Das Factorial Number System , auch factoradic genannt, ist ein gemischtes Radix-Zahlensystem. Die Fakultäten bestimmen den Stellenwert einer Zahl.
In diesem System kann die Ziffer ganz rechts entweder 0 oder 1 sein, die zweite Ziffer ganz rechts kann 0, 1 oder 2 sein und so weiter. Dies bedeutet, dass eine n
ziffernfaktoradische Zahl einen Maximalwert von haben kann (n + 1)!
.
Um beispielsweise die faktoradische Zahl 24201
in eine Dezimalzahl umzuwandeln, gehen Sie folgendermaßen vor:
2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349
Daher ist die faktoradische Zahl 24201
die 349
Basis 10
.
So konvertieren Sie eine Dezimalzahl (mit 349
als Beispiel) in eine faktoradische Zahl:
Nehmen Sie die größte Fakultät kleiner als die Zahl. In diesem Fall ist es 120
oder 5!
.
349 / 5! = 2 r 109
109 / 4! = 4 r 13
13 / 3! = 2 r 1
1 / 2! = 0 r 1
1 / 1! = 1 r 0
Daher 349
Basis 10
ist die Zahl factoradic 24201
.
Ihre Herausforderung besteht darin, das kürzeste Programm oder die kürzeste Funktion zu erstellen, die eine eingegebene Nummer in die andere Basis umwandelt.
Die Eingabe ist eine Zeichenfolgendarstellung einer nicht negativen Ganzzahl. Einer faktoradischen Zahl wird ein !
(z. B. !24201
) vorangestellt , während einer Dezimalzahl nichts vorangestellt wird. Sie können davon ausgehen, dass die maximale Eingabe 10! - 1
- 3628799
dezimal und 987654321
faktoradisch - erfolgt. Dies bedeutet, dass in einer faktoradischen Eingabe / Ausgabe keine Buchstaben erscheinen.
Das Programm muss a keiner !
faktoradischen Ausgabe voranstellen und kann eine Zeichenfolge oder eine Ganzzahl ausgeben. Die Eingabe kann in jedem vernünftigen Format erfolgen.
Testfälle:
Input: 1234
Output: 141120
Input: 746
Output: 101010
Input: !54321
Output: 719
Input: !30311
Output: 381
quelle
⍴⍵∩'!'
mit'!'∊⍵
einem Zeichen zu speichern.~'!'
durch∩⎕D
, um ein Zeichen zu speichern.Python 2.7 (
163157152)Mehr lesbare Version:
Nervenzusammenbruch:
quelle
'!'==i[0]
mit'!'in i
und verwenden könnena=x=1
. Außerdem benötigen Sie keine eckigen Klammern um die exec-Anweisung.(len(i)-1)
mit~-len(i)
.(a,b)['!'in i]
und habe es geschafft, 6 Zeichen zu entfernen. Es ist nicht so lesbar wie es war ... Pastebin-LinkGolfScript (
48 4443 Zeichen)Dies ist ein eigenständiges Programm. Die Konvertierung von Faktor => Dezimal ist recht langsam, da bei der Suche die Konvertierung von Dezimal => Faktor und nicht die direkte Basis verwendet wird.
Das Eingabeformat ermöglicht einen sehr kurzen Moduswechsel:
.~
Kopiert die Eingabezeichenfolge und wertet sie aus. Wenn die Eingabe also nur eine Zahl ist, die wir zB"1234" 1234
auf dem Stapel haben, und wenn sie mit!
(logisch nicht, mit einer nicht leeren) beginnt string being truthy) landen wir zB0 30311
auf dem Stack. Dann ist der Wert am unteren Ende des Stapels für dezimal => faktorisch und für faktorisch => dezimal falsch.quelle
PHP <7.1
178 171 170 168 164 155 147 144 138 126123 BytesLaufen Sie als Pipe mit
-r
oder testen Sie es online .Unterfunktionerforderlich: Die Fakultätsbasis wird wiederverwendet (in den Schleifen erhöht / verringert)Dezimal 0 gibt anstelle von leere Zeichenfolge zurück(Beide anderen PHP-Antworten tun dies auch.)0
.Wenn dies nicht akzeptabel ist, fügen Sie +5 für den zusätzlichen Fall hinzu.ungolfed:
Verlassene Golfideen:
$b<=$x
->$b<$x
(-1)würde reine Dezimalfaktoren auflösen (dh diejenigen, die eine Fakultätszahl mit nur einer Ziffer ungleich Null ergeben). Darunter leidet die Lösung von JMPC. HamZa´s nicht.
floor($x/$b)
->(int)($x/$b)
könnte etwas schneller sein, aber Typ Casting geht der Division voraus, daher brauche ich die Klammern und gewinne kein Byte.
$x/$b|0
macht den TrickDie Schleife in fact-> dec ähnelt der Fakultätsfindung in dec-> fact. Gleiches Inkrement, Körper spielt keine Rolle, aber leider unterschiedliche Voreinstellungen und unterschiedliche Nachbedingungen. Dang; hätte dort -21 golfen können.Ja, ich habe eine Lösung gefunden. Hat einiges Golf gespielt, aber ein weiteres -4 (no: -9) abgeschnitten und alle Bugs / Lücken geschlossen.
Noch mehr Potenzial ... oder bin ich fertig mit Golfen?
quelle
+$r
anstatt$r|0
ein Byte zu speichern. Gleiches gilt fürif($x|0)
JavaScript (ES 6)
139 137 122 113111habe einen anderen Ansatz mit Array-Magie ausprobiert; aber ich endete mit
174172 Bytes:Also habe ich einfach meinen PHP-Code genommen und übersetzt. Konnte alle
$
s und ein paar entfernen;
, aber die Notwendigkeit, vars zu initialisieren, hat einen Teil dieses Vorteils aufgezehrt. Schaffte es, beide Antworten etwas weiter nach unten zu spielen.Golf gespielt
ungolfed
Testsuite
quelle
.split('')
=>.split``
f=
. Kann auchr+=(x/(b/=j--)|0)
seinr+=x/(b/=j--)|0
?Perl 6 ,
666560 Bytes-1 Byte danke an Jo King
Probieren Sie es online!
quelle
GolfScript, 69 Zeichen
Nimmt die Eingabe von STDIN wie gewohnt und druckt das Ergebnis. Online-Test .
quelle
Haskell, 221 Zeichen
Code Golf
Verwendung
Ungolfed Code
quelle
Mathematica
213 177175Eine Fakultätszahl wird eingepackt
f[]
, egal ob es sich um eine Eingabe oder eine Ausgabe handelt.Verwendung
Umwandlung von Fakultät in Dezimalzahl .
QuotientRemainder[n,j!]
Wirkt rekursiv auf die Ziffern der Fakultätszahl von links nach rechts und dekrementiert siej
bei jedem Schritt.QuotientRemainder[349, 5!]
kehrt zum Beispiel zurück{2, 109}
und so weiter.Umwandlung von Dezimalzahlen in Fakultätszahlen . Bei Bewegung von rechts nach links
# (p++)! &
multipliziert die reine Funktion jede Ziffer#
mit der entsprechenden Fakultät.quelle
Python, 128 Zeichen
Das dauert ungefähr eine halbe Stunde, ist aber klein:
Es wird eine Liste aller faktoradischen Zahlen mit <= 9 Stellen in numerischer Reihenfolge erstellt und anschließend eine Suche oder ein Index zur Konvertierung durchgeführt.
Wenn Sie testen möchten, ersetzen Sie einfach
10**9
mit10**6
und beschränken Sie sich auf 6-stellige variadische Zahlen.Ich könnte einen Charakter technisch speichern, indem ich ihn
range(10**9)
anstelle von benutzexrange(10**9)
. Versuchen Sie das nicht zu Hause.quelle
d+2
und wird kein Leerzeichen benötigt.for
PHP
231214204Neueste Antwort
Alte Antwort
Beispiel
Ausgabe
quelle
foreach(range())
kann durch eine einfachefor
Schleife (-9) ersetzt werden. Die Idee gefällt mir allerdings.24
sollte zurückkehren1000
, kehrt aber zurück400
. Fix:g(++$p)<$x
->g(++$p)<=$x
(+1)for
Konstrukt:,
sollte;
3) Ich habe weitere 7 Änderungen, die 20 Bytes in diesem Code einsparen. Will diese?if
Bedingung invertieren , dann verwenden Mein sexy Typ wird auf int (-6) geworfen. Dies hat keinen Einfluss auf das Ergebnis von Dezimal 0! e) Das verbleibendefor
Konstrukt kann mit einem sehr nettenwhile(++$t<$c=strlen($x))
: Inkrement vor Körper umgeschrieben werden -> $ t braucht keine Initialisierung (-6)JELLY, 5 Bytes
Erläuterung
* Jelly ist jünger als das Alter der Frage, daher ist meine Antwort nicht konkurrierend.
quelle
V
und zu verwendenṾ
.)Gelee , 15 Bytes
Probieren Sie es online!
Wie es funktioniert
Warum
*)
funktioniert¬
ist elementweise logisch NICHT. Wenn eine einzelne Ganzzahl angegeben wird, wird sie zu einer einzelnen Null, was falsch ist. Wenn jedoch eine Zeichenfolge angegeben wird, wird jedes Element (Zeichen) auf Null gesetzt, und das gesamte Ergebnis ist ein Array von Nullen, das wahr ist.Null als Ganzzahl ist ein Sonderfall. Es geht durch die "Fakultät -> Ganzzahl" Route, aber es gibt immer noch Null, was korrekt ist.
Ohne eingebaute Fakultätsbasis 25 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
K 102
Könnte definitiv verbessert werden.
quelle
D (159 Zeichen)
Ungolfed und mit Programmeinstieg
Alle Befehlszeilenargumente werden als gedruckt
<original> -> <converted>
. In wird nur dezimal nach faktoradisch implementiertx
. Umgekehrt wird nurx
mit allen Dezimalzahlen (0 .. *) gerufen, bis das Ergebnis der Eingabe entspricht. Dies dauert ca. 3 Sekunden für die größte Eingabe (! 987654321).Ausführbare Online-Version: http://dpaste.dzfl.pl/46e425f9
quelle
string n
,char[]n
um ein Byte zu sparen (ich weiß, dass ich zu spät bin).if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}
kann werdenif(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
, um zwei Bytes zu sparen.VBA 225
Vielen Dank an Titus für die Hilfe! Ich freue mich immer noch auf Golf.
quelle
b
nach einem numerischen Wert zu suchen, anstatt das erste Zeichen zu vergleichen?If Not IsNumeric(b) Then
aber das braucht mehr Zeichen. Jetzt habe ich nicht mehr den gesamten Code überprüft. Es kann einen etwas besseren Weg geben, dies mitIsNumeric
insgesamt zu tun . - Korrektur, hier gibt es eine leichte Verbesserung. Vielen Dank!For d=9To 1Step-1
undFact(d)
->For d=0To 8
undFact(9-d)
und noch zwei, wenn Sie dies tunFor d=2To e
undFact(e-d+1)*Mid(b,d,1)
PHP , 124 Bytes
Probieren Sie es online!
Verlängert
quelle
Perl 6 , 150 Bytes
quelle
APL (NARS), 36 Zeichen, 72 Byte
es scheint, dass 10.2 (9..2) ⊤ besser ist als die rekursive Funktion, dank Howard für die andere APL-Lösung, die das zeigt ... (auch wenn ich nicht 100% verstehe). Eingabe für Zahlen ohne '!' <10 !. Prüfung:
quelle