Código Golf: Seu próprio animal de estimação ASCII cobra

34

Então, eu escrevi para mim uma linha que imprimiu uma cobra no console. É um pouco divertido, e me perguntei como poderia condensar meu código ...

Aqui está um exemplo (curto) de saída:

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

Aqui estão as especificações:

  • Em cada linha, um único caractere que não seja um espaço em branco (o que você quiser) é impresso no console, inicialmente com 29 a 31 espaços preenchidos à esquerda dele.
  • A cada iteração, é tomada uma decisão aleatória entre essas três ações
    • A quantidade de preenchimento diminui em 1
    • A quantidade de preenchimento permanece a mesma
    • A quantidade de preenchimento aumenta em 1

Faça isso 30 vezes, para imprimir uma cobra de 30 segmentos no console.

A resposta mais curta em bytes vence.

AJFaraday
fonte
Podemos retornar uma matriz de linhas? São permitidos espaços à esquerda / à direita ou novas linhas?
Salsicha
1
Eu assumo espaços à direita em cada linha são permitidos, certo?
Luis Mendo
1
O que significa "aleatório"? Uniformemente aleatório? Aleatório de qualquer distribuição com suporte positivo em cada um dos três resultados? Aleatório de qualquer distribuição? Os resultados precisam ser diferentes em cada execução do programa?
21418 Nathaniel
1
Observe que, por padrão, aleatório não significa uniformemente . Por exemplo, a segunda parte da minha resposta de foda cerebral é (a partir de agora) perfeitamente válida, apesar de gerar uma linha reta na maioria das vezes.
Jo rei
1
No momento, existem dois pontos que não são claros: 1) Aleatório significa uniformemente aleatório? (afeta esta resposta ) e 2) A saída deve ser diferente sempre? (? ou seja, pode o gerador de números aleatórios ser unseeded afeta esta resposta )
DJMcMayhem

Respostas:

14

05AB1E , 15 14 bytes

30DF2Ý<+ΩD0sú,

Experimente online!

Usos 0.

Explicação

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
fonte
38
05AB1E: 0 bytes, experimente online! ... espera, não, quase embora.
Urna de polvo mágico
14

Random Brainfuck , 123 122 121 bytes

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

Experimente online!

O Random Brainfuck é uma extensão do brainfuck, com a adição útil do ?comando, que define a célula atual para um byte aleatório. Isso imprime uma cobra feita de !s, que se parece mais com passos do que com uma cobra de maneira engraçada.

Como funciona:

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

Outra solução que adere à letra da pergunta, e não ao espírito.

87 bytes

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

Experimente online!

Este é fortemente inclinado para deixar o preenchimento sozinho, mas aumentar ou diminuir o preenchimento são igualmente possíveis. Cada um tem uma chance ligeiramente menor que 1 em 256 de acontecer.

Brincadeira
fonte
Muito agradável! Eu não tinha conhecimento do ?comando. 1
Grant Miller
@GrantMiller ?só está disponível em aleatório Brainfuck , não brainfuck clássico
Jo rei
8

C (gcc) , 61 58 56 bytes

Resposta editada para refletir as alterações das regras ...

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

Experimente online!

cleblanc
fonte
salve um byte passando s+=1-rand()%3para a função printf. i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Vaelus
@ Vaelus Isso faz com que a primeira linha tenha uma quantidade variável de espaços, em vez dos 30 especificados na pergunta.
Steadybox
@Steadybox O que é permitido nos comentários, aparentemente ...
Kevin Cruijssen
7

Retina , 24 bytes


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

Experimente online!

Explicação


30* +

Inicialize a string de trabalho na primeira linha, ou seja, 30 espaços e a +.

