Brainf * ck, 98 77
Obviamente, isso não tem o objetivo de vencer, mas o que seria uma competição se não tivesse uma solução brainfk
++++[>++++<-]>>,<[->>++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++[->++++++++<]>.[-]>[-<<<+>>>]<<<<]
Como brainfk só pode lidar com números inteiros de 8 bits e sem negativos, acho que não cumpre totalmente as regras, mas ei, eu nunca estive nele para vencê-lo.
Na verdade, isso funciona para entrada de 16 bits se o seu intérprete suportar
Eu até consegui produzir valores ASCII
Aqui está o 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 mais curto (77):
+>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+>+>+>+>+>+<<<<<<<<]>[.>]
Este pode lidar apenas com números inteiros de 8 bits.
O algoritmo funciona usando um contador binário que é realmente muito curto (um incremento é o >[->]++[-<+]-<-
que distribui os bits. O problema é que é difícil imprimir todos os bits
Esse último algoritmo pode ser adaptado para caber em qualquer número de bits à custa de bytes. Para poder lidar com números inteiros de N bits, são necessários 53 + 3 * N bytes para codificar.
exemplos:
(1 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+<]>[.>]
(2 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+<<]>[.>]
(3 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+<<<]>[.>]
etc