Brainfuck, 240 символов
,
>++
+++++
+[-<---
--->],[>+
+++++++[-<-
----->]<<[->+
+++++++++<]>>]<
[->+>+>>>>>>>+<<<
<<<<<<]>>>>++++++++
[-<++++>]>++++++[-<++
+++++>]+>>>++[-<+++++>]
<<<<<<[-[>.<-]<[-<+>>+<]<
[->+<]>>>>>[-<.>>+<]>[-<+>]
>.<<++<<<-<->]>>>>>>>-[-<<<<<
<.>>>
>>>]<
<<<<.
Еще не сделано. Это работает, но только с однозначными числами.
РЕДАКТИРОВАТЬ: Готово! Работает для переводчиков, использующих 0 как EOF. Смотрите NOTE
s в закомментированном источнике для тех, у кого -1.
РЕДАКТИРОВАТЬ еще раз: я должен отметить, что, поскольку в Brainfuck отсутствует стандартный метод чтения аргументов командной строки, я использовал вместо него стандартный ввод (стандартный ввод). ASCII, конечно.
РЕДАКТИРОВАТЬ в третий раз: О, дорогой, кажется, я сократил .
(вывод) символов при сжатии кода. Исправлена...
Вот основное управление памятью основного цикла. Я уверен, что он может быть сильно оптимизирован, чтобы уменьшить количество символов на 30 или около того.
- временный
- Копия счетчика
- Счетчик (считает до 0)
- Пробел (десятичный 32)
- Знак звездочки (десятичное число 42)
- Количество звездочек на текущей строке (1 + 2 * счетчик)
- временный
- Символ новой строки
- Временное?
- Общее количество строк (т.е. входное значение; сохраняется до самого конца при печати транка)
Сжатая версия:
,>++++++++[-<------>],[>++++++++[-<------>]<<[->++++++++++<]>>]<[->+>+>>>>>>>+<<<<<<<<<]>>>>++++++++[-<++++>]>++++++[-<+++++++>]+>>>++[-<+++++>]<<<<<<[-[>.<-]<[-<+>>+<]<[->+<]>>>>>[-<.>>+<]>[-<+>]>.<<++<<<-<->]>>>>>>>-[-<<<<<<.>>>>>>]<<<<<.
И красивая версия:
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.