Гіперпрограмування: 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
це можливо навіть?
Sarge Borsch

77
Це завжди здається неможливим, поки це не буде зроблено - Нельсон Мандела
Аднан

42
@SargeBorsch Так.
Денніс

8
На жаль, це можливо лише в обмеженій кількості мов.
MatthewRock

2
@ R.Kap Ні, здається занадто заплутаним.
Захоплення Кальвіна

Відповіді:


203

Желе , 12 байт

N + N

“(ẹ+)‘FQṖṪỌv

Спробуйте в Інтернеті!

N × N

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

Спробуйте в Інтернеті!

N ^ N

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

Спробуйте в Інтернеті!

Як це працює

Jelly має кілька різних типів рядкових літералів; всі вони починаються з а . Якщо літерал містить більше одного , рядок рядків повертається і відокремлює рядки один від одного.

Наприклад, “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
Ні в якому разі ... скільки годин на день ви проводите в гольфі?!?
tfrascaroli

16
@Falco Я впевнений, що Денніс просто спав, коли його розмістили. ;)
Мартін Ендер

87

> <> , 41 байт

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

Спробуйте його в Інтернеті: N + N , N * N , N ^ N . Передбачається, що вхід STDIN - це рівно одна діаграма.

> <> є двовимірною мовою, тому ми можемо скористатися тим, що семантика коду здебільшого не змінюється, якщо ми виконуємо інструкції вниз - додаткові порожні рядки, що випливають, просто відсутні. Виняток з цього становить умовний батут, ?який показує значення і пропускає наступну інструкцію, якщо значення було ненульовим - зайві нові рядки зіпсуються ?через вставлене відключення, але ми можемо обійти це, поставивши ?в кінці стовпчик і скориставшись обгортанням.

Щоб вирішити, яку операцію виконати, ключовим є те 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

TovTovTov (мутація курки ): 810147050 байт

Нижче описано два запропонованих рішення: Одне повне рішення питання, що вимагає багато байтів, і друге часткове рішення (вирішення лише частин N + N і N * N , вимагає лише 484 байти), кожен з яких має інший підхід і свій власний набір крутих хитрощів! :)

1. Повний розчин (810147050 байт)

Використовуючи TovTovTov(TOV='hi',SEP=','), TOVелементи не захищені від дублювання символів на місці (обидва "hihihi"і "hhiihhiihhii"мають три "hi"s в них, і все TovTovTovхвилює лише те, скільки TOVs з'явиться між SEPs).

Якби ми використовували 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.