Para esse desafio, uma colcha de arte ASCII terá um bloco de texto com 24 caracteres de largura e 18 linhas de altura, contendo os caracteres =-<>/\
em um padrão semelhante a uma colcha simétrica horizontal e verticalmente.
Colcha de exemplo:
========================
------------------------
//\\//\\\//\/\\///\\//\\
<<><<>>>>><<>><<<<<>><>>
/\\/\\\\/\/\/\/\////\//\
------------------------
/\/////\\///\\\//\\\\\/\
\///\/\/\\\\////\/\/\\\/
\///\/\/\\\\////\/\/\\\/
/\\\/\/\////\\\\/\/\///\
/\\\/\/\////\\\\/\/\///\
\/\\\\\//\\\///\\/////\/
------------------------
\//\////\/\/\/\/\\\\/\\/
<<><<>>>>><<>><<<<<>><>>
\\//\\///\\/\//\\\//\\//
------------------------
========================
Todas as colchas têm a mesma forma:
- Eles são sempre 24 por 18.
- A linha superior (linha 1) e a linha inferior (linha 18) estão
=
do outro lado. - As linhas 2, 6, 13 e 17 estão
-
do outro lado. - As linhas 4 e 15 são o mesmo padrão aleatório horizontalmente simétrico de
<
e>
. - Todas as outras linhas (3, 5, 7, 8, 9, 10, 11, 12, 14, 16) são preenchidas
/
e de\
maneira completamente aleatória, de modo que toda a colcha permaneça simétrica horizontal e verticalmente .
Observe que, ao dobrar a colcha exatamente ao meio, vertical ou horizontalmente, as formas dos caracteres são exatamente iguais. Não confunda isso com os próprios personagens. por exemplo, as linhas 3 e 16 não são idênticas, são imagens espelhadas verticais.
Desafio
Escreva um programa ou função que imprima ou retorne uma manta de arte ASCII aleatória.
Devido às muitas linhas codificadas e à simetria, a única aleatoriedade real vem dos 12 primeiros caracteres nas linhas 3, 4, 5, 7, 8, 9:
- Os 12 primeiros caracteres da linha 4 devem ter 12 caracteres de comprimento
<
e>
. - Os primeiros 12 caracteres nas linhas 3, 5, 7, 8, 9 devem poder ter qualquer comprimento de 12 caracteres
/
e\
(independentes um do outro). - Essas seqüências aleatórias são espelhadas de acordo para formar a colcha inteira.
A resposta mais curta em bytes vence. O desempatador é uma publicação anterior.
Você pode usar geradores de números pseudo-aleatórios. (Não, você não precisa provar que todas as 12 caracteres <>
ou /\
podem ser geradas com o PRNG do seu idioma.)
Opcionalmente, a saída pode conter uma nova linha à direita, mas não há espaços à direita ou outros caracteres além do necessário para a colcha.
Respostas:
CJam,
61605855545251 bytesEncurtou um pouco com a ajuda do Sp3000 e do Optimizer.
Teste aqui.
Explicação
Como sempre, com esses desafios simétricos da arte ASCII, estou gerando um quadrante e depois expandindo-o ao máximo por duas operações de espelhamento apropriadas.
Para esta explicação, devo começar com a função
F
, que estou definindo em algum lugar ao longo do caminho, porque é usada em três lugares para três coisas diferentes:Isso espera um número inteiro no topo da pilha e uma string abaixo disso. Seu objetivo é inverter a string e também trocar alguns caracteres, para obter o espelhamento correto. O número inteiro é
1
ou3
e indica se (1
) os colchetes e as barras devem ser trocados ou (3
) apenas os colchetes devem ser trocados. Aqui está como funciona:Agora, para o resto do código:
As duas metades e a nova linha única são impressas automaticamente no final do programa.
fonte
Python 3,
257229192185176149143 bytesCom a ajuda do @xnor, finalmente alcançamos o JS!
Saída de amostra:
Explicação
(Um pouco desatualizado, será atualizado mais tarde)
"444046402"
codifica as linhas, com cada dígito se referindo ao índice inicial da substring de 2 caracteres relevante de'--==\/<>'
. Cada linha individual é construída de dentro para fora através da repetição aleatória dos dois caracteres (usandosample(...,2)
, poisrandom.shuffle
infelizmente está no local) e da união de cadeias.Um exemplo simplificado de como a expansão pode parecer para a quarta linha é:
o que produziria
><>><><<><
:A colcha geral também é construída de dentro para fora, pois a construção começa com a 9ª / 10ª linhas, trabalhando para fora. Para fazer isso, começamos com uma lista vazia
L
, na qual adicionamos linhas na frente e no verso à medida que avançamosA
n<"5"
condição é verificar se temos uma linha que consiste em><
, nesse caso, anexamos uma linha idêntica à parte traseira, caso contrário, seu inverso.Finalmente,
*_,=
é forçar a avaliaçãomap
para que a impressão ocorra e é apenas uma maneira mais curta de fazerprint("\n".join(L))
.Durante muito tempo tive a função
que pega uma string e converte
/\><
em\/<>
respectivamente, mas finalmente consegui me livrar dela :)fonte
Python 2, 300 bytes
Este programa usa
join, lambda, replace, sample, import
e outras funções detalhadas, por isso não ganhará nenhum prêmio de golfe.O código antes do jogador de golfe se apossar dele:
Uma saída de amostra:
fonte
APL (
5358)Infelizmente, não é tão simétrico quanto eu pensava. Correção me custou 5 caracteres e agora estou fora de funcionamento.
Explicação:
L←+,3-⌽
: L é uma função que retorna seu argumento seguido por 3 - o inverso de seu argumentoL{L?12⍴2}¨⍳9
: gere 9 linhas de 12 valores aleatórios a partir de [1,2] mais seu reverso, depois o inverso dessas 9 linhas732451451260688⊤⍨18/8
: gerar a lista0 2 4 6 4 2 4 4 4 4 4 4 2 4 _7_ 4 2 0
(é aí que está a maldita assimetria)+
: para cada linha, adicione o número correspondente a cada valor↑
: formato como matriz'==--/\<><'[
...]
: para cada um dos números na matriz, selecione o caractere da sequência nessa posiçãoSaída:
fonte
<>
linhas não são verticalmente simétricas quando você usa sua tabela de troca ao fazer o espelho vertical também. (Obrigado por postar a saída btw, faz descobrir se APL funciona muito mais fácil; p)<
no final da string e aumentando a segunda linha mais uma vez, trocando-a duas vezes). Nem precisou desfazer a coisa toda, apesar de não ganhar mais agora. (Talvez na próxima vez que should't coloca a saída: P)PHP,
408,407,402,387, 379 bytesEu não sou um bom jogador de golfe, mas esse problema parecia divertido, então tentei.
Código ungolfed
A versão não gasta tem um pequeno bônus: você pode passar um número inteiro para a semente
rand()
e obter a mesma colcha de cada vez para uma semente:Isso resulta, por exemplo, nesta linda colcha tecida à mão:
Editar : Acontece que minha primeira versão não retornou uma colcha correta. Então eu consertei. Engraçado o bastante, a correção é ainda mais curta.
fonte
['/','<','\\','>','a','b']
pode ser substituído com['/','<','\\','>',a,b]
(note as aspas faltando em tornoa
eb
),@$s
pode ser substituído por$s
, você pode armazenarstr_repeat('-',12)
estr_repeat('=',12)
em variáveis / constantes globais,for($b=8;$b>=0;$b--)
pode ser substituído porfor($b=9;$b--;)
,str_repeat
e as funções repetidas pode ser encurtado, dando seu nome para uma variável global (por exemploglobal$R,$V;$R=str_repeat;$V=strrev;$V($R('=',12))
:) e newlines (\n
) pode ser substituído por uma sequência de várias linhas.strrev
inalteradas, removemos 1 espaço e algumas pequenas alterações.<>><><
linhas) para serem as mesmas.JavaScript (ES6) 169
195 201Edite 6 bytes salvos thx @nderscore. Cuidado, a nova linha dentro de aspas é significativa e contada.
Edit2 construção de linhas simplificada, sem necessidade de
reverse
econcat
Execute o snippet para testar (no Firefox)
fonte
z
. Mova a definição deQ
dentro daMath.random
chamada. Substitua'\n'
pela sequência de modelo da nova linha.|0
a conversão de números inteiros não é necessária, pois os valores serão alterados posteriormente.for(_ of-z+z)
significa?z
não é tão numérico -z é NaN (não um número) NaN convertido em corda é "NaN" e 3 caracteres + 9 caracteres são 12.Ruby,
162155Eu gosto deste porque me fez aprender a abusar barras invertidas nos literais de string e
String#tr
. Caso contrário, o código não é muito inteligente, apenas compacto.fonte
/
ina
eb
. O primeirotr
provavelmente também pode ficar sem parênteses. Seqüências de caracteres simples como'='
podem ser escritas?=
. E.join
pode ser substituído por*
.join
sinônimo me salvam 6 bytes. Não consigo remover os parêntesesx+x.reverse.tr(a,b)
porque,+
no,
entanto, tem precedência . Também não estou escapando das barras nas minhas cordas - estou deixando de escapar de uma barra invertida em cada uma. A segunda\
é necessáriab
devido à forma comotr
funciona, embora eu agora percebo o primeiro\
ema
é supérfluo, então não há outro byte.Pyth, 57
59 61Muito obrigado a @Jakube por apresentar essas versões de 57 bytes.
Algoritmo muito semelhante ao de Martin. (Revisto) Explicação por vir.
Experimente online
Explicação:
fonte
"<>"
por-GK
J"\<>/"K"\/"L+b_mXdK_Kbjbym+d_XdJ_JmsmOk12[\=\-K-JKK\-KKK
ou reduzirJ"\<>/"K"\/"jbu++HGXHK_Km+d_XdJ_JmsmOk12[KKK\-K-JKK\-\=)Y
J,
5654 bytesUso:
1 byte graças a @FUZxxl.
Explicação em breve.
Experimente online aqui.
fonte
5 1 3 1 5 1 1 1
por(3(2})8$5,3#1)
.Pitão
295287227 bytesNão é tão bom, mas eu vou postá-lo de qualquer maneira:
Se você quiser uma explicação, pergunte-me.
fonte
=
e-
nod
.Javascript ( ES7 Draft )
174168146Alguma inspiração tirada de @ edc65
Edit: Obrigado ao edc65 por algumas idéias para otimizar a construção de linhas.
Demonstração: ( somente Firefox )
Comentado:
fonte
Pharo 4, 236
ou formatado normalmente:
Explicação:
A corda
s:='====----/\/\/<><<>'
junto com o blocof:=[:c|s at:(s indexOf:c)+i]
está aqui tanto para jogar os personagens quanto para reverter os padrões ...Para i = 1, ele realiza a reversão horizontal (
/
<->\
,<
<->>
).Para i = 3, ele realiza a reversão vertical (
/
<->\
)Para i = 1 ou 2 no Random, ele joga entre
/
ou\
,<
ou>
'=-/</-///'
codifica o tipo de caracterec
que alimentará o blocof
pelas 9 primeiras linhas.#() , '=-/</-///'
é um truque de concatenação para transformar a String em uma matriz e, assim, coletar em uma matriz.O restante é uma concatenação simples após a aplicação da simetria horizontal / vertical.
fonte
Squeak 4.X, 247
Ou formatado:
Explicações:
s:='==--/\<>'.
obviamente codifica os quatro pares possíveis.r:=(1<<108)atRandom.
atire 108 bits (em um LargeInteger) por 9 linhas * 12 colunas (lançamos o == e - desnecessariamente, mas o desempenho não é nosso problema).h:=''
é a string na qual concatenaremos (pintor de Schlemiel porque um fluxo seria muito caro em caracteres).(16to:0by:-2),(0to:16by:2)do:[:i|
está iterando nas linhas (* 2)(11to:0by:-1),(0to:11) do:[:j|
está iterando nas colunas28266
é um número mágico que codifica o par a ser usado nas primeiras 9 linhas.É o padrão de bits
00 01 10 11 10 01 10 10 10
, em que 00 codifica '==', 01 '-', 10 '/ \' e 11 '<>'.101
é um número mágico que codifica a reversão horizontal e vertical.É o padrão de bits
0000 0000 0110 1010
, codificando quando inverter (1) ou não (0) o primeiro (0) ou o segundo (1) caractere de cada par '==' '-' '/ \' e '<>', para a simetria vertical e simetria horizontal.n:=3 bitAnd: 28266>>i
fornece a codificação do par de caracteres para a linha i / 2 (0 para '==', 1 para '-', 2 para '/ \' e 3 para '<>').(r-1 bitAt: 6*i+j+1)
escolha o bit aleatório para a linha i / 2 da coluna j (1 é a classificação do bit mais baixo, portanto, temos +1, k no lançamento aleatório no intervalo [1, k], portanto, temos -1).(101 bitAt: 3-n*4+m+p)
escolha o bit de reversão: (3-n) * 4 é o deslocamento para o grupo de 4 bits correspondente ao código de par n, m é o deslocamento de reversão vertical (0 para os primeiros 9, 2 para as últimas 9 linhas), p é o deslocamento de reversão horizontal (0 para as primeiras 12, 1 para as últimas 12 colunas) +1 porque a classificação de bits baixa é 1.bitXor:
executa a reversão (responde um deslocamento 0 ou 1) es at:2*n+1+bitXor_offset
escolhe o caractere correto em s.Mas
(A>>a)+(B>>b) bitAnd: 1
custa menos bytes do(A bitAt:a+1)bitXor:(B bitAt:b+1)
que o bitXor foi reescrito e o deslocamento +1 em p desapareceu ...h,#[13]
é um squeakism feio, podemos concatenar uma String com um ByteArray (contendo código para retorno de carro).fonte