Brainfuck, 240 caracteres
,
>++
+++++
+[-<---
--->],[>+
+++++++[-<-
----->]<<[->+
+++++++++<]>>]<
[->+>+>>>>>>>+<<<
<<<<<<]>>>>++++++++
[-<++++>]>++++++[-<++
+++++>]+>>>++[-<+++++>]
<<<<<<[-[>.<-]<[-<+>>+<]<
[->+<]>>>>>[-<.>>+<]>[-<+>]
>.<<++<<<-<->]>>>>>>>-[-<<<<<
<.>>>
>>>]<
<<<<.
Ainda não está pronto. Funciona, mas apenas com números de um dígito.
EDIT: Feito! Funciona para intérpretes usando 0 como EOF. Veja NOTE
s na fonte comentada para aqueles com -1.
EDITAR novamente: devo observar que, como o Brainfuck não possui um método padrão para ler argumentos de linha de comando, usei stdin (entrada padrão). ASCII, é claro.
EDITE uma terceira vez: Oh, querida, parece que eu retirei .
os caracteres (de saída) ao condensar o código. Fixo...
Aqui está o gerenciamento básico de memória do loop principal. Tenho certeza de que pode ser altamente otimizado para reduzir a contagem de caracteres em 30 ou mais.
- Temporário
- Cópia do contador
- Contador (conta até 0)
- Caractere de espaço (decimal 32)
- Caractere asterisco (decimal 42)
- Número de asteriscos na linha atual (1 + 2 * contador)
- Temporário
- Caractere de nova linha
- Temporário?
- Número total de linhas (ou seja, valor de entrada; armazenado até o final, ao imprimir o tronco)
Versão condensada:
,>++++++++[-<------>],[>++++++++[-<------>]<<[->++++++++++<]>>]<[->+>+>>>>>>>+<<<<<<<<<]>>>>++++++++[-<++++>]>++++++[-<+++++++>]+>>>++[-<+++++>]<<<<<<[-[>.<-]<[-<+>>+<]<[->+<]>>>>>[-<.>>+<]>[-<+>]>.<<++<<<-<->]>>>>>>>-[-<<<<<<.>>>>>>]<<<<<.
E a versão bonita:
ASCII to number
,>
++++++++[-<------>] = 48 ('0')
Second digit (may be NULL)
,
NOTE: Add plus sign here if your interpreter uses negative one for EOF
[ NOTE: Then add minus sign here
>++++++++[-<------>]
<<[->++++++++++<]>> Add first digit by tens
]
Duplicate number
<[->+>+>>>>>>>+<<<<<<<<<]>>
Space char
>>++++++++[-<++++>]
Asterisk char
>++++++[-<+++++++>]
Star count
+
New line char
>>>++[-<+++++>]<<<
<<<
Main loop
[
Print leading spaces
-[>.<-]
Undo delete
<[-<+>>+<]
<[->+<]
>>
Print stars
>>>[-<.>>+<]
Add stars and print new line
>[-<+>]
>.<
<++
<<<
-<->
End main loop
]
Print the trunk
>>>>>>>
-[-<<<<<<.>>>>>>]
<<<<<.
Merry Christmas =)
c=:[:((\:i.@#),}.)"1[:$&'*'"0[:>:0,~i.