Brainfuck - 617 616 604 bytes
+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.
Isso 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:
If you input these pins: [2, 3, 6, 8, 9]
First, the program does this: [2, 3, 6, 8, 9] + [10]
Then this: [2, 3, 6] + [7] + [8, 9, 10]
Then this: [2, 3] + [4, 5] + [6, 7, 8, 9, 10]
Finally, this: [1] + [2, 3, 4, 5, 6, 7, 8, 9, 10]
To build this: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
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 é [-]
(aproximadamente while (*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!
one flag at the very left; will be important later
+>>>>
all nonspace bytes of input separated by 3 empty cells; pin number `n` stored with value `n` plus 16
,[>++++[<-------->-]<[>>>>],]<<<<
test if last pin is 10
[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>
[
if not: find 10 minus the number it is; put that many placeholder pins (cells with value 1) at the end
,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<
]>
[
if so: get rid of '0' byte; convert '1' byte to 26 (10 plus 16)
>>[,<]<<+++++++++<
]<<<
pointer now sitting on the cell with the second greatest pin that was inputted (ie not a placeholder)
;;;;;;;
[
check for flag placed at the very beginning of the program; if present: break
-[+>>-<]>
[
find ((pin to our right) minus 1) minus pin to our left
move all pins left of us 4*(that value) cells and insert placeholder pins
>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]
]
find first non placeholder pin to our left
there has to be one because we haven't hit the flag yet
<<<[-[+>]+<<<<]>>>>-<<<<<
]>>>>>+
we have now added placeholder pins at the end and in the middle; all that's left is the beginning
subtract 17 from lowest pin and put that many placeholders to the left
++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]
subtract 32 from an empty cell 2 to the left of the lowest pin; will be useful later
<[<<<<]>>>++++[<-------->-]>
placeholder pins have the value 1; real pins have a value somewhere between 17 and 26
normalize it by stepping through and setting every pin with value != 1 to 3 (0's ascii code is 2 higher than period so this will make it easier to print later)
[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>
start writing 32s across the board; hitting every second cell
that's every pin and the cell 2 to the right of each pin
this is done in such a way that it will only halt if adding 32 to a cell sets it to 0; which is why we subtracted 0 from an empty cell earlier
it will catch us and prevent an infinite loop
+[<++++[<++++++++>-]<]
now write 13 to each pin; this adds up to 46 or 48; which are exactly the ascii values we want
>>[+++++++++++++>>>>]
we happen to have made a 14; turn it into a 10 for a newline
<<<<----
we're so close now; i can taste it
we have a list of 10 pins; each one with the ascii value that needs to be written
we have 32 everywhere because we'll need spaces
we even have a newline
the only problem now is that our list looks like this:
;;;;;;;;;;;;;;;;;;;;;;;;
;;1 2 3 4 5 6 7 8 9 10;;
;;;;;;;;;;;;;;;;;;;;;;;;
and we need to print in this order:
;;;;;;;;;;;;;;;;;;;;;;;;
;;7 8 9 10 4 5 6 2 3 1;;
;;;;;;;;;;;;;;;;;;;;;;;;
it's a pretty simple fix
once we print a pin we obviously don't need to remember it any more
so we simply print the last 4 pins on the list; destroying them on the way
then we print the last 3; which have become the ones we want
then two; then one
<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]
print pins 7 8 9 10
>[.,>>]
print pins 4 5 6
<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]
print pins 3 2
<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]
print the final pin!! :)
<[<<]<...<<.