Keep Talking and Nobody Explodes ist ein lokales Multiplayer-Spiel, bei dem ein Spieler die Kontrolle über eine virtuelle "Bombe" hat und von einem anderen Spieler geführt werden muss, dem "Experten", der Zugriff auf ein Handbuch zur Bombenentfernung hat. Eines der Module, die im Spiel deaktiviert werden müssen, ist das Tastaturmodul, mit dem wir uns in dieser Herausforderung befassen werden.
Die Aufgabe
Die Eingabe beginnt mit einer einzelnen Zeile druckbarer ASCII-Zeichen mit Ausnahme von Leerzeichen (0x21 bis 0x7E). Diese stellen die für Sie sichtbaren Tasten des Tastenfelds dar.
Die nächsten Zeilen stellen "Schlüssel" dar - nur eine Zeile enthält alle Zeichen der ersten Zeile, nicht unbedingt in der richtigen Reihenfolge. Ihre Aufgabe ist es, die Tastaturzeichen in der Reihenfolge der übereinstimmenden Tastenzeile auszugeben.
Zum Beispiel, wenn die Eingabe war
5~Fy
HrD7K!#}
Ui%^fHnF
)Tf;y~I5
~Fi(&5gy
,'Xd#5fZ
dann über die Tastatur - Tasten sind 5
, ~
, F
und y
. Nur die 4. Tastenzeile ~Fi(&5gy
enthält alle diese Zeichen, daher geben wir die Tastaturzeichen in der Reihenfolge aus, in der sie erscheinen, d ~F5y
. H.
Regeln und Erläuterungen
- Die Eingabe muss aus einer einzigen mehrzeiligen Zeichenfolge bestehen, wobei die Tasten und Tastenzeilen der Tastatur in separaten Zeilen stehen.
- Es wird genau eine Tastenzeile geben, die alle Tastaturzeichen enthält.
- Jede Zeile, dh die erste Tastaturzeile und die folgenden Tastenzeilen, enthalten keine doppelten Zeichen.
- Im Gegensatz zum Spiel dürfen Sie nichts über die Anzahl der Tastaturzeichen, die Länge jeder Tastenzeile oder die Anzahl der Tastenzeilen annehmen. Es wird jedoch garantiert, dass alle Hauptleitungen gleich lang sind.
- Die Ausgabe kann eine einzelne optionale nachgestellte Newline enthalten. In ähnlicher Weise können Sie einen optionalen Zeilenumbruch in der Eingabe annehmen, aber geben Sie in Ihrer Antwort an, ob Sie die Annahme benötigen.
- Obwohl dies anscheinend bereits gängige Praxis ist , sage ich ausdrücklich: Die Beendigung mit einem Fehler ist für diese Herausforderung in Ordnung, solange die STDOUT-Ausgabe korrekt ist (sofern dies Ihre gewählte Ausgabeform ist). Hoffentlich erleichtert dies die Eingabe.
Testfälle
7
4?j01C3"ch
KP.OG>QB)[
z#)Kn"I2&.
]#,D|sBFy5
Qzj*+~7DLP
Ausgang: 7
. Nur die letzte Zeile enthält a 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
Ausgang : 0b~
. Die 4. Tastenzeile enthält bereits die Zeichen in der richtigen Reihenfolge.
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
Ausgang : zTuM
. Die Schlüsselzeile ist die 4., obwohl die 3. Schlüsselzeile ein enger Fehler ist.
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
Ausgabe :n1j@o<G
. Die Schlüsselzeile ist die vorletzte Zeile.
Wertung
Das ist Code-Golf , also gewinnt der Code mit den wenigsten Bytes.
Antworten:
CJam,
1312 BytesTeste es hier.
Erläuterung
quelle
Pyth, 10
Probieren Sie es online aus
Erläuterung
quelle
Pyth, 9 Bytes
Demonstration
@Lz.z
: Filtert alle Linien für den Schnittpunkt mit der ersten Linie.olN
: Sortieren nach Längee
: Am längsten dauern.quelle
Haskell, 49 Bytes
Die erste Zeile definiert eine Hilfsfunktion
g
, die unbenannte Funktion in der zweiten Zeile ist meine Antwort.Erläuterung
Der Algorithmus ist der offensichtlichste: Teilen Sie die Eingabe in Zeilen auf, suchen Sie die Zeile, die alle Zeichen der ersten Zeile enthält, und filtern Sie alle anderen Zeichen in dieser Zeile heraus.
quelle
Prolog,
204190 BytesDies hätte eine schöne Herausforderung für Prolog sein können, wenn nicht die kombinierten Anforderungen für die Eingabe mehrerer Zeilen und nicht entkoppelter Zeichen "und" in der Eingabe berücksichtigt worden wären. Ein großer Teil des Codes (p und r) ist vorhanden, um eine Datei als Zeichen zu lesen Ich musste das tun, um die Eingabe in mehreren Zeilen ohne Auslassungszeichen zu übernehmen.
Wenn es nur ein Zeichen ohne Auslassungszeichen gab, konnte ich die Eingabe als Zeichenfolge lesen.
Wenn es nur ein Zeichen ohne Auslassungszeichen gab, konnte ich die Eingabe als Atom lesen.
Wenn die Eingabe nicht mehrzeilig war, z. B. durch Leerzeichen getrennt, konnte ich sie als Codezeile lesen.
Wie es funktioniert
So führen Sie das
Programm aus Das Programm wird mit dem folgenden Befehl ausgeführt:
p.
Die Datei mit dem Namen t, die die Eingabe enthält, muss sich im selben Verzeichnis befinden.
Edit: 14 Bytes durch Vereinheitlichung von 2 q-Sätzen mit OR gespeichert.
quelle
MATLAB, 107 Bytes
Dies endete als ein sehr schlampiges Stück Code ...
Beim Ausführen wird ein Eingabedialog geöffnet, in den eine mehrzeilige Zeichenfolge eingefügt werden kann (Zeilenumbrüche werden in Leerzeichen konvertiert und die Ausgabe ist eine Zelle mit einer sehr langen Zeichenfolge). Ich entschied mich, die resultierende Zelle in ein Zeichen umzuwandeln, das es ermöglicht, die Zwischenräume zu teilen (Ergebnis ist ein Zellenarray) und dann erneut in ein Zeichen umzuwandeln, um die beabsichtigte Form abzurufen. Die in MATLAB integrierte Member- Funktion macht hier einen guten Job, wenn es darum geht, unsere erste Zeile mit den anderen Zeilen zu vergleichen.
Danach wird es unangenehm ... Ich habe viele Möglichkeiten ausprobiert, die erste Zeile von meiner 'Best Match'-Prüfung auszuschließen, und bin dabei gelandet. Wir suchen nach der Zeile und verwenden diese Informationen dann, um die Indizes zu ermitteln (indem wir unsere ismember- Ausgabe in logische Werte konvertieren), aus denen wir unsere Ausgabezeichen erhalten möchten.
quelle
Wolfram-Sprache 106 Bytes
Beispiel Eingabe:
Ausgabe:
Erklärung des Codes: Zuerst erhalten wir mit InputString die vollständige Zeichenfolge der Eingabe, dann die erste Menge von Buchstaben, indem wir die Zeichenfolge durch Zeilenvorschub teilen und alle Zeichen der ersten Zeichenfolge in der Variablen o speichern. Als nächstes wählen wir aus den restlichen Eingabezeilen die Zeilen aus, die die Zeichen der ersten Zeile (gespeichert als Variable o) als Teilmenge haben. Wenn diese Zeile ausgewählt ist, greifen wir auf die Mitglieder dieser Zeile zu, die sich in der ursprünglichen Gruppe befinden.
Edit: Danke an Martin Büttner für die Tipps zur Verwendung der Infixnotation und meiner unnötigen Variablen
quelle
c
undi
nur einmal, hat es keinen Vorteil, sie Variablen zuzuweisen. Sie können wahrscheinlich einige Bytes von diesem Tipp speichern . Indem icho
keinen Namen gebe .s[[1]]
ist#&@@s
(dasselbe für Ihre zweite Verwendung von[[1]]
). Sie könnenStringSplit
ohne den zweiten Parameter verwenden (da dieser standardmäßig auf Leerzeichen aufgeteilt wird).SubsetQ
undMemberQ
kann eine Infixnotation verwenden, um ein Byte zu speichern, z#~SubsetQ~o
.i
undc
danke für den Tipp! Außerdem muss ich den zweiten Parameter habenStringSplit
, da einige der Zeichen als Leerzeichen interpretiert wurden (das sind nicht wirklich Leerzeichen)\n
, um ein Byte zu speichern, und die Infixnotation verwenden, um ein anderes zu speichern.Python 2, 112 Bytes
Beispiellauf: Ideone
quelle
Javascript (ES6),
107104102 BytesSnippet-Demo zur Unterstützung von Browsern.
Kommentiert:
quelle