Über die Serie
Zunächst einmal können Sie dies wie jede andere Code-Golf-Herausforderung behandeln und beantworten, ohne sich Gedanken über die Serie zu machen. Es gibt jedoch eine Rangliste für alle Herausforderungen. Sie finden die Rangliste zusammen mit einigen weiteren Informationen über die Serie im ersten Beitrag .
Loch 8: Mische eine unendliche Liste
Sie sollten eine Funktion oder ein Programm schreiben, das eine unendliche Liste als Eingabe verwendet und eine gemischte Version dieser Liste zurückgibt.
Über unendliche I / O
Es gibt verschiedene Möglichkeiten, wie Sie Eingaben vornehmen und Ausgaben für diese Herausforderung erstellen können:
- Sie können entweder eine Liste positiver Ganzzahlen oder eine Zeichenfolgendarstellung davon oder eine Zeichenfolge oder eine Liste druckbarer ASCII-Zeichen (einschließlich 0x20 bis 0x7E) verwenden. Das Ausgabeformat muss mit dem Eingabeformat übereinstimmen. Ich bezeichne die Daten nur noch als "die Liste", unabhängig davon, welche Option Sie wählen.
- Sie können die Liste aus einem unendlichen Standardeingabestream lesen und die Ausgabe kontinuierlich in einen unendlichen Standardausgabestream schreiben. Die Lösung sollte nicht von einem bestimmten Wert oder einer bestimmten Wertereihenfolge abhängen, um sicherzustellen, dass der Ausgabestream regelmäßig geschrieben und gelöscht wird (z. B. können Sie nicht einfach eine Ausgabe schreiben, wenn sich eine
5
in der Eingabeliste befindet). Wenn Sie eine Zeichenfolgendarstellung einer Liste lesen, können Sie natürlich warten, bis Sie auf das Listentrennzeichen stoßen. - In Sprachen, die diese unterstützen, können Sie eine Funktion schreiben, die eine verzögerte unendliche Liste oder Zeichenfolge annimmt und zurückgibt.
- In Sprachen, die sie unterstützen, können Sie einen unendlichen Generator implementieren, der einen anderen Generator als Eingabe verwendet.
- Alternativ können Sie eine Funktion schreiben, die keine Argumente akzeptiert und bei jedem Aufruf einen Ausgabewert zurückgibt. In diesem Fall können Sie davon ausgehen, dass eine Funktion definiert wurde, die keine Argumente akzeptiert und bei jedem Aufruf den nächsten Eingabewert zurückgibt. Sie können den Namen dieser Funktion frei wählen.
Sie können davon ausgehen, dass Ihr Programm für immer ausgeführt wird und dass unendlicher Speicher verfügbar ist. (Es ist möglich, dies mit einer begrenzten Menge an Speicher zu lösen. Dies bedeutet jedoch, dass Sie Speicher verlieren dürfen.)
Über die Zufälligkeit
Für jeden Wert v, der an einer Position i der unendlichen Eingabe gelesen wird , muss eine positive Wahrscheinlichkeit bestehen, dass er an einer der Positionen i-9 bis i + 9 der unendlichen Ausgabe endet (es sei denn, diese Position wäre negativ) ). Diese Wahrscheinlichkeiten müssen nicht für verschiedene Ausgabepositionen oder sogar für verschiedene Eingabepositionen gleich sein. Es ist in Ordnung, wenn Ihre Lösung die Werte auch an eine andere, weiter entfernte Position verschieben kann.
Daher ist es nicht erforderlich, dass Ihre Lösung den ersten Wert sehr weit unten in der Liste oder einen sehr späten Wert bis zur ersten Position mischen kann, obwohl dies in Ordnung ist, solange alle Positionen 9 Schritte von der Liste entfernt sind Eingaben sind möglich.
Wenn Sie beispielsweise den folgenden String als Eingabe verwendet haben, ___
gibt der alle Positionen an, die X
in der Ausgabe enthalten sein müssen:
___________________
abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...
Fehlt in Ihrer Sprache ein integrierter Zufallszahlengenerator oder möchten Sie diesen nicht verwenden, können Sie einen zusätzlichen Startwert als Eingabe verwenden und mithilfe des Startwerts ein eigenes geeignetes RNG implementieren . Diese Seite kann hilfreich sein.
Unabhängig von der tatsächlichen Verteilung, die Ihre Lösung verwendet, muss sie mit ziemlicher Sicherheit nach einer endlichen (aber willkürlichen) Zeit den nächsten Wert erzeugen.
Bitte erläutern Sie kurz, wie Ihre Implementierung diese Anforderungen erfüllt.
Wertung
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Bestenliste
Der erste Beitrag der Serie generiert eine Rangliste.
Um sicherzustellen, dass Ihre Antworten angezeigt werden, beginnen Sie jede Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Die Sprache wird derzeit nicht angezeigt, das Snippet erfordert sie jedoch und analysiert sie. In Zukunft werde ich möglicherweise eine Bestenliste nach Sprachen hinzufügen.)
quelle
Antworten:
Python 3 , 78 Bytes
Probieren Sie es online!
Nimmt die Eingabe von STDIN (eine pro Zeile) und druckt auf STDOUT.
Hält einen Puffer
l
von bis zu 10 Elementen. Der Puffer wird bei jedem Schritt gemischt. Bei einer Länge von 10 wird das letzte Element gedruckt und entfernt.Wenn ein Element gedruckt wird, sobald es eingefügt wurde, hat es 9 andere im Puffer wartende Elemente übersprungen, sodass 9 Stellen übrig bleiben. Ein Element kann beliebig lange im Puffer warten, sodass sich seine Position beliebig nach rechts verschieben kann.
Es scheint keine gute Möglichkeit zu geben, ein zufälliges Element aus einer Liste zu erzeugen und zu entfernen. Mischen scheint übertrieben. Die zu verwendende Länge beträgt 2 Byte
l.pop(randint(0,9))
(was bedeutet, dass die Liste 10 Elemente enthält).Es ist nicht besser.
x=choice(l);l.remove(x)
Eine Sprache mitpoprandom
wie zu tunkönnte sehr sauber machen
quelle
Befunge ( quirkster Aroma ), 4 Bytes
,
Liest ein Zeichen aus dem Stream und schiebt es auf den Stapel.~
Entfernt das oberste Zeichen aus dem Stapel (falls vorhanden) und druckt es aus.?
Randomisiert, welcher Befehl als nächstes ausgeführt wird. Der Algorithmus hier lautet also "In einer Endlosschleife mit gleicher Wahrscheinlichkeit entweder ein Zeichen drücken oder ein Zeichen platzen lassen." Ich denke, dies genügt den Anforderungen: Ein Zeichen kann beliebig viele Zeichen darüber im Stapel sehen, so dass es sich beliebig weit nach rechts bewegen kann, und es kann gedruckt werden, wenn der Stapel beliebig groß ist, so dass es sich beliebig weit nach rechts bewegen kann die linke.quelle
>> document.getElementById("output").innerHTML = "a\0b"
>> document.getElementById("output").innerHTML
"ab"
C (gcc) 94 Bytes
Probieren Sie es online!
Ok, ein TIO-Link macht nicht viel Sinn. Zum leichteren Testen habe ich das folgende C-Programm erstellt, das zufällige ASCII-Zeichen ausgibt oder eine Zeichenfolge unendlich wiederholt.
Dieses Programm wird als bezeichnet
iro
.Programmkorrektheit
Was ich hier mache, ist
9
Werte in einen Puffer zu lesen . Danach werden Zufallsindizes aus diesem Array ausgewählt und ausgegeben und dann durch das nächste Zeichen im Stream ersetzt.quelle
SILOS , 149 Bytes
Probieren Sie es online!
Im Wesentlichen nimmt es weiterhin Eingaben entgegen (auf dem Online-Interpreter durch Argumente, aber auf dem offiziellen Offline-Interpreter können Sie (unendlich) in Blöcken von jeweils 15 eingeben (30 der erste Block).
Es lädt die Eingabe in eine temporäre Warteschlange und wählt eine glückliche 15 aus (zufällig, aber in Bezug auf Wahrscheinlichkeit oder Verteilung nicht gleichmäßig verteilt).
Der Rest verbleibt in der Warteschlange, während neue Eingaben die Warteschlange füllen. Die erste Eingabe kann bis zum Ende gemischt werden (im Grunde genommen folgen die Zeichen einer Normalverteilung). Interessanterweise ist dieses Programm nur doppelt so ausführlich wie Python und möglicherweise "golfer" als Java.
Um die Ergebnisse besser sehen zu können, habe ich eine nicht konforme Version, die Eingaben als Zeichenfolge akzeptiert (es können jedoch nur etwa 8.000 Zeichen eingegeben werden).
Probieren Sie es online!
Nur zum Spaß, hier ist dieser Beitrag durch die String-Version gespeist.
quelle
Aceto , 24 Bytes, nicht konkurrierend
Nicht konkurrierend, weil ich einen Fehler im Interpreter beheben musste.
Nimmt einen unendlichen Strom von Linien und gibt sie in zufälliger Reihenfolge aus. Jedes Element hat die Chance, an einem beliebigen Punkt aufzutreten.
Wir beginnen mit einer
?
in der linken unteren Ecke, die uns in eine zufällige Richtung bewegt. Wenn das unten oder links ist, werden wir gleich zurückgeschoben.Wenn wir uns nach oben bewegen,
r
lesen wir einen Wert, mischen den Stapel (Y
) und springen zurück zumO
Rigin.Wenn wir nach rechts
d
verschoben werden , erhöhen wir den obersten Stapelwert, drücken a0
und testen auf Gleichheit (da wir Zeichenfolgen lesen, können wir niemals die ganze Zahl 0 haben). Wenn die Werte gleich sind, haben wir das Ende des Stapels erreicht (von dem aus wir nicht drucken möchten). Wir negieren den Vergleich (!
) undp
schreiben nur, wenn (`
) die Dinge nicht gleich waren. Dann springen wir auch zurück zurO
Rigin.quelle
Ruby, 43 Bytes
Meine ursprüngliche Antwort verwendete eine faul bewertete unendliche Liste, aber diese ist kürzer. Naja.
quelle
MATL , 11 Bytes
Probieren Sie es online!
Port of Histocrat's Befunge Antwort .
Erklärung: (Danke an Luis Mendo für -1 Byte)
Dies gibt mit ziemlicher Sicherheit in endlicher Zeit aus und erfordert mit ziemlicher Sicherheit nur endlichen Speicher .
Der Vollständigkeit halber ist hier eine 15-Byte-Version, die einen 10-Elemente-Puffer enthält und daraus ein zufälliges Element ausgibt:
Ich mag diese Version für das sehr idiomatische (soweit Golfsprachen idiomatisch sein können)
tn...Yr&)
, das ein zufälliges Element aus der Liste entfernt und die Liste ohne dieses Element zurückgibt. Die besondere Logistik dieser Herausforderung fügt jedoch eine Menge Bytes hinzu (diew
für die Anzeige erforderlich sind, umt9>?
zu überprüfen, ob die Liste voll genug ist ...).quelle
Alice , 7 Bytes
Probieren Sie es online!
Dies sollte bei einer unendlichen Eingabe mit unendlicher Zeit und unendlichem Speicher funktionieren, aber in der Praxis ist es nicht so einfach zu testen :)
Erläuterung
Bei jeder Iteration werden 10 Zeichen von der Eingabe gelesen und nur eines geht zur Ausgabe, sodass die Speichernutzung während der Ausführung linear zunimmt. Mit einer endlichen Eingabe erreicht dies schnell EOF, von dem zehn -1 bei jeder Iteration auf den Stapel verschoben werden. Der Versuch, -1 als Zeichen auszugeben, hat keine Auswirkung, aber es ist unwahrscheinlich, dass alle Zeichen der Eingabe in angemessener Zeit gedruckt werden.
Die Position i der Ausgabe kann von jedem Zeichen in der Eingabe bis zur Position 10i eingenommen werden. Dies entspricht der Herausforderung, die mindestens einen Bereich von i-9 bis i + 9 erfordert .
quelle
C 214 Bytes
Wie es funktioniert
Online testen (UNIX)
quelle
Vi
ausgetauscht wird,Vj
woj = RAND [ i-9, i+9 ]
diev which is read at a position i of the infinite input, there must be a positive probability for it to end up in any of the positions i-9 to i+9 of the infinite output
05AB1E , 13 Bytes
Probieren Sie es online! (geändert um 20 Elemente aufzunehmen)
quelle
Bash , 17 Bytes
Probieren Sie es online!
xargs nimmt fortlaufend 9 Buchstaben von STDIN entgegen und sendet sie an shuffle
Eine unendliche Liste kann erzeugt werden durch:
was abcde druckt .. z unendlich oft.
Der Test könnte durchgeführt werden von:
quelle
xargs shuf -e
die anforderungen erfülltR, 70 Bytes
Beginnt mit einem leeren Vektor
x
. In einer Endlosschleife nimmt es einen neuen Wert von STDIN und mischt dann den Vektor. Dann wird geprüft, ob die Länge der aufgebauten Liste 10 oder mehr beträgt. Ist dies der Fall, kann der Druckvorgang gestartet werden. Auf diese Weise hat der Vektor einen Puffer von 10 Eingaben, von denen jede in jeder Iteration gemischt wird. So ist es möglich, dass Eingaben 10 Stellen früher und unendlich viele Stellen später gedruckt werden (nach einer geometrischen Verteilung mitp=1/10
). Wenn der Puffer lang genug ist, wird das erste Element gedruckt und aus dem Vektor entfernt.quelle
Javascript, 78 Bytes
Verwendet die gleiche Methode wie die Antwort von xnor.
quelle
Perl 5 , 39 Bytes
38 Byte Code +
-n
Flag.Probieren Sie es online!
Fügen Sie jedes Element zum
@F
Array hinzu (mitpush@F,$_
). Wenn@F
10 Elemente enthalten sind (push
gibt also die Anzahl der Elemente im Array zurück9<push...
), wird ein zufälliges Element entfernt und gedruckt (splice@F,rand 10,1
um das Element zu entfernen,print
um es zu drucken).Die Ausgabe beginnt, nachdem das 10. Element gelesen wurde. Daher kann jedes Element mindestens 9 Positionen vor seiner ursprünglichen Position erscheinen und kann unendlich nach rechts verschoben werden.
quelle
SmileBASIC,
6158 BytesJedes Zeichen der unendlichen Liste wird am Ende des Puffers hinzugefügt. Wenn die Pufferlänge 11 ist, wird ein zufälliges Zeichen gedruckt und entfernt.
Funktion
R
erzeugt das nächste Zeichen.quelle
Prolog, 70 Bytes
quelle