Code Golf: Ihre eigene Haustier-ASCII-Schlange

34

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.

AJFaraday
quelle
Können wir ein Array von Zeilen zurückgeben? Sind führende / nachfolgende Leerzeichen oder Zeilenumbrüche zulässig?
Shaggy
1
Ich gehe davon aus, dass Leerzeichen in jeder Zeile erlaubt sind, oder?
Luis Mendo
1
Was bedeutet "zufällig"? Einheitlich zufällig? Zufällig aus einer Verteilung mit positiver Unterstützung für jedes der drei Ergebnisse? Zufällig aus irgendeiner Distribution? Müssen die Ergebnisse bei jedem Programmlauf unterschiedlich sein?
Nathaniel
1
Beachten Sie, dass Zufall standardmäßig nicht einheitlich bedeutet . Zum Beispiel ist der zweite Teil meiner Brainfuck-Antwort (bis jetzt) ​​vollkommen gültig, obwohl er die meiste Zeit eine gerade Linie erzeugt.
Jo King
1
Im Moment gibt es zwei Punkte, die unklar sind: 1) Bedeutet Zufall gleichmäßig zufällig? (wirkt sich auf diese Antwort aus ) und 2) Muss die Ausgabe jedes Mal anders sein? (Kann der Zufallszahlengenerator nicht gesät werden? Beeinflusst diese Antwort )
DJMcMayhem

Antworten:

14

05AB1E , 15 14 Bytes

30DF2Ý<+ΩD0sú,

Probieren Sie es online!

Verwendet 0.

Erläuterung

30DF2Ý<+ΩD0sú,
30D            # Push 30 to the stack (One for the amount of iterations we are going to perform and one for the initial padding)
   F           # Pop one of the 30s and perform the following that many times...
    2Ý          # Push [0,1,2] ...
      <         # and create [-1,0,1] from that
       +        # Add the last padding to every entry (e.g. 30 in the beginning resulting in [29,30,31]
        Ω       # Pick one of the results at random ...
         D      # and push it to the stack twice
          0     # Push 0 (Any character will work fine here) ...
           sú   # and pad it with the randomly chosen amount of spaces in the front
             ,  # Finally print the result with a trailing newline
Datboi
quelle
38
05AB1E: 0-Byte, online ausprobieren ! ... warte, nein, fast schon.
Magic Octopus Urn
14

Zufälliges Brainfuck , 123 122 121 Bytes

+[--[<]>>+<-]>+[->+>+>+<<<]++++++++++>>++<[>>[->+<<.>]>[-<+>]>?>+++<[>->+<[>]>[<+>-]<<[<]>-]>-->,<[-<<<+>>>]<<<<+.-<<.>-]

Probieren 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:

+[--[<]>>+<-]>+ Create the value 30
[->+>+>+<<<]    Copy it three times
++++++++++      Create a newline cell
>>++<            Adds 2 to the second copy to make it a space and move to the counter
[ While counter
  >>[->+<<.>]>[-<+>] Print out the padding cell number of spaces
  ?>+++<[>->+<[>]>[<+>-]<<[<]>-] Get 3-(random byte%3)
  >-->,<[-<<<+>>>]   Add (result-2) to the padding cell
  <<<<+.-<           Print an exclamation mark
  <<.                Print a newline
  >-                 Decrement counter
] end loop

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.

Scherzen
quelle
Sehr schön! Ich wusste nichts von dem ?Befehl. +1
Grant Miller
@GrantMiller ?ist nur in Random Brainfuck verfügbar , nicht im klassischen Brainfuck
Jo King
8

C (GCC) , 61 58 56 Byte

Antwort bearbeitet, um Änderungen der Regeln widerzuspiegeln ...

i;f(s){for(s=i=31;--i;printf("%*d\n",s+=1-rand()%3,8));}

Probieren Sie es online!

Cleblanc
quelle
Speichern Sie ein Byte, indem Sie s+=1-rand()%3zur Funktion printf wechseln. i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Vaelus
@Vaelus Dadurch hat die erste Zeile eine unterschiedliche Anzahl von Leerzeichen anstelle der in der Frage angegebenen 30.
Steadybox
@Steadybox Was in den Kommentaren anscheinend erlaubt ist ..
Kevin Cruijssen
7

