Einführung
Sisyphus hatte in letzter Zeit einige Probleme bei der Arbeit. Es scheint, als würde er einfach nie etwas erledigen und würde gerne eine Lösung für dieses Problem finden.
Seine jetzige Beschäftigung erfordert es, einen Stein einen Hügel hinauf zu rollen. Normalerweise macht er seine Arbeit gut, aber jedes Mal, wenn er sich der Spitze des Hügels nähert, rollt es wieder runter.
Er ist sehr frustriert von seiner Arbeit und möchte das Problem wissenschaftlich lösen, indem er einen Computer den Stein simulieren lässt, der den Hügel hinunter rollt.
Es kommt also vor, dass Sisyphus nicht besonders gut programmiert, also können Sie ihm vielleicht helfen?
Die Herausforderung
Nach dieser dummen Einführung kommen wir zur Sache. Ihr Programm erhält eine Abbildung des Hügels und des Felsens, die ungefähr so aussieht:
#o
##
###
######
########
Wo #
repräsentiert ein Teil des Hügels und o
repräsentiert den Felsen.
Sie müssen jetzt ein Programm implementieren, das die Rock 1-Ebene nach unten bewegt. Zum Beispiel sollte die Ausgabe des oben genannten sein:
#
##o
###
######
########
Wenn es einen horizontal ebenen Bereich gibt, rollt der Hügel nur horizontal, also ...
o
########
... dies würde den Stein nur zur Seite rollen lassen.
o
########
Wenn es eine vertikale Fläche gibt, fällt der Stein eine Stufe herunter, also ...
#o
#
#
#####
...ergäbe...
#
#o
#
#####
Sie erhalten auch die Breite und Höhe des Bildes jeweils in einer Zeile über dem Bild. Insgesamt würde unsere Beispieleingabe also so aussehen:
10 5
#o
##
###
######
#########
(Beachten Sie, dass die Leerzeichen hier Leerzeichen sind. Wählen Sie den Text aus und sehen Sie, was ich meine.)
Ein paar Details
- Befindet sich der Rock beim Ausführen des Programms bereits in der letzten Zeile, können Sie entweder das Programm beenden oder die unveränderte Eingabe ausgeben
- Der Hügel geht immer nur bergab
Ihr Programm sollte die Ausgabe genauso formatieren wie die Eingabe (einschließlich der Abmessungen). Wenn Sie also die Ausgabe des Programms an sich selbst weiterleiten, berechnet es den nächsten Schritt.
Sie können davon ausgehen, dass es immer einen Weg nach unten gibt, sodass Eingaben, bei denen der Pfad "blockiert" ist, undefiniertes Verhalten verursachen können
Sie können davon ausgehen, dass in der letzten Zeile immer ein Leerzeichen steht. Der Stein sollte dort "ruhen". Nachdem Sie das Programm einige Male aufgerufen haben und die Ausgabe immer in sich selbst weitergeleitet haben, sollten Sie den Stein in der letzten Zeile an der Stelle ablegen, an der er sich zuvor befunden hat.
Sie können Eingaben in jeder beliebigen Form akzeptieren (stdin, file, ...). Sie müssen das GANZE Programm veröffentlichen (so dass alle vorinitialisierten Variablen als Code gelten).
Die Zeilen enden mit
\n
.Sie können einige Beispiel - Eingänge erhalten hier (stellen Sie sicher , dass Sie die Räume richtig zu kopieren!)
Das ist Code-Golf , also gewinnt die funktionierende Vorlage mit den wenigsten Bytes .
Der Gewinner wird am 26. Juli 2014 ausgewählt. Danach können Sie Lösungen posten, aber nicht gewinnen
Wenn Sie Fragen haben, lassen Sie es mich in den Kommentaren wissen.
Viel Spaß beim Golfen!
#
s, so dass am Ende ein Leerzeichen steht, da die Breite 10 beträgt. In diesem Fall würde der Stein (nach einigen Iterationen) dort liegen, wo sich das Leerzeichen befindet (also unten) -rechte Ecke).Antworten:
Regex (.NET, Perl, PCRE, JavaScript, ...), 25 Byte
Ja, dies wird wieder einige Debatten auslösen, ob ein regulärer Ausdruck ein gültiges Programm ist, aber ich gehe dem zuvor und sage, dass diese Einreichung nur zum Spaß ist und nicht für den Gewinner in Betracht gezogen werden muss. (Im Gegensatz zur 31-Byte-Perl-Variante unten;).)
Hier ist also eine reine Regex-Ersatzlösung.
Muster (Leerzeichen beachten):
Ersetzung (beachten Sie das führende Leerzeichen):
Die Byteanzahl ist für die Summe der beiden.
Sie können es unter http://regexhero.net/tester/ testen . Stellen Sie sicher, dass Sie Zeilenenden im Unix-Stil auswählen und die eingefügte Formatierung beim Einfügen beibehalten. Wenn es immer noch nicht funktioniert, haben Sie immer noch Zeilenenden im Windows-Stil eingefügt. Die einfachste Lösung ist in diesem Fall zu ersetzen ,
\n
mit\r\n
in dem Muster zu sehen , dass es funktioniert.Hier ist eine 48-Byte- ECMAScript 6-Funktion, die dies verwendet
Endlich habe ich auch ein aktuelles Programm. Es sind 31 Bytes Perl (einschließlich zwei Bytes für
p
und0
Flags; danke an Ventero für den Vorschlag!).Wenn Sie es testen möchten, speichern Sie es nicht einmal in einer Datei
quelle
\n
mit\r\n
)Python - 190
Slicing- und Verkettungs-Horror, zusammen mit viel zu vielen Variablen. Ich bin mir sicher, dass man mehr Golf spielen kann, aber mir fallen momentan keine cleveren Python-Funktionen ein. Die Eingabe wird in einer Zeichenfolge gespeichert
s
.Da Python-Strings unveränderlich sind, ersetze ich ein Zeichen, indem ich alle Zeichen davor, mein neues Zeichen und alle Zeichen danach verkette. Anhand der Hügelbreite und der Indexierung bestimme ich, wohin der Fels rollen soll.
quelle
Ruby, 65/55 Zeichen
Ich denke, ich würde sehen, wie lange eine Lösung dauert, die das Problem nicht einfach in den Griff bekommt.
Es ist erwartungsgemäß nicht so kurz wie die Regex-Lösung von m.buettner - aber auch nicht viel länger.
Bei Verwendung von Interpreter-Flags kann dies auf 55 Zeichen verkürzt werden (53 für den Code, 2 für die Flags):
Führen Sie den Code wie folgt aus:
quelle
HTML JavaScript - 251 Zeichen
( 251, wenn Sie den Code in den einfachen Anführungszeichen zählen, die die Eingabe lesen und die Ausgabe zurückgeben. 359, wenn Sie das Eingabefeld, die Eingabezeichenfolge, die Schaltfläche usw. zählen. 192, wenn Sie genau das zählen, erledigt die Arbeit.)
Golf Code:
http://goo.gl/R8nOIK
Klicken Sie immer wieder auf "Go".
Methode
Ich verwende String.match (), um einen Hügel in 5 Teile aufzuteilen, dann ändere ich ein oder zwei Teile. Ich lerne JavaScript, daher sind alle Vorschläge willkommen.
Lesbarer Code
quelle
Python 2 -
289252 BytesIch habe einige bedeutende Verbesserungen vorgenommen, aber das ist immer noch schrecklich. Ein paar weitere Bytes können durch Konvertieren in Python 3 gespeichert werden, aber ich kann nicht bearbeitet werden.
Zuerst finde ich den Felsen. Wenn das Zeichen direkt darunter steht
'#'
, ersetzen Sie jede Instanz von'o '
durch' o'
. Da am Ende garantiert ein zusätzliches Leerzeichen vorhanden ist, wird der Stein immer nach rechts verschoben.Egal, ob ich das gerade getan habe oder nicht, ich transponiere das gesamte Raster mit
zip(*m)
. Dann mache ich noch einen Ersatz'o '
mit' o'
. Wenn sich rechts vom Felsen ein Feld befindet, bedeutet dies, dass sich im realen Gitter ein Feld darunter befindet, sodass es verschoben wird. Dann transponiere ich zurück und drucke.quelle
#
, und ich mache diese Prüfung, bevor ich die Prüfung mache, um mich vertikal zu bewegen.Python (201)
quelle
awk, 152
Mehr lesbar
quelle
PHP
485484 ZeichenIch weiß, dass dies im Vergleich zum Einstieg von m.buettner massiv ist, aber es ist das Beste, was ich im Moment tun kann. Ich denke, es muss eine schnellere Möglichkeit geben, die Eingabezeichenfolge in ein mehrdimensionales Array umzuwandeln, aber jetzt ist es sehr spät.
Und obwohl es nicht wettbewerbsfähig ist, hat mir dieses Rätsel gefallen. Möchte, dass die Erweiterung anzeigt, wo der Ball landet, oder nach einer festgelegten Anzahl von Schritten, möglicherweise nach der Breite und Höhe in der Eingabezeile hinzugefügt. Könnte das sehr leicht zu dieser Version hinzufügen.
Hier ist mein Code: Die Eingabe erfolgt in der ersten Variablen.
Sie können es hier in Aktion auf dem Codepad sehen
Bearbeiten: Codepad und Code oben geändert, da 0 anstelle von o ausgegeben wurde, was zu Problemen führte, als ich versuchte, die Ausgabe wieder in das Programm einzuspeisen. Jetzt behoben und ein Zeichen gespeichert!
quelle
Groovy -
263261256 ZeichenGolf gespielt. Lesen Sie die Datei in einen String und verwenden Sie eine Funktion
p
, um eine Funktion zu emulierenString.putAtIndex(index,value)
:Ungolfed (etwas):
quelle
try{
anstelle vontry {
undcatch(Exception
anstelle von schreibencatch (Exception
.R 234
Die Manipulation von Strings ist nicht die größte Stärke von R.
Besser lesbar:
quelle
C (182)
Oder, wenn Sie den Code tatsächlich lesen möchten:
quelle
Clojure - 366 Zeichen
Ohne Regex. Erforderliche Eingabedatei mit dem Namen "d". Golf gespielt:
Ungolfed:
Probelauf (nur ein Fall, der Kürze halber):
Ich bin ein Neuling. Vorschläge sind willkommen.
quelle
MATLAB, 160
Der schmerzhafte Teil ist die Dateieingabe. Die tatsächliche Berechnung würde nur 114 Bytes betragen:
quelle