Гиперпрограммирование: N + N, N × N, N ^ N все в одном


151

Напишите программу, которая принимает число N от 1 до 9 включительно. В своей исходной форме ваша программа должна выводить вывод N + NEg, 2если N есть 1, 4если N есть 2, 6если N есть 3, и так далее.

Когда каждый символ в вашей программе дублируется на месте, тогда это должна быть программа, которая принимает N (все еще от 1 до 9) и выводит N × NEg, 1если N есть 1, 4если N есть 2, 9если N есть 3, и так далее.

Когда каждый символ в вашей программе дублируется на месте, то это должна быть программа, которая принимает N (все еще от 1 до 9) и выводит N ^ NEg, 1если N есть 1, 4если N есть 2, 27если N есть 3, 387420489если N есть 9, и т.п.

Числа выше 9 не требуются, потому что 10 ^ 10 выходит за пределы обычного целочисленного диапазона многих языков.

пример

Если ваша первоначальная программа была

My_Program!
Exit();

Тогда он должен быть способен принимать N и выводить N + N.

Дополнительно программа

MMyy__PPrrooggrraamm!!

EExxiitt(());;

следует взять N и вывести N × N.

Наконец, программа

MMMyyy___PPPrrrooogggrrraaammm!!!


EEExxxiiittt((()));;;

должен взять N и вывести N ^ N.

Программы с четырьмя символами и далее не требуются.

правила

  • Вход и выход должны быть простыми, обычно отформатированными десятичными числами. Вы можете ответить, используя другую базу, чтобы показать свой код, но тогда ваш ответ будет неконкурентным.

  • Пользователи Windows могут воспринимать это \r\nкак один символ, поскольку такие вещи, как « \r\r\n\nне имеют смысла» или даже не работают.

  • Самая короткая нативная программа (N + N) в байтах побеждает.


11
это вообще возможно?
Сардж Борщ

77
Это всегда кажется невозможным, пока это не будет сделано - Нельсон Мандела
Аднан

42
@SargeBorsch Да.
Деннис,

8
К сожалению, это возможно только в ограниченном количестве языков.
MatthewRock

2
@ R.Kap Нет, кажется слишком запутанным.
Увлечения Кэлвина

Ответы:


203

Желе , 12 байт

N + N,

“(ẹ+)‘FQṖṪỌv

Попробуйте онлайн!

N × N

““((ẹẹ++))‘‘FFQQṖṖṪṪỌỌvv

Попробуйте онлайн!

N ^ N

“““(((ẹẹẹ+++)))‘‘‘FFFQQQṖṖṖṪṪṪỌỌỌvvv

Попробуйте онлайн!

Как это устроено

У желе есть несколько различных типов строковых литералов; все они начинаются с . Если литерал содержит более одного , возвращается строковый массив, который отделяет строки друг от друга.

Например, “abc“def”урожайность ['abc', 'def'].

В зависимости от последнего символа литерала (любой из ”«»‘’которых, «в настоящее время не реализован), можно выбирать между различными типами литералов. Для , мы получаем кодовые точки в кодовой странице Jelly вместо соответствующих символов Unicode.

Например, “abc“def‘урожайность [[97, 98, 99], [100, 101, 102]].

Три литерала в программах соответствуют следующим массивам кодов.

“(ẹ+)‘           -> [40, 214, 43, 41]
““((ẹẹ++))‘      -> [[], [40, 40, 214, 214, 43, 43, 41, 41]]
“““(((ẹẹẹ+++)))‘ -> [[], [], [40, 40, 40, 214, 214, 214, 43, 43, 43, 41, 41, 41]]

N + N,

“(ẹ+)‘FQṖṪỌv                          Main link. Argument: n

“(ẹ+)‘                                As before.
      F                               Flatten the array. Yields an integer array.
       Q                              Unique; deduplicate the integers.
                                      This yields [40, 214, 43, 41].
        Ṗ                             Pop; remove the last element.
         Ṫ                            Tail; extract the last element. 
                                      This yields 43, the Unicode code point of +.
          Ọ                           Unordinal; cast to character.
           v                          Eval; execute the character as a Jelly
                                      program with argument n.

N × N

““((ẹẹ++))‘‘FFQQṖṖṪṪỌỌvv              Main link. Argument: n

““((ẹẹ++))‘                           As before.
           ‘                          Increment all integers.
            FF                        Flatten the array. Yields an integer array.
              QQ                      Unique; deduplicate the integers.
                                      This yields [41, 215, 44, 42].
                ṖṖ                    Pop twice; remove the last two elements.
                  ṪṪ                  Tail; extract the last element.
                                      This yields 215, the Unicode code point of ×.
                    ỌỌ                Unordinal; cast to character.
                      v               Eval; execute the character as a Jelly
                                      program with argument n.
                       v              Eval; convert the return value (n×n) to a
                                      string and execute that string as a Jelly
                                      program with argument n. Since the string
                                      consists of a single integer literal, that
                                      integer is returned, ignoring the argument.

