강도인가요?

Sep 15 2020

배경 이야기

당신은 도시 교외에 작은 보석상을 소유하고 있습니다. 교외는 인구가 너무 많아서 상점의 두께 는 번화 한 거리에 맞출 수있는 문자 하나뿐입니다 .

최근 동네에서 강도 사건이 많이 발생하고 강도도 현상금을 받으러 올까봐 두렵습니다.

따라서 상점을 관리하기 위해 감시 카메라를 설치했습니다. 그러나 한 가지 큰 문제가 있습니다. 카메라에서 신호음이나 경보가 울리지 않습니다 .


보안 경보를 직접 프로그래밍하기로 결정했습니다. 이것은 장치를 완성하고 작은 가게를 안전하고 안전하게 만들 것입니다.

직무

  • 감시 카메라는 다음과 같이 매장을 매핑합니다.

    WI  J E W
    

    이것은 STDIN 또는 명령 줄 인수에서 가져올 수있는 입력입니다. 각 글자는 다른 의미를 가지고 있습니다.

    • W 는 벽을 나타냅니다 . 강도와 침입자는 통과 할 수 없습니다.
    • E 는 직원을 의미 합니다 . 이들은 카메라가 인식하는 존재입니다. 침입자를 발견하면 강도가 어떤 조치를 취하기 전에 즉시 경보를 울립니다. (그 사이에 벽 , 보석 , 침입자 또는 다른 직원 이 없으면 침입자를 볼 수 있습니다. ) 그들은 또한 가만히 서있는 경향이 있습니다.
    • J 는 보석을 의미 합니다. 이것들은 강도와 ​​침입자가 찾고있는 것들입니다.
    • 나는 의미 침입자 . 그들은 강도 일 가능성이 높습니다. 그들의 목표는 상점의 보석 중 적어도 하나를 훔치는 것입니다.
    • 물론 코드 바이트를 절약하기 위해 자신 만의 맵 범례를 만들 수 있습니다.
  • 입력에 따라 다음을 수행하는 프로그램 (또는 함수)을 작성해야합니다.

    • 경우 침입자가 자유롭게을 손에 넣을 수 있습니다 보석 또는 직원은 볼 수 있습니다 침입자를 :
      • 진실한 값을 인쇄하십시오. ( "1", "True", "Alert")
      • 완전히 경고하려면 ASCII 벨 문자를 인쇄하십시오. (ASCII 코드 7이 있습니다. 인쇄하면 많은 컴퓨터와 구현에서 삑 소리가납니다.)
        • 대부분의 구현에서는 팅 소리가 들리지 않으므로주의하십시오!
        • 종을 절대 인쇄 할 수없는 경우에는 대신 느낌표 ( '!')를 인쇄하십시오. (일부 언어에서는 느낌표 인쇄를 구현하기가 더 어려울 수 있음)
    • 그밖에:
      • 거짓 값을 인쇄합니다. ( "0", "False", "Quiet")
  • 당점 은 포장하지 않습니다 .

  • Welp, 너무 많은 바이트를 실행하면 컴퓨터가 느리게 실행됩니다. 코드를 최대한 짧게 프로그래밍하십시오. ( code-golf)

예제 테스트

STDIN:        EXAMPLE STDOUT:
WI  J E W     1(BEL)

WIWWJWE W     0

E I J I E     1(BEL)

I   W J E     0

I E W E E     1(BEL)

IIIIEIIII     1(BEL)

JJJJEJJWI     0

참고 : "(BEL)"은 문자열이 아닌 벨 문자를 나타냅니다.

행운을 빕니다!

답변

9 JonathanAllan Sep 15 2020 at 21:03

젤리 ,  10  8 바이트

ḟ⁶OIA7fỌ

모든 것이 정상이면 빈 문자열 (거짓)을 인쇄하고 그렇지 않으면 벨 문자 (벨 문자도 진리 임)를 인쇄하는 전체 프로그램입니다.

입력:

    Wall W
Employee X
   Jewel J
Intruder Q

온라인으로 시도하십시오!

