Golf ein Programm oder eine Funktion , die das gibt Lage des Gnus , die auf Platz beginnt auf einem unendlichen Schachbrett , das in einer gegen den Uhrzeigersinn Quadrat Spirale ist nummeriert, wo die Gnus immer Besuche mit der niedrigsten Zahl Quadrat sie kann erreichen, dass sie noch nicht besucht hat. 1
Inspiration: The Trapped Knight und OEIS A316667 .
Bearbeiten: Diese Sequenz befindet sich jetzt im OEIS als A323763 .
Der Code kann den Ort, die ersten Orte oder die Sequenz erzeugen, die keine Eingabe nimmt.
Fühlen Sie sich frei, ihren Standort nach (oder bis zu) Sprüngen anzugeben, aber wenn ja, geben Sie dies bitte in Ihrer Antwort deutlich an und stellen Sie sicher, dass eine Eingabe von (oder falls zutreffend) ergibt .1
[1]
Dies ist Code-Golf , daher ist es das Ziel, Arbeitscode in so wenigen Bytes wie möglich in der von Ihnen gewählten Sprache zu erstellen.
Hinweis: Die Gnus gefangen werden (ähnlich wie der Ritter bei seiner tut Lage, Platz und das Kamel hat in seinem , Platz ) an ihrem location on square . Das Verhalten Ihres Codes kann für größer als dieses undefiniert sein . (Danke an Deadcode für den C ++ - Code , der dies gefunden hat!)
Detail
Das Board sieht wie folgt aus und wird auf unbestimmte Zeit fortgesetzt:
101 100 99 98 97 96 95 94 93 92 91
102 65 64 63 62 61 60 59 58 57 90
103 66 37 36 35 34 33 32 31 56 89
104 67 38 17 16 15 14 13 30 55 88
105 68 39 18 5 4 3 12 29 54 87
106 69 40 19 6 1 2 11 28 53 86
107 70 41 20 7 8 9 10 27 52 85
108 71 42 21 22 23 24 25 26 51 84
109 72 43 44 45 46 47 48 49 50 83
110 73 74 75 76 77 78 79 80 81 82
111 112 113 114 115 116 117 118 119 120 121
Ein wildebeest ist eine "GNU" Fee Schachfigur - eine Nicht-Standard - Schachfigur , die sowohl als bewegen kann Ritter (a -leaper) und als Kamel (a -leaper).
Als solche konnte sie von ihrem Startort an jeden dieser Orte ziehen :
. . . . . . . . . . .
. . . . 35 . 33 . . . .
. . . . 16 . 14 . . . .
. . 39 18 . . . 12 29 . .
. . . . . (1) . . . . .
. . 41 20 . . . 10 27 . .
. . . . 22 . 24 . . . .
. . . . 45 . 47 . . . .
. . . . . . . . . . .
Die niedrigste davon ist und sie hat dieses Feld noch nicht besucht, also ist der zweite Term in der Sequenz.
Als nächstes könnte sie von zu einem dieser Orte ziehen:
. . . . . . . . . . .
. . . . . . 14 . 30 . .
. . . . . . 3 . 29 . .
. . . . 6 1 . . . 53 86
. . . . . . . (10) . . .
. . . . 22 23 . . . 51 84
. . . . . . 47 . 49 . .
. . . . . . 78 . 80 . .
. . . . . . . . . . .
Sie hat jedoch bereits Platz sodass ihr dritter Standort Platz , der niedrigste, den sie noch nicht besucht hat.
Die ersten Begriffe des Weges des Gnus sind:
1, 10, 3, 6, 9, 4, 7, 2, 5, 8, 11, 14, 18, 15, 12, 16, 19, 22, 41, 17, 33, 30, 34, 13, 27, 23, 20, 24, 44, 40, 21, 39, 36, 60, 31, 53, 26, 46, 25, 28, 32, 29, 51, 47, 75, 42, 45, 71, 74, 70, 38, 35, 59, 56, 86, 50, 78, 49, 52, 80, 83, 79, 115, 73, 107, 67, 64, 68, 37, 61, 93, 55, 58, 54, 84, 48, 76, 43, 69, 103, 63, 66, 62, 94, 57, 87, 125, 82, 118, 77, 113, 72, 106, 148, 65, 97, 137, 91, 129, 85
Die ersten Sprünge sind Ritterzüge, sodass die ersten Begriffe mit A316667 übereinstimmen .
Antworten:
JavaScript (Node.js) ,
191 ... 166164 Bytes2 Bytes dank @grimy gespart .
Gibt denN ten Term zurück.
Probieren Sie es online! oder Eine formatierte Version anzeigen
Wie?
Spiralindizes
Um die Koordinaten(x,y) in den Spiralindex I umzuwandeln , berechnen wir zunächst die Schicht L mit:
Welches gibt:
Wir berechnen dann die PositionP in der Ebene mit:
Welches gibt:
Der endgültige IndexI ist gegeben durch:
Anmerkung: Die obige Formel ergibt eine 0-indexierte Spirale.
Im JS-Code berechnen wir tatsächlich sofort4L2 mit:
Und dann subtrahiereP mit:
Bewegungen des Gnus
Anhand der aktuellen Position(x,y) werden die 16 möglichen Zielquadrate des Gnus in der folgenden Reihenfolge getestet:
Wir gehen durch sie, indem wir 16 Paare von vorzeichenbehafteten Werten( dx , dy) anwenden . Jedes Paar ist als einzelnes ASCII-Zeichen codiert.
Wir verfolgen den minimal angetroffenen Wert inm und die Koordinaten der entsprechenden Zelle in ( H, V) .
Sobald der beste Kandidat gefunden wurde, markieren wir ihn als besucht, indem wir ein Flag im ObjektG , das auch unsere Hauptrekursivfunktion ist.
quelle
Buffer
zu erzwingen, dass jedes Zeichen als ein einzelnes Byte interpretiert wird?Buffer
akzeptiert der Konstruktor immer noch eine Zeichenfolge. Also, ja, dies ist eine ziemlich billige Möglichkeit, es in eine Liste von Bytes umzuwandeln - im Gegensatz zu[..."string"].map(c=>do_something_with(c.charCodeAt()))
.Kokosnuss ,
337276 BytesGibt einen Wertegenerator zurück. Könnte wahrscheinlich mehr Golf gespielt werden. (Insbesondere die Folge der Differenztupel.) Spiralalgorithmus aus dieser math.se-Antwort .
Probieren Sie es online!
quelle
for a,b in (
->for a,b in(
(vielleicht können Sie das Delta-Tupel von Tupeln selbst auch Golf spielen)q
und ein Reißverschluss ist kürzer für die Tupel: 306 Bytes können natürlich noch golfen0.5
->.5
für ein weiteres Byte speichern;A**2
->A*A
zum einen mehr.05AB1E ,
7765585752 Bytes-6 Bytes dank @Arnauld mit einem Port seiner Formel.
Probieren Sie es online aus (das
ï
Symbol in der Fußzeile entfernt das Symbol.0
, um die Ausgabe zu kompakter zu gestalten. Sie können es jedoch auch entfernen, um das tatsächliche Ergebnis zu sehen).Code Erklärung:
Allgemeine Erklärung:
global_array
[1]
X
[0,0]
X
Welches ist die gleiche Formel, die @Arnauld in seiner Antwort verwendet , die jedoch anders geschrieben wurde, um die eingebauten Funktionen von 05AB1E für double, square, -1, +1 usw. zu nutzen.
(Wenn Sie nur diesen spiralförmigen Teil des Codes in Aktion sehen möchten: Probieren Sie es online aus .)
Nachdem wir alle Werte erreicht haben, die wir für die gegebene erreichen könnenx , y -Koordinate entfernen wir alle Werte, die bereits in der vorhanden sind x ,y -Koordinate dieses Minimums.
global_array
, und erhalten dann das Minimum der (verbleibenden) Werte.Dieses Minimum wird dann zum hinzugefügt
global_array
, und die VariableX
wird durch das ersetztNachdem wir die
input
Anzahl der Male wiederholt haben, gibt das Programm diesglobal_array
als Ergebnis aus.quelle