Ниже описаны два предлагаемых решения: одно полное решение вопроса, требующего большого количества байтов, и второе частичное решение (решение только частей 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=', '), на этот раз SEPs не защищены от дублирования ( ",, "все еще содержит только одну ", "), поэтому в следующем предложенном решении всегда будет 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 (количество TOVs ( 1s) в каждой из 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, что является совершенно другой командой («измените счетчик программ на первое выданное значение из стек, если значение, полученное сразу после истины, равно ").