Herausforderung
Bei einer Ganzzahl n ≥ 4 wird eine Permutation der Ganzzahlen [0, n-1] mit der Eigenschaft ausgegeben , dass keine zwei aufeinander folgenden Ganzzahlen nebeneinander liegen. Der Wert einer Permutation pi
ist die Summe abs(pi[i] - i)
aller Indizes i
.
Beispiele
(1, 3, 0, 2)
hat Wert6
(0, 2, 4, 1, 3)
hat Wert6
(0, 2, 4, 1, 3, 5)
hat Wert6
(0, 2, 4, 1, 5, 3, 6)
hat Wert8
Ergebnis Ihrer Antwort
Die Punktzahl Ihrer Antwort ist die Summe der Werte Ihrer Permutationen n = 4 .. 14
plus der Anzahl der Bytes, die Ihr Code benötigt. Je niedriger die Punktzahl, desto besser. Ihr Code muss eine gültige Ausgabe für alle diese Werte von geben n
.
Sie müssen in der Lage sein, Ihre Übermittlung vollständig auf Ihrem Computer auszuführen.
Bei Unentschieden entscheidet der Zeitpunkt der letzten Bearbeitung, der zur entsprechenden Punktzahl geführt hat.
Ist das nicht die gleiche Frage wie diese ?
Antworten auf die verknüpfte Frage sind für diese Frage nicht konkurrenzfähig, da sie keine Anstrengungen unternehmen, um den Wert einer Permutation zu optimieren. Zum Beispiel ergibt n=10
die Permutation, [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
die von den meisten Antworten dort angegeben wird, einen Wert von 30
. Sie können viel besser als das tun.
Für den Permutationsteil der Frage ist insgesamt höchstens der optimale Wert 120
. (Danke an @Laikoni.) Während Dennis 'Antwort auf die vorherige Frage 222 Punkte bringt . (Danke an @ user202729.)
quelle
[6,6,6,8,10,12,12,12,14,16,18]
für eine Punktzahl von 120. Interessanterweise ist dieses Muster in A078706 zu finden .A078706
mit zu unterscheidenn=17
, die eine Punktzahl von haben können20
.Antworten:
Jelly ,
363433323130 Bytes, Ergebnis: 120Danke an Dennis für -1 Byte! (implizit durch Beheben eines Jelly-Fehlers, obwohl das Feature die Herausforderung datiert)
Neues Feature: akkumulierte Summe (
Ä
).Probieren Sie es online!
Verwenden Sie die 1-Indizierung.
Dauert auch linear.
Dieses C ++ - Programm erzeugt die lexikographisch kleinste Permutation unter der Annahme, dass | i - p i | ≤ width (wobei width eine fest codierte Konstante ist) für alle 0 ≤ i <n , mit einer zeitlichen Komplexität von etwa O (width 2 × 2 2 × width × n) (dies ist nur O (n) für eine feste Breite ): Probieren Sie es online aus !
Wie?
Beobachten Sie das Muster. Wir stellen fest, dass die Reihenfolge aller Elemente mit Ausnahme der letzten vier ein Präfix von ist
Berechnet die inkrementelle Differenz der Sequenz.
Beachten Sie die Periode 5.
Die Jelly-Implementierung:
Für 4 letzte Elemente
zwinge einfach alle 24 Möglichkeiten. O (1) .(Anmerkung: Ich zwinge nicht mehr alle 24 Möglichkeiten der 32-Byte-Version)
quelle
0 2 4 1 3 5 8 6
und hat einen größeren Verzweigungsfaktor, aber kein so einfaches Muster.CJam (60 Bytes + 120 = 180 Punkte)
Online-Testsuite mit integrierter Wertung
Verlängerung bis n = 24
Präparation
quelle
Haskell , 146 + 89 Punkte + Bytes
Wiederholt Muster [1,3,0,2], letzte
mod i 4
Elemente werden von Hand gestimmt.Vorheriger Algorithmus (132 + 116):
Bruteforces die richtige Anzahl von Sprüngen mit einer Länge von ± 2 oder ± 3. Wählt die letzte aus, die die richtigen Zahlen enthält, gut zu funktionieren scheint und viel billiger ist als die Umsetzung der Partitur. Tio läuft gerade die Zeit vor der letzten Punktzahl aus, die 18 ist.
Probieren Sie es online!
quelle
Japt, 120 + 20 = 140
(Wenn ich eine meiner Lösungen aus der anderen Herausforderung kopiere, hätte ich 227 Punkte bekommen.)
Probieren Sie es aus oder verwenden Sie diese Version , um die Ergebnisse zu überprüfen. Beide Versionen könnten gegen 9 Uhr anfangen, auf dich zu scheißen.
Erläuterung
quelle
Ruby , 120 Punkte +
112 106 9182 BytesProbieren Sie es online!
Die Reihenfolge ist grundsätzlich
(a-2)+(a+2)%5
.Wenn n mod 5 nicht 0 oder 1 ist, sind die letzten 3 oder 4 Elemente unterschiedlich.
Dies ist immer noch halb-hardcodiert, findet immer die beste Lösung, vielleicht könnte man ein bisschen mehr Golf spielen, aber mir sind die Ideen ausgegangen.
quelle
JavaScript (Node.js) , 148 Punkte +
10973 BytesProbieren Sie es online!Erläuterung:
l
Verfolgt die zuletzt generierte Nummer undm
die nächste Nummer der entgegengesetzten Parität zul
. einmall
überschritten, werdenm+2
die Variablen ausgetauscht. Zu Beginn der Sequenz wird eine Anpassung vorgenommen, damit Sequenzen, deren Länge kein Vielfaches von 5 ist, keine Zahlen verpassen, und eine weitere Anpassung wird für vorgenommenn=4
.quelle