Są to krople deszczu:
! | . " :
Są to cząsteczki chmur:
( ) _ @ $ &
Chcę, żebyś sprawdził, kiedy otrzyma blok tekstu, czy pada deszcz. Pada deszcz, jeśli gdzieś nad każdą kroplą deszczu znajduje się cząstka chmury. Na każdą kroplę deszczu musi przypadać jedna cząsteczka chmury. Wyprowadzać truthy lub wartość falsy oznaczając swoje wnioski.
Prawidłowe przykłady
(@@@@@@)
( $ & )
Q ( )
.. . !
: .
|" !
.
()()()
......
@_$ &
errrr
h_r-5
.:. .
"
Nieprawidłowe przykłady
!
()
$$$$$
( )
:::::
.....
To jest golf golfowy, więc wygrywa najkrótszy program z postaci .
Odpowiedzi:
APL (30)
Jest to funkcja, która pobiera macierz znaków jako dane wejściowe i daje wynik logiczny.
Test:
Wyjaśnienie:
⍵∘∊¨'!|.":' '()_@$&'
: dla obu zestawów znaków (deszcz i chmury) oraz dla każdego znaku w ⍵ sprawdź, czy postać jest członkiem zestawu.+⍀¨
: uzyskaj sumę bieżącą dla każdej kolumny i każdego zestawu≤/
: dla każdej pozycji w ⍵ sprawdź, czy ilość kropel deszczu nie przekracza ilości cząstek chmur w bieżącej sumie∧/∊
: zwraca wartość logiczną ORAZ wszystkich elementów w wynikuźródło
C ++ 11,
186184 bajtówNie golfił
Podstawowe podejście, zapamiętywanie pozycji cząstek chmur w rzędzie, a jeśli napotka cząstkę deszczu, sprawdza, czy cząstka chmury znajduje się nad nią i zmniejsza licznik cząstek chmur w tej kolumnie. Program zwraca 0, jeśli jest poprawny, a 1 w przeciwnym razie.
źródło
c-m?0:p[i]++
zp[i]+=c==m
? Czy to już nie działa w C ++ 11?Ślimaki , 125
Program wyprowadza obszar siatki (lub 1, jeśli jego powierzchnia wynosi 0), jeśli pada deszcz; inaczej 0. Gdybym tylko zaimplementował klasy znaków w stylu wyrażenia regularnego.
Wersja bez golfa Zawiera fałszywe instrukcje dotyczące chmur lub kropli deszczu zamiast wypisywania wszystkich bełkotów.
\whatever
(zastąpione przez.
w prawdziwym programie) oznacza rzecz, która powinna być kroplą deszczu, ale w rzeczywistości może być czymkolwiek, ponieważ nie ma znaczenia, czy dopasujemy kroplę deszczu do chmury.źródło
Python 2, 121 bajtów
Oczekuje, że wejście będzie wypełnione prostokątem.
źródło
JavaScript ES6, 112
Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6, implementując funkcje strzałek, operator rozprzestrzeniania i ciągi szablonów (używam Firefox)
źródło
Perl 5, 80
79, plus jeden za
-E
zamiast-e
źródło
Julia, 90 znaków
W przeciwieństwie do oryginalnego rozwiązania (poniżej), w celu ustalenia rozwiązania wykorzystuje się matematykę.
mapfoldl(collect,hcat,split(s,"\n"))
(napisane powyżej z\n
zastąpionym rzeczywistym znakiem nowej linii w celu zapisania znaków) konwertuje ciąg na tablicę znaków 2d.map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
tworzy tablicę liczb, gdzie 1 oznacza, że postać jest chmurą, -1, jeśli postać jest deszczem, a 0 w przeciwnym razie.cumsum(...')
oblicza skumulowane sumy wierszy (normalnie byłoby napisanecumsum(...,2)
, ale ponieważ od tego momentu nie dbamy o orientację, transpozycja kosztuje tylko jeden znak), a następnieall(... .>-1)
sprawdza liczbę ujemną - negatywy pojawią się tylko, jeśli znak deszczu pojawia się bez poprzedzania chmurą.Julia,
139136 znakówTa funkcja najpierw transponuje tekst, aby wiersze stały się kolumnami i odwrotnie. Pamiętaj, że znaki nowego wiersza są obecne w kodzie w postaci rzeczywistych znaków nowego wiersza, aby zapisać jeden znak na wystąpienie.
Następnie funkcja iteracyjnie zastępuje pary chmur / kropel spacjami, a po usunięciu wszystkich takich par zwraca wartość true, jeśli pozostały jakieś krople, a fałsz w przeciwnym razie.
r"[()_@$&](.*?)[!|.\":]"
- jest to wyrażenie regularne, które w leniwy sposób dopasuje pary chmura / kropla, przy czym grupa 1 zawiera wszystko między chmurą a kroplą. Następnies"\g<1>"
nakazuje mu usunięcie dopasowanej chmury i kropel, ale trzymanie rzeczy pomiędzy (konieczne, ponieważ może zawierać chmury) -\g<1>
to wszystko, co zostało dopasowane w grupie 1 wyrażenia regularnego.∩("!|.\":",t)==[]
wygeneruje przecięcie kropelkowych znaków z końcowym łańcuchem, a jeśli jest pusty, to żaden z kropelkowych znaków nie jest obecny i pada deszcz.źródło
h
w użyciu rzeczywistą funkcją anonimową. W ten sposób:g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))
- wywołanieh
tego ułatwia wywoływanie.