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.
Respostas:
05AB1E ,
1514 bytesExperimente online!
Usos
0
.Explicação
fonte
Random Brainfuck ,
123 122121 bytesExperimente 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:
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.
fonte
?
comando. 1?
só está disponível em aleatório Brainfuck , não brainfuck clássicoC (gcc) ,
615856 bytesResposta editada para refletir as alterações das regras ...
Experimente online!
fonte
s+=1-rand()%3
para a função printf.i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Retina , 24 bytes
Experimente online!
Explicação
Inicialize a string de trabalho na primeira linha, ou seja, 30 espaços e a
+
.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).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,
,2
manté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 o1
diz 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.
fonte
VBA,
605949 bytesCole-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
=1
eTo
{EDIT2} salvou 10 bytes graças ao comentário de remoel
Versões antigas:
fonte
String(i," ")
aSpc(30+i)
remover entãoi=30:
. Ou -1 byte removendo&
. :)C # (.NET Core),
1121101061009998 bytes-1 byte graças a @raznagul .
-1 byte graças a @auhmaan .
Explicação:
Experimente online.
fonte
new Random().Next()
várias vezes localmente (.net Framework Versão 4.6.1), sempre obtenho o mesmo resultado. Preciso adicionar umThread.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.new Random()
usa o tempo como semente, então, em um loop apertado, o tempo é o mesmo e, portanto, o resultado é o mesmo.Thread.Sleep(10)
obter resultados diferentes de forma confiável e /Thread.Sleep(1)
ou até 9ms não é suficiente.C, 56 bytes
Experimente online!
Explicação:
C (gcc) , 55 bytes
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!
fonte
JavaScript (ES8),
636260 bytesInclui uma nova linha à direita.
*2-1
poderia ser substituído-.5
por 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ídonew Date%3-1
por uma contagem total de 55 bytes .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
repeat
epadStart
não pensei em tentarpadEnd
- não sei por que!Mostrar snippet de código
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.
Mostrar snippet de código
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.)y=31
, haveria a possibilidade de a primeira linha ser muito curta. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…Java 8,
8987 bytesPrimeiro golfe, tenho certeza que poderia ser muito melhor ..
Edit: primeira linha fixa graças ao Steadybox .
Experimente online!
fonte
Python 2 ,
836564 bytesAbordagem direta:
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:
fonte
APL (Dyalog) , 20 bytes
1 byte salvo graças a ngn
Experimente online!
fonte
¯2+
--->2-
Carvão , 14 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Seriam apenas 10 bytes se não houvesse um requisito de recuo inicial.
fonte
PHP, 61 bytes
Experimente online!
fonte
$i<30;$i++
pode ser$i++<30;
para salvar 2 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)for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Java 8,
131129127126119108101 bytesExplicação:
Experimente online.
Resposta antiga de 119 bytes:
Explicação:
Experimente online.
fonte
R ,
726967 bytesObrigado a Zahiro Mor por 2 bytes extras!
Experimente online!
fonte
sample(3,29,T)-2
pararunif(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 empaste("%"
vez depaste0("% "
ou estou perdendo alguma coisa aqui?% 30 s
vez de% 30s
. Como você disserunif
, atrapalharia as probabilidades.sprintf("%30s")
,sprintf("% 30s")
esprintf("% 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.Japonês , 13 bytes
Retorna uma matriz de linhas.
Teste-o
Explicação
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.
Tente
RNGs alternativos
Os últimos 4 bytes podem ser substituídos por qualquer um dos seguintes:
fonte
-1
for retornado pelo RNG na primeira iteração, teremos um comprimento total da linha de29
quando deveria ser30
,31
ou32
.30
e depois adicionamos-1
,0
ou1
fornecemos29
,30
ou31
- adicionamos o"
e que nos dá um comprimento total de30
,31
ou32
para a primeira linha.Rápido , 101 bytes
Explicação
Um programa completo. Isso usa um truque bastante estranho:
arc4random()
é um membro doDarwin
módulo, masUIKit
també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.fonte
for _ in 0 ... g
Agora não executa o bloco de código 29 vezes em vez de 30 (loop de 0 a 29 (exclusivo))?0...g
gera todos os números inteiros em [0; g] . Meu mal, corrigiu a explicação.0..<g
geraria os números inteiros em [0; g) : P[0; g)
que você editou para[0; g]
realmente me confundir. :) Hmm, mas não é possível iniciarg=30
e fazer um loop[1; g]
nesse caso?[0; g)
ou[1; g]
seria definitivamente possível se eu escolherg=30
, masprint(...,0)
precisa ser alterado paraprint(...+"0")
, porque um espaço (estranho) adicional seria precedido antes do 0. De qualquer maneira, a contagem de bytes permanece a mesma.Perl, 36 bytes
fonte
say
para 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?map
que parece primeiro colocar os elementos na pilha.for
e não teria tido um comprimento da laçada imprevisívelperl -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?R,
5453 bytesIdéia semelhante à anterior , mas com
sprintf
có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!
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 usandosprintf
há anos e de alguma forma sempre perdi essa parte ... Obrigado pelo lembrete!Ruby ,
4539 bytesExperimente online!
Modificar
x
durante 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)-1
vez de[-1,0,1].sample
. Obrigado, Eric Duminil !fonte
x.map
em vez dex.times
(equivalente desde que você não use o valor de retorno)rand -1..1
é de cinco bytes menor do que[-1,0,1].sample
rand(3)-1
por 6 bytes a menos.(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 desafioSenseTalk ,
237198 bytesEssa é 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.
Ungolfed / Explicação
Edit: Salvo 36 bytes graças a @mustachemoses
fonte
J , 23 bytes
Experimente online!
fonte
PowerShell , 42 bytes
Experimente online!
Loops de
1
para$l=30
. A cada iteração, colocamos$l
espaços mais umx
no pipeline como uma string e, em seguida,+=
baseamos-1, 0, 1
emGet-Random
no$l
próximo loop. Essas strings são coletadas do pipeline e um implícitoWrite-Output
nos fornece uma lista separada por nova linha gratuitamente.fonte
Bash, 53
Experimente online .
fonte
p+=RANDOM%3-1
funciona tambémGelatina , 18 bytes
Experimente online!
O caractere escolhido é 0 . Se o retorno de uma lista de caracteres for permitido, ele
Y
poderá ser descartado e o envio poderá ser transformado em uma cadeia niládica por 17 bytes . Alternativa .Como funciona
Gelatina , 16 bytes
Combinando as minhas, as soluções de Erik e Jonathan, podemos jogar até 16 bytes. O personagem escolhido é 1 .
Experimente online!
Obrigado a Jonathan Allan pelo heads-up (em
Ṭ€o⁶
).fonte
Ṭ€o⁶
no lugar do⁶ẋ;€0
meu 18 byter e chegar a 17. #Oitava ,
53 51 5049 bytesExperimente online!
Salvo 1 byte, não fazendo mais nenhum loop. Salvei outro como o Octave
printf
tambémfprintf
.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
fprintf
um 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
fprintf
funçã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:
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:
fonte
x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Lua,
8175 bytesfor i=1,n ...
Na to_expn
é avaliada apenas uma vez antes de entrar no loop, economizando um byte.-6 graças a @ user202729
Experimente online!
fonte
Python 3.6 ,
847369 bytesGraças a @WheatWizard por -11 bytes. Graças a @JoKing por -4 bytes.
fonte
i
você pode usarfor i in[1]*30
para salvar bytes.from random import*
para não precisarrandom.
mais tarde. E você pode remover o espaço da nova linha após o seu:
.30
para29
o"+".rjust(x)
pode ser substituído por" "*x+"+"
.[1]*30
para[1]*x
porque é um byte mais curto.ES5,
979581 bytesES5,
11298 bytes se for necessário o formato da função:fonte
_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
join(" ")
comjoin` `
Vermelho , 54 bytes
Experimente online!
fonte