Brainf * ck, 98 77
Obviamente, esto no tiene el propósito de ganar, pero ¿cuál sería una competencia si no tuviera una solución brainfk?
++++[>++++<-]>>,<[->>++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++[->++++++++<]>.[-]>[-<<<+>>>]<<<<]
Dado que brainfk solo puede manejar enteros de 8 bits y no negativos, supongo que no cumple completamente con las reglas, pero bueno, nunca estuve allí para ganarlo.
Esto realmente funciona para entradas de 16 bits si su intérprete admite
Incluso lo hice salir en valores ASCII
Aquí está el código anotado:
++[>++++<-] preload 8 onto cell 1
>>,< input into cell 2
[- iterate over cell 1
>>++< put 2 in cell 3
[->-[>+>>]>[+[-<+>]>+>>]<<<<<] division algorithm: converts {n d} into {0 d_minus_n%d n%d n/d}
>[-]++++++[->++++++++<]> clears cell 4 and puts 48(ascii of 0) into cell 5
.[-] output n%2 and clear it (the bit)
>[-<<<+>>>] bring n/2 into cell 2 (to be used for division in next iteration)
<<<<] end iterate
Algoritmo más corto (77):
+>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+>+>+>+>+>+<<<<<<<<]>[.>]
Este solo puede manejar enteros de 8 bits.
El algoritmo funciona utilizando un contador binario que en realidad es muy corto (un incremento es el >[->]++[-<+]-<-que presenta los bits. El problema es que es difícil imprimir todos los bits
Ese último algoritmo se puede adaptar para adaptarse a cualquier número de bits a expensas de los bytes. Para poder tratar con enteros de N bits, se requieren 53 + 3 * N bytes para codificar.
ejemplos:
(1 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+<]>[.>]
(2 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+<<]>[.>]
(3 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+<<<]>[.>]
etc