-29{¶<`^
 

Há um espaço na segunda linha. -29{quebra o restante do programa em um loop, que é executado 29 vezes. ¶<imprime a sequência de trabalho no início de cada iteração do loop com um avanço de linha à direita. O próprio estágio atômico insere um espaço no início da string (a idéia básica é inserir um espaço e, em seguida, remover aleatoriamente de 0 a 2 espaços, porque esse é um byte mais curto do que escolher aleatoriamente entre exclusão, inserção e não operação).

S,2@1`

Isso corresponde ao regex vazio em relação à entrada, o que nos dá todas as posições entre os caracteres (e o início e o fim da string). Em seguida, ,2mantém apenas as três primeiras partidas, ou seja, as partidas após zero, um e dois espaços. @seleciona uma aleatória dessas três correspondências. Em seguida, o estágio dividido ( S) divide a entrada em torno dessa correspondência. E o 1diz para manter apenas a segunda parte da divisão. Em outras palavras, descartamos tudo até nossa correspondência aleatória.

A 30ª linha, que é o resultado da iteração final do loop, é impressa implicitamente no final do programa.

Martin Ender
fonte
Você sabe o que é ainda mais curto do que remover 0-2 espaços? Baralhar espaços ao redor! . A propósito, a nova Retina é ótima: D
Leo
7

VBA, 60 59 49 bytes

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

Cole-o na janela Immediate e pressione enter. (Verifique se a declaração explícita está desativada!)

Muito mais probabilidade de se mover do que de permanecer em uma linha (ou seja, as ações não têm o mesmo peso), mas esse não era um requisito especificado (felizmente!)

{EDIT} Economizou 1 byte removendo o espaço entre =1eTo

{EDIT2} salvou 10 bytes graças ao comentário de remoel

Versões antigas:

'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
Cronocida
fonte
5
Bem-vindo ao PPCG!
Martin Ender
2
Você pode economizar alguns bytes, substituindo String(i," ")a Spc(30+i)remover então i=30:. Ou -1 byte removendo &. :)
remoel
7

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

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 graças a @raznagul .
-1 byte graças a @auhmaan .

Explicação:

Experimente 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
fonte
Uma coisa estranha: se eu ligar new Random().Next()várias vezes localmente (.net Framework Versão 4.6.1), sempre obtenho o mesmo resultado. Preciso adicionar um Thread.Sleep(10)entre a chamada para obter resultados diferentes de maneira confiável. Com um tempo de sono inferior a 10 ms, às vezes ainda recebo o mesmo resultado. Portanto, o .net-Framework e o TIO (.net-Core) têm PRNGs diferentes ou pelo menos usam sementes diferentes. Se eu alternar seu programa no TIO para C # -mono, obtenho o mesmo comportamento que localmente no .net-Framework.
raznagul
@raznagul Humm, que a produção com C # (C # Mono compilador) é, de facto estranho ..
Kevin Cruijssen
3
O @raznagul new Random()usa o tempo como semente, então, em um loop apertado, o tempo é o mesmo e, portanto, o resultado é o mesmo.
TheLethalCoder
@TheLethalCoder: Sim, é o que eu (mais ou menos) esperava. O estranho é que 1) .net-Core (pelo menos no TIO) se comporta de maneira diferente. 2) Que eu preciso Thread.Sleep(10)obter resultados diferentes de forma confiável e / Thread.Sleep(1)ou até 9ms não é suficiente.
raznagul
@raznagul Bem, dormir por 1, 9 ou 10ms deve dormir pelo mesmo tempo, dependendo de outros processos em execução ... de fato estranho.
TheLethalCoder
7

C, 56 bytes

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

Experimente online!

Explicação:

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

Depende de f "retornar" o valor atribuído a n na função, que é um comportamento indefinido, mas funciona de forma consistente com o gcc quando nenhuma otimização é ativada.

Experimente online!

Steadybox
fonte
6

JavaScript (ES8), 63 62 60 bytes

Inclui uma nova linha à direita. *2-1poderia ser substituído -.5por uma economia de 1 byte, mas as chances de cada linha ter o mesmo comprimento que a linha anterior aumentariam bastante. Obviamente, como "aleatório" não é definido no desafio, o RNG pode ser substituído new Date%3-1por uma contagem total de 55 bytes .

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

Salvei um byte graças a alguém que excluiu seu comentário antes que eu pudesse pegar o nome. Na verdade, eu tentei dessa maneira repeate padStartnão pensei em tentar padEnd- não sei por que!


Bônus

Para o mesmo número de bytes, aqui está uma versão que usa como entrada o número de espaços e iterações iniciais.

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

