Sie sollten ein Programm oder eine Funktion schreiben, die drei positive Ganzzahlen n b k
als Eingabe- und Ausgabewerte enthält oder die letzten k
Ziffern vor den nachgestellten Nullen in der Basisdarstellung b
von zurückgibt n!
.
Beispiel
n=7 b=5 k=4
factorial(n) is 5040
5040 is 130130 in base 5
the last 4 digits of 130130 before the trailing zeros are 3013
the output is 3013
Eingang
- 3 positive ganze Zahlen
n b k
wo2 <= b <= 10
. - Die Reihenfolge der Eingangszahlen kann beliebig gewählt werden.
Ausgabe
- Eine Liste der zurückgegebenen oder als Ganzzahl oder Ganzzahlliste ausgegebenen Ziffern.
- Führende Nullen sind optional.
- Ihre Lösung muss jeden Beispieltestfall auf meinem Computer in weniger als einer Minute lösen (ich teste nur enge Fälle. Ich habe einen unterdurchschnittlichen PC.).
Beispiele
Neue Tests hinzugefügt, um die Richtigkeit der Einsendungen zu überprüfen. (Sie sind nicht Teil der Laufzeitregel unter 1 Minute.)
Eingabe => Ausgabe (mit der Wahl, führende Nullen wegzulassen)
3 10 1 => 6
7 5 4 => 3013
3 2 3 => 11
6 2 10 => 101101
9 9 6 => 6127
7 10 4 => 504
758 9 19 => 6645002302217537863
158596 8 20 => 37212476700442254614
359221 2 40 => 1101111111001100010101100000110001110001
New tests:
----------
9 6 3 => 144
10 6 3 => 544
Dies ist Code-Golf, also gewinnt der kürzeste Eintrag.
code-golf
number-theory
base-conversion
factorial
randomra
quelle
quelle
7 5 3
"013" oder "13" ausgeben?7 10 4
Testfall würde ich sagen13
n
oder akzeptierenk
? Oder können wir sie auf den Bereich des Integer-Typs der Sprache beschränken?Antworten:
Dyalog APL , 23 Bytes
Dieses Programm funktioniert, solange die Fakultät die interne Repräsentationsgrenze nicht überschreitet. In Dyalog APL kann das Limit um erhöht werden
⎕FR←1287
.Angenommen, die Variablen n, b und k wurden gesetzt (z. B.
n b k←7 5 4
). Wenn Sie jedoch lieber zur Eingabe von n , b und k (in dieser Reihenfolge) auffordern möchten , ersetzen Sie die drei Zeichen durch⎕
.quelle
Mathematica,
5748 Bytes9 Bytes dank @ 2012rcampion eingespart.
quelle
b
zuerst 2 Bytes zu sparen?IntegerString[#!#2^-#!~IntegerExponent~#2,##2]&
(sowohl dieses als auch Ihr Original sind ziemlich schnell)SlotSequence
in meinem Kommentar verwendete Trick funktioniert jedoch nur mit der aktuellen Bestellung, sodass Sie nicht mehr speichern können.Python,
198192181 ZeichenEs ist schnell genug, ~ 23 Sekunden für das größte Beispiel. Und keine Fakultät eingebaut (ich sehe dich an, Mathematica!).
quelle
[2,3,2,5,3,7,2,3,5][b-2]
könnte seinint('232537235'[b-2])
, 3 Bytes zu sparen.[1,1,2,1,1,1,3,2,1][b-2]
ähnlich.111973>>2*(b-2)&3
sogar noch kürzer. Es ist die gleiche Anzahl von Bytes für die erstere obwohl (90946202>>3*(b-2)&7
).Pyth,
2635 BytesDies ist eine Funktion von 3 Argumenten, Anzahl, Basis, Anzahl der Ziffern.
Demonstration.
Der langsamste Testfall, der letzte, dauert auf meinem Computer 15 Sekunden.
quelle
PARI / GP, 43 Bytes
Die Handelsgeschwindigkeit für den Weltraum ergibt diesen einfachen Algorithmus:
Jeder der Testfälle läuft auf meinem Rechner in weniger als einer Sekunde.
quelle
Mathematica - 48 Bytes
Ungolfed:
Beispiel:
In den meisten Fällen werden die Ziffern nicht durch den einschränkenden Faktor generiert:
Die Musterübereinstimmung scheint zu sein
O(n^2)
, was dazu führt , dass die letzten beiden Testfälle die Ein-Minuten-Marke weit überschreiten.quelle
Bash / Coreutils / DC, 60 Bytes
Verwendet das
dc
Skript aus meiner Antwort, um das Faktorielle zu finden , und gibt es in der Basis aus$2
,sed
um nachfolgende Nullen abzuschneiden undtail
die letzten$3
Ziffern auszuwählen .quelle
rev
zu vereinfachen, um das Backtracking zu reduzieren, aber es istdc
das, was die CPU auffrisst ...Haskell,
111109 BytesVerwendung:
f 158596 8 20
->[3,7,2,1,2,4,7,6,7,0,0,4,4,2,2,5,4,6,1,4]
Dauert
f 359221 2 40
auf meinem 4 Jahre alten Laptop ungefähr 8 Sekunden .So funktioniert es: Falte die Multiplikation (
*
) in die Liste[1..n]
. Konvertieren Sie jedes Zwischenergebnis in eine Basisb
als Liste von Ziffern (niedrigstwertige zuerst), entfernen Sie führende Nullen, nehmen Sie dann die erstenk
Ziffern und konvertieren Sie erneut zur Basis 10. Zuletzt wieder in Basis konvertierenb
, jedoch mit der höchstwertigen Ziffer zuerst.quelle
Python 3, 146 Bytes
Ich bin nicht sicher, ob die Testfälle alle schnell genug ablaufen werden - die größeren sind sehr langsam (da sie die Nummer durchlaufen).
Probieren Sie es hier online aus (aber seien Sie vorsichtig).
quelle
Java,
303299296 BytesAuf meinem Computer beträgt dieser Durchschnitt im
359221 2 40
Testfall etwas weniger als eine Drittelsekunde. Übernimmt die Eingabe über Befehlszeilenargumente.quelle
bc 75 Bytes
Dies verwendet einige GNU-Erweiterungen, um die Codegröße zu reduzieren. Ein POSIX-konformes Äquivalent wiegt 80 Byte:
Um die Laufzeiten angemessen zu halten, schneiden wir die nachgestellten Nullen (
while(!x%b)x/=b
) ab und kürzen auf das Finalek
Ziffern (x%=b^k
), während wir die Fakultät (for(x=1;n;)x*=n--
) berechnen .Testprogramm:
Die Laufzeit der vollständigen Testsuite beträgt ca. 4¼ Sekunden auf meiner Workstation aus dem Jahr 2006.
quelle
bc
Programm (Golf oder nicht), daher sind alle Tipps besonders willkommen ...PHP, 80 Bytes
Wird wie
f(359221,2,40)
für den letzten Testfall verwendet. Läuft für alle Testfälle ziemlich flüssig.Versuch es hier !
quelle