Rozważ następującą standardową siatkę krzyżówek 15 × 15 .
Możemy to przedstawić w sztuce ASCII za pomocą #
bloków i (spacji) białych kwadratów.
# #
# #
#
# #
### ## ##
## #
# #
# ##
## ## ###
# #
#
# #
# #
Biorąc pod uwagę siatkę krzyżówek w formacie graficznym ASCII powyżej, określ, ile słów zawiera. (Powyższa tabela ma 78 słów. Zdarza się, że jest to łamigłówka New York Times z ostatniego poniedziałku .)
Słowo to grupa dwóch lub więcej następujących po sobie spacji biegnących pionowo lub poziomo. Słowo zaczyna się i kończy blokiem lub krawędzią siatki i zawsze biegnie od góry do dołu lub od lewej do prawej, nigdy po przekątnej lub do tyłu. Pamiętaj, że słowa mogą obejmować całą szerokość układanki, tak jak w szóstym rzędzie układanki powyżej. Słowo nie musi być połączone z innym słowem.
Detale
- Dane wejściowe zawsze będą prostokątem zawierającym znaki
#
lub(spację), z wierszami oddzielonymi znakiem nowej linii (
\n
). Możesz założyć, że siatka składa się z 2 różnych drukowalnych znaków ASCII zamiast#
i.
- Możesz założyć, że istnieje opcjonalny znak nowej linii. Znaki końcowe spacji są liczone, ponieważ wpływają na liczbę słów.
- Siatka nie zawsze będzie symetryczna i mogą to być wszystkie spacje lub wszystkie bloki.
- Twój program powinien teoretycznie być w stanie pracować na siatce dowolnego rozmiaru, ale w przypadku tego wyzwania nigdy nie będzie większy niż 21 × 21.
- Możesz wziąć samą siatkę jako dane wejściowe lub nazwę pliku zawierającego siatkę.
- Weź dane wejściowe z argumentów stdin lub wiersza poleceń i wyślij je na standardowe wyjście.
- Jeśli wolisz, możesz użyć funkcji o nazwie zamiast programu, biorąc siatkę za argument ciągu i wyprowadzając liczbę całkowitą lub ciąg znaków przez stdout lub return funkcji.
Przypadki testowe
Wejście:
# # #
Wyjście:
7
(Przed każdym są cztery spacje#
. Wynik byłby taki sam, gdyby każdy znak liczbowy został usunięty, ale Markdown usuwa spacje z innych pustych linii).Wejście:
## # ##
Wyjście:
0
(Słowa jednoliterowe się nie liczą.)Wejście:
###### # # #### # ## # # ## # #### #
Wynik:
4
Dane wejściowe: ( układanka z niedzieli NY Times z 10 maja )
# ## # # # # # # # ### ## # # ## # # # ## # ## # ## # # ### ## # ## ## # ## ### # # ## # ## # ## # # # ## # # ## ### # # # # # # # ## #
Wynik:
140
Punktacja
Najkrótszy kod w bajtach wygrywa. Tiebreaker to najstarszy post.
py -3 slip.py regex.txt input.txt
ipy -3 slip.py regex.txt input.txt no
, czyli trzy bajty (w tym spacja wcześniejn
)Haskell, 81 bajtów
Używa spacji
jako znaków blokowych i dowolnego innego (niebiałego) znaku jako pustej komórki.
Jak to działa: podziel wprowadzanie na listę słów w spacjach. Weź
1
za każde słowo z co najmniej 2 znakami i zsumuj je1
. Zastosuj tę samą procedurę do transpozycji (split at\n
) wejścia. Dodaj oba wyniki.źródło
JavaScript ( ES6 ) 87
121 147Zbuduj transpozycję ciągu wejściowego i dołącz go do wejścia, a następnie policz ciągi 2 lub więcej spacji.
Uruchom fragment w przeglądarce Firefox, aby go przetestować.
Kredyty @ IsmaelMiguel, rozwiązanie dla ES5 (122 bajty):
źródło
F=z=>{for(r=z.split(/\n/),i=0;i<r[j=0][L='length'];i++)for(z+='#';j<r[L];)z+=r[j++][i];return~-z.split(/ +/)[L]}
? Ma długość 113 bajtów. Twój regex został zastąpiony/ +/
(2 spacje),j=0
został dodany wfor
pętli „nadrzędnej” i zamiast korzystać ze składniobj.length
, zmieniłem na useL='length'; ... obj[L]
, który powtarza się 3 razy.F=z=>
, musiałem użyćvar F=(z,i,L,j,r)=>
). Przetestowałem to na IE11 i działa!/\n/
ciągiem szablonu z prawdziwą nową linią między. To oszczędza 1 bajt, ponieważ nie musisz pisać sekwencji ucieczki.Pyth,
151413 bajtówUżywam
jako separatora i
#
jako znaków wypełniających zamiast ich przeciwnego znaczenia niż OP. Wypróbuj online: demonstracjaZamiast
#
znaku wypełnienia przyjmuje także litery. Możesz wziąć rozwiązaną krzyżówkę i wydrukować liczbę słów. A jeśli usunieszl
polecenie, drukuje nawet wszystkie słowa. Przetestuj tutaj: puzzle z 10 maja w niedzielę NY TimesWyjaśnienie
źródło