Disarium Dilemma
Ein Disarium ist definiert als eine Zahl, deren:
Die Summe der mit der jeweiligen Position versorgten Ziffern entspricht der ursprünglichen Nummer
Ihre Aufgabe :
Sie sind von Zahlen besessen, die als Disarium eingestuft werden. Das Bedürfnis, den Wegen des Disariums zu folgen, ist in Ihnen so groß, dass Sie es ablehnen , Seiten in einem bestimmten Buch zu lesen, die nicht mit Disarien nummeriert sind. Sie haben zwei BIG Probleme:
- Ihr Professor hat Sie soeben beauftragt, Ihr Lehrbuch von Seite
n
zu Seite zu lesenm
- Sie haben letzte Woche einen schweren Schlag auf den Kopf bekommen und können sich anscheinend nicht erinnern, wie Sie programmgesteuert feststellen können, ob eine Zahl als Disarium angesehen wird.
Zeit ist von entscheidender Bedeutung, daher muss der Code zur Bestimmung der zu lesenden Seiten so kurz wie möglich sein.
Sie müssen alle von der disarium innerhalb einer inklusiven Bereich von identifizieren , n
durch m
.
Beispiele für ein Disarium :
89 = 8 1 + 9 2
135 = 1 1 + 3 2 + 5 3
518 = 5 1 + 1 2 + 8 3
Das ist Code-Golf, also gewinnt die geringste Anzahl von Bytes!
Hier ist die vollständige Sequenz von A032799 .
n
undm
? Es gibt ein sehr großes Disarium (12157692622039623539). Sollten die Antworten es identifizieren können?Antworten:
Perl 6 ,
4039 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Python2,
98898884 BytesSchrecklich. Wird kürzer.Fängt an, besser auszusehenHier ist mein rekursiver Versuch (86 Bytes):
Vielen Dank an @Rod für das Speichern von 4 Bytes!
range
zuenumerate
und so weiter.quelle
enumerate
, können Sieint(n)
stattdessen verwendenint(`x`[p])
Perl, 43 Bytes
Probieren Sie es online!
Regex ist wirklich mächtig, Leute.
Erläuterung
Der Code liest zunächst zwei Ganzzahlen als Eingabe über
<>
und erstellt mit einen Bereich von der ersten zur zweiten..
. Es verwendet dann diemap
Standardfunktion Iterierte durch diesen Bereich und wendet den folgenden Code auf jeden Wert:say if$_==eval s/./+$&**$+[0]/gr
. Das sieht nach Kauderwelsch aus und ist es auch, aber hier ist, was wirklich passiert.map
speichert implizit seinen aktuellen Wert in der Variablen$_
. Viele Perl-Funktionen und -Operationen verwenden diesen Wert, wenn keiner angegeben ist. Dies schließt reguläre Ausdrücke wie dens///
Substitutionsoperator ein.Ein Substitutionsregex besteht aus vier Teilen:
=~
verwendet, um einen regulären Ausdruck auf einen String anzuwenden. Fehlt dieser Operator jedoch, wird der reguläre Ausdruck auf die implizite Variable angewendet, die$_
über diemap
Funktion unsere aktuelle Nummer enthält ..
. Tatsächlich erfassen wir jede einzelne Ziffer.+
gefolgt von einem mathematischen Ausdruck, gemischt mit einigen magischen Perl-Variablen, die alles erheblich vereinfachen.Die spezielle skalare Variable
$&
enthält immer die Gesamtheit der letzten erfolgreichen Regex-Erfassung, in diesem Fall eine einzelne Ziffer. Die spezielle Array-Variable@+
enthält immer eine Liste der Postmatch-Offsets für die letzte erfolgreiche Übereinstimmung, dh den Index des Texts nach der Übereinstimmung.$+[0]
ist der Index im$_
unmittelbar folgenden Text$&
. Im Fall von135
erfassen wir die Ziffer1
und der Index im135
Text unmittelbar danach (nämlich35
) ist 1, was unser Exponent ist. Also wollen wir$&
(1) auf die Potenz von$+[0]
(1) erhöhen und 1 bekommen. Wir wollen 3 auf die Potenz von 2 erhöhen und 9 bekommen. Wir wollen 5 auf die Potenz von 3 erhöhen und 125 bekommen.Wenn die Eingabe war
135
, ist die resultierende Zeichenfolge+1**1+3**2+5**3
./g
und/r
./g
Weist den Interpreter an, die Ersetzungen fortzusetzen, nachdem der erste gefunden wurde (andernfalls würden wir am Ende mit enden+1**135
)./r
Weist den Interpreter an, die ursprüngliche Zeichenfolge nicht zu ändern und stattdessen die Zeichenfolge zurückzugeben, die nach den Ersetzungen verwendet werden soll. Dies ist wichtig, da es sonst überschreiben würde$_
und wir es zu Vergleichszwecken benötigen.Sobald die gesamte Substitution abgeschlossen ist, erhalten wir einen mathematischen Ausdruck, der mit der
eval
Funktion ausgewertet wird .+1**1+3**2+5**3
ausgewertet wird1 + 9 + 125 = 135
, die mit der ursprünglichen Nummer verglichen wird135
. Da diese beiden gleich sind, gibt der Code die Nummer aus.quelle
map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
"@+"
ist 1 Byte kürzer als$+[0]
:)JavaScript (ES7),
10591898883798281 ByteDanke an Arnauld für die Einsparung von 20B und an ETHProductions für die Einsparung von 6B!
Verwendung
Weisen Sie die Funktion einer Variablen zu und geben Sie das Minimum und das Maximum als Argumente an. Beispiel:
Ausgabe
Weiteres Golfen
Das scheint ziemlich gut zu sein, aber es gibt immer Raum für Verbesserungen ... denke ich.
quelle
d**(e+1)
umd**-~e
zwei Bytes zu speichern.&
anstelle von verwenden&&
. Noch ein Byte ...JavaScript (Firefox 52+), 68 Byte
Rekursive Funktion, die über ausgibt
alert
. Funktioniert in der Developer Edition von Firefox, die Sie auf dieser Seite herunterladen können . Frühere Versionen von Firefox unterstützen den**
Operator nicht und kein anderer Browser unterstützt die[for(a of b)c]
Syntax.Testschnipsel
Diese verwendet
.map
anstelle eines Arrays Verständnis, undMath.pow
statt**
, so dass es in allen Browsern , dass die Unterstützung ES6 funktionieren sollte.Code-Snippet anzeigen
quelle
05AB1E , 12 Bytes
2 Bytes dank Emigna gespart
Probieren Sie es online!
quelle
ŸvygLySmOyQ—
sollte für 12 Bytes funktionieren.Python 3, 100 Bytes
Nicht der kürzeste Ansatz, aber ein ziemlich süßer. Es gibt endlich viele Disarien; Einen guten Beweis finden Sie auf der OEIS-Seite. Das sind alles.
quelle
R, 100 Bytes
Unbenannte Funktion, die
n
und dauertm
. Wie immer in R ist das Aufteilen von ganzen Zahlen in einen numerischen Ziffernvektor mühsam und verbraucht viele Bytes. Dies macht die Funktion relativ langsam und funktioniert nur für 32-Bit-Ganzzahlen.quelle
Jelly , 11 Bytes
Probieren Sie es online!
Habe es von 16 auf 11 geschafft, mit etwas Hilfe von @miles!
Erläuterung:
quelle
J
, um Indizes abzurufen. Ein kürzerer Weg sein könnte ,D*J$S⁼
um Ihre zwei Verbindungen miteinander zu kombinierenCJam , 23 Bytes
Probieren Sie es online!
Erläuterung
quelle
05AB1E , 18 Bytes
Probieren Sie es online!
quelle
Python 2.X, 92 Bytes
quelle
(i+1)
, aber dies ist kein Problem, wenn Sie die Klammern auf diese Weise entfernen-~i
.list('k')
, was ich nicht habe. Sie können jedoch weiterhin das Leerzeichen entfernen :)Python 2 , 84 Bytes
Ein vollständiger Programmansatz, der derzeit genauso lang ist wie die Lambda-Lösung.
Probieren Sie es online!
quelle
input()
. Sehr schön! +1.Japt, 15 Bytes
Online testen! Dies war eine Zusammenarbeit zwischen @obarakon und mir.
Wie es funktioniert
Akzeptiert in der neuesten Version von Japt
x
eine Funktion als Argument, mit der wir ein weiteres Byte abarbeiten können :Online testen!
quelle
Clojure, 107 Bytes
Die Umsetzung der Gleichung ist furchtbar lang.
quelle
(.pow(-(int v)48M)
TI-Basic, 85 Bytes
quelle
int(log(
jede Zahl und dann die Befugnisse. Vielleicht ist das kürzer, aber ich bezweifle es.FUNC
Modus befinden und das Fenster muss so eingerichtet sein, dass es Ihren Eingabepunkt enthält. Scheint mir nicht tragbar genug.FUNC
Modus, obwohl ich sehe, was Sie über die Eingangsauflösung sagen. Diese Methode ist jedoch beim Golfen weit verbreitet. Du könntest immerPrompt X,Y
stattdessen.Haskell, 61 Bytes
Anwendungsbeispiel
5 # 600
->[5,6,7,8,9,89,135,175,518,598]
.Überprüfen Sie jede Zahl
i
im Bereich[n..m]
. Die Ziffern werden extrahiert durch Dreheni
in eine Zeichenfolge (show
) und machen jeden char ein eine Element - String (pure
) , die in eine Ganzzahl gedreht wird wieder (read
). Zippen Sie das Zahlenelement mit[1..]
über die Funktion^
und nehmen Sie dassum
.quelle
PHP,
929188 Bytes3 Bytes gespeichert dank @AlexHowansky
Nimmt Eingaben von Befehlszeilenargumenten entgegen. druckt ein nachstehendes Komma. Laufen Sie mit
-r
.quelle
for([,$n,$m]=$argv;$n<=$m;
"$n"[index]
und Parserfehler"_$n"[index]
während"89"[index]
und$s="$n";$s[index]
vollkommen in Ordnung sind.("_$n")[index]
Mathematica, 59 Bytes
Unbenannte Funktion, die zwei Ganzzahlargumente verwendet und eine Liste von Ganzzahlen zurückgibt.
(d=IntegerDigits@#)^Range@Length@d
erzeugt die Liste der Ziffern einer Zahl mit den entsprechenden Befugnissen;Tr[...]==#
Erkennt, ob die Summe dieser Ziffernkräfte der ursprünglichen Zahl entspricht.quelle
MATLAB,
8873 BytesUrsprüngliche Antwort:
num2str(n)-'0'
teilt an
in einen Vektor seiner Ziffern auf und1:floor(log10(n))+1
ist ein Vektor, der eins zur Anzahl der Ziffern in enthältn
. Dank einer anonymen Funktion, die 15 Bytes spart , können Sie sich für den Golf anmelden .quelle
Haskell ,
82 7675 BytesProbieren Sie es online! Verwendung:
5 ! 175
Dies überprüft jede Zahl im Bereich,
n
umm
festzustellen , ob es sich um eine Disarium-Nummer handelt, und ist daher für große Zahlen recht langsamm
.Schnellere Version: (93 Bytes)
Probieren Sie es online!
quelle
C (gcc) , 136 Bytes
Header, der pow auf TIO definiert, weil aus irgendeinem Grund pow nicht automatisch eingeschlossen wurde. Mein Computer hat es getan, also werde ich damit anfangen.
Probieren Sie es online!
quelle
MATL , 16 Bytes
Probieren Sie es online!
quelle
Batch, 115 Bytes
Batch hat nur eine 32-Bit-Arithmetik, mit der die letzte Disarium-Nummer nicht verglichen werden kann. Wenn Sie jedoch auf String-Vergleichen bestehen, gilt für 402 Bytes Folgendes:
quelle
Python 2, 100 Bytes
Ich hatte noch keine Chance, dies auszuführen (dies auf meinem Telefon zu tun).
quelle
sum
.i
eine neue Zeile ausgeben, in der sich ein Disarium befindet. Ich habe keine Ahnung, ob dies erlaubt ist, aber ich würde nein sagen, da die Ausgabe sehr leer wird.Scala,
132129 Bytes129 edit: Ändert den Variablennamen der for-Schleife von
&
aufi
gespeicherte drei Leerzeichen.Erläuterung
Für jeden Wert im Eingabebereich:
+""
zipWithIndex
diese Option, um eine Liste von Tupeln zu erstellen, die ein Zeichen der Ziffer und ihres Index enthaltenBemerkungen
Endlich habe ich gelernt, wie
fold
und wie ichzipWithIndex
arbeite. Ich bin mit denint
Konvertierungen unzufrieden , aber ich bin mit der Prägnanz vonfold
und zufriedenzipWithIndex
.quelle
Oktave,
8887 BytesDank an MattWH für das Speichern eines Bytes (f (x) -48 vs f (x) - '0')
Zu rennen:
Erläuterung
quelle
C
175169 BytesUngolfed-Version:
Kann irgendwie gekürzt werden, aber ich sehe es im Moment nicht.
@ TuukkaX Vielen Dank für das Speichern von 6 Bytes.
quelle
n!=0
kann in geändert werdenn
.Java
Erläuterung
quelle
Python 3: 131 Bytes
Nach der Erstellung dieses Codes hat sich herausgestellt, dass es nur eine begrenzte Anzahl von Disarien gibt. Daher ist es möglicherweise sinnvoller, diese explizit zu überprüfen, als so viel Listenverständnis zu verwenden, das große Eingaben in diese Lösung erschwert.
Probieren Sie es online!
quelle