Eingabe: Ein Array I von k positiven ganzen Zahlen. Die ganzen Zahlen sind nicht größer als 100 und k ≤ 100 .
Ausgabe: Ihr Code muss alle möglichen Arrays O nicht negativer Ganzzahlen der Länge k mit der Einschränkung ausgeben, dass 0 ≤ O i ≤ I i . Um von einem Array zum nächsten zu gelangen, können Sie 1 zu einem Wert im Array addieren oder subtrahieren. Ihr Code darf nicht dasselbe Array zweimal ausgeben. Wenn die Anzahl der auszugebenden Arrays sehr groß ist, sollte Ihr Code nur für immer weiter ausgegeben werden, bis er getötet wird.
Beispiele
Wenn ich ein Array von k Einsen bin , dann ist dies genau das Problem des Iterierens über alle Gray-Codes der Bitbreite k , mit der Ausnahme, dass das erste und das letzte Element nicht in einem Schritt erreichbar sein müssen.
Wenn
I = [2,1]
ja, ist eine mögliche Reihenfolge der Ausgabearrays(0,0),(0,1),(1,1),(1,0),(2,0),(2,1)
- Wenn
I = [2,1,3]
ja, ist eine mögliche Reihenfolge der Ausgabearrays(0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,1,3),(0,1,2),(0,1,1),(0,1,0),(1,1,0),(1,1,1),(1,1,2),(1,1,3),(2,1,3),(2,1,2),(2,1,1),(2,1,0),...
.
Dies ist eine Code-Golf-Herausforderung, die Einreichung mit dem Quellcode mit der kürzesten Länge gewinnt. Lassen Sie sich durch die kurzen Antworten in Golfsprachen nicht davon abhalten, eine Antwort in anderen Sprachen zu verfassen. Versuchen Sie, die kürzeste Antwort in einer beliebigen Sprache zu finden.
Dies ist auch eine Herausforderung mit eingeschränkter Komplexität. Jedes neue Array sollte mit einer O (k) -Zeit ausgegeben werden, die seit dem vorherigen ausgegebenen Array (oder dem Start des Programms für das erste ausgegebene Array ) verstrichen ist. Dies bedeutet, dass die Laufzeit pro neuem Ausgangsarray (sie haben jeweils die Länge k ) nicht größer als O (k) sein sollte . Das heißt, es sollte zeitproportional zu k sein und nicht beispielsweise k 2 oder 2 k . Beachten Sie, dass dies nicht die durchschnittliche Zeit pro Ausgang ist, sondern die Zeit im ungünstigsten Fall für jedes ausgegebene Array.
Sie können davon ausgehen, dass alle Arithmetikoperationen mit 64-Bit-Ganzzahlen in konstanter Zeit ausgeführt werden können, ebenso wie das Lesen und Ausgeben sowie das Zuweisen und Nachschlagen und Ändern von Werten in Arrays.
Eine Folge der eingeschränkten Komplexität ist, dass Lösungen, die nur beim Beenden des Programms ausgegeben werden, nicht akzeptabel sind.
I_i+1
? Kannst du 0 von erreichenI_i
?)n
undk
sind sie begrenzt? vorausgesetzt, sie gehen mit der Bitbreite ins UnendlicheAntworten:
Python 3 , 116 Bytes
Probieren Sie es online!
Danke Mnemonic für -1 Byte.
Generatorfunktion. (danke Dennis für die Erinnerung, ich habe vergessen, dass es die Funktion gibt) Wenn die Ausgabe auf stdout gedruckt werden soll, verwenden Sie
print(t,flush=1)
9 zusätzliche Bytes, oder wenn Python mit aufgerufen wird-u
,print(t)
reicht dies für +1 Bytes.Stoppt mit einem Fehler (
IndexError
). Wenn Sie diese Funktion aufrufen und dann das Programm fortsetzen möchten, müssen Sie sie abfangen.quelle
k
Schritten, da bei jedem Schritti
um1
und nachk
Schritten erhöhti==k
undd[i]
ein Fehler verursacht wird.not 0<=
mitnot-1<
.yield t
anstelle von verwendenprint(t,flush=1)
?Stax , 22 Bytes
Führen Sie es aus, und debuggen Sie es
Hier ist ein großes Beispiel für das asymptotische Verhalten .
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle
O(k)
Bits, daher können Teilungszeitenk
O(k²)
JavaScript (Node.js) , 114 Byte
Probieren Sie es online! Ungolfed:
quelle
Kotlin ,
181178 BytesDank an: Anush wies darauf hin, dass ich die Herausforderung, 2 Bytes zu sparen, falsch verstanden habe. ovs wies auf eine Einsparung von 1 Byte hin.
Probieren Sie es online!
quelle
while(true)
kann seinwhile(1<2)