Підпрограми Brainf *** з унікальними результатами


19

Вам слід написати програму на 100 байтів (BF).

Один символ усіляко видалить із нього 100 нових (99-байтних) програм. Наприклад , для програми ++.>.на 5 Підпрограми +.>., +.>., ++>., ++..і ++.>.

Вашим балом буде кількість унікальних результатів, які генерують 100 програм. Вищий бал - кращий.

Деталі

  • Ваші програми будуть припинені після виведення першого символу.
  • Недійсні або не припинені програми та програми, що генерують порожні виводи, не враховуються в рахунок.
  • Клітини BF - це 8-бітні обгорткові. (255 + 1 = 0, 0-1 = 255)
  • Вашій програмі не вводять даних. Якщо ви використовуєте ,в коді, він встановлений для поточної комірки 0.
  • У лівій частині вихідної позиції немає комірок. Наприклад <., недійсний, але .<дійсний, оскільки виконання завершено о .. Стрічка не обмежена в інший бік.
  • Програми з незбалансованими дужками ( [і ]) недійсні.
  • Ваша оригінальна програма може бути коротшою, ніж 100 байт, оскільки її легко розширити до 100 байт, не змінюючи показник.
  • Ваша оригінальна програма не повинна бути дійсним кодом BF.

Ви можете використовувати цю програму python3 (посилання ideone), щоб визначити бал своєї відповіді. (Для тривалих програм вам може знадобитися змінити maxstepзмінну.)

Приклад

(Для простоти ця програма коротша, ніж 100 байт.)

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

Score: 3

Explanation:

Subprogram     => Output

+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1

Unique outputs are [0, 1, 255]    
Score is 3 for ++,+[-]+><.-,-. (length = 15)

У разі вирівнювання виграє той, хто має коротший код. (Ваша програма може бути коротшою, ніж 100 байт, як зазначено в розділі "Деталі".) Якщо коди однакової довжини, переможцем стає попередній плакат.

Бонусна головоломка: без жирного обмеження можна знайти програму з оцінкою 100?


Я вирішив бонусну головоломку; відповідь (цензурована).
AJMansfield

@AJMansfield Чи можете ви відредагувати свій коментар, щоб і інші могли подумати про головоломку? Наприклад, змініть своє рішення на посилання pastebin.com, яке містить відповідь.
randomra

3
Хм. Я написав генетичний оптимізатор цього питання, щоб спробувати знайти мікрополіпшення існуючих відповідей, але поки що це не надто успішно. Вони зациклюються на 79 та 43 відповідно. Ну добре - варто було постріляти!
wchargin

Відповіді:


12

Оцінка: 35 41 69 78 79 83

(Видаліть новий рядок.)

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

Спробуйте в Інтернеті!

Я точно не впевнений, чому це працює ...

Оцінка: 79

X->>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>
+>+>+>+>+>+>+>+>+>+>+>+[>[-<+>>+<]+>[-<+>]<<<+]>>.

Спробуйте в Інтернеті!

Він повинен підвести 2 * мем [я] * я і додати кількість осередків (+ константних) де адреси підраховуються від справа наліво. Множник 2 і кількість комірок можуть робити видалення + і>, що мають різний паритет.

Це дійсно спрацювало так у версії на 69 пунктів. Але остання версія зламала це і отримала щось інше за збігом обставин. Він обчислює суму (mem [i] * i + i + 1), а вилучення + і> робить майже те саме, за винятком суми (i), яка має різницю в кількості комірок, яка також є кількістю різного виводу для видалення + і>.

Для бонусу:

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


Примітка. Якщо ви протестуєте це за допомогою наданої програми бомбардирів, переконайтеся, що збільшити maxstepзначення (в def evaluate(r,maxstep=20000):), оскільки деякі підпрограми працюють протягом тривалого часу.
randomra

1
Оцінку можна насправді збільшити 79, замінивши ->+>+> ...на->,>+> ...
BrainSteel

@BrainSteel Я просто змінив його на не-оп.
jimmy23013

9

Оцінка: 37 43

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

EDIT: Тепер моя програма дозволяє отримати кілька квадратних дужок. Я не збираюсь вигравати за це жодних призів, але це те, що я отримую за те, щоб деякі зважені РНГ робили зайнятість для мене.

Це було породжене програмою, яку я написав у C.

Для кожного Nвидаленого символу, ось результати:

