Inspiriert von diesem CMC
Führen Sie bei einer positiven Ganzzahl größer als 0 die folgende Operation aus:
- Wenn alle zehn einzelnen Ziffern (
1234567890
) mindestens einmal in der Nummer enthalten sind, geben Sie den Zähler aus und beenden Sie das Programm - Andernfalls verdoppeln Sie die Zahl und wiederholen Sie den Vorgang, indem Sie die Anzahl erhöhen.
Die Zählung beginnt bei 0 und gibt an, wie oft die Eingabe verdoppelt wurde. Wenn die Eingabe beispielsweise 617283945 wäre, müsste sie einmal verdoppelt werden, da 1234567890 alle 10 Ziffern enthält.
Dies ist ein Code-Golf, also gewinnt der kürzeste Code. Die Eingabe kann nach Belieben als Zeichenfolge erfolgen.
Testfälle
input => output
617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55
n
gibt es einigek
solche , die vonnk
Pandigital ist? Ich würde gerne einen Beweis sehen.Antworten:
Python 3 , 39 Bytes
Probieren Sie es online!
Ausgänge
False
für0
.quelle
J ,
2423 BytesProbieren Sie es online!
Erläuterung
quelle
05AB1E ,
1110 Bytes-1 byte dank scottinet
Probieren Sie es online! oder als Test Suite
quelle
use x
aber das ist auch 10 ... Schöne Antwort. Der Gedankex
würde verschwindenD
, aber es ist die gleiche Idee.Perl 6 ,
3128 Bytes (27 Zeichen)-3 Bytes dank @Joshua
Probieren Sie es online!
Erläuterung: Immer noch dasselbe Konstrukt zum rekursiven Generieren von Listen. Das erste Element ist die angegebene Zahl (
$_
), jedes nächste Element ist das 2-fache der vorherigen (2×*
- wir verwenden ×, da es, obwohl 2-Byte-Zeichen, immer noch 1 Byte billiger ist als2 * *
), und wir tun dies, bis die Endbedingung von*.comb.unique>9
erfüllt ist dh wenn die Nummer mehr als 9 eindeutige Zeichen enthält. (Technisch gesehen zerlegen wir die Zeichenfolge in eine Liste mit Zeichen.comb
, erzwingen sie in eine Menge mit.Set
(natürlich enthalten Mengen jedes Element nur einmal) und vergleichen sie mit 9, wodurch die Menge in einen numerischen Kontext versetzt wird, was wiederum ergibt die Anzahl der Elemente.)Schließlich subtrahieren wir 1 von dieser Liste. Die Liste wird wiederum in einen numerischen Kontext gezwungen, sodass 1 weniger als die Länge dieser Liste zurückgegeben wird.
quelle
.Set
anstelle von.unique
3 Bytes speichern.JavaScript (ES6) + big.js ,
84747370 BytesVielen Dank an @ ConorO'Brien für das Speichern von 10 Byte, indem big.js anstelle von bignumber.js vorgeschlagen wird. Vielen
Dank an @Rick Hitchcock für -1 Byte.
Vielen Dank an @Shaggy für -3 Byte
Übernimmt die Eingabe als String; unterstützt bis zu 2 69, da die automatische Konvertierung der wissenschaftlichen Notation über diesen Punkt hinaus erfolgt.
Testschnipsel
Unendlicher Bereich,
106888784 BytesWenn Sie die Option config verwenden, um die wissenschaftliche Notation bei der Konvertierung von Zahlen in Zeichenfolgen effektiv zu deaktivieren, können Sie einen nahezu unendlichen Bereich festlegen.
Code-Snippet anzeigen
quelle
BigNumber
Bit mit big.js verkürzen ?new
es in diesem optional ist. Wird aktualisiert, danke!f=n=>[..."0123456789"].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))
."4"+2**29
: tio.run/##BcGxDkAwEADQb2GQO41LNBZDbX7AKgbhKkSu0jZSX1/…Jelly ,
12, 11 BytesProbieren Sie es online!
Erläuterung:
quelle
Haskell , 46 Bytes
Probieren Sie es online!
quelle
J, 43 bytes
Try it online!
Defines an anonymous function. Collects results quite suboptimally. Check out miles's superior answer here!
quelle
^:a:
:1#@}.+:^:(10>#@~.@":)^:a:
Haskell, 44 bytes
quelle
Clojure,
1158982 bytes-26 bytes by just using a string to represent the list of characters (duh, in retrospect), and changing from using recursion to
loop
, which allowed me to make a couple of optimizations.-7 bytes by getting rid of the call to
bigint
. Apparently we only need to handle input that won't cause an overflow.Pregolfed:
quelle
every?
anstelle vonempty? (remove …
:#(loop[n % c 0](if(every?(set(str n))"1234567890")c(recur(* 2 n)(inc c)))))
Netzhaut , 85 Bytes
Probieren Sie es online! Link enthält Testfälle. Leicht laufzeitoptimiert. Erläuterung:
Duplizieren Sie die eingegebene Nummer.
Deduplizieren Sie die Ziffern in der ersten Kopie.
Wenn noch 10 Stellen übrig sind, löschen Sie beide Nummern, andernfalls löschen Sie einfach die erste Kopie. Beachten Sie, dass das Löschen beider Nummern dazu führt, dass der Rest der Schleife nicht mehr ausgeführt wird.
#
Stellen Sie eine vor große Ziffern.Verdoppeln Sie jede Ziffer.
Fügen Sie in die Trage.
Deal mit einem führenden Carry.
Hänge eine
@
und Schleife an, bis alle 10 Ziffern gefunden sind.Gibt die Anzahl der
@
hinzugefügten s aus.quelle
APL (Dyalog Unicode) , 19 + 2 = 21 Bytes
Probieren Sie es online!
Dies ist ein dyadischer
Dfn
( d irect f unctio n ), 0 als sein linkes Argument nimmt und die ganze Zahl als rechts. Da die Eingabe nur die Ganzzahl sein soll, habe ich der Byteanzahl 2 Bytes für das Argument hinzugefügt0∘
.f←
ist nicht in der Byteanzahl enthalten, da dies nicht erforderlich ist . Es macht es einfach einfacher, die Testfälle zu erstellen.Wie es funktioniert:
Die Überschriften: Ich habe diese nach einigem Chatten im APL-Raum aus der Byteanzahl entfernt, da die Funktion das tut, was sie tun soll, und die Ergebnisse nur aufgrund der Standardeinstellungen von APLs REPL falsch sind.
⎕FR←1287
Stellt die F loat R ePresentation bis 128-Bit - Dezimalzahl (7 wird der Code für dezimale in APL REPL).⎕PP←34
Stellt die P RINT P recision bis 34 Ziffern. Beide werden benötigt, da die Standarddarstellung von APL für große Zahlen sie in eine wissenschaftliche Notation (z. B. 3.14159265359E15) umwandelt, die den Code erheblich durcheinander bringt.quelle
Java 8,
1321108774 Bytes-57 Bytes dank @ OlivierGrégoire .
Erläuterung:
Probieren Sie es hier aus. (Hinweis: Der Testfall für
2
ist deaktiviert, da er bei 2 68 enden sollte, die Größe vonlong
ist jedoch auf 2 63 -1 begrenzt.)Alte 132 Bytes antworten mit
String
Eingabe und Regex:Probieren Sie es hier aus. (Hinweis: Testfall für
2
ist deaktiviert, da er aufgrund einer leicht zu hohen Rekursion eine StackOverflowException verursacht.)Der gesamte reguläre Ausdruck, der überprüft werden soll, ob der String alle 9 Ziffern enthält
^(?=.*0)(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5)(?=.*6)(?=.*7)(?=.*8)(?=.*9).*$
, verwendet eine positive Vorausschau für den gesamten String.quelle
2^68
als erste pandigitale Zahl erwarten , Longs in Java jedoch auf beschränkt sind2^63-1
.reduce
\ o /(?:.*?(\d)(?!.*\1)){10}
Schale , 10 Bytes
Probieren Sie es online!
Erläuterung
quelle
Mathematica,
5948474638 Bytes-9 Bytes dank Jenny_mathy.
Probieren Sie es online mit Mathematik!
quelle
a
wird funktionieren, aber "a" wird nicht.Print/@f/@{617283945,2,66833,1234567890,100,42}
R 74 Bytes
Probieren Sie es online! Beachten Sie, dass R die falsche Antwort auf gibt
f(2)
da in der Sprache nur begrenzte Ganzzahlen gespeichert werden.Erläuterung: Für den Test der Pandigitalität wird die Eingabe durch Verknüpfen mit einer leeren Zeichenfolge in einen Zeichenvektor gezwungen und dann in einzelne Ziffern aufgeteilt. Wir prüfen dann, ob alle 0: 9 im resultierenden Vektor vorhanden sind; Wenn nicht, erhöhen wir den Zähler, verdoppeln die Eingabe und wiederholen.
Der Zähler verwendet F, das als FALSE initialisiert wird. Um sicherzustellen, dass es in numerisch umgewandelt wird, multiplizieren wir es vor der Rückkehr mit eins.
quelle
c(x,"")
ist ein ordentlicher Trick fürel(strsplit(...))
PowerShell ,
70 bis69 ByteProbieren Sie es online!
(Fast doppelt so lange wie die Python-Antwort: - \)
Nimmt Eingaben auf
$args[0]
, wandelt sie in eine um[bigint]
und speichert sie in$n
. Gibt einefor
Schleife ein. Bei jeder Iteration wird geprüft, ob die$n
Umber in einen String konvertiert wurde und dann in einchar
-array, wennGroup-Object
zusammengenommen, ein.count
-l
ess than odere
qual to hat9
. Dies bedeutet, dass es nur dann gleich 10 ist, wenn mindestens eine Ziffer jeder Zahl1234567890
vorhanden ist. Wenn ja, verlassen wir die Schleife. Wenn nicht, fahren wir$n*=2
fort. Bei jeder Iteration innerhalb der Schleife erhöhen wir sie einfach$i
. Wenn wir die Schleife verlassen, geben wir einfach aus$i
.Beachten Sie, dass bei Eingaben, bei
1234567890
denen beispielsweise jede Ziffer bereits berücksichtigt ist, nichts ausgegeben wird. Dies ist ein falscher Wert in PowerShell und entspricht der Umwandlung0
als[int]
. Wenn das nicht in Ordnung ist, können wir+
der Ausgabe einfach ein voranstellen,$i
um sie explizit als Ganzzahl zu setzen.Dank Roland Heath ein Byte gespart.
quelle
Pyth , 11 Bytes
Testsuite .
Erste natürliche Zahl,
T
beiinput << T
der die Anforderung erfüllt ist.quelle
Perl 5 , 52 + 1 (-p) = 53 Bytes
Probieren Sie es online!
quelle
Perl, 43 + 1 Bytes
Unter Verwendung der
-p
Flagge. Dies baut auf der oben von Xcali bereitgestellten Lösung auf.quelle
Schnelle 4 , 111 Bytes
Hinweis: Funktioniert wegen Überlauf nicht für x = 2.
Erläuterung - Eingabe x wird zuerst in Zeichenfolge typisiert. Dann entfernt Set () die sich wiederholenden Zeichen. Dann wird es sortiert, um das Ergebnis abzugleichen. Wenn es nicht übereinstimmt, ist x doppelt und der Zähler wird erhöht.
quelle
Rubin,
46453938 BytesProbieren Sie es online!
Aktualisierung:
def f n;
anstelle vondef f(n);
.…[9]
anstelle von….size==10
quelle
Japt , 15 Bytes
Versuch es
Erläuterung
Implizite Eingabe einer Ganzzahl
U
.Erstellen Sie ein Array von Ganzzahlen von
0
bis99
und durchlaufen Sie jeweils eine Funktion, bei derX
es sich um das aktuelle Element handelt.U
multipliziert mit 2 erhöht auf die Potenz vonX
.Holen Sie sich den Index des ersten Elements und geben Sie dann true zurück, wenn Sie die folgende Funktion durchlaufen.
Teilen Sie in eine Reihe von Ziffern und entfernen Sie die Duplikate.
Holen Sie sich die Länge des Arrays und überprüfen Sie auf Gleichheit mit
10
.Alternative, 15 Bytes
Versuch es
Erläuterung
Implizite Eingabe einer Ganzzahl
U
.Beginnen Sie mit
0
, und geben Sie die erste Zahl zurück, die true zurückgibt, wenn die folgende Funktion ausgeführt wird. Dabei handeltX
es sich um die aktuelle Zahl.Wie oben, multiplizieren Sie
U
mit 2, um die Potenz vonX
.In ein Array von Ziffern aufteilen, Duplikate entfernen und wieder zu einer Ganzzahl zusammenfügen.
Konvertieren Sie in einen String, ermitteln Sie die Länge und konvertieren Sie zurück in eine Ganzzahl.
Prüfen Sie auf Gleichheit mit
10
.quelle
QBIC , 48 Bytes, nc
Dies sollte theoretisch funktionieren. In der Praxis schlägt dies jedoch fehl, da QBasic zehnstellige Zahlen (die mindestens erforderlich sind, um alle Ziffern zu erhalten) in wissenschaftlicher Notation umsetzt. Ich habe sie aus diesem Grund als nicht konkurrierend markiert.
Erläuterung
quelle
GNU DC, 61 Bytes
Die Eingabe wird vom oberen Ende des Stapels kopiert (der ansonsten leer sein muss). Die Ausgabe wird nach oben geschoben.
Erläuterung
Wir verwenden die Array-Variable
a
, speichern eine 1 in,a[d]
wenn eine Zifferd
vorhanden ist, andernfalls fallen wir dort auf 0 zurück. Wir verwenden die GNU-Erweiterung~
, um Quotienten und Rest in einem einzigen Befehl zu erhalten.Als Bonus funktioniert dies in beliebigen Zahlenbasen (nicht nur in Dezimalzahlen): Stellen Sie einfach den gewünschten Eingaberadix ein (die Konstante
11
in der Definition vonf
wird anhand dieser Zahlenbasis gelesen, ist also automatisch korrekt).Prüfung
quelle
REXX, 57 Bytes
quelle
q / kdb + 33 Bytes
Lösung:
Beispiele:
Erläuterung:
Alle Bytes sind gleich, möglicherweise können Sie dieses ein wenig weiter nach unten spielen. Verwendet das
scan
Adverb von q :Anmerkungen:
Wenn wir auf die sinken
k
Eingabeaufforderung gehen, können wir eine 25-Byte-Lösung haben. Konvertiert die Zahl in eine Liste von Zeichen:quelle