Hyperprogrammierung: N + N, N × N, N ^ N in einem


151

Schreiben Sie ein Programm, das eine Zahl N von 1 bis einschließlich 9 enthält. In seiner ursprünglichen Form sollte Ihr Programm N + NEg ausgeben, 2wenn N ist 1, 4wenn N ist 2, 6wenn N ist 3, und so weiter.

Wenn jedes Zeichen in Ihrem Programm doppelt vorhanden ist, sollte es ein Programm sein, das N (immer noch von 1 bis 9) aufnimmt und N × NEg ausgibt, 1wenn N ist 1, 4wenn N ist 2, 9wenn N ist 3, und so weiter.

Wenn jedes Zeichen in Ihrem Programm verdreifacht ist, sollte es ein Programm sein, das N (immer noch von 1 bis 9) aufnimmt und N ^ NEg ausgibt, 1wenn N ist 1, 4wenn N ist 2, 27wenn N ist 3, 387420489wenn N ist 9, usw.

Zahlen über 9 sind nicht erforderlich, da 10 ^ 10 außerhalb des üblichen Integer-Bereichs vieler Sprachen liegt.

Beispiel

Wenn Ihr ursprüngliches Programm war

My_Program!
Exit();

Dann sollte es in der Lage sein, N aufzunehmen und N + N auszugeben.

Zusätzlich das Programm

MMyy__PPrrooggrraamm!!

EExxiitt(());;

sollte N aufnehmen und N × N ausgeben.

Endlich das Programm

MMMyyy___PPPrrrooogggrrraaammm!!!


EEExxxiiittt((()));;;

sollte N aufnehmen und N ^ N ausgeben.

Programme mit vier Zeichen und höher sind nicht erforderlich.

Regeln

  • Eingabe und Ausgabe sollten einfache, normalerweise formatierte Dezimalzahlen sein. Sie können mit einer anderen Basis antworten, um Ihren Code zu präsentieren, aber dann ist Ihre Antwort nicht wettbewerbsfähig.

  • Windows-Benutzer können \r\nals ein Zeichen behandelt werden, da Dinge wie \r\r\n\nnicht sinnvoll sind oder vielleicht sogar funktionieren.

  • Das kürzeste native Programm (das N + N-Programm) in Bytes gewinnt.


11
ist es überhaupt möglich?
Sarge Borsch

77
Es scheint immer unmöglich, bis es fertig ist - Nelson Mandela
Adnan

42
@SargeBorsch Ja.
Dennis

8
Leider ist dies nur in wenigen Sprachen möglich.
MatthewRock

2
@ R.Kap Nein, scheint zu verwirrend.
Calvins Hobbys

Antworten:


203

Gelee , 12 Bytes

N + N

“(ẹ+)‘FQṖṪỌv

Probieren Sie es online!

N × N

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

Probieren Sie es online!

N ^ N

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

Probieren Sie es online!

Wie es funktioniert

Jelly hat verschiedene Arten von String-Literalen. alle fangen mit a an . Wenn das Literal mehrere Zeichenfolgen enthält , wird ein Zeichenfolgenarray zurückgegeben, das die Zeichenfolgen voneinander trennt.

Zum Beispiel “abc“def”Ausbeuten ['abc', 'def'].

Abhängig vom letzten Zeichen des Literal (eines davon ”«»‘’, wo «es derzeit nicht implementiert ist), kann man zwischen den verschiedenen Arten von Literalen wählen. Für erhalten wir die Codepunkte in Jellys Codepage anstelle der entsprechenden Unicode-Zeichen.

Zum Beispiel “abc“def‘Ausbeuten [[97, 98, 99], [100, 101, 102]].

Die drei Literale in den Programmen entsprechen den folgenden Codepunktarrays.

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

Beachten Sie, dass F, Q, , und nicht verändern 1D - Arrays, Arrays ohne Duplikate, Zahlen und Zeichen (jeweils).

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
Ich habe eine Antwort erwartet, weil ihr hier alles lösen könnt, aber das sind nur ein paar wirklich verrückte Sachen. Du bist ein Meister und ich bin voller Ehrfurcht vor deiner Großartigkeit.
Nova

19
Ich glaube nicht, dass ich zuvor eine Antwort von Dennis gesehen habe, die dazu führt, dass ich anfange, "auf keinen Fall" zu denken und dann langsam davon überzeugt bin, dass er eine Art Gott ist, indem ich die Erklärung lese.
Magic Octopus Urn

14
Beitreten, um zu stimmen. Beeindruckend.
Daniel R

4
Auf keinen Fall ... wie viele Stunden pro Tag verbringen Sie mit Golfen?!?
Tfrascaroli

16
@ Falco Ich bin sicher, Dennis hat gerade geschlafen, als es gepostet wurde. ;)
Martin Ender

87

> <> 41 Bytes

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

