Hintergrund
In vielen esoterischen Programmiersprachen sind keine Zahlen in Literalen integriert, daher müssen Sie diese zur Laufzeit berechnen. und in vielen dieser Fälle kann die Zahlendarstellung sehr interessant sein. Wir hatten bereits eine Herausforderung , Zahlen für Unterlast darzustellen. Bei dieser Herausforderung geht es darum, Zahlen in Modular SNUSP darzustellen . (Beachten Sie, dass Sie SNUSP nicht lernen müssen, um diese Herausforderung abzuschließen. Alle Informationen, die Sie benötigen, sind in der Spezifikation enthalten. Möglicherweise finden Sie den Hintergrund jedoch interessant.)
Die Aufgabe
Für die Zwecke dieser Herausforderung ist eine modulare SNUSP-Nummer eine Zeichenfolge, die aus den Zeichen gebildet @
wird +
, und =
mit der Ausnahme, dass das letzte Zeichen a #
ist und das vorletzte Zeichen sein muss +
oder =
(es kann nicht sein @
). Zum Beispiel gültige Zahlen sind @+#
, ==#
und @@+@=#
; Beispiele für ungültige Nummern enthalten +=
, @@#
und +?+#
.
Der Wert einer modularen SNUSP-Nummer wird rekursiv wie folgt berechnet:
#
hat einen Wert von 0 (dies ist der Basisfall).- Wenn die Zahl
=x
für eine Zeichenfolge die Form hatx
, entspricht ihr Wert dem Wert vonx
. - Wenn die Zahl
+x
für eine Zeichenfolge die Form hatx
, entspricht ihr Wert dem Wertx
plus 1. - Wenn die Zahl die Form
@cx
für ein einzelnes Zeichenc
und eine beliebige Zeichenfolge hatx
, entspricht ihr Wert dem Wert vonx
plus dem Wert voncx
.
Für diese Herausforderung müssen Sie ein Programm schreiben, das eine nichtnegative Ganzzahl als Eingabe verwendet und eine Zeichenfolge ausgibt, die die kürzestmögliche modulare SNUSP-Nummer ist und deren Wert der Eingabe entspricht.
Klarstellungen
- Es ist durchaus möglich, dass es mehr als eine Zeichenfolge mit demselben Wert gibt, und insbesondere für einige Ganzzahlen gibt es einen Gleichstand für die kürzeste modulare SNUSP-Nummer mit diesem Wert. In einem solchen Fall können Sie eine der beteiligten Zahlen mit dem Gleichstand ausgeben.
- Der Algorithmus, mit dem Sie die Nummer ermitteln, ist nicht eingeschränkt. Zum Beispiel ist es eine legale Taktik, Strings brutal zu erzwingen und zu bewerten, aber auch etwas Klügeres zu tun, um den Suchraum zu verkleinern.
- Wie bei PPCG üblich, kann Ihre Einreichung entweder ein vollständiges Programm oder eine Funktion sein (wählen Sie das aus, was in Ihrer Sprache prägnanter ist).
- Dies ist kein Problem bei der Verarbeitung von Eingabe- und Ausgabeformaten. Sie können also alle angemessenen Mittel verwenden, um eine nichtnegative Ganzzahl einzugeben und eine Zeichenfolge auszugeben. Es gibt eine vollständige Anleitung zu Meta , aber die am häufigsten verwendeten rechtlichen Methoden umfassen Funktionsargumente / -rückgaben, Befehlszeilenargumente und Standardeingabe / Standardausgabe.
Testfälle
Hier sind die kürzesten Darstellungen der ersten Zahlen:
- 0 :
#
- 1 :
+#
- 2 :
++#
- 3 :
+++#
oder@++#
- 4 :
++++#
oder+@++#
oder@=++#
- 5 :
@+++#
oder@@++#
- 6 :
+@+++#
oder+@@++#
oder@=+++#
oder@=@++#
oder@@=++#
- 7 :
@++++#
oder@+@++#
- 8 :
@@+++#
oder@@@++#
- 9 :
+@@+++#
oder+@@@++#
oder@+++++#
oder@++@++#
oder@+@=++#
oder@@=+++#
oder@@=@++#
- 10 :
@=@+++#
oder@=@@++#
oder@@@=++#
( dies ist ein ziemlich wichtiger Testfall , da alle möglichen Antworten beinhalten=
) - 11 :
@+@+++#
oder@+@@++#
oder@@++++#
oder@@+@++#
- 12 :
+@+@+++#
oder+@+@@++#
oder+@@++++#
oder+@@+@++#
oder@=+@+++#
oder@=+@@++#
oder@=@=+++#
oder@=@=@++#
oder@=@@=++#
oder@@=++++#
oder@@=+@++#
oder@@=@=++#
- 13 :
@@@+++#
oder@@@@++#
- 14 :
+@@@+++#
oder+@@@@++#
oder@=@++++#
oder@=@+@++#
oder@@+++++#
oder@@++@++#
oder@@+@=++#
- 15 :
@+@++++#
oder@+@+@++#
oder@@=@+++#
oder@@=@@++#
oder@@@=+++#
oder@@@=@++#
Als größerer Testfall ist der Ausgang vom Eingang 40 soll @@@=@@+++#
, @@@=@@@++#
, @@@@=@+++#
, oder @@@@=@@++#
.
Siegbedingung
Als Code-Golf- Herausforderung ist der Gewinner der kürzeste Eintrag, gemessen in Bytes.
=
wird optimalerweise nur als auftreten@=
, oder?Antworten:
Oracle SQL 11.2,
341262 BytesAlte Version
: 1 die Zahl, die in Modular SNUSP dargestellt werden soll
Nicht Golf:
Erstellen Sie zunächst eine Ansicht mit 3 Zeilen, eine für jedes Symbol, das zur Darstellung von Zahlen verwendet wird, minus #, das nur am Ende der Zeichenfolge verwendet wird:
Dann erzeugt die rekursive Ansicht n jede mögliche Zeichenfolge mit diesen 3 Symbolen, verkettet sie mit # und wertet sie aus.
Die Parameter sind:
s: die modulare SNUSP-Darstellung der zu bewertenden Zahl
v: der Dezimalwert von s, der durch die vorherige Iteration berechnet wurde
p: v, berechnet durch die i-2-Iteration
c: das nächste Symbol, das mit s
i verkettet wird : nur die Länge von s benötigt, um zwei LENGTH () für Golfzwecke loszuwerden
Wenn das letzte Symbol + ist, addiere 1
Wenn es @ ist, addiere den Wert der i-2-Iteration.
Andernfalls ist das Symbol entweder # oder =. v wird im Init-Teil der rekursiven Ansicht mit 0 initialisiert, sodass das neue v in beiden Fällen gleich dem vorherigen v ist.
Jede mit den 3 Symbolen mögliche Zeichenfolge wird berechnet. Dieser Teil stellt sicher, dass die Anforderung erst nach dem großen Crunch ausgeführt wird.
Da es keine Regel für die Konstruktion der Zeichenfolgen gibt, müssen Duplikate entstehen. In einer rekursiven Ansicht interpretiert Oracle diese Duplikate als Zyklen und gibt einen Fehler aus, wenn der Fall nicht explizit behandelt wird.
Gibt die erste modulare SNUSP-Darstellung zurück, die die als Parameter eingegebene Dezimalzahl ergibt: 1
In meinen Tests ist diese erste Zeile immer eine der kürzesten Darstellungen.
Falls Ihre Datenbank nicht auf die gleiche Weise funktioniert, sollte diese letzte Klausel durch ersetzt werden
quelle
JavaScript (ES6), 100 Byte
Einfacher Brute-Force-Suchalgorithmus.
quelle
t<n
zut-n
könnte funktionieren ...Pyth, 41 Bytes
Testsuite
Wie es funktioniert:
Es gibt zwei Teile. Eine rekursive Funktion, die den Wert eines SNUSP-Ausdrucks ohne Trailing berechnet
#
, und eine Brute-Force-Routine.Bewertung:
Rohe Gewalt:
quelle
CJam, 58
Brute Force, mit ein wenig Inspiration von Neils Antwort. Probieren Sie es online aus
Effiziente Version, 107
Probieren Sie es online aus
Dies verwendet dynamische Programmierung.
quelle
Haskell ,
8986 BytesBEARBEITEN:
Eine weitere Brute-Force-Lösung, die sich von Neils Antwort inspirieren ließ. (Obwohl es eher wie Isaacgs Pyth funktionierte, bevor das Golfen das einführte
l
.)Probieren Sie es online aus!
f
ist die Hauptfunktion, die eine Ganzzahl verwendet und eine Zeichenfolge zurückgibt.l
ist eine unendliche Liste von Tupeln(a,b,s)
, kürzeste Darstellungens
zuerst, zusammen mit ihrem Werta
und dem Wertb
der Darstellung, wobei das erste Zeichen entfernt wird. (Wie andere ebenfalls bemerkt / bemerkt haben, ist es harmlos, letzteres als 0 für zu behandeln#
.)l
anderen als dem ersten werden rekursiv mit einem Listenverständnis erzeugt.d
ist das Zeichen, dem vorangestellt werden solls
, um eine neue Darstellung in der Liste zu generieren, und 'c' ist das entsprechende Inkrement zua
.quelle