Code Golf: Twój własny wąż ASCII

34

Więc napisałem sobie jedno-linijkę, która wydrukowała węża na konsoli. To trochę zabawne i zastanawiałem się, jak mogę skondensować kod ...

Oto (krótki) przykładowy wynik:

                +
                 +
                  +
                   +
                   +
                   +
                  +
                   +
                    +
                    +
                    +
                     +
                     +
                      +
                      +
                       +
                      +
                     +
                     +
                    +

Oto specyfikacje:

  • W każdym wierszu na konsoli drukowany jest pojedynczy znak spacji (w zależności od tego, co chcesz), początkowo z 29 do 31 spacjami po lewej stronie.
  • Przy każdej iteracji pomiędzy tymi trzema akcjami podejmowana jest losowa decyzja
    • Ilość wypełnienia zmniejsza się o 1
    • Ilość wypełnienia pozostaje taka sama
    • Ilość wypełnienia wzrasta o 1

Zrób to 30 razy, aby wydrukować węża o długości 30 segmentów na konsolę.

Najkrótsza odpowiedź w bajtach wygrywa.

AJFaraday
źródło
Czy możemy zwrócić tablicę wierszy? Czy dozwolone są spacje wiodące / końcowe lub znaki nowej linii?
Kudłaty
1
Zakładam, że końcowe spacje w każdej linii są dozwolone, prawda?
Luis Mendo,
1
Co oznacza „losowy”? Równomiernie losowy? Losowo z dowolnej dystrybucji z pozytywnym poparciem dla każdego z trzech wyników? Losowo z jakiejkolwiek dystrybucji? Czy wyniki muszą być różne dla każdego uruchomienia programu?
Nathaniel
1
Zauważ, że domyślnie losowe nie oznacza jednorodnie . Na przykład, druga część mojej odpowiedzi na pieprzenie mózgu jest (jak na razie) całkowicie poprawna, mimo że przez większość czasu generuje linię prostą.
Jo King
1
W tej chwili są dwa niejasne punkty: 1) Czy losowe oznacza równomiernie losowe? (wpływa na tę odpowiedź ) i 2) Czy wynik musi być za każdym razem inny? (tj. czy generator liczb losowych może być niezaznaczony? Wpływa na tę odpowiedź )
DJMcMayhem

Odpowiedzi:

14

05AB1E , 15 14 bajtów

30DF2Ý<+ΩD0sú,

Wypróbuj online!

Zastosowania 0.

Wyjaśnienie

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
źródło
38
05AB1E: 0 bajtów, wypróbuj online! ... czekaj, nie, prawie jednak.
Magic Octopus Urn
14

Random Brainfuck , 123 122 121 bajtów

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

Wypróbuj online!

Random Brainfuck jest rozszerzeniem „brainfuck”, z pomocnym dodatkiem ?polecenia, które ustawia bieżącą komórkę na losowy bajt. To drukuje węża wykonanego z !s, który bardziej zabawnie przypomina kroki.

Jak to działa:

+[--[<]>>+<-]>+ 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

Inne rozwiązanie, które przylgnie do litery pytania, a nie ducha.

87 bajtów

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

Wypróbuj online!

Ten jest mocno tendencyjny do pozostawiania wyściółki w spokoju, ale zwiększenie lub zmniejszenie wyściółki są równie możliwe. Każda z nich ma nieco mniej niż 1 na 256 okazji.

Jo King
źródło
Bardzo dobrze! Nie byłem świadomy ?polecenia. +1
Grant Miller
@GrantMiller ?jest dostępny tylko w Random Brainfuck , a nie w klasycznym brainfuck
Jo King
8

C (gcc) , 61 58 56 bajtów

Odpowiedź edytowana w celu odzwierciedlenia zmian zasad ...

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

Wypróbuj online!

cleblanc
źródło
zapisz bajt, przechodząc s+=1-rand()%3do funkcji printf. i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Vaelus
@Vaelus To sprawia, że ​​pierwszy wiersz ma zmienną liczbę spacji zamiast 30 określonych w pytaniu.
Steadybox
@ Steadybox Które jest dozwolone w komentarzach najwyraźniej ..
Kevin Cruijssen
7