Следует отметить , что F, Q, и не изменяют 1D массивы, массивы без дубликатов, целых чисел и символов (соответственно).

N ^ N

“““(((ẹẹẹ+++)))‘‘‘FFFQQQṖṖṖṪṪṪỌỌỌvvv  Main link. Argument: n

“““(((ẹẹẹ+++)))‘                      As before.
                ‘‘                    Increment all integers twice.
                  FFF                 Flatten the array. Yields an integer array.
                     QQQ              Unique; deduplicate the integers.
                                      This yields [42, 216, 45, 43].
                        ṖṖṖ           Pop thrice; remove the last three elements.
                           ṪṪṪ        Tail; extract the last element.
                                      This yields 42, the Unicode code point of *.
                              ỌỌỌ     Unordinal; cast to character.
                                 v    Eval; execute the character as a Jelly
                                      program with argument n.
                                  vv  Eval twice. See N×N.

73
Я ожидал ответа, потому что вы, ребята, здесь можете решить что угодно, но это просто сумасшедшие вещи. Вы мастер, и я в восторге от вашего великолепия.
Нового

19
Я не думаю, что видел ответ от Денниса до того, как я не начал думать «нет пути», а потом постепенно убеждался, что он какой-то бог, читая объяснение.
Волшебная Урна Осьминога

14
Присоединился к голосованию Ух ты.
Даниэль Р

4
Ни за что ... сколько часов в день вы проводите в гольфе?!?
августа

16
@Falco Я уверен, что Деннис просто спал, когда это было отправлено. ;)
Мартин Эндер

87

> <> , 41 байт

\<
1:: :
&&* +
i*n n
c&
%:
4l
0(
.i
n}
&?

Попробуйте его в Интернете: N + N , N * N , N ^ N . Предполагается, что вход STDIN ровно один символ.

> <> - это двумерный язык, поэтому мы можем использовать тот факт, что семантика кода в основном не изменяется, если мы выполняем инструкции вниз - дополнительные пустые строки, которые следуют, просто no-ops. Исключением из этого является условный батут, ?который извлекает значение и пропускает следующую инструкцию, если значение было ненулевым - дополнительные символы новой строки будут сбиваться ?из-за вставленных no-ops, но мы можем обойти это, поставив ?в конце столбец и воспользоваться преимуществами упаковки.

Чтобы решить, какую операцию выполнить, ключ 40., который телепортирует IP в позицию (4, 0). В связи с расширением кода x = 4столбец соответствует +базовой программе, *дублированной программе и ^утроенной программе. К сожалению> <> не имеет встроенного возведения в степень, что делает его основной частью программы.

[Setup]
\         Mirror: reflect IP direction to downwards
1&        Put 1 into the register
ic%       Push a code point of input, then take it mod 12. This maps the char '1' to the
          number 1, and so forth for '2' to '9'.
40.       Jump to (4, 0), still heading downwards

[N+N version]
:+        Duplicate then add
n         Output as number
          (Stack is now empty, so the program errors out trying to do the above again)

[N*N version]
:*        Duplicate then multiply
n         Output as number
          (Stack is now empty, so the program errors out trying to do the above again)

[N^N version]
:&*&      Multiply register by N
:l(       Push (N < length of stack + 1)
i         Push input, but since we're now at EOF this pushes -1 (stack length += 1)
}         Move -1 to the back
?<        If (N < length + 1) was 1, execute the < to move leftward. Otherwise, skip it.
          (Continue loop)

\         Mirror: reflect IP direction upwards
&n        Output register
.         Jump to (-1, N), which is invalid so the program errors out

21

ТовТовТов (мутация Цыпленка ): 810147050 байт

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


9

Befunge-98 , 38 байт

vx:k:2-k*.@
20@
j3.
>^*
>:^
>:+.@

Попробуйте онлайн: N + N , N * N , N ^ N

Эта программа не будет работать "из коробки", так как она требует ввода в стек в начале выполнения. Заменив первую строку следующим кодом (добавив три байта), он получит ввод из stdin (хотя, к сожалению, это не работает на tryitonline.net):

v
&x:k:2-

объяснение

Настроить

v       Redirect motion downward
02j     Jump over two instructions/spaces, executing the third
        If N=1, it will skip to the 6th line
        If N=2, it will skip to the 5th line
        If N=3, it will skip to the 4th line

N = 1

>       Move right
:+.@    Duplicate, add, print and exit

N = 2

>>::^^  Move right, duplicate twice, move up
*.@     Multiply, print and exit

N = 3

>>>^^^  Redirect motion
30x     Set instruction pointer delta to (3, 0), causing it to
        move right, executing every third instruction
:k:     Duplicate the number (we'll call it M) M+1 times
        The stack is now [M]*(M+2)
2-k*    Multiply things M-1 times (`k' is a quirky instruction)
.@      Print and exit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.