Gackern gackern Niemand weiß, warum das Huhn die Straße überquerte, vielleicht war da ein gut aussehender Hahn auf der anderen Seite. Aber wir können herausfinden, wie. Schreiben Sie ein Programm, das von links nach rechts diese (oder jede andere) "Straße" kreuzt.
1356 | 1738
3822 | 1424
3527 3718
9809 | 5926
0261 | 1947
7188 4717
6624 | 9836
4055 | 9164
2636 4927
5926 | 1964
3144 | 8254
Ihr Programm "kreuzt" es und bewegt sich von links nach rechts. Sie beginnen mit einer beliebigen Zahl in der Spalte ganz links, die Sie möchten. Von dort aus können Sie zu einem beliebigen benachbarten Zeichen auf der rechten Seite wechseln. Wenn Sie oben links mit 1 begonnen haben, können Sie entweder mit 3 oder 8 beginnen. Jede Zahl, die Sie aufrufen, einschließlich der Startnummer, wird zu einer Summe addiert. Leerzeichen addieren sich nicht zu Ihrer Summe. "|" zwingt dich, dich nach oben oder unten zu bewegen, anstatt irgendwo rechts. (Sie KÖNNEN sich bei diesem Charakter NICHT vorwärtsbewegen) Ihr Ziel ist es, mit der kleinstmöglichen Summe auf die andere Seite zu gelangen. Ihr Programm muss die Summe am Ende ausdrucken und in der Lage sein, jede Straße zu lösen. Vorzugsweise könnte es auch Eingaben für eine Straße geben, dies ist jedoch nicht erforderlich. Ihr Programm muss sowohl den Pfad als auch die Summe ausgeben. Nur wenige Bytes Code gewinnen.
Zur Verdeutlichung können Sie sich diagnostisch bewegen, sofern Sie sich nicht auf einer vertikalen Leiste befinden. Sie können sich nur auf und ab bewegen, wenn Sie sich auf einer vertikalen Leiste befinden.
Für eine klarere Spezifikation von Straßen ist es im Grunde eine Zeichenfolge (oder ein Array von Spalten oder Zeilen, falls Sie dies bevorzugen), die den Regeln der Zeichen folgt, und es kann nichts ABER diese Zeichen enthalten die Straße. Es kann eine beliebige Zahl, ein Leerzeichen, ein Strich ("|") oder ein Zeilenumbruch sein. Wenn eine Straße, wie in ProgrammerDans Antwort, von einem Betrunkenen asphaltiert wurde, ist sie immer noch gültig, und Ihr Programm muss in der Lage sein, eine solche Straße zu lösen. Es wird nicht als Straße betrachtet, wenn es nicht möglich ist, auf die andere Seite zu gelangen (es gibt beispielsweise keinen Ausweg aus einer geraden Linie von Balken).
Ihr Programm muss nicht feststellen, ob eine Straße ungültig ist.
Taste:
Beliebige Zahl - addiert die Zahl zu Ihrer Summe und rückt vor.
Leertaste - Bewegen Sie sich vorwärts, es wird nichts zu Ihrer Summe hinzugefügt.
"|" - Bewegen Sie sich nach oben oder unten, es wird nichts zu Ihrer Summe hinzugefügt.
EDIT: Eine beispielhafte Lösung, wie vorgeschlagen. Ich kann keine schrecklich große machen, ich kann keine IDE finden, um sie für mich am Geldautomaten zu lösen.
Nehmen Sie diese kleine Straße:
9191 | 8282
1919 | 2727
5555 5555
Die Lösung wäre ein Pfad von 1, 1, 1, 1, Raum, Teiler, Teiler, Raum, Raum, 2, 2, 2, 2 für insgesamt 12.
EDIT # 2: Die Lösung für den ersten Weg zu dieser Frage, wie von Geobits und Völkerprogrammen bestimmt, ist 0,2,0,1,,, 1,4,1,4 für eine Summe von 13.
quelle
|
hintereinander geben?0,2,0,1, , , ,1,4,1,4 -> 13
Antworten:
Pyth,
168143141 bytes [jetzt Drunken Road kompatibel]Mein Testfall funktioniert, aber aufgrund eines Missverständnisses von meiner Seite, wird es mit dem ersten Beispiel nicht richtig funktionieren. Ich arbeite daran, es zu reparieren.Ich arbeite jetzt für ein Originalbeispiel und betrunkene Straßen
Einige
wirklichetwas weniger hässlichenCode:Teste es hier
Ich habe es auf einer Straße von 10 + 9 x 40 getestet.
quelle
Java, 955 Bytes
Ich werde natürlich keine Preise gewinnen, weil ich Java und so bin, aber ich liebe dieses Problem und wollte meinen eigenen Beitrag einreichen.
Funktionen und Grenzen:
Ok, genug Jibba Jabba. Golf Version:
Wie es meine Gewohnheit ist, Github mit dem ungolfed Code .
Lösung für "erste" Straße:
Zweites Beispiel:
Brian Tucks Beispiel:
"Betrunken" Brians Beispiel:
Visualisierte Lösung:
Genießen!
Edit: Jetzt zeige ich nur noch (zwei Fahrbahnen verschmelzen! Kann er es schaffen?)
Lösung:
(Bonus: Weg von ungolfed):
Details zum Algorithmus
Eine ausführlichere Erklärung der von mir angewendeten dynamischen Programmiertechnik wurde angefordert.
Ich verwende eine vorberechnete Lösungsmethode. Es hat einen richtigen Namen, aber ich habe ihn längst vergessen. vielleicht kann es jemand anderes anbieten?
Algorithmus:
Anmerkungen:
Das ist es. Wir scannen einmal von oben nach unten, von rechts nach links; Die einzigen Zellen, die (möglicherweise) mehrmals berührt werden, sind Pipes. Jedes Pipes wird jedoch nur einmal "gelöst", wodurch wir in unserem O (m * n) -Fenster bleiben.
Um mit "ungeraden" Kartengrößen fertig zu werden, habe ich mich dafür entschieden, die Zeilenlängen durch Auffüllen mit Nullzeichen vorab zu scannen und zu normalisieren. Nullzeichen gelten als "Nullkosten" und werden genauso wie Pipes und Leerzeichen verschoben. Dann stoppe ich beim Drucken der Lösung die Druckkosten oder bewege mich, wenn entweder der Rand der normalisierten Straße erreicht ist oder ein Nullzeichen erreicht ist.
Das Schöne an diesem Algorithmus ist, dass er sehr einfach ist, auf jede Zelle die gleichen Regeln anwendet, eine vollständige Lösung durch Lösen von O (m * n) -Unterproblemen liefert und hinsichtlich der Geschwindigkeit ziemlich schnell ist. Dabei wird der Arbeitsspeicher gegeneinander abgewogen, und es werden effektiv zwei Kopien der Straßenkarte erstellt, wobei die erste "Best-Cost" -Daten und die zweite "Best-Move" -Daten pro Zelle speichert. Dies ist typisch für die dynamische Programmierung.
quelle
c
als definieren-1>>>1
.