Siatkówka , 24 bajty


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

Wypróbuj online!

Wyjaśnienie


30* +

Zainicjuj łańcuch roboczy do pierwszego wiersza, tj. 30 spacji i znaku a +.

-29{¶<`^
 

W drugiej linii jest spacja. -29{opakowuje pozostałą część programu w pętlę, która jest uruchamiana 29 razy. ¶<wypisuje ciąg roboczy na początku każdej iteracji pętli z końcowym przesuwem linii. Sam etap atomowy wstawia spację na początku łańcucha (podstawową ideą jest wstawienie jednej spacji, a następnie losowe usunięcie 0–2 spacji, ponieważ jest to bajt krótszy niż losowe wybieranie między usuwaniem, wstawianiem i brakiem operacji).

S,2@1`

Odpowiada to pustemu wyrażeniu regularnemu względem danych wejściowych, co daje nam każdą pozycję między znakami (oraz początkiem i końcem łańcucha). Następnie ,2zachowuje tylko trzy pierwsze dopasowania, tzn. Dopasowania po zera, jeden i dwa spacje. @wybiera losowy jeden z tych trzech dopasowań. Następnie etap podziału ( S) dzieli dane wejściowe wokół tego dopasowania. I 1każe zachować tylko drugą część podziału. Innymi słowy, odrzucamy wszystko, aż do losowego dopasowania.

30. linia, która jest wynikiem końcowej iteracji pętli, jest drukowana domyślnie na końcu programu.

Martin Ender
źródło
Wiesz, co jest jeszcze krótsze niż usunięcie 0-2 spacji? Szuranie wokół! . Nawiasem mówiąc, nowa Retina jest świetna: D
Leo
7

VBA, 60 59 49 bajtów

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

Wklej go w oknie Natychmiastowe i naciśnij klawisz Enter. (Upewnij się, że wyraźna deklaracja jest wyłączona!)

O wiele bardziej prawdopodobne jest, że poruszy się niż pozostanie w linii (tzn. Akcje nie są równo ważone), ale nie był to określony wymóg (na szczęście!)

{EDYCJA} Zaoszczędzono 1 bajt, usuwając spację między =1iTo

{EDIT2} Zaoszczędzono 10 bajtów dzięki komentarzowi Remoela

Stare wersje:

'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
Chronocidal
źródło
5
Witamy w PPCG!
Martin Ender
2
Możesz zapisać kilka bajtów, zastępując String(i," ")je, Spc(30+i)a następnie usuwając i=30:. Lub -1 bajt przez usunięcie &. :)
remoel
7

C # (.NET Core), 112 110 106 100 99 98 bajtów

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

-1 bajt dzięki @raznagul .
-1 bajt dzięki @auhmaan .

Wyjaśnienie:

Wypróbuj online.

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
źródło
Jedna dziwna rzecz: jeśli dzwonię new Random().Next()wiele razy lokalnie (.NET Framework wersja 4.6.1), zawsze otrzymuję ten sam wynik. Muszę dodać przerwę Thread.Sleep(10)między rozmowami, aby niezawodnie uzyskać różne wyniki. Przy czasie snu krótszym niż 10 ms czasami wciąż otrzymuję ten sam wynik. Tak więc .net-Framework i TIO (.net-Core) mają różne PRNG lub przynajmniej używają różnych nasion. Jeśli zmienię twój program w TIO na C # -mono, otrzymam takie samo zachowanie, jak lokalnie w .net-Framework.
raznagul
@raznagul Hmm, to wyjście z C # (kompilatorem Mono C #) jest naprawdę dziwne ..
Kevin Cruijssen
3
@raznagul new Random()wykorzystuje czas jako ziarno, więc w ciasnej pętli czas jest taki sam, więc wynik jest taki sam.
TheLethalCoder
@TheLethalCoder: Tak, tego oczekiwałem (mniej więcej). Dziwne jest to, że 1) rdzeń .net (przynajmniej na TIO) zachowuje się inaczej. 2) Że muszę Thread.Sleep(10)niezawodnie uzyskać różne wyniki, a Thread.Sleep(1)nawet 9 ms to za mało.
raznagul
@raznagul Dobrze śpiące przez 1, 9 lub 10ms powinno spać w tym samym czasie, w zależności od innych uruchomionych procesów ... rzeczywiście dziwne.
TheLethalCoder
7

