Einweisung
Sie sind ein Bot in einem 2D-Raster, das sich unendlich in alle vier Richtungen erstreckt, Nord, Süd, Ost und West. Wenn Sie eine Nummer erhalten, müssen Sie den Bot bewegen, damit Sie zur Zielnummer gelangen.
So funktioniert das Raster:
Sie können sich in 4 Richtungen bewegen: Nord, Süd, Ost oder West. Sobald Sie eine Zelle verlassen, dürfen Sie nicht mehr zu dieser Zelle zurückkehren (so effektiv, dass sie von der Karte gelöscht wurde).
Es gibt einen "Zähler", der geht 1234567890
(also geht es von 1
zu 2
... bis zu 9
, dann zu 0
, dann zurück zu 1
wieder), der sich bei jeder Bewegung ändert.
Sie haben auch einen "Wert", der bei 0 beginnt.
Sobald Sie sich in eine Richtung bewegen, wird eine mathematische Operation ausgeführt, je nachdem, in welche Richtung Sie sich bewegen:
- Norden: Ihr Wert wird durch counter (
value += counter
) erhöht . - Ost: Ihr Wert wird durch counter (
value -= counter
) dekrementiert . - Süd: Ihr Wert wird mit counter (
value *= counter
) multipliziert . - West: Ihr Wert wird durch counter (
value /= counter
) geteilt.- Division ist also eine ganzzahlige Division
5/2 -> 2
. - Sie dürfen nicht durch teilen
0
.
- Division ist also eine ganzzahlige Division
Beispiel:
Wenn sich der Bot dreimal nach Norden bewegt:
- Die erste "Nord" -Zug erhöht den Zähler auf
1
und addiert diesen zum Wert (der jetzt ist1
). - Die zweite "Nord" -Zug erhöht den Zähler auf
2
und addiert diesen zum Wert (der jetzt ist3
). - Die dritte "Nord" -Zug erhöht den Zähler auf
3
und addiert diesen zum Wert (der jetzt ist6
).
Der Endwert ist 6
.
Gehe nach Norden und dann wieder nach Süden:
- Die erste "Nord" -Zug erhöht den Zähler auf
1
und addiert diesen zum Wert (der jetzt ist1
). - Der zweite "Süd" -Zugfehler, da die Zelle, auf der der Bot sich bewegen möchte, entfernt wird (aus dem ersten Zug).
Es gibt keinen endgültigen Wert, da der Bot einen Fehler gemacht hat.
Herausforderung
Ihre Herausforderung besteht darin, ein Programm zu schreiben, wenn Sie unter Angabe einer Nummer die geeigneten Anweisungen für den Bot erstellen, damit der Endwert des Bots dieser Nummer entspricht.
Wenn die Zahl also lautet 6
, wäre eine gültige Lösung dafür:
nnn
(Der Bot bewegt sich dreimal hintereinander nach Norden).
Ihre Testwerte sind:
49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553
(Dies sind 50 Zufallszahlen von 1 bis 1 Milliarde.)
Ihre Punktzahl ist die Gesamtzahl der Züge, die für alle 50 Zahlen ausgeführt wurden - je weniger Züge, desto besser. Bei einem Unentschieden gewinnt die Person, die ihren Code früher eingereicht hat.
Technische Daten
- Sie erhalten garantiert eine positive Ganzzahl für die Eingabe.
- Ihre
value
Variable darf zu keinem Zeitpunkt für Ihre generierten Pfade nach oben2^31-1
oder unten gehen-2^31
. - Ihr endgültiges Programm muss in eine Antwort passen (also
< 30,000
Bytes). - Sie dürfen nur 10 Zahlen fest codieren.
- Ihr Programm muss für jeden Testfall innerhalb von 5 Minuten auf einem angemessenen Laptop ausgeführt werden.
- Die Ergebnisse MÜSSEN jedes Mal gleich sein, wenn das Programm für jede Nummer ausgeführt wird.
quelle
value
, ja? Zumindest für mich klingt es nach einer Einschränkung der Implementierung, nicht nach dem eigentlichen Algorithmus.Antworten:
C ++: Punktzahl = 453.324.048
OK, ich brauchte etwas Zeit, um das zu überarbeiten, aber so habe ich es gelöst.
Nachdem ich den Lösungsraum studiert hatte, entschied ich, dass meine Strategie sein würde:
Hier ist mein Ergebnis: Die Gesamtpunktzahl beträgt 453324048
Und die Wege:
Ich bin mir sicher, dass es eine Möglichkeit gibt, dies zu verbessern, indem Sie einige "Süd / West" -Zugbewegungen durchführen (zum Beispiel durch 4 dividieren und mit 5 multiplizieren). Aber es zu codieren und sicherzustellen, dass Sie nicht über die Runde gehen oder gefangen werden, ist schwierig.
Ein anderer Lösungspfad könnte darin bestehen, zu versuchen, vom Ziel zurück zu einer "vernünftigen" Zahl zu gelangen und dann einfach einen Weg zu dieser kleineren Zahl zu finden. aber Sie müssen es richtig "zielen", damit die Schrittnummer übereinstimmt. knifflig, könnte aber der beste Weg sein, dies zu lösen.
Wie auch immer, hier ist mein Code-Code:
quelle
Python, Score = 56068747912
Druckt einfach
nenenenenenenen...
für jede Nummer.Wird später eine Erklärung hinzufügen.
quelle
nen
ist 2Rost , Punktzahl = 1758 (optimal unter Wegen ohne Westen)
Läuft in insgesamt etwa 7 Sekunden für 50 Zahlen mithilfe einer bidirektionalen Suche .
Probieren Sie es online aus!
Ausgabe
quelle
ns
,sn
,ew
undwe
ist sofort illegal zusätzlich zu Schleifen im Wegw
,ns
undsn
, die Blätter nur legale Wege auf Kosten des Ignorierens Rechtswege mitw
.PHP, Score = 1391462099
Ein schneller Versuch, geht niemals nach Westen, um die Pfadprüfung zu vereinfachen, und hat nur wenige Regeln, um bei jedem Schritt die Richtung zu bestimmen.
quelle