Aqui está um boneco de neve simples de arte ASCII :
_===_
(.,.)
( : )
( : )
Vamos fazer alguns amigos para ele. Este será o padrão geral para nossos snowpeople de arte ASCII:
HHHHH
HHHHH
X(LNR)Y
X(TTT)Y
(BBB)
Os espaços à esquerda e os parênteses são sempre os mesmos para todos os snowpeople. As letras diferentes representam seções do padrão que podem ser alteradas individualmente. Cada seção possui exatamente quatro predefinições para quais caracteres ASCII podem preenchê-la. Ao misturar e combinar essas predefinições para todas as oito seções, podemos fazer uma variedade de snowpeople.
Todas as predefinições
(Observe que os espaços são colocados em linhas vazias, de modo que a forma da seção esteja sempre correta.)
H é para o chapéu
Chapéu de palha
_===_
Chapéu mexicano
___ .....
Fez
_ /_\
-
___ (_*_)
N é para nariz / boca
Normal
,
Ponto
.
Linha
_
Nenhum
L é para o olho esquerdo
Ponto
.
Ponto maior
o
Maior ponto
O
Fechadas
-
R é para o olho direito
(Mesma lista do olho esquerdo.)
X é para o braço esquerdo
Braço normal
<
Braço para cima
\
Braço para baixo
/
Nenhum
Y é para o braço direito
Braço normal
>
Braço para cima
/
Braço para baixo
\
Nenhum
T é para torso
Botões
:
Colete
] [
Braços Internos
> <
Nenhum
B é para Base
Botões
:
Pés
" "
Plano
___
Nenhum
Desafio
Escreva um programa que HNLRXYTB
utilize uma cadeia de oito caracteres (via stdin ou linha de comando) no formato , onde cada letra é um dígito de 1 a 4 que indica qual predefinição usar para a seção correspondente do snowperson. Imprima o snowperson completo no stdout.
Por exemplo, a entrada 11114411
é o boneco de neve na parte superior da página. (Primeiro 1
: ele tem um chapéu de palha, segundo 1
: ele tem um nariz normal, etc.)
Outro exemplo, o snowperson para entrada 33232124
:
_
/_\
\(o_O)
(] [)>
( )
Detalhes
Quaisquer quantidades e combinações de espaços à esquerda / à direita e de novas linhas à esquerda / à direita são permitidas desde que ...
- o boneco de neve tem todas as suas seções organizadas corretamente uma em relação à outra, e
- nunca há mais de 64 caracteres de espaço em branco total (o padrão geral é de apenas 7 × 5, portanto, você provavelmente não atingirá esse limite).
Você não precisa imprimir linhas / colunas do padrão se elas contiverem apenas espaços em branco. por exemplo, a linha vazia do chapéu de palha não é necessária.
Você deve usar a ordem das peças, conforme indicado acima.
Em vez de um programa, você pode escrever uma função que aceita a sequência de dígitos como argumento. A saída deve ser impressa normalmente ou retornada como uma sequência.
- Você pode tratar a entrada como um número inteiro em vez de uma sequência, se preferir.
Pontuação
O código mais curto em bytes vence.
Pergunta bônus: Qual das 65536 pessoas distintas de neve é a sua favorita?
Respostas:
CJam,
135134132130 130125125 bytesPara criar o arquivo em sua máquina, execute
xxd -r > snowman.cjam
, cole o hexdump reversível de cima, pressione Entere finalmente Ctrl+ D.Como alternativa, você pode tentar o código online usando o intérprete CJam .
Bônus
Meu boneco de neve favorito é Olaf:
O inverno é um bom momento para ficar e abraçar, mas me coloque no verão e eu serei um ... feliz boneco de neve!
Idéia
A cadeia hexadecimal
codifica as opções possíveis para todas as partes do boneco de neve, incluindo as fixas. Vamos chamar essa string P .
Para decodificá-lo, convertemos P (aqui tratado como uma matriz de números inteiros) da base 256 para a base 20 e substituímos cada um dos números inteiros resultantes pelo caractere correspondente da string M :
Isso resulta na cadeia T :
A primeira linha codifica todas as opções de chapéu, a última todas as partes do corpo fixas. As outras linhas contêm as 28 partes variáveis do corpo.
Nós dividimos T em feeds de linha e dividimos as cadeias de caracteres da matriz resultante em quatro partes de igual comprimento. Em seguida, lemos a entrada de STDIN, pressionamos a matriz de seus dígitos na base 10 e selecionamos os elementos correspondentes das seqüências de caracteres divididas. Aproveitamos o fato de que as matrizes são agrupadas em CJam; portanto, o elemento no índice 4 de uma matriz de comprimento 4 é realmente o primeiro elemento. A última string dividida não corresponde a nenhuma entrada; portanto, ela será selecionada totalmente.
Lidamos com o chapéu deslocando o primeiro elemento da matriz resultante. O índice em M do primeiro caractere, lido como um número base 4, revela o número de espaços e sublinhados na primeira linha do chapéu. Imprimimos esses caracteres, um avanço de linha, um espaço e o restante da sequência deslocada. Em seguida, pressionamos um avanço de linha adicional na parte inferior da pilha.
Para as partes do corpo, concatenamos a string correspondente a todas elas. Vamos chamar essa string S . Para montar as partes do corpo, realizamos transliteração: tomarmos cada carácter da cadeia H , calcular o índice de tipo (M) e substituí-lo pelo carácter correspondente de S . Aproveitamos o fato de o operador de transliteração preencher automaticamente S para corresponder ao tamanho da classificação (M) repetindo o último caractere de S quantas vezes for necessário.
Finalmente, dividimos a string resultante em substrings de comprimento 7 e colocamos um avanço de linha entre cada par de substrings.
Código
Suponha-se que as variáveis
M
eP
conter as cadeias H e P .fonte
JavaScript ES6,
210208202 bytesEsta é uma função anônima; você o usa executando
([function code])('42232124')
. A parte mais irritante disso foram os braços, que ocupam duas linhas, então eu tive que incluir o código para cima e para baixo.O Snippet de pilha abaixo possui código de comentário não-golfado, sem ES6. E você pode usá-lo para testar facilmente o código e experimentar diferentes combinações. Edit: Estou me divertindo muito com isso. Eu adicionei vários novos recursos, incluindo uma maneira de gerar um boneco de neve aleatório.
Agradecemos a Yair Rand por salvar seis bytes.
fonte
1 1
->11
) e adicionando||' '
no final.CJam, 164 bytes
Gera o boneco de neve da esquerda para a direita, de cima para baixo. Isso elimina a necessidade de qualquer tipo de operação de união ou reposicionamento de cordas, pois deixo cada pedaço do boneco de neve na pilha. E então, devido ao despejo automático de pilha no final dos programas:
♫ CJam quer construir um boneco de neve! ♫
Experimente online.
Bônus
Pensando fora da caixa!
32443333
dá uma noiva (wo) homem da neve. Você precisa tentar um pouco para vê-lo, mas existem os braços para dentro, fez + braços para baixo = véu, e a cabeça está realmente no fez / véu. A forma geralmente grande é o vestido ondulado, e os "olhos" e "nariz" são dobras no vestido.Outras opções de "olho" são um pouco ousadas ...
fonte
Python,
276289 bytesEste código possui 8 bytes extras (
\
* 4) para facilitar a leitura.Constrói o boneco de neve pouco a pouco.
Bônus
F("44444432")
dá "urso russo sonolento":fonte
Python 2,
354280241261 bytesA chamada
s('33232124')
fornece:Mas meus favoritos são
44242123
e41341144
:fonte
s('33232124')
as barras não são desenhadas. De fato, a metade inferior do chapéu está faltando em muitos casos. Além disso,0
não é uma das opções.CJam,
150145 bytesBase converter todas as coisas!
O SE controla os imprimíveis, então aqui está uma cópia no Pastebin. Certifique-se de copiar a parte "RAW Paste Data", não a parte ao lado dos números das linhas. Você pode experimentá-lo online , mas o link permanente pode não funcionar em alguns navegadores.
Explicação
A
"b8li'U9gN;|"125:Kb8bp
parte gera a matrizque mapeia cada dígito da entrada para onde o dígito é usado. Qualquer coisa que seja comum a todas as entradas (por exemplo, espaços à esquerda e
()
) recebe arbitrariamente um 0, exceto o primeiro que é atribuído 1, para que a conversão base possa funcionar.l:~f=
depois converte cada dígito em int e mapeia de acordo, por exemplo, para14441133
obtermos"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f=
dá a stringapós o que duplicamos, substitua
/<[(
por\>])
e acrescente para fornecer uma sequência longa. Em seguida, dividimos a sequência em grupos de 4 e mapeamos de acordo com outra matriz"r pL|P3{cR`@L1iT"Kb21b
, obtendo uma matriz de sequências de comprimento-4 descrevendo todas as opções possíveis em cada célula (por exemplo,_=./
são todas as opções possíveis para o segundo caractere na segunda linha, começando pela Chapéu russo).Finalmente, mapeamos as opções para as entradas de acordo
.=
, divididas em linhas de comprimento 77/
e riffle em algumas novas linhasN*
.Execuções de teste
fonte
TI-BASIC, 397 bytes
Importante: Se você quiser testar isso, faça o download aqui e envie esse arquivo para sua calculadora. Faz não tentar copiar o código abaixo em editor de programa da TI-Connect CE ou SourceCoder 3 ou algo para construir e enviá-lo para a calculadora; no caso do TI-Connect, ele diz que possui um token inválido. O SC3 usa a barra invertida como delimitador de comentários (
//
inicia um comentário no SC3; no/\/
entanto, exportará como//
) e, portanto, não exportará os braços e o chapéu corretamente, fazendo com que o programa exiba as partes incorretas do corpo e jogue um ERRO: DOMÍNIO de vez em quando. Coisas divertidas!Importante # 2: Estou com preguiça de corrigir o download no momento. Portanto, quando você transferi-lo para o seu calc, altere o
7
na terceira linha, de baixo paraX+6
. O código abaixo é corrigido se você precisar comparar.Bônus: Gosto particularmente
12341214
.Algumas notas:
[2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct)
) em oposição a um ponto para que os olhos não se alinhem à vírgula, porque isso parece estranho como o inferno.fonte
length(Ans
deve serlength(Str9
; segundo, você tentou combinar Str3 a Str6 em uma única string?C,
280 272264 bytesApenas parcialmente jogou golfe neste momento, mas este é um desafio divertido.
(Com alguns \ n extras para facilitar a leitura.) Espero que o
define
desapareça com mais golfe.Uma versão mais legível é
fonte
C, 212 bytes
Uma versão legível:
Tirei a ideia da resposta de Reto Koradi . Houve várias melhorias divertidas que fiz, que podem justificar a publicação de uma resposta separada:
\"
(-3)t[i++]
por*t++
(-4)while
porfor
; removido{}
(-4)\0
(-9)t[...],t+=4
para(...)[t+=4]
eliminar o operador de vírgula (-1)Por que todo esse problema? Para compartilhar meu favorito, fantasma da neve:
fonte
d
nomain
JavaScript, 489 (sem novas linhas e guias)
correr com
node snowman.js 33232124
fonte
parseInt
chamada, pois a subtração tenta converter automaticamente os operandos de seqüência de caracteres em números. Além disso, você pode se livrar dofunction
invólucro e apenas levar com elei=process.argv[2]
, a menos que esteja usando-o para recursão ou escopo variável. Além disso, você pode se livrars
completamente e apenas fazerconsole.log([ ... ].join('\n'))
.,
caracteres, mas permite remover mais de 50. Finalmente, uma otimização muito complicada seria usar emq=j[4]-1
vez deq=j[4]==1
(e depois mudar o uso deq
e!q
). Isso fará comq
que seja0
(um valor de falsey) quandoj[4]
for1
e, caso contrário, um valor diferente de zero. Este é exatamente o oposto dos seus valores atuais verdadeiros / falsos, então você simplesmente alternaq
e!q
.Pitão, 203 bytes
Ri muito. Experimente online: Pyth Compiler / Executor
Explicação
Primeiro, defino uma função auxiliar
g
, que recebe uma lista e um caractere como entrada, converte o caractere em seu valor ASCII e leva o elemento correspondente (disposição modular).O outro é apenas imprimir linha por linha. Por exemplo, a primeira linha é:
Btw. Eu experimentei um pouco
.F"{:^7}"
, o que centraliza uma corda. Com ele, pude salvar alguns espaços no meu código, mas ele não salva bytes no final.fonte
R,
436437 bytesAqui está minha primeira tentativa no code-golf , usando R, que não é o mais curto, mas ainda divertido. Pelo menos eu estou batendo JavaScript (por enquanto) ...
Testando:
Na verdade, eu lutei
X
e fuiY
multilinha, mas com coisas no meio, acabei separando cada linha em (X
,S
) e (Y
,U
).function
e a conversão de string para inteiro também são muito detalhadas.Editar 436 => 437
Tinha que consertar um espaço vazio ausente observado pelo @OganM
Eu poderia reduzir para 428 substituindo as quebras de linha entre variáveis por
;
, mas o código "de uma linha" parece tão ruim e ilegível que não serei tão ganancioso.fonte
Haskell,
361306289 bytesUso:
Como funciona: indexe todos os elementos da lista
[hat options, left upper arm options, left eye options, ..., base options]
com o número de entrada correspondente e concatená-lo em uma única lista. Dividi o braço esquerdo e direito em uma parte superior e inferior, para poder construir o boneco de neve linha por linha.O meu favorito é o clássico
11112211
.Editar: alternado da lista de cadeias de caracteres para as partes (chapéu, olho, ...). Precisa de um segundo parâmetro, o comprimento da substring a ser utilizada.
Edit II: substrings comuns extraídos
fonte
C,
233230 bytesCom novas linhas e espaços em branco para melhor legibilidade:
A coisa toda é uma força bastante bruta. Ele usa uma tabela que contém uma entrada para cada um dos 35 (5 linhas com comprimento 7) caracteres. Cada entrada na tabela é:
,
(
,)
. O comprimento da entrada da tabela é de 1 caractere.O código, em seguida, passa os 35 caracteres e procura o valor na tabela.
fonte
R 414 bytes
Versão ligeiramente modificada da versão de Molx
Apenas fundiu as variáveis separadas em uma. Shawing de algum espaço que foi usado para
X=c(
rotina.fonte
CJam,
200191 bytesIsso certamente pode ser muito praticado. (Especialmente se eu codificá-lo). Mas aqui vai para iniciantes:
A entrada entra no STDIN. Por exemplo, a entrada
23232223
fornece:Experimente online aqui
fonte
Haskell, 333 bytes
Minha primeira submissão! Constrói o boneco de neve de cima para baixo, da esquerda para a direita. Dividi os braços em duas funções para cada braço, a parte ao lado da cabeça e a parte ao lado do corpo.
A função s pega uma lista de números inteiros e concatena a saída das funções que produzem as partes do corpo dadas sublistas corretas da entrada.
Depende da função
que retorna o enésimo elemento da lista fornecida. Isso permite a lista de chapéus em um, bem como coisas como
todas essas funções usam uma redução beta para que seu argumento seja passado como índice para a função y.
Resultado:
fonte
Python 3,
349336254251 bytesTanta coisa para fazer minha tese.
Aqui está o conteúdo do arquivo snowman.py :
E é assim que eu conjuro meu boneco de neve favorito:
Explicação
fonte
[int(i)]
efor
. Da mesma forma, você pode remover o espaço na linha 7 entref(int(i))
efor
. Além disso, em suaprint()
declaração, você não precisa imprimir o espaço final - ele não faz parte do boneco de neve. Por fim, altere suaprint()
chamada para uma linha únicaprint("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c))
. Cada um deles deve poupar 1 byte, economizando um total de 4 bytes :)n
, você pode definir um atributo da funçãof
. Portanto, você pode substituir as linhas 5-6 por:def f(m):f.n+=1;return l[4*m+int(b[f.n])-1]
<nova-line>f.n=-1
. Isso reduz mais 3 bytes.PowerShell , 199 bytes
Inspirado por Reto Koradi e anatolyg .
Experimente online!
Nota: A linha 3 possui 2 espaços para trilhas, a linha 4 possui um espaço para trilhas.
Meu favorito é
44444444
"guarda russa sonolenta":fonte
JavaScript (ES6), 247
Anúncio não tão bom @ NinjaBearMonkey's :(
Teste no snippet (com Firefox)
fonte
05AB1E ,
137135128122 bytes-6 bytes graças a @Grimy .
Experimente online ou verifique mais alguns casos de teste .
Explicação:
Primeiro, criamos a string do modelo:
Que se parece com isso:
Então eu faço um loop sobre os dígitos da entrada:
E faça o seguinte:
Pressione o índice (indexado 0)
N
da lista:Empurre todas as partes possíveis como uma lista de listas de caracteres:
Use o índice de loop
N
para obter a lista de caracteres da parte com a qual estamos trabalhando atualmente:Em seguida, divida a lista de caracteres em quatro partes iguais e use o dígito de entrada
y
(que é indexado 1) para indexá-lo. (NOTA: Como 05AB1E é indexado em 0, mas a entrada é indexada em 1, seria lógico diminuir o dígito em 1 antes da indexação. No entanto, como 05AB1E possui envolvimento automático (ou seja, a indexação3
na lista[1,3,5]
resultará em1
), eu simplesmente girou as peças uma vez, para que as partes com o nº 4 na descrição do desafio estejam na frente das listas.)E, em seguida, substitua o índice indexado 0 do loop que pressionamos primeiro, um por um pelos caracteres de parte:
E, no final, o resultado é gerado implicitamente.
Consulte esta minha dica 05AB1E (seção Como compactar números inteiros grandes? E Como compactar listas de números inteiros? ) Para entender como as peças de compressão funcionam.
Quanto ao meu favorito, ainda é o mesmo 'coelho da neve' de 1,5 ano atrás quando publiquei minha solução Java :
fonte
0
entre seus olhos. :)Java 8,
548545432401399 bytesExperimente aqui.
Explicação:
Meu favorito:
Não sei por que, mas parece meio fofo. Como um coelho com um chapéu russo em vez de orelhas.
fonte
F #, 369 bytes
Experimente online!
Como
g
usa um acessador de matriz, preciso especificar explicitamente o tipo na definição da função como astring
, e é por isso que a definição da função possui(g:string)
.Além disso, geralmente é uma matriz
strings
acessada por um índice. O chapéu, os braços esquerdo e direito, que entrariam em linhas separadas, são divididos em matrizes superior e inferior separadas. Ai
função altera um número no argumentog
para o índice da matriz. E a letrab
substitui as cadeias de espaço único nas matrizes.Grande desafio! Meu boneco de neve favorito é provavelmente
242244113
:Estou te observando
fonte
PHP, 378 bytes
Experimente online!
Eu gosto do sábio Sr. Coruja
31333342
fonte
Python 2.7, 257 bytes (eu acho)
onde 'i' é a entrada como uma sequência (por exemplo, "13243213")
fonte
i
porinput()
um total de 262 bytesDardo , 307 bytes
Experimente online!
fonte
Zsh, 247 bytes
experimente online !!
fav boneco de neve:
fonte