또는 테스트 모음을 참조하십시오 (바닥 글은 먼저 예제 문자의 문자를 번역하고 각 행에 대한 링크를 호출합니다).

어떻게?

ḟ⁶OIA7fỌ - Main Link: list of characters in "W QJX"
 ⁶       - a space character
ḟ        - filter-discard (remove any spaces)
  O      - to ordinals (e.g. "WXQJ" -> [87,88,81,74])
   I     - incremental differences (e.g. [87,88,81,74] -> [1,-7,-7])
           ...possible values are: -14 -13 -7 -6 -1 0 1 6 7 13 14
              -7 and 7 indicate an intruder (Q) is next to a jewel (J) or employee (X)
    A    - absolute values
     7   - seven
      f  - filter keep ([7] if any of the values are 7 else []) 
       Ọ - cast to characters (bell character in a list or an empty list)
         - implicit print
           ...single-element lists print their element
              while empty lists print an empty string
9 xash Sep 15 2020 at 21:26

Brachylog , 17 12 10 바이트

Employees와 Jewels를 구분하지 않음으로써 -5 바이트

-2 바이트는 곱하기가 아닌 더하기를 사용하므로 무료로 \ a에 7을 얻습니다.

빈 타일은 -이고, 침입자도 h우만이고, 보석은 여전히 ​​보석 J이며, 상점 직원은 e이며 벽 >은 닫힙니다. Brachylog에서 성공하는 술어는 진실한 가치입니다. 따라서 출력 값 ( BEL) 또는 통합 실패 (로 표시됨) false.입니다.

ạ%₉ᵐs+7g~ạ

온라인으로 시도하십시오!

이 모든 것이 완료되어 바이트 모듈로 9가 ạ%₉ᵐ매핑됩니다 (empty) => 0, I => 5, J => 2, E => 2, W => 8. 이를 통해 연속 요소의 모든 하위 집합을 합산하고 s+그중 하나가 7( I J, ie 5+0+0+2또는 E I, ie 2+0+0+5)인지 확인할 수 있습니다. 빈 타일은에 매핑되기 때문에 0값을 변경하지 않으며 순서도 변경하지 않습니다. 또한 7은 다른 요소로 만들 수 없습니다. 하나하면 일부 일치, 바이트로 반환 변환 7 ~gạ입니다 \a.

6 KevinCruijssen Sep 16 2020 at 08:01

05AB1E , 7 바이트

áÇ¥Ä7Ãç

@JonathanAllan 의 Jelly 답변의 포트 , 그래서 그를 upvote 확인하십시오!

그의 대답과 마찬가지로 W= wall을 사용합니다 . J= 보석; X= 직원; Q= 침입자.
목록에있는 하나 또는 여러 BEL 문자를 진실 값으로 출력하거나 빈 목록을 거짓 값으로 출력합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

á        # Only keep the letters of the (implicit) input-string (removes spaces)
 Ç       # Convert each character to its codepoint integer
  ¥      # Get the forward difference between each codepoint pair
         #  (one of: [-14,-13,-7,-6,-1,0,1,6,7,13,14])
   Ä     # Take the absolute value of each difference
    7Ã   # Only keep all 7s in the list
      ç  # And convert those 7s (if any) to an ASCII character with this codepoint
         # (after which the resulting list is output implicitly as result)
5 ovs Sep 15 2020 at 20:03

Python 3 , 52 바이트

빈 공간 대신 벽 대신 사용 #합니다 . 출력은 거짓 값으로 빈 문자열이고 진실 입력에 대한 벨 문자입니다. W

lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''

온라인으로 시도하십시오!

4 Arnauld Sep 15 2020 at 18:32

JavaScript (ES6),  33  28 바이트

@DomHastings 덕분에 5 바이트가 절약되었습니다!

e보석에 대한 기대 와 다른 아이템에 대한 도전에서 정의 된 캐릭터.

인쇄 할 수없는 BEL것은 아래에서 이스케이프됩니다.

s=>/E *I|I *E/i.test(s)&&'\7'

