Biorąc pod uwagę prostokątny tekst jako łamigłówkę wyszukiwania słów i ciąg wyszukiwania, określ, czy tekst zawiera szukany ciąg. Wyszukiwany ciąg może się pojawić:
- poziomo, pionowo lub po przekątnej
- do przodu lub do tyłu
Możesz napisać funkcję lub program i wziąć dwa ciągi wejściowe za pomocą argumentu funkcji, ARGV lub STDIN. Wynik powinien być wynikiem zgodnym z prawdą lub fałszem, który może zostać zwrócony z funkcji lub zapisany w STDOUT.
Załóżmy, że tekst będzie zawierał dowolne drukowalne znaki ASCII (kody szesnastkowe od 20 do 7E) i znaki podziału linii. W literach rozróżniana jest wielkość liter. Możesz założyć, że tekst wejściowy jest prostokątny, tzn. Wszystkie linie mają tę samą długość. Możesz określić, czy dane wejściowe kończą się znakiem nowej linii, czy nie (jeśli ma to znaczenie dla przesłania).
To jest kod golfowy, wygrywa najkrótsza odpowiedź (w bajtach).
Przykłady
Używając tej siatki z artykułu Wikipedii na temat wyszukiwania słów jako pierwszego wejścia:
WVERTICALL
ROOAFFLSAB
ACRILIATOA
NDODKONWDC
DRKESOODDK
OEEPZEGLIW
MSIIHOAERA
ALRKRRIRER
KODIDEDRCD
HELWSLEUTH
następujące ciągi wyszukiwania powinny dawać odpowiednio wyniki zgodne z prawdą lub fałszem:
Truthy: RANDOM, VERTICAL, HORIZONTAL, WORDSEARCH, WIKIPEDIA, TAIL
Falsy: WordSearch, CODEGOLF, UNICORN
Alternatywnie, używając tego tekstu wejściowego
Lorem ipsum dolor sit amet consectetu
r adipisicing elit sed do eiusmod tem
por incididunt ut labore et dolore ma
gna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco lab
oris nisi ut aliquip ex ea commodo co
nsequat. Duis aute irure dolor in rep
rehenderit in voluptate velit esse ci
llum dolore eu fugiat nulla pariatur.
Otrzymujemy następujące wyniki wyszukiwania (teraz używamy cudzysłowów, ponieważ w niektórych ciągach wyszukiwania są spacje):
Truthy: "Lorem", "mine", "uma bop", "tuetdod", "snol,a", "texas", "pii.d v", "vexta"
Falsy: "lorem", "wordsearch", "pii.d v", "mute"
źródło
Odpowiedzi:
CJam,
4637 bajtówCzyta tabelę ze STDIN i słowa jako argument wiersza poleceń. Wyświetla dodatnie liczby całkowite dla dopasowań i 0 dla niezgodności.
Kosztem dwóch dodatkowych bajtów oba ciągi (słowo, wysuw wiersza, siatka) można odczytać ze STDIN:
Możesz wypróbować tę wersję online za pomocą interpretera CJam .
Przykładowy przebieg
tło
Załóżmy, że dane wejściowe były następujące:
Dzieląc przy liniach, otrzymujemy następującą tablicę:
Dotyczy to słów wschodnich (słowa od lewej do prawej).
Teraz łączymy elementy
A
za pomocą ciągulen(A)
kanałów liniowych jako separatora:Następnie tniemy powstały ciąg na kawałki o długości
len(A) + len(A[0]) + 1
:Jeśli „skompresujemy” tablicę (transponujemy wiersze i kolumny), otrzymamy:
Dotyczy to słów z południowego wschodu.
Jeśli skompresujemy A i odwrócimy kolejność wierszy wyniku, otrzymamy:
Obejmuje to południe i - po powtórzeniu procesu dla przekątnych - słowa z południowego zachodu.
Ponownie kompresując i cofając, otrzymujemy:
Dotyczy to Zachodu i - po powtórzeniu procesu dla przekątnych - słów Północno-Zachodnich.
Ponownie kompresując i cofając, otrzymujemy:
Dotyczy to północy i - po powtórzeniu procesu dla przekątnych - słów północno-wschodnich.
Jak to działa
Kod działa jak wyjaśniono w poprzedniej sekcji, z dwiema drobnymi różnicami:
len(A) + len(A[0])
jakolen(A + zip(A))
.Wreszcie, łączy wszystkie wiersze wszystkich wygenerowanych tablic, używając linii jako separatorów i szuka słowa w wynikowym ciągu.
źródło
Java: 183
211321Podstawowa brutalna siła. Chyba nie ma nic więcej do powiedzenia. Dane wejściowe to igła pierwsza, a stóg siana druga. Zakłada, że siatka jest zakończona znakiem nowej linii .
Nieco bardziej czytelna wersja z pokazanym przypadkiem testowym:
źródło
if(e<1)return 1>0;
mogłoby być,return e<1;
prawda?i=a*9,
ifor(;i-->0;)
czymz=i/9;
ai%a!=4&
i tak dalej?JavaScript (E6) 111
116Poszukiwania brutalnej siły dla każdej postaci w każdym kierunku - tak golfa, jak tylko potrafię
Przetestuj w konsoli FireFox / Firebug
Wydajność
źródło
Python, 175
Niezbyt inspirowane, ale oto:
Pierwszy argument to stóg siana, drugi to igła.
źródło
h,n=input()
iprint
. Czy działa to również przy wejściach nie kwadratowych? (m = len (n)? Przyznaję, że nie do końca rozumiem, co robisz, więc mogę się całkowicie mylić!)while i>0
dowhile i:
(ponieważi
nigdy nie może być ujemne),if m<1:i=-1
doi-=m<1
.if m<1:i=-1
ponieważif m<1:i-=1
żaden z nich nie zadziała, ponieważ jest nastawionyi
negatywnie.Bash + coreutils,
214169 bajtówZastosowania transformaty 3 funkcje
r
,t
ad
do tyłu, transpozycji i przekątnej przesunięcie we wszystkich niezbędnych połączeń.Aktualizacja -
r
funkcja generuje teraz odwrócone i nieodwrócone wyjście dla dodatkowej gry w golfaWprowadzanie za pomocą argumentów wiersza poleceń - ciąg wyszukiwania, a następnie (oddzielony nowym wierszem) prostokątny blok wyszukiwania słów.
Dane wyjściowe to idiomatycznie poprawny kod statusu wyjścia powłoki - 0 oznacza PRAWDA, a 1 oznacza FAŁSZ.
Wydajność:
źródło
T()(tee >(r) $@)
, ale to jeszcze lepiej. 2. Nie sądzę, żebym kiedykolwiek widział tę składnię funkcji. 3. Biorąc pod uwagę, że niepuste ciągi są prawdziwe i falsy pustych ciągów, myślę, że można to pominąć-q
.r()(tee >(rev) $@)
,r<<<"$2"|r >(d) >(r|t) >(r|d)|r|grep "$1"
powinno również działać.-q
pozostać.C, 163
Bez zmiany układu siatki, po prostu wypróbowuję każdą literę początkową w każdym kierunku i idę, aż zbiegnę z siatki lub znajdę niedopasowanie.
Korzystam z faktu, że ciąg C kończy się na bajcie zerowym. Ponieważ w siatce nie ma zerowych bajtów, ZAWSZE wystąpi niedopasowanie. Ale jeśli niezgodność wystąpi w bajcie zerowym, wiemy, że znaleźliśmy koniec szukanego łańcucha i zapisujemy go jako dopasowanie.
Ungolfed w programie testowym
Wydajność
Zauważ, że funkcja zwróci całkowitą liczbę przypadków szukanego ciągu w siatce. Tak więc dla
OD
zwraca 6. Jeśli nie znaleziono żadnych zdarzeń, zwraca 0, co jest jedyną wartością fałszowania w C. Zmiana na zapisałabyy|=d*!n[j]
jeden znak, ale utraciłaby tę funkcjonalność.źródło
C # -
218197186 bajtówFunkcja C #, która pobiera 2 ciągi, pierwsze szukane słowo, później siatka z liniami (
\n
) między wierszami. Rzeczy stają się teraz desperackie ... tak desperackie , że moja poprzednia edycja nie zadziałała!Kod do gry w golfa:
Mniej golfa dzięki kodowi testowemu:
źródło
Haskell - 173
Zamiast szukać bezpośrednio na siatce, przekształcam siatkę na różne sposoby i dopasowuję słowo do każdego wiersza nowej siatki.
Na przykład,
Wyszukaj słowo w każdym wierszu G1, G2, G4 i G5, i gotowe. Zauważ, że G3 nie jest używany, zamieszczam go tutaj tylko dla ilustracji.
Podobny pomysł dotyczy wyszukiwania do przodu i do tyłu: wystarczy wyszukać oryginalne słowo i słowo odwrócone.
Więc teraz szukaliśmy 8 kierunków. Oto kod, którego poprawność została zweryfikowana przez inny skrypt .
Funkcja
f
jest tym, czego chcemy, a jej argumentemr
jest ciąg prostokąta,w
słowo do wyszukania.źródło
Python 2 - 246
259275308298297294313322Podziękowania dla Willa za pomoc w radzeniu sobie z drukowaniem i definiowaniem złączenia.
Dzięki podziemnej linii kolejowej za właściwe przypomnienie mi o polach golfowych; str
Naprawiono błędne dopasowania dzięki użyciu „,” jako separatora.
Najwyraźniej najlepszym sposobem na golfa jest dodanie ton przewijania w poziomie.
Wejście jako
spacjąwybuchunowej linii wyznaczone linie w cudzysłowie: "WVERTICALL \ nROOAFFLSAB \ nACRILIATOA \ nNDODKONWDC \ nDRKESOODDK \ nOEEPZEGLIW \ nMSIIHOAERA \ nALRKRRIRER \ nKODIDEDRCD \ nHELWSLEUTH", "RANDOM"źródło
L=len;J=''.join
itp. iprint any(s in(v,d,w,r...))
? Szedłem tą samą drogą, kiedy zobaczyłem, że napisałeś :))
lub]
następuje spację, możesz ją usunąć.APL (Dyalog Classic) , 44 bajty
Wypróbuj online!
źródło
\n
oddzielić (to znaczy mieć⎕TC[2]
jako separator).J ,
6053 bajtówWypróbuj online!
Wymaga, aby pierwsze wejście nie zawierało znaków nowej linii.
Wyjaśnienie:
Wypróbuj online!
Haki są przydatne.
źródło
Galaretka , 16 bajtów
Rozwiązano powiązane (być może duplikat) wyzwanie z 15 z tych 16 bajtów jako rdzeniem kodu ...
Dyadyczny link akceptujący listę znaków po lewej stronie i listę znaków po prawej stronie, która zwraca 1, jeśli znaleziono, i 0, jeśli nie.
Wypróbuj online!
W jaki sposób?
źródło