Складіть більш тривалу програму продовження


16

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

Спочатку обчислюється тривалість програми. Потім згадана довжина перетворюється на двійкову і ліворуч оббивається нулями до кратного 3. Отриманий двійковий рядок розбивається на шматки по 3 біти, кожен з яких переводиться в команду "епізодичний" як таку:

000 -> +
001 -> -
010 -> >
011 -> <
100 -> .
101 -> ,
110 -> [
111 -> ]

Нарешті програма запускається як brainfuck 1 .

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

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

Ось гакітна програма для обчислення тривалості від brainfuck


1: Для цього виклику ми будемо використовувати обгорткові комірки та непромотальну стрічку.


3
+[.]Я виграю? : P
Квінтек

3
Можливо, може бути цікавіше оцінити тривалість виходу?
Jo King

@JoKing Це гарна ідея. На жаль, це здається трохи пізнім для цього.
Пост Рок-Гарф Хантер

2
Крім того, чому ця мітка-лайка?
Втілення

1
@ msh210 Це буде робити хитрість більшу частину часу, але є кілька відмінностей, наприклад, різні символи Brainfuck коштують різних сум ( +найдешевший і ]найдорожчий), і, звичайно, важливо, де в програмі вони є. Хоча - це гарна оцінка, вона не є рівнозначною. 23н
Опублікувати Rock Garf Hunter

Відповіді:


15

8437495638205698686671 байт

Це перекладається на програму brainfuck:

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

231584178474632390847141970017375815706539969331281128078915168015826259279614

Це обчислюється функцією

f(n)=2*f(n-1)+n
f(0)=0

з входом 255.

Пояснення:

-[         Loop 255 times
  >>[>]    Move to the end of a series of positive cells (initially empty)
  +        Add one cell to the end
  [-       Loop over each cell 
    >[>]+  Add one cell to the end
    .      Print a SOH byte
    [<]+   Restore current cell
  <]       Move to next cell
<-]        Decrement counter

4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823 байт

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

Які саме друкує

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

(250255) NUL байт.

У цій відповіді Brainfuck у кредит є кредит @hvd , тож переконайтеся, що його висловили!

Пояснення:

Я збирався написати власне пояснення, але зрозумів , що роз'яснення @hvd вже наголошене , тому я наведу його тут:

>>>>>> потрібно, щоб залишити трохи робочого місця.

-виробляє 255 ( оскільки 0 - 1 = 255, коли ми маємо обгорткові комірки ).

[[->>>+<<<]------>>>-] перетворює це на 255 копій значення 250, даючи стрічку, яка виглядає так:

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ повертає покажчик даних назад і закінчує початкові дані:

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

Потім настає цикл: [+...-]спочатку встановлюється значення 1 на 2, яке встановлюється назад на 1 в кінці циклу. Цикл закінчується, коли тіло циклу вже встановлено 2 на 1.

Тепер числа 2 250 250 250 ... 250 являють собою лічильник, в основі 250, кожен номер один більший від цифри, яку він представляє.

  • [>>>]<<<рухається повністю вправо. Оскільки кожна цифра представлена ​​ненульовим числом, це тривіально.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-зменшує лічильник на 1. Починаючи з останньої цифри: цифра зменшується. Якщо вона залишається позитивною, ми закінчили. Якщо він повернеться до нуля, встановіть його на 250 та продовжте з цифрою раніше.

  • [<<<].>>>переміщує вказівник назад перед найбільш лівою цифрою, і це приємний момент для друку байта NUL. Потім переставте позицію в точну ліву частину зліва, щоб побачити, чи закінчили ми.

Щоб перевірити правильність, змініть початковий - до +для друку 250 1 NUL байт, ++для 250 2 , і т.д.


4

19326644346528796447 байт

Brainfuck код:

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

Друкує

57896044618658097711785492504343953926634992332820282019728792003956564819967

нульові байти

Це працює так:

mem[i]=255;
do
    while(--mem[i]){
        mem[i+1]=mem[i+2]=mem[i];
        mem[i]=1;
        i+=2;
    }
while(mem[--i]);

Досить прямолінійна рекурсія.

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