Shaggy
fonte
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``é um byte mais curto. (Nota: uma vez que não permite quebras de linha nos comentários, eu tinha que digitar \ n em vez de realmente usando uma quebra de linha.)
Stefnotch
Obrigado, @Stefnotch. Infelizmente, mesmo com um valor inicial de y=31, haveria a possibilidade de a primeira linha ser muito curta. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…
Shaggy
1
Corrija-me se estiver errado, mas a sua solução atual também não sofre com esse problema?
Stefnotch
1
A primeira linha deve ter exatamente 30 espaços, de acordo com o desafio.
Nit
1
@Nit, o OP confirmou que a primeira linha pode conter 29-31 espaços, mas ainda não editou esse fato no desafio, apesar de repetidas solicitações para fazê-lo.
23618 Shaggy
6

Java 8, 89 87 bytes

Primeiro golfe, tenho certeza que poderia ser muito melhor ..

Edit: primeira linha fixa graças ao Steadybox .

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

Experimente 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
fonte
5
Bem-vindo ao PPCG! :)
Salsicha
2
83 bytes
Steadybox 20/02
6

Python 2 , 83 65 64 bytes

Abordagem direta:

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

Experimente online!

Obrigado ao @Rod por salvar alguns bytes! Obrigado a @ovs por -1 byte!

Editar: nome da variável alterada e sequência de saída para a letra 's'

Mais saída de cobra para 88 bytes:

from random import*
s=[30,0]
exec"print' '*sum(s)+'(S)'[s[-1]+1];s+=[randint(-1,1)];"*30
Gábor Fekete
fonte
1
Eu gosto disso. Solução realmente elegante.
linemade
5

Carvão , 14 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

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

Seriam apenas 10 bytes se não houvesse um requisito de recuo inicial.

Neil
fonte
@KevinCruijssen Hmm, isso é estranho, porque o carvão vegetal gosta de aparar por padrão.
Neil
5

PHP, 61 bytes

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

Experimente online!

chocochaos
fonte
8
$i<30;$i++pode ser $i++<30;para salvar 2 bytes.
21818 Kevin Cruijssen 13:20
2
55 bytes: for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');(a \né contado como um carvão animal, e deve ser substituído por uma nova linha real)
Ismael Miguel
2
Alternativa de 55 bytes de comprimento, sem avisos: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;}

Explicação:

Experimente 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

Resposta antiga de 119 bytes:

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

Explicação:

Experimente 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
fonte
4

R , 72 69 67 bytes

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

Obrigado a Zahiro Mor por 2 bytes extras!

Experimente online!

