Diese Frage hat einen ähnlichen Aufbau wie " Ein Array suchen", das zu einer Reihe von Summen passt, obwohl sich seine Ziele stark unterscheiden.
Betrachten Sie ein Array A
von Länge n
. Das Array enthält nur positive Ganzzahlen. Zum Beispiel A = (1,1,2,2)
. Definieren wir f(A)
als die Menge der Summen aller nicht leeren zusammenhängenden Subarrays von A
. In diesem Fall f(A) = {1,2,3,4,5,6}
. Die zu produzierenden Schritte f(A)
sind wie folgt:
Die Subarrays von A
sind (1), (1), (2), (2), (1,1), (1,2), (2,2), (1,1,2), (1,2,2), (1,1,2,2)
. Ihre jeweiligen Beträge sind 1,1,2,2,2,3,4,4,5,6
. Das Set, das Sie aus dieser Liste erhalten, ist daher {1,2,3,4,5,6}
.
Wir nennen ein Array A
eindeutig, wenn es kein anderes Array B
mit der gleichen Länge gibt f(A) = f(B)
, außer dem A
umgekehrten Array . Zum Beispiel, f((1,2,3)) = f((3,2,1)) = {1,2,3,5,6}
aber es gibt kein anderes Längenarray 3
, das den gleichen Satz von Summen erzeugt.
Wir werden nur Arrays betrachten, bei denen die Elemente entweder eine bestimmte Ganzzahl s
oder sind s+1
. ZB wenn s=1
die Arrays nur 1
und enthalten würden 2
.
Aufgabe
Die Aufgabe für eine gegebene n
und s
ist es, die Anzahl der eindeutigen Arrays dieser Länge zu zählen. Sie können davon ausgehen, dass s
zwischen 1
und 9
.
Sie sollten nicht die Umkehrung eines Arrays sowie das Array selbst zählen.
Beispiele
s = 1
ist die Antwort immer n+1
.
s = 2
Die Antworten zählen von n = 1
oben:
2,3,6,10,20,32,52,86
s = 8
Die Antworten zählen von n = 1
oben:
2,3,6,10,20,36,68,130
Ergebnis
Für einen bestimmten n
Fall sollte Ihr Code die Antwort für alle Werte von s
von 1
bis ausgeben 9
. Ihre Punktzahl ist der höchste Wert, n
für den dies in einer Minute abgeschlossen ist.
Testen
Ich muss Ihren Code auf meinem Ubuntu-Computer ausführen. Geben Sie daher so detaillierte Anweisungen wie möglich zum Kompilieren und Ausführen Ihres Codes an.
Bestenliste
- n = 24 von Anders Kaseorg in Rust (34 Sekunden)
- n = 16 von Ourous in Clean (36 Sekunden)
- n = 14 von JRowan in Common Lisp (49 Sekunden)
quelle
Antworten:
Rust , n ≈ 24
Benötigt nächtlichen Rost für die praktische
reverse_bits
Funktion. Kompilieren mitrustc -O unique.rs
und ausführen mit (z./unique 24
. B.) .quelle
s
unds+1
darin?s
unds + 1
(da Sie sagten, dies sind die einzigen Arrays, die wir berücksichtigen werden), obwohl nicht sofort klar ist, ob dies einen Unterschied machen würde.Common Lisp SBCL, N = 14
Aufruffunktion (goahead ns)
Hier sind die Laufzeiten
quelle
sbcl
irgendwie auf?Sauber
Sicher nicht der effizienteste Ansatz, aber ich bin gespannt, wie gut ein naiver By-Value-Filter funktioniert.
Trotzdem müssen mit dieser Methode noch einige Verbesserungen vorgenommen werden.
In eine Datei mit dem Namen
main.icl
einfügen oder die oberste Zeile in ändernmodule <your_file_name_here>
.Kompilieren mit
clm -h 1500m -s 50m -fusion -t -IL Dynamics -IL StdEnv -IL Platform main
.Sie können die Version, die TIO (und ich) verwenden, über den Link in der Überschrift oder eine neuere von hier herunterladen .
quelle
s
? In der Frage geben Sie an: " Für ein gegebenes n sollte Ihr Code die Antwort für alle Werte von s von 1 bis 9 ausgeben."