Eine magische Folge ist eine Folge von nicht negativen ganzen Zahlen, x[0..n-1]
so dass es genau x[i]
Instanzen von gibti
Zum Beispiel ist 6,2,1,0,0,0,1,0,0,0 eine magische Sequenz, da es 6 Nullen, 2 Einsen usw. gibt.
Schreiben Sie eine Funktion, die bei n alle magischen Folgen der Länge n ausgibt
Das Programm, das innerhalb von 10 Sekunden die richtige Ausgabe für den höchsten Wert von n erzeugen kann, gewinnt. (Alle Programme sind jedoch willkommen)
Zum Beispiel kann Alices Programm innerhalb von 10 Sekunden bis zu n = 15 verarbeiten, während Bobs innerhalb derselben Zeit bis zu n = 20 verarbeiten kann. Bob gewinnt.
Plattform: Linux 2.7GHz @ 4 CPUs
number
fastest-code
sequence
Agnishom Chattopadhyay
quelle
quelle
n>5
mit einer Lösung, die nicht die Form hat[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
? Ich habe zu einem aufgeschautn=20
und keinen gefunden und mich gefragt, ob ich einen Fehler mache.Antworten:
Python, n≈10 8
Dies nutzt die Tatsache, die ich beweisen werde, dass die einzigen Magic-Sequenzen der Länge
n
sind:[1, 2, 1, 0]
und[2, 0, 2, 0]
fürn=4
[2, 1, 2, 0, 0]
zumn=5
[n-4, 2, 1, 0, 0, ..., 0, 0, 1, 0, 0, 0]
zumn>=7
Also, für
n>=7
, braucht man nur eine riesige Tupel zurück. Ich kann dies bis zu ungefährn=10^8
auf meinem Laptop tun , was wahrscheinlich durch den Speicher begrenzt ist. nicht mehr und es friert ein. (Dank an trichoplax für die Idee, Tupel anstelle von Listen zu verwenden.) Oder wenn man stattdessen ein Wörterbuch mit Einträgen ungleich Null drucken{0:n-4, 1:2, 2:1, (n-4):1}
kann, kann man dies für ginormous tunn
.Ich beweise die Einzigartigkeit für
n>=7
; Die anderen können durch rohe Gewalt oder Fallarbeit überprüft werden.Die Summe der Einträge von
l
ist die Gesamtzahl aller Nummern der Liste, dh deren Längen
. Die Liste enthältl[0]
Nullen und dahern-l[0]
Einträge ungleich Null. Aber per Definitionl[0]
muss ungleich Null sein, sonst erhalten wir einen Widerspruch, und jeder der anderen Einträge ungleich Null ist mindestens 1. Dies macht bereits eine Summe vonl[0] + (n-l[0]-1)*1 = n-1
aus der Gesamtsumme von ausn
.l[0]
Ohne zu zählen , kann es höchstens eine 2 geben und keinen Eintrag größer als 2.Dies bedeutet jedoch, dass die einzigen Einträge ungleich Null sind
l[0], l[1], l[2], and l[l[0]]
, deren Werte höchstensl[0]
und eine Permutation von sind1,1,2
, die eine maximale Summe von ergibtl[0]+4
. Da diese Summen
mindestens 7 ist, haben wirl[0]>=3
und sol[l[0]]=1
. Jetzt gibt es mindestens eine1
, was bedeutetl[1]>=1
, aber wennl[1]==1
das eine andere ist1
, bedeutet diesl[1]>=2
, dassl[1]
es der Einzige ist2
. Dies ergibtl[2]=1
, und alle verbleibenden Einträge sind0
alsol[0]=n-4
, was die Lösung vervollständigt.quelle
Python 3, Nr. 40
Führt eine Breitensuche nach möglichen Listen durch, füllt Einträge von rechts nach links aus und stoppt die Suche an einem Suffix, wenn dies nicht plausibel ist. Dies kann passieren, wenn:
n
(die Summe für die gesamte Liste muss seinn
)i*l[i]
im Suffix überschreitetn
(die Summe für die gesamte Liste muss seinn
)Ich hatte ursprünglich getestete Präfixe von links nach rechts, aber das ging langsamer.
Die Ausgaben bis
n=30
sind:Mit Ausnahme der ersten drei Listen
[1, 2, 1, 0], [2, 0, 2, 0], [2, 1, 2, 0, 0]
gibt es genau eine Liste für jede Längen>6
und sie hat die Form[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
. Dieses Muster bleibt mindestens bis zu bestehenn=50
. Ich vermute, es hält für immer an. In diesem Fall ist es trivial, eine große Anzahl davon auszugeben. Selbst wenn nicht, würde ein mathematisches Verständnis der möglichen Lösungen eine Suche erheblich beschleunigen.quelle
n=0
. Ich hatte verpasst, dass wir das Ergebnis für eine Single zurückgebenn
, ohne die zu zählenn
. Das bringt mich auf den Punktn=40
.Pyth - 15 Bytes
Verwendet Brute Force durch alle möglichen Sequenzen von len
n
und filtert dann.Die vollständige Erklärung folgt in Kürze.
Probieren Sie es hier online aus .
quelle
K, 26 Bytes
Wie Maltysens Ansatz, rohe Gewalt. Das Herzstück des Programms ist ein Prädikat, das prüft, ob ein bestimmter Vektor "magisch" ist:
Erstellen Sie einen Iota-Vektor, solange der Eingabevektor (
!#x
) vorhanden ist, zählen Sie die Vorkommen jeder Ziffer ((+/x=)'
) und vergleichen Sie das Ergebnis mit dem Eingabevektor (x~
). Wenn es eine Übereinstimmung gibt, haben Sie eine magische Sequenz.Leider scheint dieser erste Stich ziemlich langsam zu sein. Beim Testen mit Kona auf meinem Laptop dauert es ungefähr 12 Sekunden, bis n = 7 verarbeitet ist. Ich muss etwas mehr darüber nachdenken.
quelle