Mir ist klar, dass dies ein bisschen mathematisch ist, aber - hier geht es weiter.
In der Mathematik ist die Hyperoperationssequenz eine unendliche Folge von arithmetischen Operationen (Hyperoperationen genannt), die mit der unären Operation des Nachfolgers beginnt und dann mit den binären Operationen der Addition, Multiplikation und Exponentiation fortgesetzt wird, wonach die Sequenz mit weiteren darüber hinausgehenden binären Operationen fortfährt Potenzierung unter Verwendung von Rechtsassoziativität.
Ihr Ziel ist es, ein Programm zu schreiben, das drei ganze Zahlen x, y und n als Eingabe verwendet und das Ergebnis der n-ten Hyperoperation für x und y ausgibt.
Z.B
1 1 1
Ausgänge 2
2 4 4
Ausgänge 65536
3 3 4
Ausgänge 7625597484987
- Das Programm muss in kürzester Zeit geschrieben sein.
- Sie können Eingaben entweder aus
STDIN
oder aus einer Datei vornehmen. - Bibliotheksfunktionen nicht erlaubt.
- Eingabebeschränkungen: n ist ≥ 1.
http://en.wikipedia.org/wiki/Tetration bietet eine gute Erklärung für den Fall, dass Sie sich nicht darum kümmern können.
quelle
n=1
? Wenn esx+y
oder istx+1
,1 1 1
sollte zurückkehren2
Antworten:
Rubin, langsam,
86 8483 ZeichenRuby, schnell,
96 9493 ZeichenDie erste Version ist mit dem letzten Testfall viel zu langsam, daher habe ich eine Version hinzugefügt, die Multiplikation als Basisfall anstelle von Addition verwendet. Die Berechnung der ersten Version dauert ewig
3 3 4
. Die zweite ist instanteneous (in der nativen IRB-Konsole; die Webversion ist etwas langsamer).Hier tauchen einige Schönheiten von Ruby auf:
Fast jede Aussage ist ein Ausdruck in Rubin. Auf diese Weise können Sie Semikolons in den ternären Operator einfügen, vorausgesetzt, Sie haben genügend Klammern herumliegen. Coffeescript hat das ausgeliehen. Es wurde auch Rubys Aufrufsyntax "Keine Parens erforderlich" ausgeliehen.
Implizite Rückgabe: Dies ist eine coole Funktion und folgt aus der vorherigen. In der Tat wird das Starten der letzten Zeile einer Funktion mit
return
als lahm angesehen, selbst wenn nicht Golf gespielt wird.Zahlen sind Objekte in Rubin (gerade
null
ist ein Objekt). In Ruby haben Ganzzahlen die Methodetimes
, die den an sie übergebenen Block mehrmals ausführt. Dies ist nur eine von Rubys vielen Iteratormethoden. Hierupto
können wir mit der Methode zwei weitere Zeichen über dem speichern, wastimes
uns erlaubt.einstellige
*
ist der Splat - Operator hier. Es verwandelt ein Array in eine Argumentliste. Genau wie bei JavascriptFunction#apply
, aber es ist kürzer und besser.unary
&
verwandelt eine Prozedur in einen Block. Während:to_i
es ein Symbol ist, kann es ziemlich gut in eine Prozedur umgewandelt werden. Es wird nämlich zu einer Prozedur, dieto_i
ihr Argument aufruft und das Ergebnis zurückgibt. Weitere Informationen zum Stapelüberlauf.Es wäre möglich, es noch schneller zu bekommen, wenn man es
n=3
als Basisgehäuse verwendet, aber ich fürchte, es wird nicht benötigt. Es würde jedoch nur 11 Zeichen kosten, dank einer anderen Schönheit von Ruby: dem Exponentiationsoperator**
. Python hat diesen Operator, aber es ist nicht der erste (wie @ aka.nice feststellte - danke - hatte Fortran diesen Operator bereits).Online-Ruby-Interpreter hier verfügbar: http://repl.it/Ikj/1
quelle
3 3 4
:) Es ist sehr langsam.APL, 62
{...}⎕
: Nimmt ausgewertete Eingaben (durch Leerzeichen getrennte Zahlen ergeben ein numerisches Array) und wendet eine Funktion darauf an.1=3⌷⍵:
: Wenn n gleich 1 ist ...2⌷+\⍵
: Rückgabesumme der ersten 2 Elemente (x + y) ...⋄0=2⌷⍵:
: Andernfalls, wenn y gleich 0 ist ...(⍵[3]⌊3)⌷⍵[1],0,1
: Numerisches Array [x, 0,1] erstellen und Index zurückgebenmin(n,3)
...⋄∇⍵[1],(∇⍵-0 1 0),3⌷⍵-1
: Andernfalls wird ∇ (x, ∇ (x, y-1, n), n-1) zurückgegeben. (∇ ist Selbstreferenz)Ich habe einen "Hyper-Raiser" -Operator, der eine Funktion übernimmt und die nächste Hyperoperation zurückgibt
Zum Beispiel
+{⍺⍺/⊃⍴/⌽⍵}
wäre die Multiplikationsfunktion und die+{⍺⍺/⊃⍴/⌽⍵}5 3
Ausgänge 15.Aber ich kann es nicht dazu bringen, sich zu wiederholen. Vielleicht kann es jemand anderes tun.
quelle
Python, 83
(Basierend auf der Antwort von Flornquake )
Sehr langsam für große Ergebnisse.
Für
2, 4, 4
die Ausgabe ist65536
.quelle
Python,
9692Eingabe:
3, 3, 4
Ausgabe:
7625597484987
Verkürzt mit ein paar Ideen von @ WolframH .
quelle
Golfscript, langsam, 39 Zeichen
(Live-Link)
Dies ist der rekursive Standardalgorithmus mit einem Basisfall von n = 1 (Addition) (dh langsam). Das gleiche habe ich in meiner Ruby-Lösung verwendet
Hier ist eine Version mit meinen Anmerkungen (meistens Stapelhaltung). Es enthält keine Optimierung, die ich später hinzugefügt habe:
~
ist der Bewertungsoperator. Bei Zeichenfolgen wird die Zeichenfolge als GolfScript-Programm behandelt. Glücklicherweise ist eine durch Leerzeichen getrennte Liste von Ganzzahlen ein gültiges GolfScript-Programm, das diese Ganzzahlen auf den Stapel schiebt. Im Vergleich dazu ist meine vorherige Version der Eingaberoutine (" "/{~}/
aufgeteilt nach Leerzeichen und Auswertung) ziemlich lahm. Bei Funktionen wird die Funktion aufgerufen. Wenn.
(Klon) vorangestellt wird , ruft es die Funktion mit sich selbst als erstem Argument auf.Golfscript scheint nicht gerade für die Erstellung rekursiver Algorithmen geeignet zu sein. Wenn Sie einen rekursiven Algorithmus wünschen, der nicht optimierbar ist, müssen Sie Stapelrahmen erstellen und zerstören, um Ihre Variablen zu erhalten. In den meisten Sprachen erfolgt dies automatisch. In Golfscript müssen Sie die Variablen (eigentlich Stapeleinträge) tatsächlich klonen und die Stapeleinträge zerstören, die Sie nicht mehr benötigen. Golfscript hat kein Konzept für Stapelrahmen. Habe ich gesagt, dass GolfScript eine stapelbasierte Sprache ist?
Die erste Anforderung ist verständlich. Sie müssen die Argumente irgendwie angeben. Es ist nur schön, wenn sie auch ihre ursprünglichen Positionen behalten. Die zweite Anforderung ist unglücklich, insbesondere da sich der Rückgabewert oben auf dem Stapel befindet und Golfscript nicht in der Lage ist, nur ein beliebiges Stapelelement zu löschen. Sie können den Stapel drehen und das neue obere Element verwerfen, aber das baut sich schnell auf.
\;
ist gut.\;\;\;\;\;
ist nicht. Sie können dies\;
in einer Schleife tun ({\;}9*
; Kosten: 6 Zeichen, um bis zu 9 Elemente zu verwerfen, oder 7 Zeichen, um bis zu 99 Elemente zu verwerfen), aber wir können es besser machen:Golfscript verfügt über erstklassige Arrays. Es hat auch die Array-Literal-Syntax
[1 2 3 4]
. Was unerwartet ist, ist das[
und]
ist eigentlich kein Teil der Syntax. Sie sind lediglich zwei Operatoren:[
Markiert die aktuelle Position auf dem Stapel und]
sammelt jedes Element, bis es die Markierung für den Start des Arrays findet oder keinen Stapel mehr hat, und verwirft die Markierung. Sie können diese beiden sogar auseinander reißen und sehen, was passiert. Nun, eine ziemlich interessante Sache:Habe ich gesagt, Golfscript hat kein Konzept für Stapelrahmen? Ich habe gelogen. Dies ist ein Stapelrahmen :
[
. Sie können alles auf einmal verwerfen :];
. Aber was ist, wenn wir den Rückgabewert behalten wollen? Sie können den Stapelrahmen bei der Funktionseingabe schließen (dann haben wir eine leicht verstümmelte Version von Pass-by-Array - kein interessantes Konzept), oder Sie können den Stapelrahmen schließen und sein letztes Element übernehmen, anstatt ihn vollständig zu verwerfen:]-1=
oder wir kann stattdessen das letzte Element entsperren und dann den Frame verwerfen :])\;
. Sie sind gleich lang, aber letzteres ist etwas kühler, also benutze ich es.Anstelle von 6 oder 7 Zeichen für eine Bereinigung können wir also 5 verwenden. Ich bin immer noch der Meinung, dass dies mehr Golf sein könnte, aber hey, wir haben einen Charakter gespeichert.
quelle
Smalltalk Squeak 4.x schmeckt vielen Bytes!
Ich könnte eine der rekursiven Formen in Integer in 71 Zeichen implementieren
Dann kostet mich das Lesen aus einer Datei oder einem FileStream-Standard einen Arm ... Squeak wurde offensichtlich nicht als Skriptsprache entwickelt. Daher werde ich viele Bytes ausgeben, um meine eigenen allgemeinen Dienstprogramme zu erstellen, die nichts mit dem Problem zu tun haben:
Implementieren Sie diese 21-Zeichen-Methode in Stream (um Seaparatoren zu überspringen).
Implementieren Sie diese 20-Zeichen-Methode in Behavior (um eine Instanz aus einem Stream zu lesen).
Dann 28 Zeichen in String (um ein Dateihandle zu erstellen)
Dann 59 Zeichen in FileDirectory (um einen readStream zu erstellen)
Dann 33 Zeichen in BlockClosure (um es n-mal auszuwerten)
Dann 63 Zeichen im Array (bewerten Sie das Argument mit dem Empfänger und die Argumente aus dem Array)
Lösen Sie dann das Problem, indem Sie dieses 31-Zeichen-Snippet an einer beliebigen Stelle auswerten, um es aus der Datei mit dem Namen x zu lesen
Auch ohne die Dienstprogramme zu zählen, sind das bereits 71 + 31 = 102 Zeichen ...
Jetzt, da ich sicher bin, den CodeGolf zu verlieren, habe ich eine lustigere Implementierung in Integer:
Diese Methode definiert (kompiliert) eine binäre Nachricht aus n +, wenn sie nicht existiert (wird vom Empfänger der Nachricht m nicht verstanden), und startet die Ausführung zu Beginn des Senderkontexts neu. Ich habe zusätzlichen Wagenrücklauf und Leerzeichen zur besseren Lesbarkeit eingefügt.
Beachten Sie, dass dies
(m selector size-2min:1)hex last
eine Kurzschlussform von ist(m selector size>2)asBit printString
.Wenn Smalltalk keine bösen Supermächte demonstrieren sollte, könnte die letzte Aussage durch kürzere und einfachere ersetzt werden
Implementieren Sie nun das Dienstprogramm mit 28 Zeichen in Character (um es n-mal in einem String zu wiederholen).
Bewerten Sie dann diesen Ausdruck mit 43 Zeichen:
Wir können mit 10 weiteren Zeichen beschleunigen, indem wir in Integer implementieren:
und in diesem Fall sind wir auch kürzeren Code haben , weil wir ersetzen können
^',(m selector size-2min:1)hex last
mit^1'
Für einen so hohen Preis arbeitet der Code mit der zweiten Ganzzahl = 0 :)
quelle
Groovy - 77
Hinweis: Für nicht winzige Argumente sind obszöne Mengen an Stapel (und Zeit) erforderlich.
quelle
AXIOM Computer Algebra System, Bytes 69
Prüfung:
Dies würde eine gewisse Rekursion beseitigen ... Möglicherweise tausche ich x und y in einer Rückgabe aus ... gibt es andere Testwerte?
quelle
APL (NARS), Zeichen 61, Bytes 122
Prüfung:
quelle