Seu objetivo é exibir a arte ASCII de uma formação no boliche de dez pinos, onde apenas alguns pinos permanecem. Menos bytes ganha.
Os dez pinos estão em uma formação triangular:
O O O O
O O O
O O
O
Os pinos são rotulados de 1 a 10 como:
7 8 9 10
4 5 6
2 3
1
Pinos de desenho como O
e pinos ausentes como .
, a formação 1 3 5 6 9 10
é:
. . O O
. O O
. O
O
Entrada:
Uma sequência separada por espaço que lista um subconjunto não vazio dos números de 1 a 10 em ordem.
Resultado:
Imprima a formação correspondente ou faça a saída como uma string com quebras de linha.
A formação deve estar nivelada com a esquerda da tela. Qualquer espaço em branco é bom, desde que a imagem visível esteja correta. Linhas vazias antes e depois também são boas.
Casos de teste:
>> 1 2 3 4 5 6 7 8 9 10
O O O O
O O O
O O
O
>> 7 10
O . . O
. . .
. .
.
>> 3 5 7 9 10
O . O O
. O .
. O
.
>> 1
. . . .
. . .
. .
O
Respostas:
Brainfuck -
617616604 bytesIsso me levou a maior parte de dois dias. Eu acho que valeu a pena. Provavelmente, há partes que podem ser jogadas mais, alterando a célula em que algo está armazenado ou o que quer que seja, mas, no momento, estou feliz por fazê-lo funcionar.
Este programa teria que ser completamente diferente se a pergunta não especificasse que a entrada seria classificada. A maneira como isso funciona é construindo uma lista de 10 pinos em torno dos que são inseridos. Isso é meio confuso, mas talvez isso explique melhor:
Enquanto faz isso, ele lembra quais pinos o usuário colocou lá e quais colocou lá. Essa estratégia seria muito difícil de usar se a entrada não fosse classificada.
Outra coisa que a classificação facilita é a detecção do número 10. Como o cérebro lida com bytes individuais, não com "números" por si só, poderia ter sido uma chatice, mas a entrada classificada tornou muito mais fácil para mim lidar com. A razão para isso tem a ver com a maneira como eu armazenei dados no programa. Pego a entrada um caractere de cada vez e subtraio 32 do resultado. Se a célula não for zero depois disso, avançarei 4 células. antes de repetir. Isso significa que eu recebo um byte de espaço não espacial a cada 4 células e efetivamente armazeno pinos como seu número + 16. No entanto, 10 leva dois bytes para digitar, então tive que ser especial. Se a entrada não fosse classificada, eu teria que olhar através dos pinos, mas, como é classificada, sempre será o último pino se aparecer. Verifico se o (último byte da entrada + 1) == (o segundo último byte da entrada) e, em caso afirmativo, deve ser 10. Me livre do último byte e defino o segundo último como o que meu sistema entende como "10". Os personagens
'1'
e'0'
não cabe em um único byte, mas o número 26 com certeza se encaixa!Criar truques apenas para fazer alguma coisa funcionar é minha parte favorita do uso dessa linguagem. :)
Se você estiver interessado em saber como esse programa funciona com mais detalhes, poderá vê-lo com os comentários que eu usei enquanto escrevia para garantir que eu me lembrasse do que tudo fazia. Até escrever comentários no cérebro é difícil, já que não há sintaxe para comentários. Em vez disso, todos os personagens, exceto aqueles em,
<[+.,-]>
não são ops. É fácil introduzir bugs acidentalmente incluindo.
ou,
em seus comentários! É por isso que a gramática é tão instável e ponto e vírgula está em todo lugar.EDIT: Como exemplo de como é fácil estragar tudo: usei "non-space" em um dos comentários! Quando retirei todos os caracteres não bf da fonte, o programa que costumava fazer isso ficava no arquivo
-
. Felizmente, não quebrou nada, mas agora eu o removi para salvar um byte. :)EDIT II: Já faz um tempo desde que eu toquei este, haha. Em outra resposta cerebral neste site, notei que acidentalmente usei uma vírgula na versão comentada. Como a entrada já estava esgotada, ela definiu a célula atual como 0 (isso depende da implementação, mas, na minha experiência, é o comportamento mais comum). Corrigi o bug, mas isso me fez pensar. A maneira idiomática de definir uma célula como 0 é
[-]
(aproximadamentewhile (*p) { *p--; }
), que é mais dois bytes. Sempre que toda a entrada tiver sido lida, eu posso usar,
. Isso me salvou 2 bytes nessa resposta e 12 nessa!fonte
Python 2, 108 bytes
Ligue com
f("3 5 7 9 10")
.i
é o número da linha, com 4 sendo a primeira linha e 1 sendo a última.z
é o nono pino nessa linha, com 0 significa que é o primeiro pino da linha ei-1
significa que é o último pino da linha.O principal hack é
i*~-i/2-~z
, o que é convertido(i, z) -> pin number
. Por exemplo,(4, 0) -> 7
como o pino 7 é o primeiro na linha 4 (a primeira linha). A derivação é assim:Queremos uma função levando
i
para o primeiro pino da linhai
, ou seja4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1
. Isso é satisfeito(i**2-i)/2 + 1
e, portanto,(i**2-i)/2 + 1 + z
fornece o número de pino correto para a entrada(i, z)
Em seguida, simplifique:
Pitão , 33 bytes
Experimente online.
O programa traduz aproximadamente para:
(Obrigado a isaacg por dicas)
fonte
V4
é equivalente aFNU4
erz7
é equivalente amvkcz\
.Pyth , 31
Experimente aqui .
V4
configura um loop for, com N como a variável over [0,1,2,3].*dN
fornece os espaços iniciais, porqued
é espaço.Para encontrar a localização dos pinos, ele usa
+7+dZ
- 7 + d + Z.d
é:enquanto
Z
é 0 na primeira linha, -4 na segunda, -7 na terceira e -9 na quarta. Isso ocorre porqueZ
começa como 0 e~Z-N4
diminuiZ
em 4, depois em 3 e depois em 2.Em seguida, verifica se o local do pino está na entrada, usando
}+7+dZrz7
.rz7
são os pinos desejados na forma de lista de int.Em seguida, ele cria um
O
se estava presente e,.
caso contrário. Este é um espaço separado, comjd
e impresso implicitamente.fonte
Perl 5: 51 (50 + 1 para
-p
)Usando
r
sinalizador para os///
qual é uma das adições recentes ao perl 5.fonte
CJam,
4841 bytesUau, isso ficou terrivelmente longo
Teste aqui.
Explicação
Primeiro, geramos o layout:
Isso gera
E agora substituímos os caracteres de dígito de acordo com a entrada:
fonte
"789A456S23SS1":~S*7/N*[l~]'OerB,'.er
é um pouco mais curto.er
auto-difusão estava em ordem naquele momento."789A456S23SS1":~S*7/N*[l~]"O"erB,"."er
funciona bem em 0.6.2.Python 2,
9794Isso usa a função de conversão, que permite fazer substituições de caractere por caractere em uma string. Como tr em perl, exceto por muito mais tempo para digitar. Eu recebo uma lista de dígitos decimais criando uma sequência de 9 a 99 de potência.
fonte
Javascript, 155
Primeiro golfe, provavelmente pode ser mais curto.
ligue com
EDITAR
Versão ES6, 130
EDITAR
Versão ES6, 79falhaVersão ES6,
7277, nenhum alerta, apenas retornafonte
.match
). Este é o mais elegante de todos.Ruby, 91
Simplesmente substitui os argumentos de linha de comando com
.
s e0
s e imprime-los usando um loop de 4 ciclos.Versão legível
fonte
GNU sed, 75
A pontuação inclui 1 extra para a
-r
opção:Entrada via STDIN:
Experimente online .
fonte
l
s .0
para10
a linha 2,1/
para1 /
a linha 5 e[0-9]
para as[0-9]+
linhas 7 e 9, poderá soltar a primeira linha por 4 bytes.CJam,
4039 bytesEu sei que há uma maneira mais curta, não tenho tempo para descobrir isso agora.
Como funciona:
Experimente online aqui
fonte
APL (35)
Teste:
Explicação:
17110357⊤⍨28/2
: a representação de 28 bits de17110357
:\⍨
: Para todos0
, forneça um espaço e, para todos1
, pegue um item da string à esquerda.⎕∊⍨⍳10
: Leia uma linha do teclado e avalie-a (⎕
) e verifique se todos os números de 1 a 10 (⍳10
) estão ou não contidos na entrada (∊⍨
).'.O'[1+
...]
: adicione 1 a cada valor (dando 1s e 2s em vez de 0s e 1s) e substitua a cada 1 por.
cada 2 porO
.4 7⍴
: transforme a sequência gerada em uma matriz de 4 por 7⊖
: virar horizontalmentefonte
Powershell: 109
A entrada está em $ i
Foi divertido. Também aprendemos várias coisas sobre como o pipeline funciona.
fonte
Haskell:
163160 bytesIsso aceita uma linha de números separados por espaço
stdin
.Ungolfed:
E um bônus:
C: 250 bytes
Esta versão espera que seus argumentos de linha de comando sejam a lista de números.
fonte
Perl, 73
E uma abordagem de bônus pateta que não deu certo, 90 caracteres:
fonte
Mathematica, 109 bytes
Função:
Chamado por:
Se funções anônimas forem permitidas, isso pode ser reduzido para 105 bytes :
Se a entrada não tiver que ser uma cadeia de caracteres delimitada por espaço, mas possa ser uma matriz de números no formulário
{3,5,7,9,10}
, isso poderá ser reduzido ainda mais para 79 bytes :fonte
Festança pura (sem coreutils), 85
Substituição simples de padrões:
A lista é inserida por meio da linha de comando args.
fonte
Rebol - 117
Ungolfed:
fonte
Brainfuck, 179 bytes
Formatado:
Espera entrada sem uma nova linha à direita.
Experimente online.
A fita é inicializada com dez nós, cada um dos quais contém um seguido por um zero. O primeiro é o valor inicial do pino e o zero facilita a navegação e atua como um espaço reservado para o caractere de espaço. Para cada número na entrada, esse pino é incrementado em 3; observe que
ord('O') - ord('.') = 33
, e durante a fase de impressão, o valor do pino será multiplicado por 11. (Essa multiplicação também é usada para gerar o caractere de espaço.) A ordem dos pinos da esquerda para a direita na fita é simplesmente de1
até10
. Se a entrada terminar com a10
, é feita uma correção, pois a10
é inicialmente tratada como a1
.Após o processamento da entrada, uma negativa é colocada após cada linha. Em seguida, as linhas são impressas em um loop, com o número de espaços à esquerda determinado pelo número de linhas processadas anteriormente.
fonte
Clojure, 216 caracteres (ugh)
Tenho certeza que isso pode ser jogado ainda mais.
Use assim:
fonte
AWK: 96 bytes
Nota:
fonte
C # - 192 bytes
Porque c #!
Comecei tentando criar a saída com matemática, mas o método simples de substituir tokens na string parece melhor para linguagens de nível superior. A dependência do Linq é longa, mas ainda menor do que manter um contador e fazer verificações de alcance.
EDIT: retorno de linha unix (-3 bytes)
fonte
Scala,
150148Aceita conjunto de seqüências delimitadas por espaço
fonte
JavaScript ES6, 78 bytes
Use o seguinte trecho para testar. Ele usa avisos e alertas e notação de função regular para facilitar o teste.
fonte
VB / Basic-229
Meu objetivo era vencer java ^^
editar vbCr em vez de chr (13)
r = r + Espaço (3 - (e - b))
taquigrafia se
uso da função em vez de sub
sub MAIN () -> sub m ()
fonte
Java - 223 caracteres
Eu gostava dessa maneira de fazer isso, e então percebi que precisava de um pequeno hack, ainda como a minha solução.
fonte
K, 57 bytes
Ainda não é muito competitivo, mas é um começo:
Exemplo de uso:
Começo avaliando a string de entrada com
.
- felizmente, os números separados por espaço são uma lista válida literal em K. Ao incluir uma lista vazia no resultado de eval, posso garantir que seja uma lista, mesmo no caso de um único pino. Então eu crio um vetor booleano representando as posições dos pinos:Então indexo em uma lista de strings para obter caracteres preenchidos com espaço para cada posição do pino.
Eu divido essa sequência em linhas (
_
), inverto-as (|
) e uno cada fragmento (,/'
):Agora está começando a se parecer com o padrão que queremos. Tudo o que resta é juntar alguns espaços à esquerda em cada linha (
((!4)#\:" "),'
) e imprimir as linhas em stdout (0:
).fonte
Pascal (FPC) , 165 bytes
Experimente online!
Pega números da entrada padrão, imprime a formação na saída padrão.
Pascal (FPC) , 175 bytes
Experimente online!
Uma função que faz a mesma coisa, assumindo uma matriz de posições de pinos e retornando uma string formatada.
fonte
Powershell, 84 bytes
Script de teste:
Resultado:
fonte
Java -
371316294 caracteresNa primeira vez, tenho certeza de que é uma merda, mas sou um novato. Também funciona quando os números não são solicitados. A numeração está errada, mas não tenho tempo para descobrir como corrigi-la ...
entrada é fornecida por,
java B 1 2 3 5 10
por exemplo. A saída será então:fonte
Japt
-Rx
,29191817 bytesTente
Explicação
fonte