plannapus
fonte
Mudar de sample(3,29,T)-2para runif(29,-1,1)reduzirá a contagem de bytes em 2, mas os movimentos não são mais prováveis. E você também pode mudar para em paste("%"vez de paste0("% "ou estou perdendo alguma coisa aqui?
Rift
@ Rift, se eu estava usando colar, as seqüências de caracteres resultantes seriam da forma em % 30 svez de % 30s. Como você disse runif, atrapalharia as probabilidades.
plannapus
Localmente sprintf("%30s"), sprintf("% 30s")e sprintf("% 30 s")retorne os mesmos resultados para mim. Mas no TIO, apenas os dois primeiros têm resultados idênticos, portanto, você paste0("%"deve salvar um byte. E não há exigência de que todo movimento tenha a mesma probabilidade.
Rift
4

Japonês , 13 bytes

Retorna uma matriz de linhas.

30ÆQù1nH±1n3ö

Teste-o


Explicação

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

Bônus

Por 2 bytes a menos , aqui está uma versão que usa como entrada o número de espaços e iterações iniciais.

U°ÆQùU±1n3ö

Tente


RNGs alternativos

Os últimos 4 bytes podem ser substituídos por qualquer um dos seguintes:

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
Shaggy
fonte
1
Uau, não acredito que estamos vencendo no momento! Eu acho que você pode salvar um byte com isso (no celular, então não posso realmente verificar)
ETHproductions
@ETHproductions: Ha! É idêntico ao que eu comecei. O problema é que, se -1for retornado pelo RNG na primeira iteração, teremos um comprimento total da linha de 29quando deveria ser 30, 31ou 32.
Shaggy
Hmm, estou confuso sobre como sua versão contorna isso ... Então, acredito que o OP esclareceu nos comentários que eles não se importam se um espaço extra é removido ou adicionado na iteração inicial.
ETHproductions
Na verdade, estou confuso com "quando deveria ser 30, 31 ou 32" - onde é necessário?
ETHproductions
@ETHproductions: Começamos com 30e depois adicionamos -1, 0ou 1fornecemos 29, 30 ou 31- adicionamos o "e que nos dá um comprimento total de 30, 31ou 32para a primeira linha.
Salsicha
4

Rápido , 101 bytes

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

Explicação

Um programa completo. Isso usa um truque bastante estranho: arc4random()é um membro do Darwinmódulo, mas UIKittambém vem com esta função instalada, por isso economiza um byte :) Também usa uma das minhas dicas de golfe do Swift para repetir seqüências de caracteres várias vezes.

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
fonte
for _ in 0 ... gAgora não executa o bloco de código 29 vezes em vez de 30 (loop de 0 a 29 (exclusivo))?
Kevin Cruijssen
@KevinCruijssen Não, 0...ggera todos os números inteiros em [0; g] . Meu mal, corrigiu a explicação. 0..<ggeraria os números inteiros em [0; g) : P
Sr. Xcoder
Ah, o [0; g)que você editou para [0; g]realmente me confundir. :) Hmm, mas não é possível iniciar g=30e fazer um loop [1; g]nesse caso?
Kevin Cruijssen
@KevinCruijssen Fazer um loop sobre um [0; g)ou [1; g]seria definitivamente possível se eu escolher g=30, mas print(...,0)precisa ser alterado para print(...+"0"), porque um espaço (estranho) adicional seria precedido antes do 0. De qualquer maneira, a contagem de bytes permanece a mesma.
Sr. Xcoder
4

Perl, 36 bytes

perl -E '$#a=29;map{$#a+=rand(3)-say"@a -"}@a'
Ton Hospel
fonte
Tão bom. Eu sempre esqueço que você pode definir um tamanho de matriz assim ... e usar saypara subtração. Estou certo ao pensar que não altera o número de execuções quando $#aé incrementado porque não é uma referência?
Dom Hastings
@ DomHastings: É porque eu uso o mapque parece primeiro colocar os elementos na pilha. fore não teria tido um comprimento da laçada imprevisível
Ton Hospel
Isso é realmente útil saber. Obrigado!
Dom Hastings
Bom golfe. Tentei remover outro byte perl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30', mas às vezes (nem sempre) resultava em falha de segmentação. Poderia ser um bug no perl v5.22.1 e v5.16.3?
precisa
@ Kjetil Sim, esse é um problema bem conhecido que provavelmente nunca será corrigido. Ao fazer um loop em uma matriz, as entradas não recebem uma refcount extra; portanto, se você as excluir, elas serão liberadas no momento em que o loop as atingir e você atingir a memória liberada. Felizmente, você nunca faz isso em programas reais.
Ton Hospel
4

R, 54 53 bytes

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

Idéia semelhante à anterior , mas com sprintfcódigo abreviado e uma cadeia de caracteres mais curta literal. Em vez de \n(dois bytes), estou usando uma quebra de linha literal (um byte).

Try it online!

Konrad Rudolph
fonte
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number. Estou usando sprintfhá anos e de alguma forma sempre perdi essa parte ... Obrigado pelo lembrete!
plannapus
1
Às vezes, a segunda linha recua dois espaços em vez de um.
Scott Milner
@ScottMilner Encontrei algum tempo para corrigi-lo.
21918 Konrad Rudolph
4

Ruby , 45 39 bytes

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

Experimente online!

Modificar xdurante o loop não afeta o contador de loops. Eu escolhi S como um caractere de saída particularmente semelhante a uma cobra.

-6 bytes: use em rand(3)-1vez de [-1,0,1].sample. Obrigado, Eric Duminil !

benj2240
fonte
Você pode salvar dois bytes com x.mapem vez de x.times(equivalente desde que você não use o valor de retorno)
RJHunter
1
Opa, você está certo, me ignore!
precisa saber é o seguinte
1
OK eu tenho um melhor: rand -1..1é de cinco bytes menor do que[-1,0,1].sample
RJHunter
1
@RJHunter: Ou rand(3)-1por 6 bytes a menos.
Eric Duminil
1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}(mesmo tamanho) imprimirá exatamente 30 espaços para a cabeça da serpente, conforme solicitado pelo desafio
Asone Tuhid 28/02/18
4

