Dies sind Regentropfen:
! | . " :
Dies sind Wolkenteilchen:
( ) _ @ $ &
Ich möchte, dass Sie bei einem Textblock überprüfen, ob es regnet oder nicht. Es regnet, wenn sich für jeden Regentropfen irgendwo darüber ein Wolkenteilchen befindet. Für jeden Regentropfen muss ein Wolkenteilchen vorhanden sein. Geben Sie einen wahrheitsgemäßen oder falschen Wert aus , der Ihre Schlussfolgerungen angibt.
Gültige Beispiele
(@@@@@@)
( $ & )
Q ( )
.. . !
: .
|" !
.
()()()
......
@_$ &
errrr
h_r-5
.:. .
"
Ungültige Beispiele
!
()
$$$$$
( )
:::::
.....
Dies ist ein Code-Golf, so dass das kürzeste Programm in Charakteren gewinnt.
Antworten:
APL (30)
Dies ist eine Funktion, die eine Zeichenmatrix als Eingabe verwendet und eine boolesche Ausgabe liefert.
Prüfung:
Erläuterung:
⍵∘∊¨'!|.":' '()_@$&'
: Überprüfen Sie für beide Zeichensätze (Regen und Wolken) und für jedes Zeichen in ⍵, ob das Zeichen Mitglied des Satzes ist.+⍀¨
: Erhalte eine laufende Summe für jede Spalte und jeden Satz≤/
: Überprüfen Sie für jede Position in ⍵, ob die Menge der Regentropfen die Menge der Wolkenteilchen in der laufenden Summe nicht überschreitet∧/∊
: Gibt das boolesche UND aller Elemente im Ergebnis zurückquelle
C ++ 11,
186184 BytesUngolfed
Grundlegender Ansatz: Speichern von Positionen von Wolkenteilchen in einer Reihe. Wenn Regenpartikel angetroffen werden, wird geprüft, ob sich das Wolkenteilchen darüber befindet, und der Zähler der Wolkenteilchen in dieser Spalte wird verringert. Das Programm gibt 0 zurück, wenn es gültig ist, und 1, wenn es gültig ist.
quelle
c-m?0:p[i]++
mitp[i]+=c==m
? Oder funktioniert das in C ++ 11 nicht mehr?Schnecken , 125
Das Programm gibt die Fläche des Gitters aus (oder 1, wenn die Fläche 0 ist), wenn es regnet. sonst 0. Wenn ich nur Zeichenklassen im Regex-Stil implementiert hätte.
Ungolfed-Version Diese enthält gefälschte Anweisungen für Wolken oder Regentropfen, anstatt den ganzen Kauderwelsch aufzuschreiben .
\whatever
(.
im realen Programm durch ersetzt) bedeutet eine Sache, die ein Regentropfen sein sollte, aber eigentlich alles sein kann, da es keine Rolle spielt, ob wir einen Nicht-Regentropfen einer Wolke zuordnen.quelle
Python 2, 121 Bytes
Erwartet, dass die aufgefüllte Eingabe rechteckig ist.
quelle
JavaScript ES6, 112
Testen Sie das Ausführen des folgenden Snippets in einem EcmaScript 6-kompatiblen Browser, der Pfeilfunktionen, Spread-Operator- und Vorlagenzeichenfolgen implementiert (ich verwende Firefox).
quelle
Perl 5, 80
79 plus eins für
-E
statt-e
quelle
Julia, 90 Zeichen
Im Gegensatz zur ursprünglichen Lösung (unten) wird hierfür die Lösung mithilfe der Mathematik bestimmt.
mapfoldl(collect,hcat,split(s,"\n"))
(oben geschrieben\n
durch durch eine neue Zeile ersetzt, um Zeichen zu speichern) konvertiert die Zeichenfolge in ein 2D-Array von Zeichen.map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
Erstellt ein Array von Zahlen, mit 1, wenn das Zeichen eine Wolke ist, -1, wenn das Zeichen Regen ist, und 0, wenn dies nicht der Fall ist.cumsum(...')
berechnet die kumulierten Summen der Zeilen (wird normalerweise geschriebencumsum(...,2)
, aber da uns die Orientierung von diesem Punkt an egal ist, kostet das Transponieren nur ein Zeichen) undall(... .>-1)
prüft dann auf eine negative Zahl - Negative treten nur auf, wenn ein Regenzeichen vorliegt wird angezeigt, ohne dass ein Wolkenzeichen vorangestellt ist.Julia,
139136 ZeichenDiese Funktion transponiert zuerst den Text, sodass Zeilen zu Spalten werden und umgekehrt. Beachten Sie, dass Zeilenumbrüche im Code in Form von tatsächlichen Zeilenumbrüchen vorhanden sind, um ein Zeichen pro Instanz zu speichern.
Die Funktion ersetzt dann iterativ Wolken / Tröpfchen-Paare durch Leerzeichen. Sobald alle diese Paare entfernt wurden, gibt sie true zurück, wenn noch Tröpfchen übrig sind, andernfalls false.
r"[()_@$&](.*?)[!|.\":]"
- Dies ist eine Regex, die Wolken / Tröpfchen-Paare auf träge Weise zusammenbringt, wobei Gruppe 1 alles zwischen Wolke und Tröpfchen enthält. Danns"\g<1>"
wird es angewiesen, die übereinstimmende Wolke und die Tröpfchen zu entfernen, aber das Material dazwischen zu belassen (notwendig, da es möglicherweise Wolken enthält) - das\g<1>
ist alles, was in Gruppe 1 der Regex abgeglichen wurde.∩("!|.\":",t)==[]
generiert den Schnittpunkt der Tröpfchenzeichen mit der letzten Zeichenfolge. Wenn diese leer ist, ist keines der Tröpfchenzeichen vorhanden und es regnet.quelle
h
in der Verwendung durch die eigentliche anonyme Funktion ersetzen . So:g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))
- Das Aufrufenh
erleichtert das Aufrufen.