Also schrieb ich mir einen Einzeiler, der eine Schlange auf die Konsole druckte. Es macht ein bisschen Spaß und ich fragte mich, wie ich meinen Code komprimieren könnte ...
Hier ist eine (kurze) Beispielausgabe:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Hier sind die Spezifikationen:
- In jeder Zeile wird ein einzelnes Nicht-Whitespace-Zeichen (je nachdem, was Sie möchten) auf die Konsole gedruckt, wobei anfangs 29 bis 31 Leerzeichen links daneben stehen.
- Bei jeder Iteration wird eine zufällige Entscheidung zwischen diesen drei Aktionen getroffen
- Der Umfang der Polsterung verringert sich um 1
- Der Umfang der Polsterung bleibt gleich
- Die Menge der Polsterung erhöht sich um 1
Tun Sie dies 30 Mal, um eine 30-Segment lange Schlange auf die Konsole zu drucken.
Die kürzeste Antwort in Bytes gewinnt.
Antworten:
05AB1E ,
1514 BytesProbieren Sie es online!
Verwendet
0
.Erläuterung
quelle
Zufälliges Brainfuck ,
123 122121 BytesProbieren Sie es online!
Random Brainfuck ist eine Erweiterung von Brainfuck mit dem hilfreichen Zusatz des
?
Befehls, der die aktuelle Zelle auf ein zufälliges Byte setzt. Dies druckt eine Schlange aus!
s, die eher wie Schritte als lustig genug wie eine Schlange aussieht.Wie es funktioniert:
Eine andere Lösung, die eher am Buchstaben der Frage als am Geist festhält.
87 Bytes
Probieren Sie es online!
Dieser ist stark vorgespannt, um die Polsterung in Ruhe zu lassen, aber eine Vergrößerung oder Verkleinerung der Polsterung ist beide gleichermaßen möglich. Jedes hat eine etwas geringere Chance als 1 zu 256.
quelle
?
Befehl. +1?
ist nur in Random Brainfuck verfügbar , nicht im klassischen BrainfuckC (GCC) ,
615856 ByteAntwort bearbeitet, um Änderungen der Regeln widerzuspiegeln ...
Probieren Sie es online!
quelle
s+=1-rand()%3
zur Funktion printf wechseln.i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Retina , 24 Bytes
Probieren Sie es online!
Erläuterung
Initialisieren Sie den Arbeitsstring in der ersten Zeile, dh 30 Leerzeichen und a
+
.In der zweiten Zeile ist ein Leerzeichen.
-29{
Wickelt den Rest des Programms in eine Schleife, die 29-mal ausgeführt wird.¶<
druckt den Arbeitsstring am Anfang jeder Schleifeniteration mit einem nachfolgenden Zeilenvorschub. Die atomare Stufe selbst fügt ein Leerzeichen am Anfang des Strings ein (die Grundidee ist, ein Leerzeichen einzufügen und dann zufällig 0–2 Leerzeichen zu entfernen, da dies ein Byte kürzer ist als die zufällige Auswahl zwischen Löschen, Einfügen und No-Op).Dies vergleicht den leeren regulären Ausdruck mit der Eingabe, die uns jede Position zwischen Zeichen (sowie Anfang und Ende der Zeichenfolge) gibt. Dann
,2
bleiben nur die ersten drei Übereinstimmungen erhalten, dh die Übereinstimmungen nach null, eins und zwei Leerzeichen.@
wählt zufällig eine dieser drei Übereinstimmungen aus. DannS
teilt die Aufteilungsstufe ( ) die Eingabe um diese Übereinstimmung auf. Und das1
sagt ihm, er solle nur den zweiten Teil der Teilung behalten. Mit anderen Worten, wir verwerfen alles bis zu unserer zufälligen Übereinstimmung.Die 30. Zeile, die das Ergebnis der letzten Schleifeniteration ist, wird implizit am Ende des Programms ausgegeben.
quelle
VBA,
605949 BytesFügen Sie es in das Direktfenster ein und drücken Sie die Eingabetaste. (Stellen Sie sicher, dass die explizite Deklaration deaktiviert ist!)
Es ist weitaus wahrscheinlicher, sich zu bewegen, als in einer Linie zu bleiben (dh Aktionen sind nicht gleich gewichtet), aber das war keine bestimmte Voraussetzung (Zum Glück!)
{EDIT} 1 Byte durch Entfernen des Leerzeichens zwischen
=1
und gespeichertTo
{EDIT2} Gespeichert 10 Bytes dank remoel Kommentar
Alte Versionen:
quelle
String(i," ")
undSpc(30+i)
dann entferneni=30:
. Oder -1 Byte durch Entfernen&
. :)C # (.NET Core),
1121101061009998 Byte-1 Byte dank @raznagul .
-1 Byte dank @auhmaan .
Erläuterung:
Probieren Sie es online aus.
quelle
new Random().Next()
mehrmals lokal aufrufe (.net Framework Version 4.6.1), erhalte ich immer das gleiche Ergebnis. Ich muss einThread.Sleep(10)
zwischen den Aufrufen hinzufügen , um zuverlässig unterschiedliche Ergebnisse zu erhalten. Mit einer Schlafzeit von weniger als 10ms bekomme ich manchmal immer noch das gleiche Ergebnis. .Net-Framework und TIO (.net-Core) haben also unterschiedliche PRNGs oder verwenden zumindest unterschiedliche Seeds. Wenn ich Ihr Programm in TIO auf C # -mono umstelle, erhalte ich dasselbe Verhalten wie lokal in .net-Framework.new Random()
verwendet die Zeit als Startwert, sodass in einer engen Schleife die Zeit und das Ergebnis identisch sind.Thread.Sleep(10)
zuverlässig unterschiedliche ErgebnisseThread.Sleep(1)
erzielen muss und oder sogar 9ms nicht ausreichen.C 56 Bytes
Probieren Sie es online!
Erläuterung:
C (gcc) , 55 Bytes
Hängt davon ab, dass f den Wert "zurückgibt", der n in der Funktion zugewiesen wurde. Dies ist ein undefiniertes Verhalten, das jedoch mit gcc konsistent funktioniert, wenn keine Optimierungen aktiviert sind.
Probieren Sie es online!
quelle
JavaScript (ES8),
636260 BytesBeinhaltet einen nachgestellten Zeilenumbruch.
*2-1
könnte durch-.5
eine Einsparung von 1 Byte ersetzt werden, aber die Wahrscheinlichkeit, dass jede Zeile dieselbe Länge wie die vorherige Zeile hat, würde sich erheblich erhöhen. Natürlich wird als „zufällig“ nicht in der Herausforderung definiert, die RNG könnte ersetzt werdennew Date%3-1
für eine Anzahl von insgesamt Byte 55 .Dank an jemanden, der seinen Kommentar gelöscht hat, bevor ich den Namen finden konnte, wurde ein Byte gespeichert. Ich hatte es tatsächlich auf diese Weise versucht
repeat
undpadStart
dachte nicht daran, es zu versuchenpadEnd
- ich weiß nicht warum!Code-Snippet anzeigen
Bonus
Für die gleiche Anzahl von Bytes ist hier eine Version, die die Anzahl der Start-Leerzeichen und Iterationen als Eingabe verwendet.
Code-Snippet anzeigen
quelle
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``
ist ein Byte kürzer. (Hinweis: Da SO keine Zeilenumbrüche in Kommentaren zulässt, musste ich \ ny=31
die Möglichkeit, dass die erste Zeile zu kurz ist. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…Java 8,
8987 BytesErste Golf, ich bin sicher, es könnte viel besser sein ..
Bearbeiten: Erste Zeile dank Steadybox korrigiert .
Probieren Sie es online!
quelle
Python 2 ,
836564 BytesEinfacher Ansatz:
Probieren Sie es online!
Vielen Dank an @Rod für das Speichern einiger Bytes! Vielen Dank an @ovs für -1 Byte!
Bearbeiten: Variablenname und Ausgabezeichenfolge auf den Buchstaben 's' geändert
Mehr schlangenartige Ausgabe für 88 Bytes:
quelle
APL (Dyalog) , 20 Bytes
1 Byte gespart dank ngn
Probieren Sie es online!
quelle
¯2+
--->2-
Holzkohle , 14 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Wäre nur 10 Bytes, wenn es keine anfängliche Einrückungsanforderung gäbe.
quelle
PHP, 61 Bytes
Probieren Sie es online!
quelle
$i<30;$i++
kann sein$i++<30;
, 2 Bytes zu sparen.for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');
(das\n
wird als 1 Zeichen gezählt und sollte durch eine echte Newline ersetzt werden)for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Java 8,
131129127126119108101 BytesErläuterung:
Probieren Sie es online aus.
Alte 119-Byte-Antwort:
Erläuterung:
Probieren Sie es online aus.
quelle
R ,
726967 BytesVielen Dank an Zahiro Mor für 2 zusätzliche Bytes!
Probieren Sie es online!
quelle
sample(3,29,T)-2
aufrunif(29,-1,1)
wird die Anzahl der Bytes um 2 verringert, Bewegungen sind jedoch nicht mehr gleich wahrscheinlich. Und könnten Siepaste("%"
stattdessen auch wechselnpaste0("% "
oder vermisse ich hier etwas?% 30 s
anstelle von% 30s
. Wie Sie sagten,runif
würden die Wahrscheinlichkeiten durcheinander bringen.sprintf("%30s")
,sprintf("% 30s")
undsprintf("% 30 s")
die gleichen Ergebnisse für mich zurück. Aber auf TIO haben nur die ersten beiden identische Ergebnisse, daherpaste0("%"
sollte ein Byte gespeichert werden. Und es ist nicht erforderlich, dass jeder Zug dieselbe Wahrscheinlichkeit hat.Japt , 13 Bytes
Gibt ein Array von Zeilen zurück.
Probier es aus
Erläuterung
Bonus
Für 2 Bytes weniger ist hier eine Version, die die Anzahl der Start-Leerzeichen und Iterationen als Eingabe verwendet.
Versuch es
Alternative RNGs
Die letzten 4 Bytes können durch eines der folgenden ersetzt werden:
quelle
-1
das RNG bei der ersten Iteration zurückgibt, wir eine Gesamtzeilenlänge von,29
wann es sein sollte30
,31
oder haben32
.30
und fügen Sie dann-1
,0
oder1
uns zu geben29
,30
oder31
- fügen Sie das"
und das gibt uns eine Gesamtlänge von30
,31
oder32
für die erste Zeile.Schnell , 101 Bytes
Erläuterung
Ein volles Programm. Dies verwendet einen ziemlich seltsamen Trick:
arc4random()
Ist ein Mitglied desDarwin
Moduls, hat aberUIKit
auch diese Funktion installiert, so dass es ein Byte speichert :) Verwendet auch einen meiner Swift-Golftipps, um Saiten beliebig oft zu wiederholen.quelle
for _ in 0 ... g
den Codeblock jetzt nicht 29-mal statt 30 aus (Schleife von 0 bis 29 (exklusiv))?0...g
generiert alle Ganzzahlen in [0; g] . Meine schlechte, reparierte die Erklärung.0..<g
würde die ganzen Zahlen in [0; g) : P[0; g)
hast du ja bearbeitet, um[0; g]
mich zu verwirren. :) Hmm, aber ist es in diesem Fall nicht möglich, mit derg=30
Schleife zu beginnen[1; g]
?[0; g)
oder[1; g]
wäre definitiv möglich, wenn ich esg=30
stattdessen wähle ,print(...,0)
muss dann aber auf geändert werdenprint(...+"0")
, da sonst ein zusätzliches (Fremd-) Leerzeichen vor die 0 gestellt würde. In jedem Fall bleibt die Anzahl der Bytes gleich.Perl, 36 Bytes
quelle
say
für die Subtraktion verwenden. Habe ich Recht, wenn$#a
es erhöht wird, ändert es nicht die Anzahl der Läufe, weil es keine Referenz ist?map
die Elemente auf dem Stapel anscheinend zuerst anlege .for
nicht und hätte eine unvorhersehbare Schleifenlänge gehabtperl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'
, aber das führte manchmal (nicht jedes Mal) zu einem Segmentierungsfehler. Könnte es ein Fehler in Perl v5.22.1 und v5.16.3 sein?R,
5453 BytesÄhnliche Idee wie oben , jedoch mit verkürztem
sprintf
Code und einem kürzeren Zeichenkettenliteral. Anstelle von\n
(zwei Bytes) verwende ich einen wörtlichen Zeilenumbruch (ein Byte).Try it online!
quelle
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number.
Ich benutze essprintf
seit Jahren und irgendwie habe ich diesen Teil immer verpasst ... Danke für die Erinnerung!Ruby ,
4539 BytesProbieren Sie es online!
Änderungen
x
während der Schleife wirken sich nicht auf den Schleifenzähler aus. Ich habe S als besonders schlangenartiges Ausgabezeichen gewählt.-6 Bytes: Verwenden Sie
rand(3)-1
anstelle von[-1,0,1].sample
. Danke, Eric Duminil !quelle
x.map
anstelle vonx.times
(äquivalent, da Sie den Rückgabewert nicht verwenden)rand -1..1
ist fünf Bytes kürzer als[-1,0,1].sample
rand(3)-1
für 6 Bytes weniger.(x=30).times{puts' '*x+?+;x+=rand(3)-1}
(gleiche Größe) druckt genau 30 Felder für den Kopf der Schlange, wie von der Herausforderung gefordertSenseTalk ,
237198 BytesDies ist eine Sprache, die ich vor etwa einem Jahrzehnt kennen und lieben gelernt habe. Es ist die Skriptsprache, die das automatisierte Test-Tool Eggplant Functional steuert . Ich war viele Jahre lang begeisterter Benutzer des Tools, bevor ich eine Weile in das Unternehmen eintrat. Es ist nicht die Golf-fähigste Sprache, aber ich finde es sehr unterhaltsam, darin zu schreiben. Das Golfen ist eigentlich eine ziemliche Herausforderung, da die Sprache wortreich und englischartig sein soll bis 237 Bytes.
Ungolfed / Erklärung
Bearbeiten: 36 Bytes dank @mustachemoses gespeichert
quelle
J , 23 Bytes
Probieren Sie es online!
quelle
PowerShell , 42 Byte
Probieren Sie es online!
Schleifen von
1
bis$l=30
. Bei jeder Iteration werden$l
Leerzeichen plus einx
als Zeichenfolge in die Pipeline eingefügt, und dann wird für die nächste Schleife+=
entweder-1, 0, 1
aufGet-Random
in basiert$l
. Diese Zeichenfolgen werden aus der Pipeline gesammelt, und ein ImplizitWrite-Output
gibt uns kostenlos eine durch Zeilenumbrüche getrennte Liste.quelle
Bash, 53
Probieren Sie es online aus .
quelle
p+=RANDOM%3-1
funktioniert auch.Jelly , 18 Bytes
Probieren Sie es online!
Das gewählte Zeichen ist 0 . Wenn das Zurückgeben einer Liste mit Zeichen zulässig ist,
Y
kann das gelöscht und die Übermittlung für 17 Byte in eine Niladenkette umgewandelt werden . Alternative .Wie es funktioniert
Gelee , 16 Bytes
Wenn wir die Lösungen von Erik und Jonathan kombinieren, können wir das auf 16 Bytes reduzieren. Das gewählte Zeichen ist 1 .
Probieren Sie es online!
Vielen Dank an Jonathan Allan für das Heads-up
Ṭ€o⁶
.quelle
Ṭ€o⁶
anstelle von verwenden,⁶ẋ;€0
wie mein 18-Byter tut und bis 17 bekommen.Oktave ,
53 51 5049 BytesProbieren Sie es online!
1 Byte gespart, indem keine Schleife mehr ausgeführt wird. Ein anderer wurde gespeichert, wie es Octave
printf
auch getan hatfprintf
.Dieser neue Code erstellt ein Array mit 30 zufälligen Ganzzahlen im Bereich
-1:1
. Es summiert dann das Array kumulativ und addiert 30, was die gewünschte Sequenz ergibt.Das Ergebnis wird
fprintf
im Format "Eine Dezimalzahl, die auf eine bestimmte Breite aufgefüllt wird, gefolgt von einer neuen Zeile" gedruckt . Die Breite wird als erster Wert und die Dezimalzahl als zweiter Wert eingegeben Wenn mehr Werte eingegeben werden, wiederholt Octave den Druck automatisch, um die gewünschte Ausgabe zu erhalten.Um die Schleifenbildung dann zu erreichen, müssen wir nur Nullen zwischen dem Sequenzarray verschachteln, sodass die
fprintf
Funktion jeden Wert in der Sequenz als Breite und jede Null als zu druckende Ziffer verwendet.Druckt eine Ausgabe wie:
Der obige Code gibt nicht immer genau 30 Leerzeichen in der ersten Zeile aus. Es wird entweder 29, 30 oder 31 sein. Um dies zu korrigieren, würden Sie diese 53-Byte-Version verwenden:
quelle
x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Lua,
8175 BytesIn
for i=1,n ...
der to_expn
wird nur einmal vor dem Eintritt in die Schleife ausgewertet, wobei ein Byte gespeichert wird.-6 danke an @ user202729
Probieren Sie es online!
quelle
Python 3.6 ,
847369 BytesDanke an @WheatWizard für -11 Bytes. Vielen Dank an @JoKing für -4 Bytes.
quelle
i
, können Siefor i in[1]*30
stattdessen zum Speichern von Bytes verwenden.from random import*
so, dass Sie dasrandom.
später nicht brauchen . Und Sie können den Zeilenumbruch nach Ihrem entfernen:
.30
auf29
das wechseln ,"+".rjust(x)
können Sie mit ersetzen" "*x+"+"
.[1]*30
,[1]*x
weil es ein Byte kürzer ist.ES5,
979581 BytesES5,
11298 Bytes, wenn das Funktionsformat benötigt wird:quelle
_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
join(" ")
mitjoin` `
Rot , 54 Bytes
Probieren Sie es online!
quelle