Muito inspirado por esse desafio Code Golf: Sua própria cobra ASCII de estimação - eu pensei que fazê-la horizontal acrescentaria uma camada extra de complexidade.
Um exemplo de cobra horizontal:
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
E as regras são:
- São impressas exatamente 5 linhas de caracteres
- Cada linha tem exatamente 30 caracteres, consistindo em uma combinação de espaços e o personagem com o qual você escolhe desenhar sua cobra.
- Sua cobra começa na linha 3
- A próxima linha a ser usada para desenhar sua cobra deve ser escolhida aleatoriamente a partir da sua linha atual, uma linha acima (se você ainda não estiver na linha 1) ou uma linha abaixo (se você ainda não estiver na linha 5).
- Essas opções devem ser igualmente ponderadas. Portanto, se você estiver na linha 1, terá 50% de chance de permanecer na linha 1 e 50% de chance de passar para a linha 2. Se estiver na linha 2, 33% de chance de passar para a linha 1, 33% de chance de permanecer na linha 2 ou 33% de chance de passar para a linha 3
- Sua cobra não precisa visitar todas as linhas.
Respostas:
JavaScript (ES6), 98 bytes
Guardado 7 bytes graças a @KevinCruijssen
Retorna uma matriz de 5 strings.
Experimente online!
Comentado
fonte
d
e usar((y%4?3:2)|0)-(y>0)
para -6 bytes. Experimente online.1
innew Random(...)
está implícito por padrão, é claro. Experimente online.!!y
Em vez de(y>0)
poupa mais de 2 bytes.)Carvão , 28 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Imprima um pouco de preenchimento para forçar 5 linhas de saída.
Repita 30 vezes.
Imprima um zero (e mova horizontalmente).
Se a coordenada Y for 2, mova para cima aleatoriamente por 0 ou 1.
Se for -2, desça aleatoriamente por 0 ou 1.
Caso contrário, desça aleatoriamente por -1, 0 ou 1.
fonte
Perl, 68 bytes
Isso não parece ótimo.
fonte
Gelatina , 24 bytes
Experimente online!
Explicação
fonte
R , 138 bytes
Experimente online!
Handily outgolfed by plannapus
fonte
Python 3, 144 bytes
@Ruts, @Turksarama e @mypetlion foram muito úteis na redução de bytes
Vai tentar melhorar isso. Desafio divertido!
fonte
l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else l
paral+=random.randint(~-(l<1),l<4)
para salvar 31 bytes.m=[[' 'for x in R(w)]for y in R(h)]
param=[list(' '*w)for y in R(h)]
para salvar 7 bytes.boolean
uma subclasse deint
. Então,False
pode ser usado no lugar de0
eTrue
pode substituir1
. O~
operador é unário por bit a bitnot
e o-
operador vira o sinal (multiplique por-1
). Portanto,~-(False)
avalia-1
e~-(True)
avalia como 0. #:m[2][0]=0
desapareceu) e 2 bytes no loop for (for i in R(1,30):
torna-sefor i in R(30):
). Você também precisará recalcular l depois de definir o 0. Isso deve levar a 144 bytes.R ,
120114 bytesObrigado a Giuseppe pelos 6 bytes adicionais!
Usa uma tabela de probabilidades da seguinte maneira:
onde cada coluna corresponde a um caso, ou seja, a coluna 1 é escolhida se a cobra estiver na linha 1, dando probabilidades 0, 1/2 e 1/2 para escolher respectivamente -1 [descer], 0 [ficar parado] e 1 [ subir] (
sample
normaliza automaticamente as probabilidades para 1), a coluna 2 da linha 2 fornece probabilidades 1/3, 1/3 e 1/3, etc ...Experimente online!
fonte
SOGL V0.12 ,
2221 bytesExperimente aqui!
Explicação:
fonte
Japonês,
3129 bytesRetorna uma matriz de linhas.
Teste-o
fonte
Japonês , 26 bytes
Teste online!
fonte
Python 2 , 127 bytes
Experimente online!
fonte
Oitava com pacote de estatísticas, 99 bytes
Também funciona no MATLAB com a caixa de ferramentas estatísticas.
Experimente online!
fonte
Japonês , 28 bytes
Economizou 9 bytes graças a ETHproductions
Experimente online!
fonte
SmileBASIC,
10710510389 bytesEssa resposta é mais interessante que a vertical por causa dos casos de borda (literais).
64 bytes, sem espaços de impressão:
Eu também encontrei algumas variações da linha 2 com o mesmo comprimento:
A divisão inteira de Y / 3 é usada para verificar se Y está fora do intervalo válido e para obter o sinal.
fonte
Java 8,
177170 bytes-7 bytes graças a @ OlivierGrégoire .
Explicação:
Experimente online.
fonte
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)
para salvar alguns bytes.C (gcc) ,
134130 bytesExperimente online!
fonte
Python 3 , 123 bytes
Experimente online!
Gere uma matriz de números inteiros e converta-a em cada linha.
Python 2 , 120 bytes
Experimente online!
No Py2, o redundante analisa
exec
eprint
pode ser removido, mas a sintaxe na 2ª linha é inválida.Superando a finalização de Py2 por Rod e Py3 por linemade .
fonte
Ruby ,
9877 bytesExperimente online!
Um lambda retornando uma matriz de seqüências de caracteres.
Meu impulso inicial foi gerar as colunas e transpor essas colunas, mas é muito mais fácil evitar essa etapa.
Eu gostaria de inicializar
a
com[" "*30]*5
, mas isso faria cópias rasas das cordas, resultando em uma cobra muito gorda e não escorregadia.Eu poderia ter usado uma constante comoD
o incremento (para a mesma contagem de bytes), mas Ruby reclamaria toda vez que eu a designasse. Decidi que preferia diminuir a legibilidade reutilizando oi
meio do loop a ter vários avisos de depuração para ignorar.Eu também gostaria de economizar alguns bytesloop{x+=rand(3)-1;(0..4)===x&&break}
, mas isso causaria um viés nas bordas: 1/3 de chance de voltar para dentro, 1/3 de chance de permanecer e 1/3 de chance de sair dos limites por um tempo antes de eventualmente voltar aleatoriamente (ou seja, "ficar").-20 bytes: use Ruby
Integer#[]
para criar condicionais minúsculos, garantindo pesos de movimento corretos para todas as 5 posições. Isso substitui um padrão de quebra de loop (com uma chance diferente de zero de não parar) para uma economia enorme. Obrigado, Eric Duminil !-1 byte: Inicialize
a
com em(0..4).map
vez de5.times
, obrigado novamente por Eric Duminil .fonte
loop
. Você pode calcular o incremento comrand(2+14[x])-30[x]
ourand -(30[x])..15[x]
. Provavelmente há uma versão mais curta. Ainda assim, -20 bytes não é ruim! Experimente online!x,a=2,(0..4).map{" "*30}
. Experimente online!30[x]
é um ótimo truque! Obrigado!Perl 6 , 85 bytes
Experimente online!
A expressão longa entre parênteses é uma sequência lenta gerada a partir do elemento inicial
(' ', ' ', 0, ' ', ' ')
, a primeira faixa vertical da saída. Cada tira / lista sucessivo é gerado a partir do precedente, chamando seurotate
método, com o deslocamento escolhido aleatoriamente a partir de um conjunto contendo0
,1
(se o primeiro elemento é diferente de zero), e-1
(se o quinto elemento é diferente de zero).A matriz de tiras horizontais é transposta com o
[Z]
operador, transformando-a em uma lista de tiras verticais, cada uma das quais é entãojoin
editada em uma única seqüência e é gerada comsay
.fonte
Scala, 207 bytes
amostra:
degolfado:
Minha invenção única - bem, eu não li as outras soluções até agora, é gerar um Random (6) que é implicitamente dois Randoms (2 * 3). Se estiver longe da fronteira, utilizo os valores de r / 2 (0,1,2) e → (-1,0,1) para subir ou descer. Se na fronteira, posso evitar o chamado caro do personagem de outro aleatório, e apenas pegar o módulo (2) para decidir se devo ficar ou devo ir.
Vamos ver as outras soluções. :)
fonte
java
?try it
link? Kevin Cruijssen não incluiu alguns boilerplate, necessários para compilar esse código ou executá-lo no JShell, mas acho que isso está de acordo com as diretrizes - pode haver uma meta-discussão. Se preferir, você pode tentar reduzir esse código usando também uma matriz de duas dimensões. Uma segunda idéia é reduzir o código deslizante no final. Algum método de mapa? O println está oculto por Kevin. - Sim, a matriz fornece uma melhoria em 8. #Perl,
83101 bytesNovo: sem problema de probabilidade nas fronteiras:
Ungolfed:
fonte
PowerShell , 133 bytes
Experimente online!
Constrói uma matriz 2D de 30 espaços de largura por 5 linhas de altura. (NB - se alguém puder encontrar uma maneira mais eficaz de inicializar esse array, eu irei <3 para sempre.) Define a variável auxiliar
$l
como2
(isso é usado para qual linha o segmento anterior da serpente estava). Em seguida, passa de0
para29
.A cada iteração, definimos nosso elemento de cobra como
0
. Então indexamos em uma matriz complicada,Get-Random
que seleciona se aumentamos ou diminuímos ou permanecemos os mesmos. Isso foi adicionado novamente$l
.Finalmente, percorremos os cinco elementos de
$a
e-join
seus elementos internos em uma única sequência cada. Essas cinco strings são deixadas no pipeline, e o implícitoWrite-Output
nos fornece novas linhas de graça.fonte
Clojure, 123 bytes
Aí vêm as parênteses:
Versão não destruída:
Constrói uma lista das diferentes alturas do corpo da cobra e itera de 0 a 4. Sempre que uma altura corresponde à linha atual, ela imprime um 0, caso contrário, um espaço em branco. Não deixar as alturas excederem o limite realmente custa bytes. Também reconhecer quando uma nova linha está em ordem é mais intensivo em bytes, como deveria ser. Pode-se escrever facilmente um single
doseq
, produzindo um produto cartesiano dos x e y, mas não se sabe quando imprimir uma nova linha.fonte
Python3 + numpy,
137132 bytesNão é o envio de python mais curto, nem o mais longo, e definitivamente não é o mais rápido.
atualizar Usando
numpy
's comando diff salvou 5 bytes para testar se a cobra é um padrão válido, em comparação com o cálculo da diferença manualmente comj[1:]-j[:-1]
.fonte
C (gcc),
80767271 bytesExperimente online!
fonte
f(r)
vez der;f()
R , 95 bytes
A próxima linha
x
é sempre escolhida entre linhas que não estão a mais de 1 distância da linha atual (l[abs(x-l)<2]
). O uso emreplicate
vez de umfor
ciclo salva alguns bytes necessários para a inicialização e manipulação da matriz e requer o uso do<<-
operador ao atribuir à variável globalx
.Experimente online!
fonte
05AB1E , 25 bytes
Experimente online!
Explicação
fonte