Retina , 24 Bytes


30* +
-29{¶<`^
 
S,2@1`

Probieren Sie es online!

Erläuterung


30* +

Initialisieren Sie den Arbeitsstring in der ersten Zeile, dh 30 Leerzeichen und a +.

-29{¶<`^
 

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).

S,2@1`

Dies vergleicht den leeren regulären Ausdruck mit der Eingabe, die uns jede Position zwischen Zeichen (sowie Anfang und Ende der Zeichenfolge) gibt. Dann ,2bleiben nur die ersten drei Übereinstimmungen erhalten, dh die Übereinstimmungen nach null, eins und zwei Leerzeichen. @wählt zufällig eine dieser drei Übereinstimmungen aus. Dann Steilt die Aufteilungsstufe ( ) die Eingabe um diese Übereinstimmung auf. Und das 1sagt 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.

Martin Ender
quelle
Wissen Sie, was ist noch kürzer als das Entfernen von 0--2 Leerzeichen? Räume umher mischen! . Übrigens, die neue Netzhaut ist großartig: D
Leo
7

VBA, 60 59 49 Bytes

For l=1To 30:?Spc(30+i)"+":i=i+Sgn(Rnd()-.5):Next

Fü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 =1und gespeichertTo

{EDIT2} Gespeichert 10 Bytes dank remoel Kommentar

Alte Versionen:

'V1
i=30:For l=1 To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next
'V2
i=30:For l=1To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next
Chronozid
quelle
5
Willkommen bei PPCG!
Martin Ender
2
Sie können ein paar Bytes sparen, indem Sie ersetzen String(i," ")und Spc(30+i)dann entfernen i=30:. Oder -1 Byte durch Entfernen &. :)
Remoel
7

C # (.NET Core), 112 110 106 100 99 98 Byte

v=>{var r="";for(int t=30,i=t;i-->0;r+="+\n".PadLeft(t+=new System.Random().Next(3)-1));return r;}

-1 Byte dank @raznagul .
-1 Byte dank @auhmaan .

Erläuterung:

Probieren Sie es online aus.

v=>{                      // Method with empty unused parameter and no return-type
  var r="";               //  Result-string, starting empty
  for(int t=30,           //  Temp-integer, starting at 30
      i=t;i-->0;          //  Loop 30 times
    r+=                   //   Append the result-String with:
       "+\n"              //    The character and a new-line,
            .PadLeft(     //    left-padded with `t` spaces,
                     t+=new System.Random().Next(3)-1));
                          //    after `t` first has been changed with -1, 0, or 1 randomly
  return r;}              //  Return the result-string
Kevin Cruijssen
quelle
Eine seltsame Sache: Wenn ich new Random().Next()mehrmals lokal aufrufe (.net Framework Version 4.6.1), erhalte ich immer das gleiche Ergebnis. Ich muss ein Thread.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.
Raznagul
@raznagul Hmm, diese Ausgabe mit C # (Mono C # -Compiler) ist in der Tat komisch ..
Kevin Cruijssen
3
@raznagul new Random()verwendet die Zeit als Startwert, sodass in einer engen Schleife die Zeit und das Ergebnis identisch sind.
TheLethalCoder
@TheLethalCoder: Ja, das habe ich (mehr oder weniger) erwartet. Die seltsamen Dinge sind, dass 1) .net-Core (zumindest auf TIO) sich anders verhält. 2) Dass ich Thread.Sleep(10)zuverlässig unterschiedliche Ergebnisse Thread.Sleep(1)erzielen muss und oder sogar 9ms nicht ausreichen.
Raznagul
@raznagul Gut schlafen für 1, 9 oder 10ms sollten alle für die gleiche Zeit schlafen, abhängig von anderen laufenden Prozessen ... seltsam in der Tat.
TheLethalCoder
7

C 56 Bytes

n;f(p){n>29?n=0:f(printf("%*d\n",n++?p-rand()%3:31,0));}

Probieren Sie es online!

Erläuterung:

