Herausforderung
Sie erhalten eine Tabelle als Eingabe, gezeichnet mit ASCII |
und _
. Ihre Aufgabe ist es, die Stühle darum zu stellen.
Beispiel
Eingang:
____
| |
| |
| |
| |
|____|
Ausgabe:
_^_^_
< >
| |
< >
| |
<_ _ _>
v v
Diese Stühle bestehen aus <>
und v^
.
Ein anderes Beispiel:
Die Linie muss so viele Stühle wie möglich enthalten.
_____
| |_____
| |
| |
| |
| _____|
|_____|
_^_^_
< |_^_^_
| >
< |
| |
< _ _ _>
|_ _ _| v v
v v
Zwischen jedem Stuhl muss ein Leerzeichen sein. Und >_^_^_<
ist ungültig, sollte es sein |_^_^_|
.
_____ _____
| |_____| |
| |
| |
| |
| ___________|
|_____|
_^_^_ _^_^_
< |_^_^_| >
| |
< >
| |
< _ _ _ _ _ _>
|_ _ _| v v v v v
v v
Auf der Innenseite eines "Donuts" dürfen sich keine Stühle befinden.
_________________
| _____ |
| | | |
| | | |
| |_____| |
|_________________|
_^_^_^_^_^_^_^_^_
< _____ >
| | | |
< | | >
| |_____| |
<_ _ _ _ _ _ _ _ _>
v v v v v v v v
^
und v
priorisieren <
und >
. Kein Stuhl für sich allein (er muss mindestens einen haben |
oder _
in der Reihe stehen).
_________________
| _____ |
| | | |
| | |_____|
| |_____
|___________|
_^_^_^_^_^_^_^_^_
< _ _ _ >
| | v v | |
< > <_ _ _>
| |_^_^_ v v
<_ _ _ _ _ _|
v v v v v
Dies ist Codegolf, also gewinnt der kürzeste Code.
Antworten:
Python 2,
10331007924879829787713699692691688687672670664659654648643642630625623620570560554545518514513510505492476454451443 Bytes6 Bytes gespart dank Riley
6 Bytes gespart dank Adnan
Da diese Frage über ein Jahr alt ist und noch keine Antworten hat, dachte ich, ich würde es versuchen.
Probieren Sie es online!
Das Programm liest aus der Tabelle eine Datei mit dem Namen
I
und druckt die Tabelle mit ihren Stühlen ausstd::out
. Ich war mir bei einigen Randfällen nicht sicher, also habe ich mein bestes Urteil abgegeben (was auch immer die geringste Anstrengung erfordert hat), aber es scheint alle Testfälle zu bestehen. Einige der Ausgänge stimmen nicht genau überein, aber sie haben alle die gleiche Anzahl von Stühlen.Erläuterung
Die erste Zeile legt einfach einige Definitionen fest, die uns in Zukunft Bytes sparen werden:
(Ich werde diese Makros für die Lesbarkeit in zukünftigen Zeilen entpacken)
Dann werden wir eine Datei mit dem Namen öffnen,
I
weil wir bereits eine Variable haben, die kurz dafür ist, so dass ein paar Bytes gespart werden.Wir teilen uns entlang von Zeilenumbrüchen, um eine Liste von Zeichenfolgen zu erstellen (Die Zeilen des Bildes)
Ich finde dann die Länge der längsten Zeile, so dass ich alle Zeilen auf diese Länge auffüllen kann. (Ich füge auch 3 hinzu, weil wir ein bisschen zusätzliche Polsterung brauchen)
Dann führen wir das eigentliche Auffüllen durch und erstellen einen Rand aus
I
Zeichen am Rand. Dies liegt daran, dass wir später den Unterschied zwischen der Innenseite und der Außenseite der Form feststellen müssen. Wir werden auch den Datentyp von einer Liste von Zeichenketten in eine Liste von Zeichenketten (Länge 1 Zeichenketten) ändern.Die nächste Zeile ist nur eine weitere Definition zum Speichern von Bytes.
(Ich werde auch dieses auspacken)
Jetzt möchten wir die
I
Zeichen auf alle Bereiche außerhalb der Form verteilen . Wir können dies mit einem Pseudozellularautomaten tun. JedesI
wird sich auf alle benachbartenZeichen ausbreiten . Wir konnten Schleife , bis der Automat jedoch stabilisiert dies kann nicht mehr Iterationen dauern , als es Zeichen , so dass wir nur eine Schleife durch alle Zeichen
b
(dem ursprünglichen Eingang)Bei jeder Iteration möchten wir jedes Zeichen in der 2D-Liste übergehen (mit Ausnahme der äußersten Auffüllung).
Für jede Position führen wir den folgenden Code aus:
Lassen Sie uns das aufschlüsseln.
Wir haben ein Wenn mit zwei Bedingungen, die durch ein
&
(bitweisesand
) getrennt sind.Die erste prüft einfach, ob sich
I
in einer der benachbarten Zellen eine befindet, und die zweite prüft einfach, ob die aktuelle Zelle eine ist" "
. Wenn wir diese Bedingungen erfüllen, setzen wir die aktuelle Zelle auf eineI
.Nachdem wir das Äußere und Innere der Form bestimmt haben, können wir damit beginnen, die Stühle um den Tisch zu platzieren.
Nochmals durchlaufen wir alle Zellen (und setzen weitere Shorthands)
Hier ist mein Lieblingsteil. Wenn Sie sich bisher durch mein langweiliges, meist auf Definitionen basierendes Golfspiel geschlichen haben, werde ich Sie mit einem guten Schuss cleveren Golfspiels belohnen (wenn ich es selbst sage).
Ein kleiner Hintergrund in Python:
Wenn Sie in Python versuchen, einen Wörterbuchschlüssel zweimal zuzuweisen, weist er dem letzteren einen zu. Zum Beispiel
Wir werden diese Eigenschaft missbrauchen, um die aktuelle Zelle einem bestimmten Zeichen zuzuweisen.
Die erste Bedingung ist
Befindet sich die Zelle in der Mitte einer Kante mit 3
_
Zeichen, werden die aktuelle Zelle und die Zelle darunter neu zugewiesen. Wir weisen es dem Ergebnis der Indizierung eines überladenen Wörterbuchs durch zuI
. Wir setzen zuerst unseren Standardwert mit dem Paar,"I":"_"+a[x+1][y]
dh wenn keine Änderung erfolgt, werden die beiden Zellen wieder auf ihre ursprünglichen Werte zurückgesetzt. Als nächstes fügen wir das Paar hinzua[x-1][y]:"^ "
. Dies macht nichts (wichtig), es sei denn, die Zelle über der aktuellen (a[x-1][y]
) ist mit einem gefülltI
. Wenn ein vorhandenI
ist, wird der Standardwert überschrieben, der uns auffordert, einen Stuhl in der aktuellen Zelle zu platzieren. Als nächstes bewegen wir uns zu der Zelle unter der aktuellen Zelle, wenn diese ZelleI
erneut überschrieben wird, um einen nach oben gerichteten Stuhl unter der aktuellen Stelle zu platzieren.Die nächste Bedingung ist ein bisschen einfacher
Wir prüfen, ob die aktuelle Zelle und die Zelle darüber beide sind
|
. In diesem Fall haben wir ein Wörterbuch erstellt.Das erste Paar im Wörterbuch
"I":"|"
legt die Standardeinstellung fest. Da wir auf den Schlüssel zugreifen werden,I
wenn erI
nicht neu zugewiesen wird, wird er standardmäßig auf|
(das Zeichen, das er bereits ist) zurückgesetzt und es wird nichts unternommen.Fügen Sie die beiden Tasten hinzu.
A[y+1]:">",A[y-1]:"<"
Wenn eine der beiden Zellen links und rechts istI
, wird die aktuelle Zelle einem Stuhl zugewiesen, der nach außen zeigt.Jetzt müssen wir nur noch ausgeben. Wir können jedoch nicht einfach drucken, sondern müssen erst einige Dinge im Haushalt erledigen. Wir müssen zurück in einen String konvertieren und alle von
I
uns erstellten s entfernen . Dies geschieht in einer Zeile.quelle
i,o="I "
anstatt zui="I";o=" "
arbeiten?n
kostet 4 Bytes und spart mir 6. Obwohl ich es nicht oft benutze, spart es 2 Bytes.