Einführung
Erfahrene Code-Golfer haben uns auf die Flut des Jüngsten Gerichts vorbereitet . Risikogebiete wurden evakuiert und die Bevölkerung in die Höhe getrieben.
Wir haben die Flut unterschätzt (oder es gab einen Fehler im Code von @ user12345). Einige hochgelegene Gebiete nähern sich rasch dem Meeresspiegel. Um das Überleben der nun dicht besiedelten Lager zu sichern, müssen Mauern errichtet werden. Leider verfügt die Regierung nur über ein begrenztes Angebot an Mauern.
Problem
Unser Schreckensszenario wird durch zwei Zahlen in einer Zeile beschrieben, n
und m
. Auf diese Zeile folgen n
Zeilen mit m
Werten pro Zeile, die nur durch ein Leerzeichen voneinander getrennt sind. Jeder Wert besteht aus vier Zeichen.
x
Unpassierbar. Wasser kann hier nicht fließen. Wände können hier nicht errichtet werden.-
Instabil. Hierdurch kann Wasser fließen. Wände können hier nicht errichtet werden..
Stabil. Hier kann Wasser durchströmen. Hier können Wände errichtet werden.o
Lager. Hier kann Wasser durchströmen. Wenn doch, stirbt jeder. Wände können hier nicht gebaut werden.
Wasser fließt von allen Rändern der Karte, es sei denn, die Kante ist unpassierbar oder die Kachel ist mit einer Wand versehen. Schreiben Sie ein Programm, das die Mindestanzahl von Wänden ausgibt, die zum Schutz eines Lagers erforderlich sind.
Beispiel Eingabe
6 7
x . . x x x x
x . . x - - x
x . x x - - x
x . o o o - .
x . o o o - .
x x x x x x x
Beispielausgabe
3
Annahmen
- Wasser fließt nur orthogonal
- Lager existieren nur als ein orthonal zusammenhängender Block pro Szenario
- Es wird immer eine Lösung geben (obwohl dafür möglicherweise viele Wände erforderlich sind)
- Lager können nicht an einer Kante lokalisiert werden, da das Szenario dann keine Lösung hätte
- 2
n
<<16 - 2
m
<<16 - Die Eingabe kann von stdin bereitgestellt, aus "city.txt" gelesen oder als einzelnes Argument akzeptiert werden
Kürzester Code gewinnt!
Antworten:
Mathematica,
257253 ZeichenDie Eingabe wird von gelesen
"city.txt"
.Erläuterung:
Mathematica hat viele Funktionen, um mit Graphen umzugehen.
Zuerst lese ich die Daten aus
"city.txt"
.Dann konstruiere ich ein Gitterdiagramm mit 'm' * 'n' Eckpunkten (
GridGraph@d[[1,{2,1}]]
) und füge einen "Eckpunkt im Unendlichen" hinzu, der mit jedem Eckpunkt an den "Kanten" des Diagramms verbunden ist. Von diesem Scheitelpunkt fließt das Wasser ab.Und
o
,x
unds
bezeichnen die Positionen von "o", "x" und "." beziehungsweise.Dann lösche ich für jede Untergruppe
w
vons
(die Untergruppen sind nach Länge sortiert) die Scheitelpunkte inx
undw
ausg
(VertexDelete[g,x⋃w]
) und finde die Länge des kürzesten Pfades vom "Scheitelpunkt im Unendlichen" zum Lagero
. Wenn die Länge unendlich ist, ist das Lager sicher. Die Länge der erstenw
ist also die minimale Anzahl von Wänden, die zum Schutz eines Lagers erforderlich sind.quelle
C
827 799522Golf gespielt:
Die Eingabe erfolgt mit der Höhe und mit als Befehlszeilenargumenten, und dann wird das Raster wie folgt als einzelne Zeichenfolge auf stdin gelesen:
./a.out 6 7 < input
wobei die Eingabe in dieser Form erfolgt (von links nach rechts, von oben nach unten):"Lesbar":
Nicht annähernd so kurz wie die Lösung von @Claudiu, aber sie läuft rasend schnell. Anstatt sich von den Rändern aus zu füllen, findet es das Lager und wirkt von den O-Marken nach außen.
Beispielwandplatzierungen:
quelle
@
). Ich habe versucht, Ihren Code selbst auszuführen, aber es schien nicht zu funktionierenPython,
553525512449414404387368 Zeichen (+4? Für den Aufruf)Ich hatte viel zu viel Spaß beim Golfen. Es ist 82 Bytes größer, wenn Sie versuchen, es zu komprimieren! Das ist ein Maß für Kompaktheit und mangelnde Wiederholung.
Einrückungsstufen sind Leerzeichen, Tabulator.
Verwendung :
Liest aus
city.txt
:Rufen Sie wie folgt auf:
Das
2>X
soll stderr verstecken, da das Programm durch Auslösen einer Ausnahme beendet wird. Wenn dies als unfair angesehen wird, können Sie 4 Zeichen für den Aufruf hinzufügen.Erläuterung :
Einfache rohe Gewalt.
C
führt eine Überflutung durch und gibt true zurück, wenn es auf ein Lager trifft. Keine zusätzliche Polsterung, da die richtige Polsterung zu viel Platz in Anspruch nahm.D
RuftC
von jedem Punkt an der Kante aus, derC
diese Wände berücksichtigt, und druckt Länge und Ausgang, wenn keine von ihnen das Lager erreicht. Die Liste der Wände wird auch verwendet, um die Überflutung zu verfolgen, so dass kein Kopieren der Tafel erforderlich ist! Trickily,C
auch alle leeren Stellen hängt sie in eine Liste findetS
, so dass die FunktionD
wird auch zum ersten Konstrukt die Liste der leeren Stellen eingesetzt. Aus diesem Grund benutze ichsum
stattany
, um all das zu gewährleisten.
s beim ersten Durchlauf gesammelt werden.Ich rufe
D
einmal, dann die Liste der freien Stellen in kopieren ,Z
daS
zu werden halten angehängt (ineffizient, aber billiger auf Zeichenzählung). Dann benutze ichitertools.combinations
, um jede Kombination von leeren Stellen auszuwählen, von 0 Stellen bis. Ich führe jede Kombination durchD
und sie gibt die Länge der ersten funktionierenden aus und löst eine Ausnahme aus, um das Programm zu beenden. Wenn keine Antwort gefunden wird, wird nichts gedruckt.Beachten Sie, dass das Programm derzeit nicht funktioniert, wenn keine Wände benötigt werden. Es wären +3 Zeichen, um sich um diesen Fall zu kümmern. nicht sicher, ob es notwendig ist.
Beachten Sie auch, dass dies ein
O(2^n)
Algorithmus ist, bei demn
die Anzahl der leeren Stellen angegeben ist. Also, für ein 15x15 komplett leeres Brett mit einem Lager in der Mitte, das wird dauern2^(15*15-1)
=2.6959947e+67
Iterationen zu vervollständigen, die in der Tat eine sehr lange Zeit sein werden!quelle
Groovy:
841805754Ungolfed:
Viel mehr Golfen kommt noch ...
Gibt 2E9 zurück, wenn keine Lösung vorliegt.
quelle
Dyalog APL , 91 Bytes
⊃∊{1∊a[⍸×{(×d)∧s 3∨/3∨⌿⍵}⍣≡4=d←0@⍵⊢a]:⍬⋄≢⍵}¨c[⍋≢¨c←(,⍳2⊣¨b)/¨⊂b←⍸2=a←(s←(4,4,⍨⍉)⍣2)'xo.'⍳⎕]
geht davon aus
⎕IO=0
, dass Funktionen ab v16.0 (@
und⍸
) verwendet werden und die Laufzeit in der Anzahl.
-s exponentiell ist⎕
Eingaben ausgewertet wird, muss eine Matrix von Zeichen sein'xo.'⍳
Ersetzex
mit 0,o
mit 1,.
mit 2 und alle anderen mit 3s←(4,4,⍨⍉)⍣2
eine Funktion, die eine Matrix mit 4s umgibta←
Weisen Sie einer Variablen die mit 4s umgebene numerische Matrix zua
b←⍸2=
b
ist die Liste der Koordinatenpaare, in denen sich die 2en (dh die.
-s) befinden(,⍳2⊣¨b)/¨⊂b
generiere alle Kombinationen von Elementen vonb
c[⍋≢¨c←...]
sortiere sie nach Größe{... :⍬⋄≢⍵}¨
Überprüfen Sie für jede Kombination etwas und geben Sie entweder dessen Länge oder eine leere Liste zurück⊃∊
das erste nicht leere Ergebnisd←0@⍵⊢a
d
wirda
bei einigen Elementen durch 0 ersetzt4=
Boolesche Matrix erstellen - wo sind die 4er? dh die Grenze, die wir hinzugefügt haben{...}⍣≡
Wenden Sie die Funktion so lange an,{}
bis sich das Ergebnis stabilisiert hat3∨/3∨⌿⍵
"boolean" oder "jedes Element mit seinen Nachbarn"s
Das Ergebnis wird kleiner, also erstellen wir den Rahmen neu(×d)∧
Wenden Sie die Nicht-Null-Elemente vond
(die Nicht-Wände) als Boolesche Maske ana[⍸× ...]
Wasa
entspricht der 1 in unserer Booleschen Matrix?1∊
Gibt es Einsen, dho
Lager?quelle