N = 0 => 158
N = 1 => 158
N = 2 => 158
N = 3 => 187
N = 4 => 129
N = 5 => 100
N = 6 => 158
N = 7 => 13
N = 8 => 1
N = 9 => 211
N = 10 => 129
N = 11 => 1
N = 12 => 57
N = 13 => 255
N = 14 => Mismatched Braces
N = 15 => 59
N = 16 => 11
N = 17 => 11
N = 18 => 11
N = 19 => 117
N = 20 => 11
N = 21 => 117
N = 22 => 166
N = 23 => Mismatched Braces
N = 24 => 206
N = 25 => 206
N = 26 => 206
N = 27 => 147
N = 28 => 147
N = 29 => 158
N = 30 => 148
N = 31 => 188
N = 32 => 51
N = 33 => 17
N = 34 => 84
N = 35 => 84
N = 36 => 84
N = 37 => 158
N = 38 => 158
N = 39 => 94
N = 40 => 46
N = 41 => 94
N = 42 => 94
N = 43 => 94
N = 44 => 17
N = 45 => 196
N = 46 => Mismatched Braces
N = 47 => 149
N = 48 => No Termination
N = 49 => No Termination
N = 50 => Mismatched Braces
N = 51 => Mismatched Braces
N = 52 => 45
N = 53 => 77
N = 54 => 45
N = 55 => 77
N = 56 => 50
N = 57 => 209
N = 58 => 50
N = 59 => 251
N = 60 => 249
N = 61 => 99
N = 62 => 99
N = 63 => 117
N = 64 => 89
N = 65 => 207
N = 66 => 89
N = 67 => 115
N = 68 => 115
N = 69 => 115
N = 70 => 95
N = 71 => Mismatched Braces
N = 72 => Mismatched Braces
N = 73 => 104
N = 74 => Mismatched Braces
N = 75 => No Termination
N = 76 => No Termination
N = 77 => No Termination
N = 78 => No Termination
N = 79 => Left Overflow
N = 80 => 3
N = 81 => 2
N = 82 => No Termination
N = 83 => Mismatched Braces
N = 84 => No Termination
N = 85 => 133
N = 86 => 133
N = 87 => 0
N = 88 => Mismatched Braces
N = 89 => 158
N = 90 => 0
N = 91 => 4
N = 92 => Mismatched Braces
N = 93 => 0
N = 94 => 158
N = 95 => Mismatched Braces
N = 96 => 0
N = 97 => 157
N = 98 => 159
N = 99 => None

Всього існує 37 унікальних результатів, які (в числовому порядку):

0, 1, 2, 3, 4, 11, 13, 17, 45, 46, 50, 51, 57, 59, 77, 84, 89, 94, 95, 99,
100, 104, 115, 117, 129, 133, 147, 148, 149, 157, 158, 159, 166, 187, 188, 
196, 206, 207, 209, 211, 249, 251, 255

Я на 90% 100% впевнений, що це рішення не є оптимальним , але довести, що це може бути надзвичайно складно . Є кілька речей, які зрозумілі. Не маючи .символів, поки останній символ не здається шляхом , а квадратні дужки ( []) здаються досить марними . Я трохи подумав тут, що хотів би окреслити:

Нехай Lбуде довжина коду в байтах (у виклику, 100) та nкількість унікальних результатів підпрограм.

Для отримання L=3, існує кілька оптимальних рішень виду +-., де n=2(в даному випадку, виходи 1 і 255 для +.і -., відповідно) . Це ставить найкраще співвідношення для L = 3в n/L = 66.67%. Зауважте, що цей коефіцієнт не можна долати принаймні L<10.

Бо L=10рішення є досить простими, щоб змусити це змусити. Ось найкращі рішення за адресою n = 6:

++>-->+<+. => 6
++>-->+<+. => 6
+++>->+<+. => 6
--->->+<+. => 6
++>---><+. => 6
+++>--><+. => 6
-->++>-<-. => 6
+++>+>-<-. => 6
--->+>-<-. => 6
-->+++><-. => 6
--->++><-. => 6

Який коефіцієнт приносить бал n/L = 60%.

Очевидно L->infinity, що коефіцієнт повинен наближатися до 0, оскільки існує лише 255 можливих виходів для потенційно нескінченного L.

Однак співвідношення НЕ зменшується рівномірно. Неможливо побудувати рішення для n=6, L=9, тому найкращим співвідношенням L=9є 5/9 = 55.56% < 60%.

Це ставить питання, як швидко і в чому питання зменшується співвідношення? Тому що L = 100, і на 10^9 checks/second, знадобиться кілька порядків більше, ніж термін експлуатації Всесвіту, щоб забезпечити оптимальне рішення. Чи є елегантний спосіб зробити це? Я дуже сумніваюся , що це вниз 37%для L = 100.

Співвідношення фактично збільшується, аж до L=100. Перегляньте інші відповіді для підтвердження.

Я хотів би почути ваші оцінки вище. Зрештою, я міг бути помилково неправильним.

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