Nehmen Sie eine positive ganze Zahl X
. Diese Zahl ist Teil der Sequenz, an der wir interessiert sind, wenn die Summe aller Ziffern X
ein Teiler von X
ist und wenn das Produkt aller Ziffern X
ein Teiler von ist X
.
Zum Beispiel 135
ist eine solche Zahl, weil 1 + 3 + 5 = 9
die sich teilt 135 = 9 * 15
und 1 * 3 * 5 = 15
die sich auch teilt 135
.
Dies ist die Sequenz A038186 im OEIS.
Ihre Aufgabe: Geben Sie bei einer Ganzzahl N
die N
dritte positive Ganzzahl mit solchen Eigenschaften aus.
Eingänge und Ausgänge
Zahlen können
0
-indexiert oder1
-indexiert sein; Bitte geben Sie an, welche Antwort Sie verwenden.Die Eingabe kann
STDIN
als ein Funktionsargument oder etwas Ähnliches durchgenommen werden.Die Ausgabe kann auf
STDOUT
eine Funktion oder auf eine ähnliche Weise gedruckt oder von dieser zurückgegeben werden.
Testfälle
Die folgenden Testfälle sind 1
indiziert.
Input Output
1 1
5 5
10 12
20 312
42 6912
50 11313
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
quelle
0
.Antworten:
05AB1E ,
1312 BytesDanke an Emigna für das Speichern eines Bytes!
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
µNNSONSP‚ÖP½
funktioniert auch, nicht wahr?Pyke, 14 Bytes (nicht konkurrierend) (1-indiziert)
Probieren Sie es hier aus!
Mein Gott, was für viele neue Funktionen.
Davon sind nicht wettbewerbsfähig
I
dem nur geprüft wurde, ob das erste Element auf dem Stapel wahr istdigits
- Eine Liste der Ziffern in der Nummer zurückgeben@
Dient zum Abrufen des n-ten Elements einer unendlichen ListeDavon wurden zum ersten Mal verwendet:
Entfernen Sie die letzten 2 Bytes, um alle diese Zahlen zu erhalten.
quelle
C #, 118 Bytes
Volles Programm mit ungolfed Funktion und Testfällen:
quelle
for(int x=0,c=0;;)
Spart Ihnen 1 Byte.Jelly , 13 Bytes
1-basiert.
TryItOnline!
Wie?
quelle
Perl 6 , 44 Bytes (0-indiziert)
Erläuterung:
Unendliche Listen ftw!
quelle
*
mehr Bytes bedeuten.//0
in demgrep
Block verwende.//0
weil es normalerweise in Codegolf akzeptiert wird, um auf stderr zu drucken.//0
Eigentlich 20 Bytes
Naive Implementierung der Sequenzdefinition. Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle
Qualle , 45 Bytes
Probieren Sie es online!
Erläuterung
Dies ist mit Abstand das aufwändigste (und auch längste) Programm, das ich bisher in Jellyfish geschrieben habe. Ich habe keine Ahnung, ob ich das verständlich aufschlüsseln kann, aber ich denke, ich muss es versuchen.
Jellyfish bietet einen ziemlich allgemeinen Iterationsoperator
\
, der beim "Finden des N-ten Etwas " sehr hilfreich ist . Eine seiner Semantiken ist "eine Funktion auf einem Wert iterieren, bis eine separate Testfunktion etwas Wahres ergibt" (in der Tat empfängt die Testfunktion sowohl das aktuelle als auch das letzte Element, aber wir lassen es nur das aktuelle Element betrachten). . Wir können dies verwenden, um eine Funktion "Nächste gültige Nummer" zu implementieren. Eine weitere Überladung von\
ist "N-mal eine Funktion auf einem Startwert iterieren". Wir können unsere vorherige Funktion verwenden und sie0
N-mal durchlaufen , wobei N die Eingabe ist. All das ist ziemlich genau mit diesem Teil des Codes zusammengestellt:(Die Gründe, warum
0
die eigentliche Eingabe für die resultierende Funktion dort drüben ist, sind etwas kompliziert und ich werde hier nicht darauf eingehen.)Das Problem dabei ist, dass wir den aktuellen Wert nicht manuell an die Testfunktion übergeben. Der
\
Betreiber wird dies für uns tun. Also haben wir jetzt eine einzige unäre Funktion (über Kompositionen, Haken, Gabeln und Curry), die eine Zahl aufnimmt und uns sagt, ob es eine gültige Zahl ist (dh eine, die durch ihre Ziffernsumme und ihr Ziffernprodukt geteilt wird). Dies ist ziemlich nicht trivial, wenn Sie sich nicht auf das Argument beziehen können. Je. Es ist diese Schönheit:Das
(
ist ein unärer Hook , was bedeutet, dass es die Funktion below (f
) an seinem Eingang aufruft (den aktuellen Wertx
) und dann beide an die Testfunktion rechts (g
) übergibt , das heißt, es berechnetg(f(x), x)
.In unserem Fall
f(x)
handelt es sich um eine andere zusammengesetzte Funktion, die ein Paar mit dem Ziffernprodukt und der Ziffernsumme von ergibtx
. Das heißt, esg
wird eine Funktion sein, die alle drei Werte hat, um zu prüfen, ob siex
gültig ist.Wir beginnen damit, wie
f
die Ziffernsumme und das Ziffernprodukt berechnet werden. Das istf
:&
ist auch Komposition (aber umgekehrt).~
Wenn Sie mit currying arbeiten, erhalten Sie10~b
eine Funktion, die die Dezimalstellen einer Zahl berechnet, und da wir diese&
von rechts übergeben, passiert das als Erstes mit der Eingabex
. Der Rest verwendet diese Ziffernliste, um die Summe und das Produkt zu berechnen.Um eine Summe zu berechnen, können wir falten zusätzlich darüber, was ist
/+
. Um das Produkt zu berechnen, falten wir die Multiplikation mit/*
. Um diese beiden Ergebnisse zu einem Paar zu kombinieren, verwenden wir ein Paar Hooks(
und)
. Die Struktur hierfür ist:(Wo
f
undg
sind Produkt bzw. Summe.) Versuchen wir herauszufinden, warum dies uns ein Paar vonf(x)
und gibtg(x)
. Beachten Sie, dass der rechte Haken)
nur ein Argument hat. In diesem Fall bedeutet das andere Argument, dass es;
die Argumente in ein Paar einschließt. Außerdem können Hooks auch als Binärfunktionen verwendet werden (was hier der Fall sein wird). In diesem Fall wenden sie einfach die innere Funktion nur auf ein Argument an. Also wirklich)
auf eine einzige Funktiong
gibt eine Funktion, die berechnet[x, g(y)]
. Wennf
wir dies in einem linken Haken zusammen mit verwenden , erhalten wir[f(x), g(y)]
. Dies wird wiederum in einem unären Kontext verwendet, was bedeutet, dass es tatsächlich mit aufgerufen wirdx == y
und wir am Ende mit[f(x), g(x)]
wie erforderlich enden . Puh.Damit bleibt nur eines übrig, nämlich unsere frühere Testfunktion
g
. Erinnern Sie sich, dass es aufgerufen wird, alsg([p, s], x)
wox
noch der aktuelle Eingabewert ist,p
ist sein stelliges Produkt unds
ist seine stellige Summe. Das istg
:Um die Teilbarkeit zu testen, verwenden wir natürlich Modulo, das
|
in Jellyfish enthalten ist. Etwas ungewöhnlich ist, dass es seinen rechten Operanden modulo als linken Operanden verwendet, was bedeutet, dass die Argumenteg
bereits in der richtigen Reihenfolge vorliegen (arithmetische Funktionen wie diese ziehen sich automatisch über Listen, sodass die beiden separaten Module kostenlos berechnet werden). . Unsere Zahl ist sowohl durch das Produkt als auch durch die Summe teilbar, wenn das Ergebnis ein Nullenpaar ist. Um zu überprüfen, ob dies der Fall ist, behandeln wir das Paar als eine Liste von Basis-2-Ziffern (d
). Das Ergebnis davon ist Null, nur wenn beide Elemente des Paares Null sind. Daher können wir das Ergebnis von this (N
) negieren , um einen Wahrheitswert dafür zu erhalten, ob beide Werte die Eingabe teilen. Beachten Sie, dass|
,d
undN
sind einfach alle zusammen mit einem Paar von&
s zusammengesetzt.Leider ist das nicht die ganze Geschichte. Was ist, wenn das Ziffernprodukt Null ist? Division und Modulo durch Null geben beide Null in Jellyfish zurück. Während dies wie eine etwas seltsame Konvention erscheint, erweist es sich tatsächlich als etwas nützlich (da wir nicht auf Null prüfen müssen, bevor wir das Modulo ausführen). Es bedeutet jedoch auch, dass wir ein falsches Positiv erhalten können, wenn die Ziffernsumme die Eingabe teilt, das Ziffernprodukt jedoch Null ist (z
10
. B. Eingabe ).Wir können dies beheben, indem wir unser Divisionsergebnis mit dem Zahlenprodukt multiplizieren (wenn also das Zahlenprodukt Null ist, wird unser Wahrheitswert ebenfalls zu Null). Es erweist sich als einfacher, das Ergebnis der Teilbarkeit mit dem Paar aus Produkt und Summe zu multiplizieren und anschließend das Ergebnis aus dem Produkt zu extrahieren.
Um das Ergebnis mit dem Paar zu multiplizieren, müssen wir zu einem früheren Wert zurückkehren (dem Paar). Dies geschieht mit einer Gabel (
]
). Gabeln sind ein bisschen wie Haken an Steroiden. Wenn Sie ihnen zwei Funktionenf
und gebeng
, stellen sie eine Binärfunktion dar, die berechnetf(a, g(a, b))
. In unserem Falla
ist das Produkt / Summen-Paarb
der aktuelle Eingabewert,g
unser Teilbarkeitstest undf
die Multiplikation. Das alles berechnet sich also[p, s] * ([p, s] % x == [0, 0])
.Jetzt müssen Sie nur noch den ersten Wert daraus extrahieren, den Endwert der im Iterator verwendeten Testfunktion. Dies ist so einfach wie das Erstellen (
&
) der Verzweigung mit der head- Funktion<
, die den ersten Wert einer Liste zurückgibt.quelle
R,
132115 BytesNeue Version dank @Billywob nette Kommentare!
Ungolfed:
Da R sich mitNA
s seltsam verhält , musste ich den ganzenifelse(is.na(...))
Teil hinzufügen !Oder benutze
na.omit(...)
quelle
n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(!b%%sum(d)&ifelse(is.na((p=!b%%prod(d))),F,p))i=i+1};b
spart ein paar Bytes von:el(...)
statt[[1]]
, indemc(b,"")
stattpaste(b)
, negiert die logische Ausdrücke!
statt==0
und die geschweiften Klammern auf der Skipping -if
Anweisung. Ich vermute, dass es eine einfachere Möglichkeit geben sollte, mit demNA
Problem umzugehen, aber etwas Kluges nicht herausfinden konnte.0
an den in derif
Anweisung ausgewerteten Ausdruck ein anhängen . Dies gibt jedoch eine Warnung zurück, wenn das Produkt nicht gleich ist0
.n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b
el(...)
!Brachylog , 22 Bytes
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES6), 78
Weniger golfen
quelle
Pyth, 18 Bytes
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
JavaScript (ES6), 72 Byte
Demo
Bei höheren Werten ist der Wert in der Regel langsam, daher beschränke ich ihn hier auf 20.
Code-Snippet anzeigen
quelle
Haskell,
94857271 Bytes1-indiziert.
Vielen Dank an @Zgarb für das Speichern von 13 Bytes!
Vielen Dank an @nimi für das Speichern eines Bytes!
quelle
(==)=<<map(gcd n)$[sum k,product k]
sollte einige Bytes sparen.[sum k,product k]
kann es seinmap($read.pure<$>show n)[sum,product]
.([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
MATL , 21 Bytes
Lang und ineffizient ...
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6), 70 Byte
Dies stellte sich als ziemlich ähnlich wie die Antwort von @ Arnauld heraus, aber die Rekursion ist anscheinend 2 Bytes kürzer. Funktioniert in Chrome, obwohl es bei Eingaben über 30 sehr langsam ist (50 dauert 6 Sekunden).
quelle
Python 2,
122110 Bytes1 indiziert, müssen Sie einen Python-Interpreter mit einer recht hohen Rekursionsgrenze verwenden.
quelle
Wunder, 33 Bytes
Nullindexiert. Verwendung:
Erläuterung
Besser lesbar:
Grundsätzlich erhält man eine unendliche Liste von Zahlen, die durch ihre digitale Summe und ihr Produkt teilbar sind, indem man eine unendliche Liste von ganzen Zahlen durch ein Prädikat filtert. Dann wird der
n
dritte Punkt einfach aus der Liste genommen.quelle
Julia, 81 Bytes
Dies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt. Um es zu nennen, geben Sie ihm einen Namen. Der Ansatz ist der naheliegende: Überprüfen Sie jede Zahl, bis wir
n
Begriffe der Sequenz gefunden haben. Dieall
Überprüfung ist notwendig , um sicherzustellen , dass wir nicht bekommen , eineDivisionError
aus ,%
wenn das Produkt aus den Ziffern 0.Ungolfed:
Probieren Sie es online! (beinhaltet alle Testfälle)
quelle
prod(d)
zup
oder etwas und dann ersetzt dasall(d.>0)
mitp>0
. Und Sie können ein anderes speichern, indem Sie dasi%sum(d)
auf die andere Seite des1
ie bewegenp<1>i%sum(d)
.C89,
381226195170169 Bytes1-indiziert (gleiche exakte Antworten wie bei der Challenge).
Nimmt 4 Byte (32 Bit) an
int
(modernste Architekturen) .Ich glaube wirklich, dass dies nicht kürzer gehen kann.
Die Funktion führt
int g (int)
zu einem Speicherverlust und greift einmal pro Anruf auf den nicht initialisierten Speicher zu, führt jedoch keinen Fehler aus und gibt die richtige Nummer zurück.Vollständiges Programm, das Eingaben in unary (
./prog $(seq 1 10)
für 10) mit ungolfed (irgendwie) aufnimmt:Alte Antwort:
C99, 381 Bytes
Damit kann wohl mehr golfen werden.
Volles Programm:
quelle
int
für alles zu verwenden, da es der standardmäßige Integer-Typ ist.C 110 Bytes
Ungolfed und Nutzung:
quelle
Python3,
13480 BytesNeue Version dank Flp.Tkc
Neuer Code, ich erinnerte mich an eine spielerische Art, die Fakultät zu spielenDer Code selbst ist nicht sehr golfartig, eher wie Brute-Force-Golfg (x) ist eine Funktion, die True zurückgibt, wenn x den Kriterien entspricht.
quelle
<1
anstelle von==0
. Sie brauchen dieis True
if-Anweisung nicht, um zu prüfen, ob die Bedingung trotzdem erfüllt ist. Sie können die Backtick-Verknüpfung von Python 2 verwendenstr/repr
, um einige Bytes zu rasieren. Es gibt auch viel nicht benötigtes Leerzeichen hier.h+=g(str(k))
1 hinzu, wenn True, 0, wenn False.x
(Graviszeichen) in Python 2 die gleicherepr(x)
oderstr(x)
in Python 3 :)PHP, 96 Bytes
Dient
n
als Befehlszeilenargument.Golf gespielt
Ungolfed
quelle
PowerShell v2 +, 84 Byte
Iterative Lösung. Übernimmt die Eingabe
$n
und tritt in einefor
Schleife ein, solange sie$n
nicht Null ist. Jede Iteration subtrahieren wir vom$n
Ergebnis einer Booleschen Anweisung, die im Folgenden aufgeführt ist:Somit wird nur , wenn
$a%(sum)
und$a%(product)
sind beide gleich Null wird der Zusatz sein auch Null und damit die Boolesche-nicht wird wahr sein , und deshalb$n
verringert.Sobald wir die Schleife verlassen (dh den n-ten Term erreicht haben), platzieren wir sie einfach
$a
in der Pipeline, und die Ausgabe ist implizit.Beispiele
Hinweis: Dadurch werden STDERR eine Reihe von Fehlern "Versucht, durch Null zu dividieren" übergeben, die standardmäßig ignoriert werden. Ich habe
2>$null
dem folgenden Beispiel explizit ein hinzugefügt , um die Ausgabe zu bereinigen. Es ist auch ziemlich langsam, sobald es ungefähr30
so weit ist, und50
dauert ungefähr 45 Sekunden auf meinem Computer.quelle
BASH, 125 Bytes
quelle