n; // As a global variable, n is initialized to zero.
f(p)
{
    // Call the function recursively until n > 29.
    n > 29

        // At the end, set n back to zero.
        ? n=0

        // On the first iteration, n == 0 and p has an indeterminate value.
        // 'n++ ? p-rand()%3 : 31' returns 31 (without reading p), and thus
        // 30 spaces get printed. printf() returns the number of characters
        // printed, 32 (30 spaces + '0' + '\n').
        //    On subsequent iterations, p has the value the previous printf
        // call returned, which is the padding on last iteration + 2. Also,
        // n > 0, so the same expression now returns p-rand()%3, and thus
        // the padding changes either by -1, 0, or 1 spaces. The function
        // is again called with the value of the current line's padding + 2.
        : f(printf("%*d\n", n++ ? p-rand()%3 : 31, 0));
}

C (gcc) , 55 Bytes

n;f(p){n=n<30&&f(printf("%*d\n",n++?p-rand()%3:31,0));}

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!

Steadybox
quelle
6

JavaScript (ES8), 63 62 60 Bytes

Beinhaltet einen nachgestellten Zeilenumbruch. *2-1könnte durch -.5eine 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 werden new Date%3-1für eine Anzahl von insgesamt Byte 55 .

f=(x=y=30)=>x?``.padEnd(y+=Math.random()*2-1)+`+
`+f(--x):``

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 repeatund padStartdachte nicht daran, es zu versuchen padEnd- ich weiß nicht warum!


Bonus

Für die gleiche Anzahl von Bytes ist hier eine Version, die die Anzahl der Start-Leerzeichen und Iterationen als Eingabe verwendet.

f=(x,y=x)=>x?``.padEnd(y)+`+
`+f(--x,y+Math.random()*2-1):``

Zottelig
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 \ n
eingeben,
Danke, @Stefnotch. Leider besteht auch bei einem Anfangswert von y=31die Möglichkeit, dass die erste Zeile zu kurz ist. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…
Shaggy
1
Korrigieren Sie mich, wenn ich falsch liege, aber leidet Ihre aktuelle Lösung nicht auch unter diesem Problem?
Stefnotch
1
Die erste Zeile sollte genau 30 Leerzeichen enthalten, je nach Herausforderung.
Nit
1
@Nit hat die OP bestätigt , dass die erste Zeile kann 29-31 Leerzeichen enthalten aber noch zu bearbeiten diese Tatsache in die Herausforderung, trotz wiederholter Aufforderungen , dies zu tun.
Shaggy
6

Java 8, 89 87 Bytes

Erste Golf, ich bin sicher, es könnte viel besser sein ..

Bearbeiten: Erste Zeile dank Steadybox korrigiert .

l->{for(int a=31,b=a;--a>0;){System.out.printf("%"+b+"c\n",'+');b+=2-Math.random()*3;}}

Probieren Sie es online!

 l->{                                           //Begin lambda
    for(int a=31,b=a;--a>0;)                  //Initialise vars, loop through 30 lines
    {
        System.out.printf("%"+b+"c\n",'+');     //Print result
        b+=2-Math.random()*3;                   //Change padding by -1, 0, or 1
    }
JSchiff
quelle
5
Willkommen bei PPCG! :)
Shaggy
2
83 Bytes
Steadybox
6

Python 2 , 83 65 64 Bytes

Einfacher Ansatz:

import os
k=30
exec"print' '*k+'+';k+=ord(os.urandom(1))%3-1;"*k

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:

from random import*
s=[30,0]
exec"print' '*sum(s)+'(S)'[s[-1]+1];s+=[randint(-1,1)];"*30
Gábor Fekete
quelle
1
Ich mag das. Wirklich gepflegte Lösung.
Linemade
5

Holzkohle , 14 Bytes

× ³⁰F³⁰«↙+M‽³→

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

× ³⁰            Print 30 spaces (forces the desired indentation)
    F³⁰«        Repeat 30 times
        ↙+      Print a `+` and move down and left one square
          M‽³→  Move right a random number of squares from 0 to 2

Wäre nur 10 Bytes, wenn es keine anfängliche Einrückungsanforderung gäbe.