온라인으로 시도하십시오!

4 Noodle9 Sep 15 2020 at 19:38

AWK , 47 \$\cdots\$ 27 26 바이트

Dominic van Essen 덕분에 2 3 7 8 바이트 절약 !!! 따옴표 안에 인쇄 할 수없는 종 문자가 있습니다.

$0=/[EJ] *I|I *[EJ]/?"":0

온라인으로 시도하십시오! (인쇄 가능한 벨 포함)

위험 할 가능성이있는 경우 벨 문자 (진정)를 출력하거나 그렇지 않으면 0 (거짓)을 출력합니다.

3 Abigail Sep 15 2020 at 20:12

perl -pl, 26 바이트

$_=/I *[EJ]|[EJ] *I/?"^G":0

온라인으로 시도하십시오!

인쇄 할 수없는 문자를 입력하기 어렵 기 때문에 벨 문자가 여기 (그리고 TIO에 있음)에 있으며 두 문자 콤보로 표시됩니다 ^G. 실제 프로그램에서 이것은 ASCII 코드 7이있는 문자입니다 (따라서 1 문자로 계산합니다).

어떻게 작동합니까?

설명 된 모든 사건은 보석이나 직원 옆에 침입자로 귀결됩니다. 따라서 정규 표현식을 사용하여이 경우를 감지합니다.

perl -pl, 15 바이트

s/E *I|I *E/^G/i

온라인으로 시도하십시오!

여기서 "truthy"는 "BEL 문자 포함"으로, "falsey"는 "BEL 문자 포함 안 함"으로 간주됩니다. 그리고 e보석의 상징 으로 사용하는 @Dom Hastings의 제안을 사용 합니다.

perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 바이트

$_=@F>1?"^G":0

온라인으로 시도하십시오!

작업의 일부를 명령 줄 스위치로 오프로드하고 13 바이트로 줄일 수 있습니다.

3 Razetime Sep 16 2020 at 10:05

Pip , 26 21 바이트

3NST(_-BMPaRMs)?o.'!i

온라인으로 시도하십시오!

Dominic Van Essen의 입력 변경 후 -5 바이트.

입력을 다음과 같이받습니다.

8 → Wall
4 → intruder
7 → Jewel
1 → Employee

차이점을 가져 와서 문자열로 변환하고 문자열 표현에 3이 있는지 확인합니다.

2 Mukundan314 Sep 15 2020 at 19:24

Pyth , 13 바이트

*\lf&/TN@GTc

온라인으로 시도하십시오!

전설

  • j -보석
  • e -직원
  • " -침입자
  • -벽
  • # -비어 있음

설명

*\!lf&/TN@GTc
    f          # filter
            c  # input split on whitespace chars
               # with lambda T:
         @GT   #     some lowercase alphabet in T
     &/TN      #     and '"' in T
*\!l           # output '!' repeated length of results of filter times  
2 CongChen Sep 16 2020 at 07:59

R , 74 바이트

function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)

온라인으로 시도하십시오!

2 rtpax Sep 16 2020 at 13:07

C (gcc) , 97 바이트

i;j;r;t;f(char*s){for(i=j=r=0;t=*s++;t==87?i=j=0:0)i|=t==73,j|=t==74|t==69,r|=i&j;r&&putchar(7);}

온라인으로 사용해보세요 (TIO가 처리 할 수 ​​없으므로 벨 대신 느낌표 사용)

1 Neil Sep 15 2020 at 23:32

차콜 , 18 바이트

×!⊙⪪EIIEIJJI²№⁻θ ι

온라인으로 시도하십시오! 링크는 자세한 코드 버전입니다. !BEL이 Charcoal의 코드 페이지에 없기 때문에 출력 됩니다. 설명:

    EIIEIJJI        Literal string `EIIEIJJI`
   ⪪        ²       Split into 2-character substrings
  ⊙                 Any substring satisfies
             №      (non-zero) Count of
                 ι  Current substring in
               θ    Input string
              ⁻     With spaces deleted
×!                  `!` if the above is true
                    Implicitly print