Сделайте более длинную программу


16

Lenguage - это диалект мозгового штурма, который известен тем, что преодолевает проблемы ограничения источников. Это потому, что Lenguage заботится только о длине своего источника, а не о содержании.

Сначала рассчитывается длина программы. Затем указанная длина преобразуется в двоичную форму и дополняется слева нулями до значения, кратного 3. Полученная двоичная строка разбивается на куски по 3 бита, каждый из которых преобразуется в команду «мозгового удара» следующим образом:

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

Наконец программа запускается как brainfuck 1 .

Отсюда задача довольно проста: написать программу, которая не принимает входных данных и выдает выходные данные, состоящие из одного байта, повторяемого целым числом N раз, где N строго больше длины вашей программы.

Ответы будут оцениваться в байтах, причем меньшее количество байтов будет лучше.

Вот хакерская программа для расчета языка от мозгового срыва


1: Для этой задачи мы будем использовать обертывающие ячейки и не обертывающую ленту.


3
+[.]Я выиграю? : P
Quintec

3
Возможно, было бы более интересно оценить длину вывода?
Джо Кинг

@JoKing Это хорошая идея. К сожалению, похоже, что уже немного поздно.
Пост Рок Гарф Хантер

2
Кроме того, почему это помеченное пятно?
Воплощение Невежества

1
@ msh210 Это будет делать большую часть времени, но есть несколько отличий, например, разные персонажи Brainfuck стоят разное количество ( +самое дешевое и ]самое дорогое), и, конечно, важно, где они находятся в программе. Хотя является хорошей оценкой, она не совсем эквивалентна. 23N
Пост Рок Гарф Хантер

Ответы:


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 байтов.

Заслуга @hvd в этом ответе Brainfuck , поэтому убедитесь , что upvote его!

Объяснение:

Я собирался написать собственное объяснение, но понял, что объяснение @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.