강도인가요?
배경 이야기
당신은 도시 교외에 작은 보석상을 소유하고 있습니다. 교외는 인구가 너무 많아서 상점의 두께 는 번화 한 거리에 맞출 수있는 문자 하나뿐입니다 .
최근 동네에서 강도 사건이 많이 발생하고 강도도 현상금을 받으러 올까봐 두렵습니다.
따라서 상점을 관리하기 위해 감시 카메라를 설치했습니다. 그러나 한 가지 큰 문제가 있습니다. 카메라에서 신호음이나 경보가 울리지 않습니다 .
보안 경보를 직접 프로그래밍하기로 결정했습니다. 이것은 장치를 완성하고 작은 가게를 안전하고 안전하게 만들 것입니다.
직무
감시 카메라는 다음과 같이 매장을 매핑합니다.
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)"은 문자열이 아닌 벨 문자를 나타냅니다.
행운을 빕니다!
답변
젤리 , 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
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.
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)
Python 3 , 52 바이트
빈 공간 대신 벽 대신 사용 #합니다 . 출력은 거짓 값으로 빈 문자열이고 진실 입력에 대한 벨 문자입니다. W
lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''
온라인으로 시도하십시오!
JavaScript (ES6), 33 28 바이트
@DomHastings 덕분에 5 바이트가 절약되었습니다!
e보석에 대한 기대 와 다른 아이템에 대한 도전에서 정의 된 캐릭터.
인쇄 할 수없는 BEL것은 아래에서 이스케이프됩니다.
s=>/E *I|I *E/i.test(s)&&'\7'
온라인으로 시도하십시오!
AWK , 47 \$\cdots\$ 27 26 바이트
Dominic van Essen 덕분에 2 3 7 8 바이트 절약 !!! 따옴표 안에 인쇄 할 수없는 종 문자가 있습니다.
$0=/[EJ] *I|I *[EJ]/?"":0
온라인으로 시도하십시오! (인쇄 가능한 벨 포함)
위험 할 가능성이있는 경우 벨 문자 (진정)를 출력하거나 그렇지 않으면 0 (거짓)을 출력합니다.
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 바이트로 줄일 수 있습니다.
Pip , 26 21 바이트
3NST(_-BMPaRMs)?o.'!i
온라인으로 시도하십시오!
Dominic Van Essen의 입력 변경 후 -5 바이트.
입력을 다음과 같이받습니다.
8 → Wall
4 → intruder
7 → Jewel
1 → Employee
차이점을 가져 와서 문자열로 변환하고 문자열 표현에 3이 있는지 확인합니다.
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
R , 74 바이트
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
온라인으로 시도하십시오!
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가 처리 할 수 없으므로 벨 대신 느낌표 사용)
차콜 , 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