Hiperprogramowanie: N + N, N × N, N ^ N wszystko w jednym


151

Napisz program, który przyjmuje liczbę N od 1 do 9 włącznie. W swojej natywnej formie program powinien wypisywać dane wyjściowe N + NEg, 2jeśli N jest 1, 4jeśli N jest 2, 6jeśli N jest 3itd.

Kiedy każdy znak w twoim programie jest zduplikowany na miejscu, powinien to być program, który przyjmuje N (wciąż od 1 do 9) i wyprowadza N × NEg, 1jeśli N jest 1, 4jeśli N jest 2, 9jeśli N jest 3, i tak dalej.

Kiedy każdy znak w twoim programie jest potrojony na miejscu, powinien to być program, który przyjmuje N (wciąż od 1 do 9) i wyprowadza N ^ NEg, 1jeśli N jest 1, 4jeśli N jest 2, 27jeśli N jest 3, 387420489jeśli N jest 9, itp.

Liczby powyżej 9 nie są wymagane, ponieważ 10 ^ 10 jest poza zwykłym zakresem liczb całkowitych wielu języków.

Przykład

Jeśli twój program początkowy był

My_Program!
Exit();

Wtedy powinno być w stanie przyjmować N i generować N + N.

Dodatkowo program

MMyy__PPrrooggrraamm!!

EExxiitt(());;

powinien przyjmować N i wyprowadzać N × N.

Wreszcie program

MMMyyy___PPPrrrooogggrrraaammm!!!


EEExxxiiittt((()));;;

powinien przyjmować N i wyprowadzać N ^ N.

Programy z poczwórnymi postaciami i nie są wymagane.

Zasady

  • Dane wejściowe i wyjściowe powinny być zwykłe, zwykle sformatowane liczby dziesiętne. Możesz odpowiedzieć, używając innej bazy, aby pochwalić się swoim kodem, ale wtedy twoja odpowiedź nie jest konkurencyjna.

  • Użytkownicy systemu Windows mogą traktować \r\njako jedną postać, ponieważ takie rzeczy \r\r\n\nnie miałyby sensu, a może nawet nie działały.

  • Najkrótszy rodzimy program (N + N) w bajtach wygrywa.


11
czy to w ogóle możliwe?
Sarge Barszcz

77
Zawsze wydaje się to niemożliwe, dopóki się nie skończy - Nelson Mandela
Adnan

42
@SargeBorsch Tak.
Dennis,

8
Niestety jest to możliwe tylko w ograniczonej liczbie języków.
MatthewRock

2
@ R.Kap Nie, wydaje się zbyt mylące.
Calvin's Hobbies,

Odpowiedzi:


203

Galaretka , 12 bajtów

N + N

“(ẹ+)‘FQṖṪỌv

Wypróbuj online!

N × N

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

Wypróbuj online!

N ^ N

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

Wypróbuj online!

Jak to działa

Galaretka ma kilka różnych rodzajów literałów łańcuchowych; wszystkie zaczynają się od . Jeśli literał zawiera więcej niż jeden , zwracana jest tablica ciągów, która oddziela ciągi od siebie.

Na przykład “abc“def”daje ['abc', 'def'].

W zależności od ostatniego znaku literału (dowolnego z tych ”«»‘’, w których «obecnie nie jest zaimplementowany), można wybierać między różnymi rodzajami literałów. Ponieważ otrzymujemy punkty kodowe na stronie kodowej Jelly zamiast odpowiednich znaków Unicode.

Na przykład “abc“def‘daje [[97, 98, 99], [100, 101, 102]].

Trzy literały w programach odpowiadają następującym tablicom punktów kodowych.

“(ẹ+)‘           -> [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.

Należy zauważyć, że F, Q, , i nie zmieniają 1D tablic, tablice bez duplikatów, liczb i znaków (odpowiednio).

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
Spodziewałem się odpowiedzi, ponieważ tutaj możecie rozwiązać wszystko, ale to tylko niektóre naprawdę szalone rzeczy. Jesteś mistrzem, a ja jestem pod wrażeniem twojej wspaniałości.
Nova,

19
Nie sądzę, że widziałem wcześniej odpowiedź Dennisa, która nie spowodowała, że ​​zacząłem myśleć „nie ma mowy”, a potem powoli przekonywałem się, że jest jakimś bogiem, czytając wyjaśnienie.
Magic Octopus Urn

14
Dołączył do głosowania. Łał.
Daniel R

4
Nie ma mowy ... ile godzin dziennie spędzasz na grze w golfa?!?
tfrascaroli

16
@ Falco jestem pewien, że Dennis spał, kiedy został opublikowany. ;)
Martin Ender