Neil
quelle
@ KevinCruijssen Hmm, das ist umständlich, weil Charcoal standardmäßig gerne schneidet.
Neil
5

PHP, 61 Bytes

for($p=32;$i<30;$i++)echo str_pad("+
",$p+=rand(-1,1),' ',0);

Probieren Sie es online!

Chocochaos
quelle
8
$i<30;$i++kann sein $i++<30;, 2 Bytes zu sparen.
Kevin Cruijssen
2
55 Bytes: for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');(das \nwird als 1 Zeichen gezählt und sollte durch eine echte Newline ersetzt werden)
Ismael Miguel
2
Alternative 55 Byte lang, ohne Warnung:for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Ismael Miguel
5

Java 8, 131 129 127 126 119 108 101 Bytes

v->{String r="";for(int i=30,j,t=i;i-->0;r+="+\n")for(j=t+=Math.random()*3-1;j-->0;r+=" ");return r;}

Erläuterung:

Probieren Sie es online aus.

v->{                     // Method with empty unused parameter and String return-type
  String r="";           //  Result-String, starting empty
  for(int i=30,j,t=i;    //  Two index integers, and a temp integer (starting at 30)
      i-->0;             //  Loop 30 times:
      r+="+\n")          //    After every iteration: Append the character and a new-line
    for(j=t+=Math.random()*3-1;
                         //   Change `t` with -1, 0, or 1 randomly
        j-->0;r+=" ");   //    And append that many spaces to the result-String
  return r;}             //  Return the result-String

Alte 119-Byte-Antwort:

v->{String s="",r=s;int i=90,t=30;for(;i-->t;s+=" ");for(;i-->0;t+=Math.random()*3-1)r+=s.substring(t)+"+\n";return r;}

Erläuterung:

Probieren Sie es online aus.

v->{                      // Method with empty unused parameter and String return-type
  String s="",            //  Temp-String, starting empty
         r=s;             //  Result-String, starting empty
  int i=90,t=30;          //  Temp integer, starting at 30
  for(;i-->t;s+=" ");     //  Fill the temp String with 60 spaces
  for(;i-->0;             //  Loop 30 times:
      t+=Math.random()*3-1//    After every iteration: Change `t` with -1, 0, or 1 randomly
    r+=s.substring(t)     //   Append the result with `60-t` amount of spaces
       +"+\n";            //   + the character and a new-line
  return r;}              //  Return the result-String
Kevin Cruijssen
quelle
4

R , 72 69 67 Bytes

cat(sprintf(paste0("% ",cumsum(c(30,sample(3,29,T)-2)),"s"),"+\n"))

Vielen Dank an Zahiro Mor für 2 zusätzliche Bytes!

Probieren Sie es online!

Plannapus
quelle
Durch das Umschalten von sample(3,29,T)-2auf runif(29,-1,1)wird die Anzahl der Bytes um 2 verringert, Bewegungen sind jedoch nicht mehr gleich wahrscheinlich. Und könnten Sie paste("%"stattdessen auch wechseln paste0("% "oder vermisse ich hier etwas?
Rift
@Rift Wenn ich Einfügen verwenden würde, wären die resultierenden Zeichenfolgen von der Form % 30 sanstelle von % 30s. Wie Sie sagten, runifwürden die Wahrscheinlichkeiten durcheinander bringen.
Plannapus
Vor Ort sprintf("%30s"), sprintf("% 30s")und sprintf("% 30 s")die gleichen Ergebnisse für mich zurück. Aber auf TIO haben nur die ersten beiden identische Ergebnisse, daher paste0("%"sollte ein Byte gespeichert werden. Und es ist nicht erforderlich, dass jeder Zug dieselbe Wahrscheinlichkeit hat.
Rift
4

Japt , 13 Bytes

Gibt ein Array von Zeilen zurück.

30ÆQù1nH±1n3ö

Probier es aus


Erläuterung

30Æ               :Create the range [0,30) and pass each through a function
   Q              :  The " character
    ù             :  Pad start to length...
           3ö     :    Random element from the range [0,3)
         1n       :    Subtract 1
       H±         :    Add the result of that to H (inititally 32)
     1n           :    Subtract 1 to avoid the possibility of the first line being 33 characters long in total

Bonus

Für 2 Bytes weniger ist hier eine Version, die die Anzahl der Start-Leerzeichen und Iterationen als Eingabe verwendet.

U°ÆQùU±1n3ö

Versuch es


Alternative RNGs

Die letzten 4 Bytes können durch eines der folgenden ersetzt werden:

MrJ1     :A random float between -1 and 1
Jõ ö     :Generate the range [-1,1] and return a random element
3ö É     :An alternative way of writing the method used above
½nMr     :0.5 subtracted from a random float between 0 and 1
Zottelig
quelle
1
Wow, ich kann nicht glauben, dass wir im Moment gewinnen! Ich denke, Sie können ein Byte mit diesem speichern (auf dem Handy, so kann ich nicht wirklich überprüfen)
ETHproductions
@ETHproductions: Ha! Das ist identisch mit dem, womit ich angefangen habe. Das Problem ist jedoch, dass, wenn -1das RNG bei der ersten Iteration zurückgibt, wir eine Gesamtzeilenlänge von, 29wann es sein sollte 30, 31oder haben 32.
Shaggy
Hmm, ich bin verwirrt darüber, wie Ihre Version das dann umgeht ... Außerdem glaube ich, dass OP in den Kommentaren klargestellt hat, dass es ihnen egal ist, ob in der anfänglichen Iteration ein zusätzliches Leerzeichen entfernt oder hinzugefügt wird.
ETHproductions
Eigentlich bin ich verwirrt von "wann sollte es 30, 31 oder 32 sein" - wo ist das erforderlich?
ETHproductions
@ETHproductions: Wir beginnen mit 30und fügen Sie dann -1, 0oder 1uns zu geben 29, 30 oder 31- fügen Sie das "und das gibt uns eine Gesamtlänge von 30, 31oder 32für die erste Zeile.
Zottelig
4

Schnell , 101 Bytes

import UIKit
var g=29;for _ in 0...g{print((0..<g).map{_ in" "}.joined(),0);g+=Int(arc4random()%3)-1}

Erläuterung

Ein volles Programm. Dies verwendet einen ziemlich seltsamen Trick: arc4random()Ist ein Mitglied des DarwinModuls, hat aber UIKitauch diese Funktion installiert, so dass es ein Byte speichert :) Verwendet auch einen meiner Swift-Golftipps, um Saiten beliebig oft zu wiederholen.

import UIKit        // Imports the UIKit module, necessary for the RNG.
var g=29;           // Declares an integer variable g by assigning it to 30.
for _ in 0 ... g {  // Execute the code block 30 times (for each integer in [0; g]):
 print(             // Output the following:
  (0..<g).map       // For each integer in [0; g)...
   {_ in" "}        // ... return a literal space character. 
    .joined()       // ... And join the result to a single string.
             ,0     // Also print a "0" preceded by a single space (g starts from 29).
 );
g+=                 // Increment the variable g by...
   arc4random()%3   // ... A random integer, modulo 3...
   Int(...)-1       // ... Casted to an integer (yes, this is needed!) and decremented.
}
Mr. Xcoder
quelle
Führt for _ in 0 ... gden Codeblock jetzt nicht 29-mal statt 30 aus (Schleife von 0 bis 29 (exklusiv))?
Kevin Cruijssen
@ KevinCruijssen Nein, 0...ggeneriert alle Ganzzahlen in [0; g] . Meine schlechte, reparierte die Erklärung. 0..<gwürde die ganzen Zahlen in [0; g) : P
Mr. Xcoder
Ah, das [0; g)hast du ja bearbeitet, um [0; g]mich zu verwirren. :) Hmm, aber ist es in diesem Fall nicht möglich, mit der g=30Schleife zu beginnen [1; g]?
Kevin Cruijssen
@KevinCruijssen Sich entweder zu wiederholen [0; g)oder [1; g]wäre definitiv möglich, wenn ich es g=30stattdessen wähle , print(...,0)muss dann aber auf geändert werden print(...+"0"), da sonst ein zusätzliches (Fremd-) Leerzeichen vor die 0 gestellt würde. In jedem Fall bleibt die Anzahl der Bytes gleich.
Mr. Xcoder
4

Perl, 36 Bytes

perl -E '$#a=29;map{$#a+=rand(3)-say"@a -"}@a'
Tonne Hospel
quelle
So gut. Ich vergesse immer, dass Sie eine solche Array-Länge festlegen können ... und sayfür die Subtraktion verwenden. Habe ich Recht, wenn $#aes erhöht wird, ändert es nicht die Anzahl der Läufe, weil es keine Referenz ist?
Dom Hastings
@DomHastings: Das liegt daran, dass ich mapdie Elemente auf dem Stapel anscheinend zuerst anlege . fornicht und hätte eine unvorhersehbare Schleifenlänge gehabt
Ton Hospel
Das ist wirklich nützlich zu wissen. Vielen Dank!
Dom Hastings
Schönes Golfen. Ich habe versucht, ein anderes Byte mit zu entfernen perl -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?
Kjetil S.
@Kjetil Ja, das ist ein bekanntes Problem, das wahrscheinlich nie behoben wird. Beim Durchlaufen eines Arrays erhalten die Einträge keine zusätzliche Nachzählung. Wenn Sie sie also löschen, werden sie freigegeben, sobald die Schleife sie erreicht und Sie auf den freigegebenen Speicher klicken. Zum Glück machst du das nie in echten Programmen.
Ton Hospel
4

R, 54 53 Bytes

cat(sprintf('
%*s',cumsum(c(30,sample(3,29,T)-2)),0))

Ähnliche Idee wie oben , jedoch mit verkürztem sprintfCode und einem kürzeren Zeichenkettenliteral. Anstelle von \n(zwei Bytes) verwende ich einen wörtlichen Zeilenumbruch (ein Byte).

Try it online!

Konrad Rudolph
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 es sprintfseit Jahren und irgendwie habe ich diesen Teil immer verpasst ... Danke für die Erinnerung!
Plannapus
1
In der zweiten Zeile werden manchmal zwei Leerzeichen anstelle von einem eingerückt.
Scott Milner
@ScottMilner Einige Zeit gefunden, um das Problem zu beheben.
Konrad Rudolph
4

Ruby , 45 39 Bytes

x=30
x.times{puts' '*(x+=rand(3)-1)+?S}

Probieren Sie es online!

Änderungen xwä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)-1anstelle von [-1,0,1].sample. Danke, Eric Duminil !

benj2240
quelle
Sie können zwei Bytes mit x.mapanstelle von x.times(äquivalent, da Sie den Rückgabewert nicht verwenden)
speichern
1
Ups, du hast recht, ignorier mich!
RJHunter
1
OK, ich habe eine bessere: rand -1..1ist fünf Bytes kürzer als[-1,0,1].sample
RJHunter
1
@RJHunter: Oder rand(3)-1für 6 Bytes weniger.
Eric Duminil
1
(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 gefordert
Asone Tuhid
4

SenseTalk , 237 198 Bytes

Dies 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.

set s to "                              +"&lf
set p to s
repeat 30
set a to random(0,2)
if a equals 0
delete first char of p
else if a equals 1
put " " before p
end if
put p after s
end repeat
put s

Ungolfed / Erklärung

set the_snake to "                              +"&lf #assign the first line of the snake
set previous_line to the_snake                        #set up for the loop

repeat 30 times                                       #loop 30x
    set action to random(0,2)                         #random add/subtract/stay the same

    if action equals 0
        delete the first character of previous_line   #SenseTalk really shines at string manipulation
    else if action equals 1
        put " " before previous_line                  #insert a character at the beginning
    end if

    put previous_line after the_snake                 #plop the new segment into the string
end repeat                                            #close the loop

put the_snake                                         #print to standard out

Bearbeiten: 36 Bytes dank @mustachemoses gespeichert

Allen Fisher
quelle
1
Ist das Leerzeichen notwendig?
MoustacheMoses
Dafür habe ich großen Respekt. Besonders vor dem Hintergrund der "Golfsprachen", die zu existieren scheinen, völlig unleserlich, aber kurz. Es ist schön, ein Beispiel zu haben, das nur zeigt, was Sie mit Ihrer Sprache anfangen können.
AJFaraday
1
Guten Ruf @MustacheMoses! Aktualisiert.
Allen Fisher
Ich zähle 198 Bytes (nun, das User-Skript zählt so viele)
HyperNeutrino
@AllenFisher Haben Sie einen eigenständigen Interpreter oder Compiler für diese Sprache, den ich verwenden kann, ohne eine Auberginendemo zu erhalten?
MoustacheMoses
3

PowerShell , 42 Byte

1..($l=30)|%{" "*$l+"x";$l+=-1,0,1|Random}

Probieren Sie es online!

Schleifen von 1bis $l=30. Bei jeder Iteration werden $lLeerzeichen plus ein xals Zeichenfolge in die Pipeline eingefügt, und dann wird für die nächste Schleife +=entweder -1, 0, 1auf Get-Randomin basiert $l. Diese Zeichenfolgen werden aus der Pipeline gesammelt, und ein Implizit Write-Outputgibt uns kostenlos eine durch Zeilenumbrüche getrennte Liste.

AdmBorkBork
quelle
3

Bash, 53

  • 3 Bytes gespart dank @Dennis
for((i=p=30;i--;p+=RANDOM%3-1));{ printf %${p}s+\\n;}

Probieren Sie es online aus .

Digitales Trauma
quelle
p+=RANDOM%3-1funktioniert auch.
Dennis
@ Tennis Ja natürlich! Vielen Dank!
Digital Trauma
3

Jelly , 18 Bytes

1ŒRX+
30ǒС⁶ẋ;€0Y

Probieren Sie es online!

Das gewählte Zeichen ist 0 . Wenn das Zurückgeben einer Liste mit Zeichen zulässig ist, Ykann das gelöscht und die Übermittlung für 17 Byte in eine Niladenkette umgewandelt werden . Alternative .

Wie es funktioniert

30 € 0Y | Niladic Hauptverbindung.
30 | Ab 30 ...
  Ç'С | ... Wiederholen Sie den Hilfslink 29 Mal und sammeln Sie die Ergebnisse in einer Liste.
             | (Diese Liste enthält die ersten 30, es gibt also tatsächlich 30 Zahlen).
      ⁶ẋ | Wiederholen Sie ein Leerzeichen so oft für jedes Element in der Liste.
        € 0 | Fügen Sie jeweils eine 0 hinzu.
           Y | Und mach mit bei Newlines.
------------- +
1ŒRX + | Monadischer Helferlink. Alternativ können Sie µ1ŒRX + µ anstelle von Ç verwenden.
1 | Der buchstäbliche.
 ŒR | Symmetrischer Bereich von –1 bis 1.
   X + | Wählen Sie eine Zufallszahl aus und fügen Sie sie dem Argument hinzu.

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 .

’r‘X
30ǒСṬ€o⁶Y

Probieren Sie es online!

Vielen Dank an Jonathan Allan für das Heads-up Ṭ€o⁶.

Mr. Xcoder
quelle
Sie könnten Ṭ€o⁶anstelle von verwenden, ⁶ẋ;€0wie mein 18-Byter tut und bis 17 bekommen.
Jonathan Allan
@ JonathanAllan Vielen Dank! Wenn ich die drei Jelly-Antworten kombiniere, habe ich tatsächlich 16 Bytes. Aber ich habe das als sekundäre Lösung gepostet, weil es nicht ganz meine ist. :-)
Mr. Xcoder
3

Oktave , 53 51 50 49 Bytes

printf('%*d\n',[a=31+cumsum(randi(3,1,30)-2);~a])

Probieren Sie es online!

1 Byte gespart, indem keine Schleife mehr ausgeführt wird. Ein anderer wurde gespeichert, wie es Octave printfauch getan hat fprintf.

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 fprintfim 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 fprintfFunktion jeden Wert in der Sequenz als Breite und jede Null als zu druckende Ziffer verwendet.

Druckt eine Ausgabe wie:

                              0
                             0
                              0
                             0
                              0
                               0
                              0
                               0
                              0
                              0
                             0
                            0
                           0
                           0
                           0
                          0
                           0
                            0
                             0
                              0
                              0
                             0
                             0
                              0
                               0
                              0
                              0
                               0
                               0
                                0

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:

x=31;for i=2:x;fprintf('%*d\n',x,0);x+=randi(3)-2;end
Tom Carpenter
quelle
Sie können zwei Bytes speichern:x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Kevin Cruijssen
@ KevinCruijssen Ich habe darüber nachgedacht, aber es funktioniert nicht gleich. Dies würde dazu führen, dass die erste Zeile mit 29, 30 oder 31 Leerzeichen beginnt.
Tom Carpenter
1
@ KevinCruijssen in der Tat, egal. Ich habe gerade die OPs Kommentare bemerkt, die besagen, dass das erlaubt ist.
Tom Carpenter
Ja. Es ist ein bisschen ärgerlich, dass eine Regel im Kommentar steht (zumal es der aktuellen Herausforderungsbeschreibung widerspricht ..). Ich habe OP gebeten, die Herausforderung so zu bearbeiten, dass Sie mit 29, 30 oder 31 beginnen können, da er dies in den Kommentaren zuzulassen scheint.
Kevin Cruijssen
3

Lua, 81 75 Bytes

n=30;for i=1,n do print(("%-"..n.."s+"):format(" "))n=n-2+math.random(3)end

In for i=1,n ...der to_exp n wird nur einmal vor dem Eintritt in die Schleife ausgewertet, wobei ein Byte gespeichert wird.

-6 danke an @ user202729

Probieren Sie es online!

lqnrd
quelle
1
Willkommen bei PPCG! Möglicherweise möchten Sie Ihrem Beitrag einen TIO-Link hinzufügen, damit die Benutzer Ihr Programm einfacher testen können.
User202729
Sie können Ihre Antwort auf 76 Bytes abgrenzen . Neben der Seite Tipps zum Golfen in Lua kann nützlich sein.
user202729
75 Bytes .
user202729
3

Python 3.6 , 84 73 69 Bytes

from random import*
x=30
exec("print(' '*x+'+');x+=randint(-1,1);"*x)

Danke an @WheatWizard für -11 Bytes. Vielen Dank an @JoKing für -4 Bytes.

MoustacheMoses
quelle
Da Sie am Ende nicht verwenden i, können Sie for i in[1]*30stattdessen zum Speichern von Bytes verwenden.
Wheat Wizard
Sie können auch from random import*so, dass Sie das random.später nicht brauchen . Und Sie können den Zeilenumbruch nach Ihrem entfernen :.
Weizen-Assistent
Und wenn Sie 30auf 29das wechseln , "+".rjust(x)können Sie mit ersetzen " "*x+"+".
Weizen-Assistent
In Bezug auf meinen letzten Kommentar sollten es 30 statt 29 Leerzeichen sein. Ihre aktuelle Antwort enthält nur 29 Leerzeichen und entspricht somit nicht der Spezifikation. Dies kann durch Ändern von 30 auf 31 behoben werden.
Weizen-Assistent
1
@ WheatWizard Danke! Ich habe Ihre Änderungen hinzugefügt und Ihnen auch gutgeschrieben. Ich habe zu gewechselt [1]*30, [1]*xweil es ein Byte kürzer ist.
MoustacheMoses
3

ES5, 97 95 81 Bytes

for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)

ES5, 11298 Bytes, wenn das Funktionsformat benötigt wird:

function a(){for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)}a()

Kyle Fairns
quelle
2
Willkommen bei PPCG! Ich denke, Ihre Variablen müssen innerhalb einer Funktion deklariert werden -_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
Oliver
Das wird die Bytes töten, das sage ich dir. ES5 enthält standardmäßig keine Pfeilfunktionen. Ich werde aktualisieren
Kyle Fairns
@ Oliver, Funktionsformat hinzugefügt :)
Kyle Fairns
Nett! Ich bin nicht sicher , wenn es eingeführt wurde, aber ich denke , Sie ersetzen können join(" ")mitjoin` `
Oliver
@Oliver Ich bin mir nicht sicher, ob Sie das in ES5 können, oder? Ich dachte, das wäre ein Template-Literal, das in ES6 hinzugefügt wurde?
Kyle Fairns