brainfuck - 617 616 604 bytes
+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.
Esto me llevó la mayor parte de dos días. Creo que valió la pena. Probablemente hay partes que se pueden jugar más al cambiar en qué celda se almacena algo o lo que sea, pero en este momento estoy feliz de que funcione.
Este programa tendría que ser completamente diferente si la pregunta no especificara que la entrada se ordenaría. La forma en que esto funciona es mediante la construcción de una lista de 10 pines alrededor de los que se ingresan. Eso es un poco confuso, pero tal vez esto lo explique mejor:
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]
Mientras hace eso, recuerda cuáles de los pines puso el usuario allí y cuáles puso allí. Esta estrategia sería muy difícil de usar si la entrada no estuviera ordenada.
Otra cosa que facilita la clasificación es la detección del número 10. Dado que Brainfuck trata con bytes individuales, no con "números" per se, podría haber sido una molestia, pero la entrada clasificada me facilitó mucho el trato. con. La razón de eso tiene que ver con cómo almacené los datos en el programa. Tomo la entrada un carácter a la vez y resta 32 del resultado. Si la celda no es cero después de eso, avanzo 4 celdas. antes de repetir Esto significa que obtengo un byte de entrada no espacial cada 4 celdas, y almaceno efectivamente los pines como su número + 16. Sin embargo, 10 toma dos bytes para escribir, así que tuve que ponerlo en mayúsculas y minúsculas. Si la entrada no fue ordenada, tendría que mirar a través de los pines, pero dado que está ordenada, siempre será el último pin si aparece. Verifico si el (último byte de entrada + 1) == (el segundo último byte de entrada) y si es así, debe ser 10. Me deshago del último byte y configuro el segundo último a lo que mi sistema entiende como "10". Los caracteres'1'
y '0'
no caben en un solo byte, ¡pero el número 26 sí!
Crear trucos para hacer que algo funcione es mi parte favorita de usar este lenguaje. :)
Si está interesado en cómo funciona este programa con más detalle, puede ver el programa con los comentarios que usé mientras lo escribía para asegurarse de recordar lo que hizo todo. Incluso escribir comentarios en brainfuck es difícil, ya que no hay sintaxis de comentarios. En cambio, todos los personajes, excepto los de adentro, <[+.,-]>
son no operativos. ¡Es fácil introducir errores al incluirlos accidentalmente .
o ,
en sus comentarios! Es por eso que la gramática es tan inestable y los puntos y comas están en todas partes.
EDITAR: Como ejemplo de lo fácil que es arruinarlo: ¡utilicé "no espacio" en uno de los comentarios! Cuando eliminé todos los caracteres que no son bf de la fuente, el programa que solía hacer se mantuvo en el -
. Por suerte no rompió nada, pero ahora lo he eliminado para guardar un byte. :)
EDITAR II: Ha pasado un tiempo desde que toqué este, jaja. En otra respuesta mental en este sitio, noté que accidentalmente usé una coma en la versión comentada. Como la entrada ya se había agotado, estableció la celda actual en 0 (esto depende de la implementación, pero en mi experiencia es el comportamiento más común). Arreglé el error, pero me hizo pensar. La forma idiomática de establecer una celda en 0 es [-]
(aproximadamente while (*p) { *p--; }
), que es dos bytes más larga. Cada vez que se ha leído toda la entrada, puedo usarla ,
. ¡Esto me ahorró 2 bytes en esa respuesta y 12 en esta!
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!! :)
<[<<]<...<<.