Створіть програму Brainf_ck, яка виводить рядок заданої довжини


11

Ваш друг намагається прорватися у склепіння, яке має своєрідну систему блокування: для нього потрібна певна кількість ніжних стукань у певному місці. Ваш друг виявив номер (який знаходиться в діапазоні 1 ... 99999) і володіє гаджетом, який видає необхідні стуки. Однак гаджет - перекладач Brainfuck! Тож вашому другові потрібно годувати програмою Brainfuck, яка, очевидно, повинна бути якомога коротшою (введення / вивід гаджета повільний).

Ваше завдання - допомогти йому! Напишіть програму або підпрограму будь-якою мовою, яка приймає як вхідне число N, і виводить програму Brainfuck, яка не приймає введення та виводить рядок друкованих символів ASCII (виключаючи пробільний символ - коди в діапазоні 33 ... 126) довжиниN .

Приклад: для введення 10може бути вихід

+++++++++++++++++++++++++++++++++..........

(але я впевнений, що це можна скоротити!)

Ваш результат буде сумою довжин ваших результатів для наступних значень N(вони є випадковими числами):

55
68
15
28
841
838
522
846
4898
9004
9363
3810
13230
67175
37231
44701

О, і ви будете передавати свій код (програма-генератор) своєму другові через Twitter. Тому переконайтеся, що це 140 символів або менше!


PS Мова Brainfuck має багато варіантів. Припустимо, стрічка нескінченна в обох напрямках (або "достатньо кругла і достатньо велика"), і комірки мають 32-бітну ємність int (скінченна і здатна приймати числа до 99999). Крім того, ніякого обгортання: коли клітина переповнюється, машина самознищується!


2
"наступні значення N (вони є випадковими числами") нагадали мені xkcd.com/221
cirpis

Щойно для довідки, пробільний символ (код символу 32) зазвичай включається в діапазон друку ASCII. Це насправді не має значення для виклику, оскільки ви чітко визначили діапазон.
Мартін Ендер

3
Чи можемо ми вважати, що клітини у brainfuck є цілими числами довільної ширини? Якщо ні, то як і коли вони загортаються?
orlp

1
Було б добре припустити, що принаймні вміст може містити 67175 + кілька.
orlp

@anatolyg Я зрозумів це пізніше. Вибачте.
Esolanging Fruit

Відповіді:


3

Python 2, оцінка: 1021

Я щойно зрозумів, що цей конкурс досить старий, але все-таки, оскільки я придумав краще рішення, ніж ті, що опублікували, я також розмістив його.

Ось сценарій python з 102 байтами, який виконує цю роботу:

n=input()
s='>'
while n:
    s+='>'+'+'*(n%5+1);n/=5
print s+'[->[-<+++++>]<<]<+++++++[>+++++<-]>>[-<.>]'

Ідея полягає у використанні базового кодування 5 для N (найкраща база принаймні для поточних входів, які, до речі, не виглядають дуже "випадковими", схоже, що вони були довільно обрані ОП), і написати загальний алгоритм Brainfuck для декодувати число довільної довжини (число кодується з кожною цифрою, збільшеною на одиницю, щоб виявити кінець перетворення). Я вирішив надрукувати символ 35 #, символ 36 $еквівалентний.

Ви можете запустити наступний сценарій bash, щоб отримати рахунок:

i=0
while read p; do
  i=$((i+`echo $p | python convert.py | wc -m`))
done
echo $i

З більш просунутою програмою, яка замінює кодування множенням на невеликі числа і вибирає найкращу базу для кодування кожного числа, я можу досягти 958 символів Brainfuck, але Python є занадто багатослівним (і я досить поганий / ледачий гольфіст) для того, щоб щоб отримати конвертер на 144 байти!


Це чудова ідея! Можливо, я використаю його один раз, щоб вдосконалити цю відповідь (написав сценарій на Python, щоб набрати менше 950, але я не знаю жодної мови для гольфу, щоб зробити його досить коротким).
anatolyg

8

BrainF ***, оцінка: 193,313

Це не менше 140 символів (це 147, так близько !!), тому це не може перемогти, але я подумав, що це круто.

Друкує 43 знаки плюс, потім Nперіоди. Не дуже оптимально.

>++++++[>+++++++<-]>+[->+>+<<]>[->.<]<<+[[-]>[-],[+[-----------[>[-]++++++[<------>-]<--<<[->>++++++++++<<]>>[-<<+>>]<+>]]]<]>>>+++<<<<[>>>>.<<<<-]

Якщо хтось може допомогти скоротити це, я б хотів це.


Я думаю, що з Brainfuck було б досить зробити "підпрограму", яка отримує свій вхід на стрічку - не потрібно читати з "стандартного пристрою введення".
anatolyg

