Das Problem
Ein Schreckensszenario wird von drei Zahlen auf einer einzelnen Zeile beschrieben n
, m
und p
. Auf diese Zeile folgen n
Zeilen mit m
Werten pro Zeile. Jeder Wert gibt die Gesamtmenge an Wasser an, die jede Zelle aufnehmen kann.
Die folgenden p
Zeilen beschreiben das Wetter für die nächsten p
Tage. Pro Tag fällt 1 Einheit Regen auf eine einzelne Zelle. Wenn die Wassermenge in einer Zelle die Menge überschreitet, die sie aufnehmen kann, wird diese Zelle überflutet. Wenn mehrere benachbarte Zellen die volle Kapazität haben, werden sie als eine Zelle behandelt, die gemeinsame Nachbarn haben (denken Sie an Minesweeper, wenn Sie auf eine Gruppe von Leerzeichen klicken).
- Eine einzelne mittlere Zelle hat 4 Nachbarn
- Zwei benachbarte mittlere Zellen mit voller Kapazität werden als eine Zelle mit 6 Nachbarn behandelt
- Eine einzelne Eckzelle hat 2 Nachbarn
- Eine Einzelwandzelle hat 3 Nachbarn
Wenn eine Zelle überflutet, tritt ein Überflutungsereignis auf. Das überschüssige Wasser wird gleichmäßig an die Nachbarn verteilt. Wenn dies zu einer Überschwemmung eines oder mehrerer Nachbarn führt, tritt ein weiteres Überschwemmungsereignis auf. Dies setzt sich fort, bis sich das Wasser gesetzt hat oder die Stadt vollständig überflutet ist.
Beispiel Eingabe
7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 2 2 2
0 0
1 2
4 3
0 0
bedeutet, dass es in Zeile 1, Spalte 1 geregnet hat1 2
bedeutet, dass es in Reihe 2, Spalte 3 geregnet hat (die kein Wasser fassen kann und sofort überschwemmt!)
p
Wenn die Stadt nach Regentagen vollständig überflutet ist, geben Sie Sink aus . Andernfalls geben Sie Swim aus .
Beispielausgabe
Schwimmen
Annahmen
- Die Eingabe kann über stdin erfolgen, aus "city.txt" gelesen oder als Argument akzeptiert werden. Alle drei sind erlaubt, um bereits gepostete Antworten nicht ungültig zu machen.
- Die Wasserkapazitäten sind nicht negative ganze Zahlen.
Über 40 Teams von Studenten (von A & M, UT, LSU, Rice, Baylor usw.), die an einem Programmierwettbewerb mit verschiedenen verfügbaren Sprachen teilgenommen haben, konnten dieses Problem nicht in 5 Stunden lösen. Aus diesem Grund kann ich nur erwähnen, dass dieses Rätsel einen Haken hat, der die Lösung trivial macht. Der kürzeste Code gewinnt immer noch, weil ich so zuversichtlich bin, dass der kürzeste Code auch das Rätsel lösen wird.
n
umm
Wertelinien oder umgekehrt? Ihr Beispiel entspricht nicht der schriftlichen Spezifikation.0.25
Einheiten auf jede benachbarte Zelle (unter der Annahme einer einzelnen mittelüberfluteten Zelle)?Antworten:
Golfscript,
3730 ZeichenNeu und verbessert, danke an PeterTaylor für die Tipps:
Erklärung :
Das Programm wird dann beendet und der Stapel ausgegeben.
Alte Version + Erklärung:
Gleicher Ansatz wie Fors , nur Golfscripted =). Kann wahrscheinlich effizienter gemacht werden. Die Eingabe erfolgt von stdin.
Erklärung :
Das Programm gibt dann den Stapel aus, der nur die Antwort ist.
quelle
]
Ohne eine Übereinstimmung[
wird der gesamte Stapel in einem Array gesammelt, so dass eine Initiale[~]
vereinfacht werden kann~]
.grid_size
Verwenden Sie<
, um die ersten Elemente eines Arrays abzurufen, und<{+}*
sparen Sie so mit ziemlicher Sicherheit etwas an der Addition der Gesamtkapazität.0>"Sink""Swim"if
kann sein0>"SinkSwim"4/=
~]
? Ich habe es versucht und es schien nicht zu funktionieren. Der letzte Hack ist schön, obwohl es sein muss"SwimSink"
- wird es verwenden. und die Array-Sache scheint auch vielversprechend, wird daran arbeiten.ruby golfscript.rb
und es hat immer noch nicht funktioniert ... kannst du überprüfen, ob es auf deiner Seite funktioniert? Ich bekomme den gleichen Fehler auf beiden:undefined method '+' for nil:NilClass (NoMethodError)
C:
1009695 Zeichen5 Stunden? Hat fünf Minuten gedauert. :)
Aragaer, danke für die Vereinfachungen! Ich habe jedoch die Variablendeklarationen und -argumente in main neu angeordnet, da Clang einen Fehler auslöst, wenn das zweite Argument in main von einem anderen Typ ist als
char **
.quelle
p;main(n,m){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m),p-=m);puts(p>0?"Sink":"Swim");}
n,m;main(p){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}
. Ich habe auch mit Ahnung von gespieltn-=scanf
, bin mir aber nicht sicher, ob das Programm danach korrekt sein wird. Erstensscanf
kann nach vorne verschoben werden,for
ohne die Zeichenanzahl zu ändern.n-=scanf...
würde nicht funktionieren, da es sich imn-=1
Grunde genommen um ein Pre-Inkrement handelt, sodass es die südöstliche Ecke verfehlen würde. Die andere Veränderung ist großartig.Python, 4 Zeilen, 175 Zeichen
Lol, ich frage mich, ob die 40+ Teams den Haken gefunden haben ... nachdem sie es auf die harte Tour gebracht haben.
quelle
#
.input()
undmap()
:n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
J (50 Zeichen) und K (40) doppeltes Merkmal
Wie üblich haben diese beiden die exakt gleiche Struktur in ihren Lösungen, also sind sie beide hier. K ist jedoch viel kürzer, was eine angenehme Überraschung ist.
Erläuterung:
".1!:1]1
- Lesen Sie die erste Zeile ein und konvertieren Sie sie in ganze Zahlen.(...)/0 2{
Nehmen Sie die Elemente bei Index 0 und 2 (-n
undp
jeweils), und verwenden Sie sie als die linke und rechte Argumente auf das Verb(...)
, respectively.+1!:1@#1:
-n+p
Zeilen einlesen.[+/@".@$
- Nehmen Sie ($
) die erstenn
Zeilen ([
), verwerfen Sie den Rest und konvertieren Sie dann in ganze Zahlen (".
) und addieren Sie in jeder Zeile (+/
).]<[:+/
- Addieren Sie die Zeilensummen und vergleichen Sie diesen Wert mit dem richtigen Argumentp
. Wir produzieren wahr, wennp
weniger als die Summe ist.>Sink`Swim{~
- Wählen Sie aus,Swim
ob die obige Kompression zu true oderSink
false führte.Verwendungszweck:
Und jetzt das K:
Erklärt:
. 0:`
- Lesen Sie eine Eingabezeile ein und konvertieren Sie sie in ein Array von Ganzzahlen.{...}.
- Verwenden Sie diese drei Zahlenn m p
als Argumentex y z
für diese Funktion.0::'(x+z)#`
- Erstellen Siex+z
Kopien des Eingabedateizugriffs`
und lesen Sie dann jeweils eine Zeile ein (0::'
)..:'x#
- Nimm die erstenx
Gegenstände und wandle sie in einen Zahlenvektor um.z<+//
- Summieren Sie die gesamte Matrix und testen Sie, ob sie größer als istz
.`Sink`Swim@
- Geben Sie zurückSink
oder geben SieSwim
an, ob der Test wahr ist.Verwendungszweck:
quelle
APL, 35
Ich bin mir nicht sicher, ob es erlaubt ist, aber es akzeptiert keine Eingaben nach der "Stadt".
x←⎕
Übernimmt die Eingabe und speichert sie in einer Variablenx
(durch Leerzeichen getrennte Zahlen werden als numerisches Array interpretiert).1⌷
Extrahiert den Index 1 (APL-Arrays basieren auf Eins).⍳
Generiert ein Array von 1 bis zum Argument (1⌷x←⎕
in diesem Fall).¨
"Map"{+/⎕}
-Operation Geben Sie die Summe ein und geben Sie sie zurück.+/
Summieren Sie das durch die Kartenoperation erzeugte Array.4×x[3]>
Testen Sie, ob die Summe <x[3]
(1 oder 0) ist, und multiplizieren Sie dann 4.'SwimSink'⌽⍨
Drehen Sie die Zeichenfolge'SwimSink'
um diesen Betrag4↑
. Extrahieren Sie schließlich die ersten 4 Zeichen der Zeichenfolgequelle
⎕IO←0
, und ersetzen Sie dann4↑'SwimSink'⌽⍨4×
mit'Swim' 'Sink'⊃⍨
,x[3]
mitx[2]
und1⌷x
mit⊃x
, um zwei Bytes zu speichern.AWK, 70
Dies ist eine Verbesserung von laindir zu meiner Behauptung (86):
quelle
NR<=h
sollte seinNR<=h+1
, sonst erhalten Sie falsche Senken, da die letzte Zeile der Kapazitäten übersprungen wird. Dies kann auch auf 70 als verkürzt werdenn{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
CoffeeScript -
128113Eine Funktion, die die Zeichenfolge als einziges Argument verwendet:
quelle
`p>x?"Sink":"Swim"`
stattif p>x then"Sink"else"Swim"
. Parens für die dritte Anweisung werden ebenfalls nicht benötigt.SED, 128
Es hat Spaß gemacht, eine
sed
Version davon zu schreiben . Es hat folgende Mängel:Es wird davon ausgegangen, dass die Stadt mehr als zwei Säulen hat, um Regenlinien leicht zu erkennen.
Es wird davon ausgegangen, dass die Kapazität jeder Stadt im Bereich von 0 bis 9 liegt.
Hier ist es:
Rufen Sie mit der
-n
Flagge.quelle
SWI-Prolog 79
Wenn es Ihnen nichts ausmacht, dass diese Antwort nicht über stdin, sondern per Abfrage eingegeben wird:
Die Antwort validiert das Eingabeformat nicht, aber ich glaube nicht, dass es ein Problem ist, da Sie dies auch beim Programmierwettbewerb nicht tun müssen.
Beispielabfrage (mit Beispiel in der Frage):
quelle
Python - 152
quelle
,
, vor und nach'
, nach)
...Scala - 128
Es könnte möglich sein, einige Klammern oder ähnliches wegzulassen, aber Scala ist sehr wankelmütig in Bezug auf Interpunktion und punktfreien Stil und () vs {} und so weiter.
quelle
Javascript - 73 Zeichen
Angenommen, die Eingabe befindet sich in der Variablen
s
und gibtSwim
oder ausSink
.Beispiel:
Von der ursprünglichen Frage - Eingabe in die Browserkonsole:
Ausgänge:
quelle