Keep Talking and Nobody Explodes to lokalna gra wieloosobowa, w której jeden gracz ma kontrolę nad wirtualną „bombą” i musi być prowadzony przez innego gracza, „eksperta”, który ma dostęp do instrukcji usuwania bomb. Jednym z modułów do rozbrojenia w grze jest moduł klawiatury, z którym będziemy mieli do czynienia w tym wyzwaniu.
Zadanie
Wejście rozpocznie się od jednego wiersza drukowalnych znaków ASCII z wyjątkiem spacji (0x21 do 0x7E). Reprezentują one widoczne przyciski klawiatury.
Następne kilka linii będzie reprezentować „klucze” - tylko jeden wiersz będzie zawierał wszystkie znaki pierwszego wiersza, niekoniecznie w kolejności. Twoim zadaniem jest wyprowadzanie znaków z klawiatury, w kolejności zgodnej linii klawiszy.
Na przykład, jeśli dane wejściowe były
5~Fy
HrD7K!#}
Ui%^fHnF
)Tf;y~I5
~Fi(&5gy
,'Xd#5fZ
wówczas klawiatura przyciski 5
, ~
, F
i y
. Tylko czwarta linia klawiszy ~Fi(&5gy
zawiera wszystkie te znaki, więc znaki klawiatury wypisujemy w kolejności, w jakiej się pojawiają, tj ~F5y
.
Zasady i wyjaśnienia
- Wejście musi być pojedynczym ciągiem wielowierszowym, z przyciskami klawiatury i wierszami klawiszy w osobnych wierszach.
- Będzie dokładnie jedna linia klucza, która zawiera wszystkie znaki na klawiaturze.
- Każda linia, tj. Początkowa linia klawiatury i następujące po niej linie klawiszy, nie będą miały zduplikowanych znaków.
- W przeciwieństwie do gry, nie możesz zakładać niczego o liczbie znaków na klawiaturze, długości każdej linii klawiszy lub liczbie linii klawiszy. Jednak wszystkie kluczowe linie mają tę samą długość.
- Dane wyjściowe mogą zawierać jeden opcjonalny końcowy znak nowej linii. Podobnie możesz przyjąć w obu przypadkach opcjonalny końcowy znak nowej linii w danych wejściowych, ale proszę podać w swojej odpowiedzi, czy potrzebujesz założenia.
- Chociaż wydaje się to już powszechną praktyką , stwierdzę wprost: zakończenie z błędem jest w porządku dla tego wyzwania, pod warunkiem, że wyjście STDOUT jest poprawne (jeśli jest to wybrana przez ciebie forma wyjścia). Mamy nadzieję, że ułatwi to obsługę danych wejściowych.
Przypadki testowe
7
4?j01C3"ch
KP.OG>QB)[
z#)Kn"I2&.
]#,D|sBFy5
Qzj*+~7DLP
Wyjście: 7
. Tylko ostatni wiersz zawiera 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
Wyjście : 0b~
. Czwarta linia klucza zawiera już znaki w odpowiedniej kolejności.
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
Wyjście : zTuM
. Kluczowa linia jest czwartą, chociaż trzecia linia kluczowa jest bliskie.
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
Wyjście : n1j@o<G
. Kluczowa linia jest drugą ostatnią linią.
Punktacja
To jest golf golfowy , więc kod w najmniejszej liczbie bajtów wygrywa.
Odpowiedzi:
CJam,
1312 bajtówSprawdź to tutaj.
Wyjaśnienie
źródło
Pyth, 10
Wypróbuj online
Wyjaśnienie
źródło
Pyth, 9 bajtów
Demonstracja
@Lz.z
: Filtruj wszystkie linie pod kątem przecięcia z pierwszą linią.olN
: Sortuj według długoście
: Najdłużej.źródło
Haskell, 49 bajtów
Pierwsza linia definiuje funkcję pomocnika
g
, nienazwana funkcja w drugiej linii jest moją odpowiedzią.Wyjaśnienie
Algorytm jest oczywisty: podziel wejście na linie, znajdź linię zawierającą wszystkie znaki pierwszego wiersza i odfiltruj wszystkie pozostałe znaki w tej linii.
źródło
Prolog,
204190 bajtówTo mogłoby być miłym wyzwaniem dla Prologa, gdyby nie połączone wymagania dotyczące wprowadzania danych wielowierszowych oraz znaków nieskalowanych „i” na wejściu. Istnieje duża część kodu (p i r) do odczytu pliku jako znaku kody, które musiałem zrobić, aby wprowadzić dane nieskalowane w kilku wierszach.
Gdyby tylko „istniał jako znak nieskalowany, mógłbym odczytać dane wejściowe jako ciąg
.
Jeśli wejście nie było wielowierszowe, powiedzmy zamiast tego oddzielone spacją, mógłbym odczytać je jako jedną linię do kodów.
Jak to działa
Jak uruchomić
Program jest uruchamiany za pomocą polecenia:
p.
Plik o nazwie t zawierający dane wejściowe musi znajdować się w tym samym katalogu.
Edycja: Zapisano 14 bajtów poprzez ujednolicenie 2 klauzul q z OR.
źródło
MATLAB, 107 bajtów
W rezultacie był to bardzo niechlujny fragment kodu ...
Podczas uruchamiania otwierane jest okno dialogowe wprowadzania, w którym można wkleić ciąg wielu wierszy (znaki nowej linii są konwertowane na spacje, a wynikiem będzie komórka z 1 bardzo długim ciągiem). Zdecydowałem się przekonwertować wynikową komórkę na znak, który umożliwia podział na spacje (wynikiem jest tablica komórek), a następnie ponownie przekonwertować na znak, aby odzyskać zamierzony kształt. Wbudowany element MATLAB- a funkcja ma tutaj dobrą robotę, porównując naszą pierwszą linię z innymi liniami.
Potem robi się nieprzyjemnie ... Próbowałem wielu sposobów, aby wykluczyć pierwszą linię z mojego testu „najlepszego dopasowania” i skończyłem z tym. Szukamy linii, a następnie wykorzystać te informacje, aby pobrać indeksów (poprzez przekształcenie naszej ismember wyjście logicals), że chcemy nasze znaki wyjściowe z.
źródło
Język wolfram 106 bajtów
Przykładowe dane wejściowe:
Wynik:
Objaśnienie kodu: Najpierw za pomocą InputString otrzymujemy pełny ciąg danych wejściowych, a następnie otrzymujemy pierwszy zestaw liter, dzieląc ciąg znaków na nowy wiersz i zapisując wszystkie znaki pierwszego w zmiennej o. Następnie wybieramy z pozostałych linii wejściowych te wiersze, które mają znaki pierwszego wiersza (zapisane jako zmienna o) jako podzbiór. Następnie z zaznaczoną tą linią, bierzemy elementy tej linii, które są w oryginalnym zestawie.
Edycja: Podziękowania dla Martina Büttnera za wskazówki dotyczące korzystania z notacji infix i moich niepotrzebnych zmiennych
źródło
c
ii
tylko raz, więc nie ma korzyści w przypisując je do zmiennych. Prawdopodobnie możesz zapisać niektóre bajty z tej wskazówki . Nie podająco
imienia.s[[1]]
jest#&@@s
( to samo przy drugim użyciu[[1]]
). Możesz używaćStringSplit
bez drugiego parametru (ponieważ domyślnie dzieli się na białe znaki).SubsetQ
iMemberQ
może użyć notacji infix, aby zapisać bajt, np#~SubsetQ~o
.i
ic
raz, dzięki za cynk! Potrzebuję też drugiego parametruStringSplit
, ponieważ, ponieważ działo się trochę dziwnie z niektórymi postaciami interpretowanymi jako białe spacje (które nie są tak naprawdę białymi spacjami)\n
, aby zapisać jeden bajt, i użyć notacji infix, aby zapisać inny.Python 2, 112 bajtów
Przykładowy przebieg: Ideone
źródło
JavaScript (ES6),
107104102 bajtówPrezentacja Snippet do obsługi przeglądarek.
Skomentowano:
źródło