@anatolyg Це значно полегшує - ймовірно, приблизно 80 або 90 символів. Чи варто це змінити?
mdc32

5

J, загальна оцінка = 1481

(Для мого попереднього запису та пояснення перевірте історію версій.)

f10=.('>++++++++++<';'')rplc~;@([:(<@('+++++[>+++++++<-]>>+',;@((<'[>++++++++++')#~#)),[<@(']',~'<-','<.>'#~],[,])"0 #-i.@# )10#.inv])

Ця функція генерує вкладені петлі BF на основі базових 10 цифр вхідного числа. Перевірка всіх розумних підстав та вибір найменшого коду BF покращить бал з невеликою сумою.

Програми BF для тестового набору:

   f10 every 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
+++++[>+++++++<-]>>+[>++++++++++[-<<.....>>]<-<.....>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[-<<......>>]<-<........>]                                                                                 
+++++[>+++++++<-]>>+[>++++++++++[-<<.>>]<-<.....>]                                                                                         
+++++[>+++++++<-]>>+[>++++++++++[-<<..>>]<-<........>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<.>]                                                             
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<...>>]<-<........>]                                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<.....>>>]<-<<..>>]<-<..>]                                                                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<......>]                                                        
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<....>>>>]<-<<<........>>>]<-<<.........>>]<-<........>]                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<>>>]<-<<>>]<-<....>]                                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<...>>>]<-<<......>>]<-<...>]                              
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<...>>>>]<-<<<........>>>]<-<<.>>]<-<>]                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<.>>>>>]<-<<<<...>>>>]<-<<<..>>>]<-<<...>>]<-<>]                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<......>>>>>]<-<<<<.......>>>>]<-<<<.>>>]<-<<.......>>]<-<.....>]
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<...>>>>>]<-<<<<.......>>>>]<-<<<..>>>]<-<<...>>]<-<.>]          
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<....>>>>>]<-<<<<....>>>>]<-<<<.......>>>]<-<<>>]<-<.>]          

Обчислювальна оцінка на тестовому наборі:

   +/#@> f10 each 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
1481

3

Піт, 1702р

Реконструюйте числа за допомогою коефіцієнтів N + x.

+holN+]++">>"*"+"Q"<<"mjk(">>"j">"m*"+"kP+Qd"<[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>"*"-"d"<<")50"++++++[>++++++<-]>>[<.>-]"

Для 2цього виходи ++. тепер, який нічого не друкує у BF.
випадкова

@randomra Добрий улов, це сталося під час оновлення, я це виправлю, дайте мені кілька.
orlp

@randomra Потрібно виправити, зробив оцінку трохи вище (звичайно).
orlp

3

CJam, 52 74 108 байт, всього = 1304 1244 1210

ri5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**

Тестовий сценарій (повільно в онлайн-перекладачі):

q~]
{
_[0:T;
5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**
]s
_[L:RL@0\
"-+><.]"['('){+\_{)}0?@\}{@\+\_{)}0?}{R1$c+:R;}]:`"]a"{{_aa+1$4G#%{:~~1}{;0}?}g}`+a+er:~:~
];R,@=!"Error."N+*o
}%s,

Я не бачив частини про самознищення. Але це ніколи не переповниться.
jimmy23013

Як це працює?
anatolyg

@anatolyg Перша версія просто генерує число в базі 5. Пізніші версії додали окремий регістр для перших двох цифр і також використовували декремент.
jimmy23013

@ user23013 О, вибачте, не побачив змін у специфікаціях. (Оновлено відповідь відповідно.)
randomra

2

Befunge-98, N + 41, всього = 193281

&>'+\:v
v^-1,\_
' >1-:v
>v^,+'_
,'    :
>ff3++^
>2f*+v
^>/9+:,
>'>,61v
, v*6+<
^/2,:<@
v >+2+,
>'<,']^

Я знаю, що це погано, але мені здалося, що сьогодні я пишу якийсь Befunge. Найкраща частина Befunge - це те, що програми є ще менш зрозумілими, ніж фактичні мови гольфу, особливо коли вони повторно використовують код: D

Використовує аналогічний алгоритм, що відповідає відповіді CJam Мартіна Бюттнера :

(N +'s)>+++++++++++++++++++++++++++++++++<[->.<]


1

Befunge-93 - 24 + N, всього = 193009

&>">>]-<]-<++++>[++++>[+++"v
v  ,,,,,,,,,,,,,,,,,,,,,,, <
>:v
,v_@
"1
.-
"
^<

Для цього використовується префікс +++[>++++[>++++<-]<-]>>для встановлення першого індексу стрічки на "0" з 24 символами. Програма Befunge є дуже базовою і виводить її разом із N '. символів.


Тепер, коли я бачу це, я не знаю, чому я думав, що моя петля буде кращою ...
Мартін Ендер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.