계속 대화하고 아무도 폭발하지 않음 은 로컬 멀티 플레이어 게임으로, 한 플레이어는 가상 “폭탄”을 제어하고 다른 플레이어 인 “전문가”는 폭탄 제거 매뉴얼에 액세스해야합니다. 게임에서 무장 해제 할 모듈 중 하나는 키패드 모듈인데,이 도전에서 우리가 다루게 될 것입니다.
작업
공백 (0x21 ~ 0x7E)을 제외한 인쇄 가능한 ASCII 문자의 한 줄로 입력이 시작됩니다. 이것은 사용자에게 보이는 키패드 버튼을 나타냅니다.
다음 몇 줄은 “키”를 나타냅니다. 한 줄에만 첫 번째 줄의 모든 문자가 반드시 순서대로 포함되지는 않습니다. 당신의 임무는 일치하는 키 라인의 순서로 키패드 문자를 출력하는 것입니다.
예를 들어 입력이
5~Fy
HrD7K!#}
Ui%^fHnF
)Tf;y~I5
~Fi(&5gy
,'Xd#5fZ
다음 키패드 버튼은 5
, ~
, F
및 y
. 네 번째 키 라인에만 ~Fi(&5gy
이러한 문자가 모두 포함되므로 키패드 문자가 나타나는 순서대로 즉,을 출력합니다 ~F5y
.
규칙 및 설명
- 키패드 버튼과 키 라인이 별도의 라인에있는 단일 멀티 라인 문자열이어야합니다.
- 모든 키패드 문자를 포함하는 키 라인이 정확히 하나 있습니다.
- 모든 행, 즉 초기 키패드 행과 다음 키 행에는 중복 문자가 없습니다.
- 게임과 달리 키패드 문자 수, 각 키 라인 길이 또는 키 라인 수에 대해서는 아무 것도 가정하지 않아도됩니다. 그러나 모든 키 라인의 길이는 동일해야합니다.
- 출력에는 단일 선택적 후행 줄 바꿈이 포함될 수 있습니다. 마찬가지로 입력에서 선택적인 후행 줄 바꿈에 대해 가정 할 수 있지만 가정이 필요한 경우 답변에 지정하십시오.
- 이것은 이미 일반적인 관행 인 것처럼 보이지만 STDOUT 출력이 올바른 한 (이것이 선택한 출력 형식 인 경우) 오류로 종료하는 것이 좋습니다. 바라건대 이것은 입력 처리를 더 쉽게 할 것입니다.
테스트 사례
7
4?j01C3"ch
KP.OG>QB)[
z#)Kn"I2&.
]#,D|sBFy5
Qzj*+~7DLP
출력 : 7
. 마지막 줄에만을 포함합니다 7
.
0b~
Ob+hy{M|?;>=dtszPAR5
*8rCfsw|3O9.7Yv^x>Hq
$ip.V@n}|La:TbIt^AOF
jZ[Ec4s0|%b*$id',~J6
z*#b}-x$Ua&!O2;['T+?
NVj_X8rlhxfnS\.z}];c
bykscf.w^dnWj+}-*2g_
VP`AJH|&j5Yqmw/"9IMc
출력 : 0b~
. 네 번째 키 라인에는 이미 올바른 순서로 문자가 포함되어 있습니다.
MTuz
bIAr>1ZUK`s9c[tyO]~W
oMGIi/H&V"BeNLua%El=
j*uYbplT:~);BM|_mPZt
Q}z5TC@=6pgr<[&uJnM%
YOA(F~_nH6T{%B7[\u#5
y&t"8zQn{wo5[Idu4g:?
[0tZG"-fm!]/|nqk,_2h
dA&C.+(byo6{7,?I}D@w
출력 : zTuM
. 세 번째 키 라인은 가까운 미스이지만 키 라인은 네 번째입니다.
o@nj<G1
f]?-<I6h2vS*%l=:}c8>LK5rMdyeon,;sE[@m(73
ibhp+2Hq6yKzIf_Zo}EO3-[*0/e&Fvd]wQU=|%`C
;}>d'cg~CPtQG&%L\)MUl419bkTZ7@]:[*H"RyYj
L^<:zXJ#kj$EFlwN%B`Dd,Cs?]xRZ*K9-uQ.@&f+
i1v'7:90R-l}FMxj`,DTWK+(n32Z4Vs[p@%*eS!d
B|^Ti/ZG$}ufL9*wE[AVt]P7CrX-)2JpD<sYxd6O
ex.$4#KarS^j+'_!B"]H[\83:(DCXUgI*Lct?qAR
^GXQoy*KW&v}n']Em~\N9)fxP(qC=7#4sRdcD6%5
;inr[&$1j_!F~@pzo#blv]}<'|fRds6OW%tEg"G2
e;0T#gfo^+!:xHDN&4V=In?AwhEv$2Fd~ZLz_\81
출력 : n1j@o<G
. 키 라인은 두 번째 마지막 라인입니다.
채점
이것은 code-golf 이므로 가장 적은 바이트의 코드가 이깁니다.
답변
CJam, 13 12 바이트
qN/(f&{,}$W=
설명
q e# Read all input.
N/ e# Split into lines.
( e# Pull off the keypad buttons.
f& e# Take the set intersection of each key line with the keypad, preserving the order
e# order in the key line.
{,}$ e# Sort the results by length.
W= e# Pick the last (longest) one.
답변
피스, 10
@zhf!-zT.z
설명
@zhf!-zT.z ## z = first line of input, .z = list of rest of lines
f .z ## Filter .z as T based on
!-zT ## Whether removing all the letters from z that appear in T leaves an
## Empty string or not (keep the ones that give empty strings)
h ## Take the first such line (necessary indexing, shouldn't ever matter)
@z ## @ is setwise intersection. Pyth implements this by iterating over
## each element of the second argument and keeping values that appear
## in the first argument, which gives the intended result
답변
답변
하스켈, 49 바이트
g(!)(a:b)=[c|d<-b,all(!d)a,c<-d,c!a]
g elem.lines
첫 번째 줄은 도우미 함수를 정의합니다 g
의 명명되지 않은 함수는 내 대답입니다.
설명
알고리즘은 명백합니다. 입력을 행으로 분할하고 첫 번째 행의 모든 문자가 포함 된 행을 찾은 다음 해당 행의 다른 모든 문자를 필터링하십시오.
g(!)(a:b)= -- g gets a binary function ! and list of strings a:b
[c| -- and returns the string of characters c where
d<-b,all(!d)a, -- d is drawn from b and x!d holds for all x in a,
c<-d,c!a] -- and c is drawn from d and c!a holds.
g elem.lines -- The input is split into lines and fed to g elem;
-- then x!d means x `elem` d in the above.
답변
프롤로그, 204 190 바이트
입력에서 여러 줄 입력과 이스케이프 처리되지 않은 문자 ‘및 “의 조합 된 요구 사항이 아니었다면 Prolog에 큰 어려움이 있었을 수 있습니다. 파일을 문자로 읽는 데 큰 코드 (p 및 r)가 존재합니다. 이스케이프 처리되지 않은 입력을 여러 줄에 취하기 위해 수행해야하는 코드.
이스케이프 처리되지 않은 문자로 ‘만 존재하는
경우 입력을 문자열로 읽을 수 있습니다. 이스케이프 처리되지 않은 문자로만 존재하는 경우 입력을 원자로 읽을 수 있습니다.
입력이 여러 줄로 구성되지 않은 경우 대신 공백으로 구분하면 코드의 한 줄로 읽을 수 있습니다.
r(I,[H|T]):-read_line_to_codes(I,H),H\=end_of_file,r(I,T).
r(_,[]).
q(_,[]).
q(E,[H|T]):-subset(E,H),intersection(H,E,X),writef("%s",[X]);q(E,T).
p:-open("t",read,I),r(I,[H|T]),q(H,T),!.
그것이 작동하는 방법
- 읽을 파일 t (모든 입력을 포함)를 엽니 다
- 모든 행을 문자 코드로 읽고 목록 목록에 배치하십시오 (행당 1 목록).
- 테일 목록을 통해 재귀하고 헤드 목록이 해당 목록의 하위 집합으로 존재하는지 확인
- 일치하는 목록을 머리와 교차하여 원하는 순서대로 원하는 문자를 얻습니다.
- 인쇄 솔루션
프로그램 실행 방법 은 다음 명령으로 실행됩니다 :
p.
입력을 포함하는 파일 이름 t는 동일한 디렉토리에 있어야합니다.
편집 : OR로 2 개의 q 절을 통합하여 14 바이트를 절약했습니다.
답변
MATLAB, 107 바이트
b=char(strsplit(char(inputdlg),' '));[~,x]=ismember(b,b(1,:));[~,f]=min(abs(1./sum(~x')-1));b(f,(~~x(f,:)))
이것은 매우 조잡한 코드 조각이되었습니다 …
실행될 때 여러 줄 문자열을 붙여 넣을 수있는 입력 대화 상자가 열립니다 (줄 바꾸기는 공백으로 변환되고 출력은 매우 긴 문자열을 가진 셀이됩니다). 결과 셀을 char로 변환하여 공백으로 분할 할 수있게하고 (결과는 셀 배열 임) 다시 char로 변환하여 원하는 모양을 검색합니다. MATLAB의 내장 ismember 함수는 첫 줄을 다른 줄과 비교할 때 잘 작동합니다.
그 후 그것은 불쾌 해집니다 … 나는 ‘최고의 일치’확인에서 첫 번째 줄을 제외시키고 많은 방법을 시도했으며 이것으로 끝났습니다. 행을 찾은 다음이 정보를 사용하여 출력 문자를 원하는 인덱스를 가져옵니다 ( ismember 출력을 논리 로 변환 하여).
답변
Wolfram 언어 106 바이트
c=Characters[InputString[]~StringSplit~"\n"];o=c[[1]];t=Select;t[t[Rest@c,#~SubsetQ~o&][[1]],o~MemberQ~#&]
입력 예 :
산출:
코드 설명 : 먼저 InputString을 사용하면 전체 입력 문자열을 얻은 다음 문자열을 줄 바꿈으로 나누고 첫 번째 문자의 모든 문자를 변수 o에 저장하여 첫 번째 문자 집합을 얻습니다. 다음으로, 나머지 입력 라인에서 첫 번째 라인 문자 (변수 o로 저장 됨)를 서브 세트로 갖는 라인을 선택합니다. 그런 다음 해당 줄을 선택하면 원래 세트에있는 해당 줄의 멤버를 가져옵니다.
편집 : 삽입 표기법 사용에 대한 팁과 불필요한 변수에 대해 Martin Büttner에게 감사드립니다.