Versuchen Sie es online: N + N , N * N , N ^ N . Nimmt an, dass der STDIN-Eingang genau ein Zeichen ist.

> <> ist eine 2D-Sprache, daher können wir die Tatsache nutzen, dass die Codesemantik größtenteils unverändert bleibt, wenn wir Anweisungen abwärts ausführen. Die Ausnahme ist die bedingte Trampolin , ?die einen Wert springt und überspringt die nächste Anweisung , wenn der Wert ungleich Null war - die zusätzlichen Zeilenumbrüche würde vermasseln ?aufgrund der No-ops eingefügt, aber wir können , indem die dieses Problem umgehen , ?am Ende eine Säule und nutzen Sie die Verpackung.

Um zu entscheiden, welche Operation ausgeführt werden soll, muss der Schlüssel 40.lauten, welcher die IP zur Position teleportiert (4, 0). Aufgrund der Erweiterung des Codes x = 4entspricht die Spalte +für das Basisprogramm, *für das doppelte Programm und ^für das verdreifachte Programm. Leider ist in> <> keine Exponentiation eingebaut, was den Großteil des Programms ausmacht.

[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 (eine Mutation von Chicken ): 810147050 Bytes

Im Folgenden werden zwei Lösungsvorschläge beschrieben: Eine vollständige Lösung für die Frage, die viele Bytes erfordert, und eine zweite Teillösung (Lösen nur der Teile N + N und N * N , die nur 484 Bytes erfordern), die jeweils einen anderen Ansatz verfolgen Reihe von coolen Tricks! :)

1. Vollständige Lösung (810147050 Bytes)

Unter Verwendung TovTovTov(TOV='hi',SEP=','), die TOVElemente immun gegen die Duplizieren Zeichen anstelle (beide "hihihi"und "hhiihhiihhii"haben drei "hi"s in ihnen, und alle TovTovTovkümmern sich um sind , wie viele TOVs zwischen erscheinen SEPs).

Wenn wir es verwenden würden SEP=', ', wäre das gesamte Programm immun gegen Zeichenverdopplungen (was cool ist, aber die Frage nicht löst). Also benutzen wir SEP=','.

So "hihihi,hi"kompiliert das Programm zum Beispiel in das ints-Array [3,1], während es "hhiihhiihhii,,hhii"in [3,0,1]und "hhiihhiihhii,,hhii"in kompiliert [3,0,0,1]. Dies bedeutet, dass die Befehle selbst nach dem Duplizieren ihre Bedeutung nicht ändern, die Gesamtlänge ändert sich jedoch mit dem Duplizieren von Zeichen. Die unten stehende Lösung fragt die Länge des Programms ab und verwendet diese, um zu entscheiden, ob oder gedruckt werden N+Nsoll .N*NN^N

Die vorgeschlagene vollständige Lösung lautet wie folgt: [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]

Als Zeichenfolge ist es ein ziemlich langes Programm, bestehend aus 810147050 Zeichen, beginnend mit: hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...

2. Lösen nur der N + N und N * N Teile der Frage (484 Bytes)

Wenn Sie TovTovTov(TOV='1',SEP=', ')diesmal " SEPs" verwenden, sind die s immun gegen Duplizierung (es ist ",, "immer noch nur eine enthalten ", "). Die folgende vorgeschlagene Lösung enthält also immer 33 Befehle, auch nach der Duplizierung von Zeichen:

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

Das entsprechende ints-Array (die Anzahl der TOVs ( 1s) in jedem der obigen 33 Befehle) lautet wie folgt:[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]

Das Duplizieren der Zeichen an Ort und Stelle führt zu einer Liste von 33 völlig unterschiedlichen Befehlen : [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]

Das ursprüngliche ints-Array (das N + N berechnet ) wurde sorgfältig entworfen , damit das Programm nach dem Ändern der Bedeutung der Befehle noch Sinn macht, aber N * N berechnet . Zum Beispiel ändert sich der erste 4(der TovTovTovals "Behandle die nächste Operation als ASCII-Code, der in ein Zeichen konvertiert werden soll" verstanden wird) nach dem Duplizieren von Zeichen in 8, was ein völlig anderer Befehl ist ("ändere den Programmzähler auf den ersten aus dem angezeigten Wert stapeln, wenn der unmittelbar folgende Wert true ist ").


9

Befunge-98 , 38 Bytes

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

Probieren Sie es online aus: N + N , N * N , N ^ N

Dieses Programm funktioniert nicht sofort, da zu Beginn der Ausführung Eingaben auf dem Stack sein müssen. Wenn Sie die erste Zeile durch den folgenden Code ersetzen (drei Bytes hinzufügen), wird die Eingabe von stdin übernommen (obwohl dies auf tryitonline.net leider nicht funktioniert):

v
&x:k:2-

Erläuterung

Konfiguration

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.