Ниже описаны два предлагаемых решения: одно полное решение вопроса, требующего большого количества байтов, и второе частичное решение (решение только частей N + N и N * N , требующих только 484 байта), каждое из которых использует свой подход и свой множество крутых трюков! :)
1. Полное решение (810147050 байт)
Используя TovTovTov(TOV='hi',SEP=',')
, что TOV
элементы имеют иммунитет к дублирующих знаков на месте (как "hihihi"
и "hhiihhiihhii"
три "hi"
с в них, и все TovTovTov
заботы о том , как много TOV
лет появляются между SEP
с).
Если бы мы использовали SEP=', '
, вся программа была бы невосприимчива к дублированию символов (что здорово, но не решит вопрос). Итак, мы используем SEP=','
.
Так "hihihi,hi"
, например, программа компилируется в массив ints [3,1]
, а "hhiihhiihhii,,hhii"
компилируется в [3,0,1]
и "hhiihhiihhii,,hhii"
в [3,0,0,1]
. Это означает, что сами команды не меняют своего значения после дублирования, но общая длина изменяется с дублированием символов. Решение ниже запрашивает длину программы и использует это , чтобы решить , нужно ли печатать N+N
, N*N
или N^N
.
Предлагаемое полное решение в виде массива ints: [6, 12, 9, 18, 9, 142, 11, 38, 8, 9, 260, 11, 73, 8, 22, 75, 7, 10, 14, 3, 1, 22, 24, 18, 15, 8, 10, 16, 3, 1, 22, 24, 18, 15, 8, 10, 45, 16, 7, 22, 3, 1, 22, 24, 18, 15, 8, 22, 3, 1, 22, 24, 18, 15, 8, 25, 3, 1, 22, 24, 18, 15, 8, 48, 3, 1, 22, 24, 18, 15, 8, 277, 3, 1, 22, 24, 18, 15, 8, 3146, 3, 1, 22, 24, 18, 15, 8, 46677, 3, 1, 22, 24, 18, 15, 8, 823564, 3, 1, 22, 24, 18, 15, 8, 16777237, 3, 1, 22, 24, 18, 15, 8, 387420510, 3, 1, 22, 24, 18, 15, 8]
Как строка, это довольно длинная программа, состоящая из 810147050 символов, начиная с:
hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...
2. Решение только N + N и N * N частей вопроса (484 байта)
Используя TovTovTov(TOV='1',SEP=', ')
, на этот раз SEP
s не защищены от дублирования ( ",, "
все еще содержит только одну ", "
), поэтому в следующем предложенном решении всегда будет 33 команды, даже после дублирования символов:
1111, 111111111111111111111111111111111111111111111111, 1111111111, 1111111111, 1111111111, 111111, 111111111111, 111111111, 11111111111111, 111, 1, 1111111111111111111111, 111111111111111111111111, 111111111111111111, 111111111111111, 11111111, 111111111111, 1111111111111111, 111111111111111, 1111111111111111111111, 111111111111111111111111111111111111, 11, 1111111111111111111111111111, 111111, 111, 111111, 11111111111, 111111111111111111111111111, 1111, 1, 11111111, 1, 11111111
Соответствующий массив ints (количество TOV
s ( 1
s) в каждой из 33 команд выше) выглядит следующим образом:[4,48,10,10,10,6,12,9,14,3,1,22,24,18,15,8,12,16,15,22,36,2,28,6,3,6,11,27,4,1,8,1,8]
Дублирование символов на месте приводит к списку из 33 совершенно разных команд :
[8,96,20,20,20,12,24,18,28,6,2,44,48,36,30,16,24,32,30,44,72,4,56,12,6,12,22,54,8,2,16,2,16]
Оригинальный Интс массив (который вычисляет N + N ) был разработан тщательно , так что после того , как команды меняют свое значение, программа по- прежнему имеет смысл, но вычисляет N * N . Например, первая 4
(которая TovTovTov
понимается как «обрабатывать следующую операцию как код ascii для преобразования в символ») изменяется после дублирования символа на 8
, что является совершенно другой командой («измените счетчик программ на первое выданное значение из стек, если значение, полученное сразу после истины, равно ").