C, 56 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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 bajtów

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

Zależy od f „powrotu” wartości przypisanej nw funkcji, co jest niezdefiniowanym zachowaniem, ale działa spójnie z gcc, gdy nie są włączone optymalizacje.

Wypróbuj online!

Steadybox
źródło
6

JavaScript (ES8), 63 62 60 bajtów

Zawiera końcowy znak nowej linii. *2-1można by zastąpić -.51 bajtem oszczędności, ale szanse, że każda linia będzie miała taką samą długość jak poprzednia linia, znacznie wzrosłyby. Oczywiście, ponieważ „wyzwanie” nie jest zdefiniowane w wyzwaniu, RNG można zastąpić new Date%3-1całkowitą liczbą bajtów wynoszącą 55 .

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

Zapisałem bajt dzięki komuś, kto usunął swój komentarz, zanim mogłem złapać nazwę. Ja rzeczywiście starał się to w ten sposób repeat, a padStartjednak nie sądzę, aby spróbować padEnd- nie wiem dlaczego!


Premia

Dla tej samej liczby bajtów, oto wersja, która przyjmuje liczbę początkowych spacji i iteracji jako dane wejściowe.

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

Kudłaty
źródło
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``jest o jeden bajt krótszy. (Uwaga: ponieważ SO nie pozwala na łamanie linii w komentarzach, musiałem wpisać \ n zamiast faktycznie używać łamania linii.)
Stefnotch
Dzięki, @Stefnotch. Niestety, nawet przy początkowej wartości y=31, istnieje możliwość, że pierwszy wiersz będzie zbyt krótki. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…
Kudłaty
1
Popraw mnie, jeśli się mylę, ale czy twoje obecne rozwiązanie również nie cierpi z powodu tego problemu?
Stefnotch
1
Pierwsza linia powinna mieć dokładnie 30 spacji, zgodnie z wyzwaniem.
Nit
1
@Nit, PO potwierdził, że pierwszy wiersz może zawierać 29-31 spacji, ale musi jeszcze edytować ten fakt w wyzwaniu, pomimo wielokrotnych próśb o zrobienie tego.
Kudłaty
6

Java 8, 89 87 bajtów

Najpierw golf, jestem pewien, że mogłoby być znacznie lepiej ..

Edycja: Naprawiono pierwszą linię dzięki Steadybox .

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

Wypróbuj 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
źródło
5
Witamy w PPCG! :)
Kudłaty
2
83 bajty
Steadybox
6

Python 2 , 83 65 64 bajtów

Proste podejście:

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

Wypróbuj online!

Dzięki @Rod za uratowanie niektórych bajtów! Dzięki @ovs za -1 bajt!

Edycja: zmieniono nazwę zmiennej i ciąg wyjściowy na literę „s”

Więcej wężowych danych wyjściowych dla 88 bajtów:

from random import*
s=[30,0]
exec"print' '*sum(s)+'(S)'[s[-1]+1];s+=[randint(-1,1)];"*30
Gábor Fekete
źródło
1
Lubię to. Naprawdę fajne rozwiązanie.
linemade
5

Węgiel drzewny , 14 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

× ³⁰            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

Byłby tylko 10 bajtów, gdyby nie było wymogu wstępnego wcięcia.

Neil
źródło
@KevinCruijssen Hmm, to niezręczne, ponieważ węgiel drzewny lubi przycinać domyślnie.
Neil,
5

PHP, 61 bajtów

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

Wypróbuj online!

chocochaos
źródło
8
$i<30;$i++można $i++<30;zapisać 2 bajty.
Kevin Cruijssen
2
55 bajtów: for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');( \nliczony jest jako 1 znak i należy go zastąpić prawdziwym nowym wierszem)
Ismael Miguel
2
Alternatywna 55-bajtowa długość, bez ostrzeżeń: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 bajtów

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;}