SenseTalk , 237 198 bytes

Essa é uma linguagem que conheci e amei cerca de uma década atrás. É a linguagem de script que aciona a ferramenta de teste automatizada Eggplant Functional . Eu era um usuário ávido da ferramenta por muitos anos antes de ingressar na empresa por um tempo. Não é a língua com maior capacidade de golfe, mas acho muito agradável escrever. Jogar golfe é realmente bastante desafiador, pois o idioma deve ser detalhado e parecido com o inglês ... demorei um pouco para entender para 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 / Explicação

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

Edit: Salvo 36 bytes graças a @mustachemoses

Allen Fisher
fonte
1
O espaço em branco é necessário?
BigodeMoses
Eu tenho muito respeito por isso. Particularmente no contexto das "línguas do golfe", que parecem existir totalmente ilegíveis, mas curtas. É bom ter um exemplo que mostra apenas o que você pode fazer com o seu idioma.
AJFaraday
1
Boa chamada @MustacheMoses! Atualizada.
Allen Fisher
Conto 198 bytes (bem, as contagens userscript que muitos)
HyperNeutrino
@AllenFisher Você tem um intérprete ou compilador autônomo para esse idioma que eu posso usar sem obter uma demonstração do Eggplant?
BigodeMoses
3

J , 23 bytes

echo(8":~+/)\31,1-?29$3

Experimente online!

FrownyFrog
fonte
3

PowerShell , 42 bytes

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

Experimente online!

Loops de 1para $l=30. A cada iteração, colocamos $lespaços mais um xno pipeline como uma string e, em seguida, +=baseamos -1, 0, 1em Get-Randomno $lpróximo loop. Essas strings são coletadas do pipeline e um implícito Write-Outputnos fornece uma lista separada por nova linha gratuitamente.

AdmBorkBork
fonte
3

Bash, 53

  • 3 bytes salvos graças a @Dennis
for((i=p=30;i--;p+=RANDOM%3-1));{ printf %${p}s+\\n;}

Experimente online .

Trauma Digital
fonte
p+=RANDOM%3-1funciona também
Dennis
@ Dennis Sim, é claro! Obrigado!
Digital Trauma
3

Gelatina , 18 bytes

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

Experimente online!

O caractere escolhido é 0 . Se o retorno de uma lista de caracteres for permitido, ele Ypoderá ser descartado e o envio poderá ser transformado em uma cadeia niládica por 17 bytes . Alternativa .

Como funciona

€ 0Y | Link principal niládico.
30 A partir de 30 ...
  Ç'С ... Repita o link auxiliar 29 vezes e colete os resultados em uma lista.
             | (Esta lista inclui os 30 primeiros, então, na verdade, existem 30 números).
      ⁶ẋ Repita um espaço várias vezes para cada item da lista.
        0 € | Anexe um 0 a cada um.
           Y E junte-se por novas linhas.
------------- +
1ŒRX + | Link auxiliar monádico. Como alternativa, você pode usar µ1 × RX + µ em vez de Ç.
1 | O literal.
 |R | Faixa simétrica de –1 a 1.
   X + Escolha um número aleatório e adicione-o ao argumento.

Gelatina , 16 bytes

Combinando as minhas, as soluções de Erik e Jonathan, podemos jogar até 16 bytes. O personagem escolhido é 1 .

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

Experimente online!

Obrigado a Jonathan Allan pelo heads-up (em Ṭ€o⁶).

Mr. Xcoder
fonte
Você pode usar Ṭ€o⁶no lugar do ⁶ẋ;€0meu 18 byter e chegar a 17. #
Jonathan Allan
@JonathanAllan Thank you! Combinando as três respostas Jelly, acabei tendo 16 bytes. Mas postei isso como uma solução secundária, porque não é totalmente minha. :-)
Sr. Xcoder
3

