Betrachten Sie die Ziffern einer Integralbasis über einer, die in der angegebenen Reihenfolge aufgeführt sind. Teilen Sie sie wiederholt genau in zwei Hälften, bis jeder Ziffernblock eine ungerade Länge hat:
Base Digits Subdivided Digit Chunks
2 01 0 1
3 012 012
4 0123 0 1 2 3
5 01234 01234
6 012345 012 345
7 0123456 0123456
8 01234567 0 1 2 3 4 5 6 7
9 012345678 012345678
10 0123456789 01234 56789
11 0123456789A 0123456789A
12 0123456789AB 012 345 678 9AB
...
16 0123456789ABCDEF 0 1 2 3 4 5 6 7 8 9 A B C D E F
...
Lesen Sie nun für jede Zeile in dieser Tabelle die unterteilten Ziffernblöcke als Zahlen in der Basis dieser Zeile und summieren Sie sie. Geben Sie das Ergebnis der Einfachheit halber in Basis 10 an.
Zum Beispiel...
- Für Basis 3 gibt es nur eine zu summierende Zahl: 012 3 = 12 3 = 5 10
- Für Basis 4 gibt es 4 Zahlen zu summieren: 0 4 + 1 4 + 2 4 + 3 4 = 12 4 = 6 10
- Basis 6: 012 6 + 345 6 = 401 6 = 145 10
- Basis 11: 0123456789A 11 = 2853116705 10
Herausforderung
Schreiben Sie ein Programm, das eine ganze Zahl größer als eins als Basis verwendet und diese Unterteilungssummenprozedur ausführt, wobei die endgültige Summe in Basis 10 ausgegeben wird . (Wenn also der Eingang 3
der Ausgang ist 5
, wenn der Eingang 6
der Ausgang ist 145
, usw.)
Schreiben Sie entweder eine Funktion, die eine Ganzzahl (oder eine Zeichenfolge, da die Zahlen ziemlich groß werden können) annimmt und zurückgibt, oder verwenden Sie stdin / stdout, um die Werte einzugeben und auszugeben.
Der kürzeste Code in Bytes gewinnt.
Anmerkungen
- Sie können alle integrierten oder importierten Basiskonvertierungsfunktionen verwenden.
- Es gibt keine Obergrenze für den Eingabewert (außer einer vernünftigen
Int.Max
). Die Eingabewerte hören nicht bei 36 auf, nur weil "Z" dort stoppt .
Antworten:
CJam,
1715Funktioniert, wenn die Eingabe einen nachgestellten Zeilenumbruch enthält.
Eine offensichtlichere Version für diejenigen, die nicht wissen
x & -x
:Wie es funktioniert
quelle
x & -x
ist wirklich klug.Python,
8278Huh?
Die Anzahl der Zifferngruppen, die die Unterteilung ergibt, G , ist einfach die größte Zweierpotenz, die die Anzahl der Ziffern (dh die Basis) teilt, b . Es ist gegeben durch G = b ^ (b & (b - 1)) , wobei ^ bitweise XOR ist. Wenn Sie mit der Tatsache vertraut sind, dass n eine Zweierpotenz ist, wenn n & (n - 1) = 0 ist, sollte es ziemlich einfach sein zu verstehen, warum. Andernfalls arbeiten Sie einige Fälle aus (binär) und es wird klar.
Die Anzahl der Stellen pro Gruppe, g , ist einfach B / G .
Die erste Zifferngruppe 012 ... (g-1) als Zahl in Basis b ist .
Die nächste Gruppe, g (g + 1) ... (2g-1) , als Zahl in Basis b , ist die Summe .
Allgemeiner gesagt , die n - ten Gruppe (Null-Basis) als Zahl zur Basis b , a n ist .
Denken Sie daran, dass es G- Gruppen gibt, daher
berechnet das Programm die Summe aller Gruppen .
quelle
~
:b/G-i-1
kann seinb/g+~i
und(G-1)*b/2
kann sein~-G*b/2
CJam (Schnappschuss), 19 Bytes
Beachten Sie, dass die neueste stabile Version (0.6.2) einen Fehler aufweist , der dazu führen kann, dass
mf
Ganzzahlen anstelle von Longs zurückgegeben werden. Paradoxerweise kann dies umgangen werden, indem in integer (:i
) umgewandelt wird.Um dies mit CJam 0.6.2 (z. B. mit dem Online-Interpreter ) auszuführen , müssen Sie den folgenden Code verwenden:
Alternativ können Sie den neuesten Snapshot herunterladen und erstellen, indem Sie die folgenden Befehle ausführen:
Testfälle
Wie es funktioniert
quelle
Haskell,
746955Beispiele:
quelle
CJam, 41 Bytes
Dies ist im Grunde Ell's Lösung in CJam:
Probieren Sie es hier online aus
Mein ursprünglicher Beitrag:
Funktioniert nicht richtig für Base 11 und höher
Ich werde versuchen zu sehen, ob ich es für Base 11 und höher zum Laufen bringen kann, ohne die Größe stark zu erhöhen.
quelle
Mathematica, 114 Bytes (oder 72 Bytes)
Hm, das wurde länger als ich dachte:
Und ungolfed:
Wenn ich nur Ell's raffinierte Formel portiere, sind es alternativ 72 Bytes:
quelle
J - 22 char
Funktion mit einem einzigen Argument (nennen Sie es
y
für die Zwecke dieses Golfs) auf der rechten Seite.Zuerst verwenden wir, um
1&q:
zu ermitteln, wie ofty
durch 2 teilbar ist, und dann so oft durch 2 zu teilen-y
. Dies gibt uns das Negative der Breite, in die wir die Dinge aufteilen müssen, was perfekt ist, weil]\
überlappende Teile benötigt werden, wenn das Argument positiv ist, und nicht überlappend, wenn es negativ ist.Dann teilen wir die
i.y
ganzen Zahlen von 0 bisy-1
in Vektoren dieser Breiten auf und#.
konvertieren sie von Basisy
zu Basis 10. Schließlich+/
wird die Summierung durchgeführt, und wir sind fertig.Beispiele: (Eingabe an der J REPL ist eingerückt, Ausgabe ist linksbündig)
quelle
JavaScript,
9989 Bytesoder
Die zweite Funktion ähnelt der von Ell. Der erste verwendet einen traditionelleren Ansatz. Beide sind 89 Zeichen groß.
Versuchen Sie es hier: http://jsfiddle.net/wndv1zz8/1/
quelle
Gelee ,
109 BytesProbieren Sie es online aus!
Im Wesentlichen nur eine Übersetzung der CJam-Antwort von jimmy23013, außer dass sie
n & -n
direkt als Anzahl der zu teilenden Chunks verwendet wird.(Das
ð
hat nichts mit Mapping zu tun: Esḅ
vektorisiert nur über sein linkes Argument undð
dient dazu,ḅS
sich als neue dyadische Kette abzutrennen, die das ErgebnisḶœsÇ
als linkes Argument und das Argument zum Hauptlink als rechtes Argument verwendet.)quelle