Wyjaśnienie:

Wypróbuj online.

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

Stara 119 bajtowa odpowiedź:

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;}

Wyjaśnienie:

Wypróbuj online.

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
źródło
4

R , 72 69 67 bajtów

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

Dzięki Zahiro Mor za 2 dodatkowe bajty!

Wypróbuj online!

plannapus
źródło
Zmiana z sample(3,29,T)-2na runif(29,-1,1)zmniejszy liczbę bajtów o 2, ale ruchy nie są już tak prawdopodobne. Czy mógłbyś również przejść na paste("%"zamiast, paste0("% "czy coś mi brakuje?
Rift
@Rift Gdybym używał wklejania, powstałe ciągi miałyby formę % 30 szamiast % 30s. Jak powiedziałeś runif, zepsułoby to prawdopodobieństwo.
plannapus
Lokalnie sprintf("%30s"), sprintf("% 30s")i sprintf("% 30 s")zwraca te same rezultaty dla mnie. Ale w TIO tylko pierwsze dwa mają identyczne wyniki, więc paste0("%"należy zapisać bajt. I nie ma wymogu, aby każdy ruch miał takie samo prawdopodobieństwo.
Szczelina
4

Japt , 13 bajtów

Zwraca tablicę wierszy.

30ÆQù1nH±1n3ö

Sprawdź to


Wyjaśnienie

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

Premia

Dla 2 bajtów mniej , oto wersja, która przyjmuje liczbę początkowych spacji i iteracji jako dane wejściowe.

U°ÆQùU±1n3ö

Spróbuj


Alternatywne RNG

Ostatnie 4 bajty można zastąpić dowolnym z poniższych:

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
Kudłaty
źródło
1
Wow, nie mogę uwierzyć, że w tej chwili wygrywamy! Myślę, że można zapisać bajt z tego (na telefon więc nie mogę sprawdzić)
ETHproductions
@ETHproductions: Ha! To jest identyczne z tym, co zacząłem. Problem polega jednak na tym, że jeśli -1RNG zwróci go przy pierwszej iteracji, otrzymamy całkowitą długość linii, 29kiedy powinna być 30, 31lub 32.
Kudłaty
Hmm, jestem zdezorientowany co do tego, jak twoja wersja sobie z tym poradzi ... Wierzę też, że OP wyjaśnił w komentarzach, że nie obchodzi ich, czy dodatkowe miejsce zostanie usunięte lub dodane w początkowej iteracji.
ETHprodukcje
Właściwie jestem zdezorientowany przez „kiedy powinno być 30, 31 lub 32” - gdzie to jest wymagane?
ETHprodukcje
@ETHproductions: Zaczynamy od, 30a następnie dodajemy -1, 0lub 1dajemy 29, 30 lub 31- dodajemy "i, który daje nam całkowitą długość 30, 31lub 32dla pierwszego wiersza.
Kudłaty
4

Szybki , 101 bajtów

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

Wyjaśnienie

Pełny program. Wykorzystuje to dość dziwną sztuczkę: arc4random()jest członkiem Darwinmodułu, ale UIKittakże ma zainstalowaną tę funkcję, więc oszczędza bajt :) Używa także jednej z moich wskazówek golfowych Swift do powtarzania ciągów dowolną liczbę razy.

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.
}
Pan Xcoder
źródło
Czy teraz nie for _ in 0 ... gwykonuje bloku kodu 29 razy zamiast 30 (pętla od 0 do 29 (wyłącznie))?
Kevin Cruijssen
@KevinCruijssen Nie, 0...ggeneruje wszystkie liczby całkowite w [0; g] . Mój zły, naprawiłem wyjaśnienie. 0..<gwygeneruje liczby całkowite w [0; g) : P
Mr. Xcoder,
Ach, [0; g)edytowałeś [0; g]mnie, żeby naprawdę mnie zdezorientować. :) Hmm, ale g=30czy [1; g]w takim przypadku nie można zacząć od pętli ?
Kevin Cruijssen
@KevinCruijssen Pętla nad jednym [0; g)lub na [1; g]pewno byłaby możliwa, jeśli wybiorę g=30zamiast tego, ale następnie print(...,0)należy go zmienić na print(...+"0"), ponieważ w przeciwnym razie przed 0 pojawiłoby się dodatkowe (obce) miejsce. Tak czy inaczej liczba bajtów pozostaje taka sama.
Pan Xcoder,
4