87

> <> , 41 bajtów

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

Spróbuj go online: N + N , N * N , N ^ N . Zakłada, że ​​wejście STDIN ma dokładnie jeden znak.

> <> jest językiem 2D, więc możemy skorzystać z faktu, że semantyka kodu jest w większości niezmieniona, jeśli wykonujemy instrukcje w dół - dodatkowe puste linie, które się pojawiają, są po prostu brakiem operacji. Wyjątkiem jest warunkowa trampolina, ?która wyskakuje z wartości i pomija następną instrukcję, jeśli wartość jest niezerowa - dodatkowe znaki nowej linii popsułyby się z ?powodu wprowadzonych opcji no-op, ale możemy to obejść, umieszczając ?na końcu kolumna i korzystanie z owijania.

Aby zdecydować, którą operację wykonać, kluczem jest 40.teleportacja adresu IP na pozycję (4, 0). Z powodu rozszerzenia kodu x = 4kolumna odpowiada +programowi *bazowemu, programowi podwójnemu i ^programowi potrójnemu. Niestety> <> nie ma wbudowanego potęgowania, co sprawia, że ​​większość programu.

[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 (mutacja kurczaka ): 810147050 bajtów

Poniżej opisano dwa sugerowane rozwiązania: jedno pełne rozwiązanie pytania wymagające dużej liczby bajtów i drugie częściowe rozwiązanie (rozwiązanie tylko części N + N i N * N , wymagające tylko 484 bajtów), każde przyjmujące inne podejście i własne zestaw fajnych sztuczek! :)

1. Pełne rozwiązanie (810147050 bajtów)

Korzystanie TovTovTov(TOV='hi',SEP=','), te TOVelementy są odporne na powielania znaków w miejscu (zarówno "hihihi"i "hhiihhiihhii"trzy "hi"s w nich, a wszystko TovTovTovtroszczy się o to, jak wiele TOVs pojawiają się między SEPs).

Gdybyśmy użyli SEP=', ', cały program byłby odporny na powielanie postaci (co jest fajne, ale nie rozwiąże pytania). Więc korzystamy SEP=','.

"hihihi,hi"Na przykład program kompiluje się do tablicy ints [3,1], podczas gdy "hhiihhiihhii,,hhii"kompiluje się do [3,0,1]i "hhiihhiihhii,,hhii"do [3,0,0,1]. Oznacza to, że same polecenia nie zmieniają swojego znaczenia po powieleniu, ale ogólna długość zmienia się wraz z powielaniem znaków. Poniższa rozwiązanie odpytuje długość programu i używa tego do zdecydować, czy drukować N+N, N*Nlub N^N.

Sugerowane pełne rozwiązanie, jako tablica ints, to: [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]

Jako ciąg jest to dość długi program, składający się z 810147050 znaków, zaczynający się od: hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...

2. Rozwiązywanie tylko części N + N i N * N pytania (484 bajty)

Używając TovTovTov(TOV='1',SEP=', '), tym razem SEPs są odporne na duplikację ( ",, "wciąż ma tylko jedną ", "), więc następujące sugerowane rozwiązanie będzie zawsze zawierało 33 polecenia, nawet po duplikacji znaków:

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

Odpowiednia tablica ints (liczba TOVs ( 1s) w każdym z 33 powyższych poleceń) jest następująca:[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]

Powielenie znaków w miejscu daje listę 33 zupełnie różnych poleceń : [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]

Oryginalny ints array (który oblicza N + N ) został zaprojektowany dokładnie tak, że po polecenia zmienić swoje znaczenie, program nadal ma sens, ale oblicza N * N . Na przykład pierwsza 4(która TovTovTovrozumie jako „traktuj następną operację jako kod ascii do konwersji na znak”) zmienia się po powieleniu znaku na 8, co jest zupełnie inną komendą („zmień licznik programu na pierwszą wyskakującą wartość z stos, jeśli wartość pojawiła się bezpośrednio po wartości „prawda”).


9

Befunge-98 , 38 bajtów

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

Wypróbuj online: N + N , N * N , N ^ N

Ten program nie będzie działać od razu po wyjęciu z pudełka, ponieważ wymaga wejścia na stos na początku wykonywania. Zastępując pierwszy wiersz następującym kodem (dodając trzy bajty), pobierze dane wejściowe ze standardowego wejścia (chociaż nie działa to na tryitonline.net, niestety):

v
&x:k:2-

Wyjaśnienie

Ustawiać

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.