Oitava , 53 51 50 49 bytes

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

Experimente online!

Salvo 1 byte, não fazendo mais nenhum loop. Salvei outro como o Octave printftambém fprintf.

Esse novo código cria uma matriz de 30 números inteiros aleatórios no intervalo -1:1. Em seguida, soma cumulativamente a matriz e adiciona 30, o que fornece a sequência desejada.

O resultado é impresso usando fprintfum formato que diz "Um número decimal, preenchido com uma largura especificada, seguido por uma nova linha. A largura será a primeira entrada de valor e o número decimal será a segunda entrada de valor. Se o número dos valores introduzidos é mais do que isso, o Octave continuará repetindo a impressão automaticamente para obter a saída desejada.

Para obter o loop, precisamos apenas intercalar zeros entre a matriz de sequências, para que a fprintffunção use cada valor na sequência como uma largura e cada zero como o dígito a ser impresso.

Imprime uma saída como:

                              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

O código acima nem sempre imprime exatamente 30 espaços na primeira linha. Será 29, 30 ou 31. Para corrigir isso, você usaria esta versão de 53 bytes:

x=31;for i=2:x;fprintf('%*d\n',x,0);x+=randi(3)-2;end
Tom Carpenter
fonte
Você pode salvar dois bytes:x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Kevin Cruijssen
@KevinCruijssen Eu pensei sobre isso, mas não funciona da mesma maneira. Isso resultaria na primeira linha iniciando com 29, 30 ou 31 espaços.
Tom Carpenter
1
@KevinCruijssen na verdade, não importa. Acabei de notar os comentários dos OPs dizendo que isso é permitido.
Tom Carpenter
Sim. É um pouco irritante que uma regra esteja no comentário (especialmente porque ela contradiz a descrição do desafio atual ..). Pedi ao OP para editar o desafio para refletir que você pode começar com 29, 30 ou 31, pois ele parece permitir isso nos comentários.
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

for i=1,n ...Na to_exp n é avaliada apenas uma vez antes de entrar no loop, economizando um byte.

-6 graças a @ user202729

Experimente online!

lqnrd
fonte
1
Bem-vindo ao PPCG! Você pode adicionar um link TIO à sua postagem para que as pessoas possam testar seu programa com mais facilidade.
user202729
Você pode obter uma resposta de até 76 bytes . Além da página Dicas para jogar golfe em Lua podem ser úteis.
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)

Graças a @WheatWizard por -11 bytes. Graças a @JoKing por -4 bytes.

BigodeMoses
fonte
Como você não acaba usando, ivocê pode usar for i in[1]*30para salvar bytes.
Assistente de trigo
Você também pode, from random import*para não precisar random.mais tarde. E você pode remover o espaço da nova linha após o seu :.
Assistente de trigo
E se você mudar 30para 29o "+".rjust(x)pode ser substituído por " "*x+"+".
Assistente de trigo
Na verdade, em relação ao meu último comentário, deve haver 30 espaços e não 29. Sua resposta atual coloca apenas 29 espaços e, portanto, falha em atender às especificações. Isso pode ser corrigido alterando 30 para 31.
Assistente de Trigo
1
@WheatWizard Thanks! Adicionei suas alterações e creditei você também. Mudei [1]*30para [1]*xporque é um byte mais curto.
BigodeMoses
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 se for necessário o formato da função:

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
fonte
2
Bem-vindo ao PPCG! Eu acho que suas variáveis ​​devem ser declaradas dentro de uma função #:_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
Oliver
Isso matará os bytes, eu vou lhe dizer isso. O ES5 não inclui as funções de seta por padrão. Vou atualizar
Kyle Fairns
@Oliver, formato função adicionada :)
Kyle Fairns
Agradável! Eu não tenho certeza quando foi introduzido, mas acho que você pode substituir join(" ")comjoin` `
Oliver
@ Oliver Não tenho certeza de que você poderia fazer isso no ES5, poderia? Eu pensei que era um literal de modelo adicionado no ES6?
Kyle Fairns