Perl, 36 bajtów

perl -E '$#a=29;map{$#a+=rand(3)-say"@a -"}@a'
Ton Hospel
źródło
Tak dobrze. Zawsze zapominam, że możesz ustawić taką długość tablicy ... i używać saydo odejmowania. Czy mam rację, myśląc, że nie zmienia liczby przebiegów, gdy $#ajest zwiększany, ponieważ nie jest to odniesienie?
Dom Hastings,
@DomHastings: To dlatego, że używam, mapktóry wydaje się najpierw układać elementy na stosie. fornie ma i miałby nieprzewidywalną długość pętli
Ton Hospel
Naprawdę warto wiedzieć. Dzięki!
Dom Hastings,
Niezła gra w golfa. Próbowałem zgolić kolejny bajt perl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30', ale czasami (nie za każdym razem) powodowało to błąd segmentacji. Czy to może być błąd w perlu v5.22.1 i v5.16.3?
Kjetil S.
@Kjetil Tak, to dobrze znany problem, który prawdopodobnie nigdy nie zostanie naprawiony. Podczas zapętlania tablicy wpisy nie otrzymują dodatkowego przelicznika, więc jeśli je usuniesz, zostaną zwolnione do czasu, gdy pętla je osiągnie i zwolnisz pamięć. Na szczęście nigdy nie robisz tego w prawdziwych programach.
Ton Hospel
4

R, 54 53 bajty

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

Podobny pomysł jak powyżej , ale ze skróconym sprintfkodem i literałem krótszego ciągu znaków. Zamiast \n(dwóch bajtów) używam dosłownego podziału linii (jeden bajt).

Try it online!

Konrad Rudolph
źródło
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number. Używam od sprintflat i jakoś zawsze tęskniłem za tą częścią ... Dziękuję za przypomnienie!
plannapus
1
Druga linia jest czasem wcięta o dwie spacje zamiast o jedną.
Scott Milner
@ScottMilner Znalazłem trochę czasu, aby to naprawić.
Konrad Rudolph
4

Rubinowy , 45 39 bajtów

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

Wypróbuj online!

Modyfikacja xpodczas pętli nie wpływa na licznik pętli. Wybrałem S jako szczególnie snakelową postać wyjściową.

-6 bajtów: użyj rand(3)-1zamiast [-1,0,1].sample. Dzięki, Eric Duminil !

benj2240
źródło
Możesz zapisać dwa bajty x.mapzamiast x.times(ekwiwalent, ponieważ nie używasz wartości zwracanej)
RJHunter 21.02.18
1
Ups, masz rację, zignoruj ​​mnie!
RJHunter
1
OK Mam lepszy: rand -1..1jest pięć bajtów krótszy niż[-1,0,1].sample
RJHunter
1
@RJHunter: Lub rand(3)-1mniej o 6 bajtów.
Eric Duminil
1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}(ten sam rozmiar) wydrukuje dokładnie 30 spacji dla głowy węża zgodnie z żądaniem wyzwania
Asone Tuhid
4

SenseTalk , 237 198 bajtów

Jest to język, który poznałem i pokochałem około dziesięć lat temu. Jest to język skryptowy, który napędza narzędzie do automatycznego testowania Eggplant Functional . Przez wiele lat byłem zapalonym użytkownikiem tego narzędzia, zanim na jakiś czas dołączyłem do firmy. Nie jest to język, który najlepiej nadaje się do gry w golfa, ale pisanie go jest dla mnie bardzo przyjemne. Gra w golfa jest w rzeczywistości dość trudna, ponieważ język ma być gadatliwy i podobny do angielskiego ... zajęło mi sporo czasu do 237 bajtów.

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

Niegolfowane / Wyjaśnienie

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

Edycja: Zapisano 36 bajtów dzięki @mustachemoses

Allen Fisher
źródło
1
Czy konieczne są białe znaki?
MustacheMoses
Mam na to duży szacunek. Zwłaszcza na tle „języków golfowych”, które wydają się być całkowicie nieczytelne, ale krótkie. Miło jest mieć przykład pokazujący, co możesz zrobić ze swoim językiem.
AJFaraday
1
Dobra rozmowa @MustacheMoses! Zaktualizowano
Allen Fisher
Zliczam 198 bajtów (cóż, skrypt użytkownika liczy tyle)
HyperNeutrino
@AllenFisher Czy masz samodzielny interpreter lub kompilator dla tego języka, którego mogę używać bez pobierania demonstracji Bakłażana?
MustacheMoses
3

PowerShell , 42 bajty

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

Wypróbuj online!

Pętle od 1do $l=30. Każdej iteracji umieszczamy $lspacje oraz xznak w potoku jako ciąg znaków, a następnie +=albo na -1, 0, 1podstawie Get-Randomdo $ldla następnej pętli. Te ciągi znaków są zbierane z potoku, a domniemany Write-Outputdaje nam listę oddzieloną znakiem nowej linii za darmo.

AdmBorkBork
źródło
3

Bash, 53

  • 3 bajty zapisane dzięki @Dennis
for((i=p=30;i--;p+=RANDOM%3-1));{ printf %${p}s+\\n;}

Wypróbuj online .

Cyfrowa trauma
źródło
p+=RANDOM%3-1też działa.
Dennis
@Dennis Tak, oczywiście! Dzięki!
Cyfrowa trauma
3

Galaretka , 18 bajtów

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

Wypróbuj online!

Wybrana postać to 0 . Jeśli dozwolone jest zwracanie listy znaków, Ymożna ją usunąć, a przesłanie można przekształcić w łańcuch niladyczny na 17 bajtów . Alternatywa .

Jak to działa

30Ç'С⁶ẋ; 0 EUR | Główny link Niladic.
30 | Począwszy od 30 ...
  Ç'С | ... Powtórz link pomocnika 29 razy i zbierz wyniki na liście.
             | (Ta lista zawiera pierwsze 30, więc w rzeczywistości jest 30 liczb).
      ⁶ẋ | Powtórz spację wiele razy dla każdego elementu na liście.
        ; 0 EUR | Dodaj 0 do każdego.
           Y | I dołącz przez nowe linie.
------------- +
1ŒRX + | Monadic link pomocnika. Alternatywnie możesz użyć µ1ŒRX + µ zamiast Ç.
1 | Dosłowny.
 ŒR | Zakres symetryczny od –1 do 1.
   X + | Wybierz tam losową liczbę i dodaj ją do argumentu.

Galaretka , 16 bajtów

Łącząc moje, rozwiązania Erika i Jonathana, możemy zagrać w golfa do 16 bajtów. Wybrana postać to 1 .

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

Wypróbuj online!

Podziękowania dla Jonathana Allana za heads-up (on Ṭ€o⁶).

Pan Xcoder
źródło
Możesz użyć Ṭ€o⁶zamiast tego, ⁶ẋ;€0co robi mój 18 bajter i zejść do 17.
Jonathan Allan
@JonathanAllan Dziękujemy! Łącząc trzy odpowiedzi na galaretki, faktycznie miałem 16 bajtów. Ale zamieściłem to jako rozwiązanie wtórne, ponieważ nie jest całkowicie moje. :-)
Mr. Xcoder
3

Oktawa , 53 51 50 49 bajtów

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

Wypróbuj online!

Zapisano 1 bajt, nie wykonując już pętli. Zapisane innego jak Octave ma printfjak fprintf.

Ten nowy kod tworzy tablicę 30 losowych liczb całkowitych w zakresie -1:1. Następnie sumuje sumę macierzy i dodaje 30, co daje pożądaną sekwencję.

Wynik jest drukowany przy użyciu fprintfformatu, który brzmi: „Liczba dziesiętna, dopełniona do określonej szerokości, a następnie nowy wiersz. Szerokość będzie pierwszą wartością wejściową, a liczba dziesiętna drugą wartością. Jeśli liczba wartości wejściowych jest więcej, Octave będzie automatycznie powtarzał wydruk, aby uzyskać pożądany wynik.

Aby więc uzyskać pętlę, potrzebujemy tylko zerować zera między tablicą sekwencji, więc fprintffunkcja wykorzystuje każdą wartość w sekwencji jako szerokość, a każde zero jako cyfrę do wydrukowania.

Drukuje dane wyjściowe, takie jak:

                              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

Powyższy kod nie zawsze drukuje dokładnie 30 spacji w pierwszym wierszu. Będzie to 29, 30 lub 31. Aby to naprawić, użyj tej 53-bajtowej wersji:

x=31;for i=2:x;fprintf('%*d\n',x,0);x+=randi(3)-2;end
Tom Carpenter
źródło
Możesz zapisać dwa bajty:x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Kevin Cruijssen
@KevinCruijssen Myślałem o tym, ale to nie działa tak samo. Powoduje to, że pierwsza linia zaczyna się od 29, 30 lub 31 spacji.
Tom Carpenter
1
@ KevinCruijssen w rzeczywistości, nieważne. Właśnie zauważyłem komentarze OP mówiące, że jest to dozwolone.
Tom Carpenter
Tak. To trochę denerwujące, że reguła jest w komentarzu (zwłaszcza, że ​​jest to sprzeczne z obecnym opisem wyzwania ..). Poprosiłem OP o edycję wyzwania, aby odzwierciedlić, że możesz zacząć od 29, 30 lub 31, ponieważ wydaje się, że pozwala na to w komentarzach.
Kevin Cruijssen
3

Lua 81 75 bajtów

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

W for i=1,n ...tym to_exp n oceniana jest tylko raz przed wejściem do pętli, oszczędzając jeden bajt.

-6 dzięki @ user202729

Wypróbuj online!

lqnrd
źródło
1
Witamy w PPCG! Możesz dodać link TIO do swojego postu, aby ludzie mogli łatwiej testować Twój program.
user202729
Możesz zagrać w golfa do 76 bajtów . Oprócz strony Przydatne mogą być porady dotyczące gry w golfa w Lua .
user202729
75 bajtów .
user202729
3

Python 3.6 , 84 73 69 bajtów

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

Dzięki @WheatWizard za -11 bajtów. Dzięki @JoKing za -4 bajty.

MustacheMoses
źródło
Ponieważ nie używasz i, możesz for i in[1]*30zamiast tego użyć do zapisania bajtów.
Wheat Wizard
Możesz także from random import*, aby nie potrzebować random.później. I możesz usunąć spację nowego wiersza po swoim :.
Wheat Wizard
A jeśli zmieni 30się można zastąpić . 29"+".rjust(x)" "*x+"+"
Wheat Wizard
Właściwie w odniesieniu do mojego ostatniego komentarza powinno to być 30 spacji, a nie 29. Twoja aktualna odpowiedź zawiera tylko 29 spacji i dlatego nie spełnia specyfikacji. Można to naprawić, zmieniając 30 na 31.
Kreator pszenicy
1
@WheatWizard Thanks! Dodałem twoje zmiany i podziękowałem ci również. Zmieniłem [1]*30na, [1]*xponieważ jest o jeden bajt krótszy.
MustacheMoses
3

ES5, 97 95 81 bajtów

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

ES5, 11298 bajtów, jeśli wymagany jest format funkcji:

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
źródło
2
Witamy w PPCG! Myślę, że twoje zmienne muszą być zadeklarowane wewnątrz funkcji -_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
Oliver
To zabije bajty, powiem ci to. ES5 nie zawiera domyślnie funkcji strzałek. Zaktualizuję
Kyle Fairns
@Oliver, dodano format funkcji :)
Kyle Fairns
Miły! Nie jestem pewien, kiedy to został wprowadzony, ale myślę, że można zastąpić join(" ")zjoin` `
Oliver
@Oliver Nie jestem pewien, czy mógłbyś to zrobić w ES5, prawda? Myślałem, że to dosłowny szablon dodany w ES6?
Kyle Fairns