Wir können dies ein wenig verkürzen, wenn wir annehmen, dass der Stack nur die beiden Argumente enthält.
[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf
Als eigenständiges Programm benötigen wir nur 37 Zeichen:
?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx
Anstatt zu verwenden [39+]sz9<z, verwenden wir einfach Z39*+, was 39 für eine einstellige Zahl und 78 für eine zweistellige Zahl addiert. Stattdessen verwenden 113wir B3( ADfunktioniert auch).
dc -e'[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf' -e'351837066319 31 lfx'
oder:
dc -f base.dc -e '351837066319 31 lfx'
Erklärung: Wir nehmen die Nummer und die Basis auf dem Stapel. srspeichert die Basis in Register r. Die rekursive Funktion [lr~rd0<x]dsxxzerlegt eine Zahl TOSin ihre Basisziffern register r. Die erste Ziffer ist immer 0, vom Stapel entfernt um k(Genauigkeit festlegen, die standardmäßig auch 0 ist, entspricht also einem NOP). Die rekursive Funktion [48+d57<ad122<banz0<p]dspxgibt dann mit Hilfe der Funktionen a ( [39+]sa) und b ( [58-]sb) jede Ziffer in ASCII aus . IPgibt einen Zeilenumbruch aus. Die Funktion wird im Register gespeichert fund kann von aufgerufen werden lfx.
Wenn Sie 48+ zum Ende bewegen, werden zwei gespeichert (57 und 122 lassen jeweils ein Zeichen fallen). Ein kleines Versehen ist auch, dass Sie als Funktion nicht davon ausgehen können, dass sich nichts anderes auf dem Stapel befindet, aber das Problem würde behoben, wenn Sie die Schleifen zusammenführen (wodurch auch einige Zeichen gespart würden).
Oder 53 + 46 = 99 Zeichen, wenn Sie andere Teile Ihres Programms unten links weiterleiten möchten.
11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_ v
^ < ^, $# +"0" < +"'" <-":"<
Platzieren Sie zuerst die umzurechnende Zahl auf dem Stapel, dann die Basis und geben Sie diese Funktion von links oben nach rechts ein. Gibt die Zeichenfolge für Sie aus (da Befunge keine Zeichenfolgenvariablen unterstützt) und geht von unten $nach unten. Benötigt die (1,1)Zelle für die Radix-Speicherung.
ZB für das angegebene Beispiel 351837066319in die Eingabe eingeben und ausführen:
BC_BASE_MAX ist als 16 dokumentiert. Ich weiß nicht, welches Wunder die Ausgabe direkt auf der Beispieleingabe macht, aber es gibt für die meisten anderen Basen Müll (dh Nicht-Alphanum-Zeichen) aus.
JB
@JB: welches bc verwendest du? GNU bc sollte funktionieren. sysconf(_SC_BC_BASE_MAX)Gibt auf meinem System 99 zurück, mindestens 16.
Ninjalj
@JB: beachte auch, dass frühere überarbeitungen fehlerhaft waren, ich hatte gerade die frageanforderungen überflogen.
Ninjalj
bc 1,06. Nun, Sie erwähnen es, ich habe die Abbildung aus der Manpage, aber falsch verstanden. 16 ist die Eingangsbasisgrenze. Die Ausgabegrenze liegt bei 999. Ich habe zuerst eine frühere Version ausprobiert, das wollen wir jetzt noch einmal sehen.
JB
1
Ich denke, dieser gibt Großbuchstaben für die Basen 11-16 anstelle von Kleinbuchstaben aus. Sie können einige bei der Basisumwandlung speichern, indem Sie dcanstelle von verwenden bc.
at 0:00
perfekt.Antworten:
Ruby 1,8 - 75 Zeichen, mit Rekursion.
Ohne Rekursion
(Beide basieren auf der 1.9-Lösung von Dogbert.)
quelle
Python - 86
Dank an Hoa Long Tam für den String-Import-Trick
quelle
Gleichstrom - 43 Zeichen
Wir können dies ein wenig verkürzen, wenn wir annehmen, dass der Stack nur die beiden Argumente enthält.
Als eigenständiges Programm benötigen wir nur 37 Zeichen:
Anstatt zu verwenden
[39+]sz9<z
, verwenden wir einfachZ39*+
, was 39 für eine einstellige Zahl und 78 für eine zweistellige Zahl addiert. Stattdessen verwenden113
wirB3
(AD
funktioniert auch).quelle
Python,
9399BEARBEITEN : "oder '0'" für leere Zeichenketten hinzugefügt
quelle
dc, 61 Zeichen
Rennen wie:
oder:
Erklärung: Wir nehmen die Nummer und die Basis auf dem Stapel.
sr
speichert die Basis in Register r. Die rekursive Funktion[lr~rd0<x]dsxx
zerlegt eine ZahlTOS
in ihre Basisziffernregister r
. Die erste Ziffer ist immer 0, vom Stapel entfernt umk
(Genauigkeit festlegen, die standardmäßig auch 0 ist, entspricht also einem NOP). Die rekursive Funktion[48+d57<ad122<banz0<p]dspx
gibt dann mit Hilfe der Funktionen a ([39+]sa
) und b ([58-]sb
) jede Ziffer in ASCII aus .IP
gibt einen Zeilenumbruch aus. Die Funktion wird im Register gespeichertf
und kann von aufgerufen werdenlfx
.quelle
Ruby -
727059 ZeichenOhne Rekursion 70 Zeichen
Prüfung
quelle
Haskell, 109 Zeichen
quelle
Befunge - 53 x 2 = 106 Zeichen
Oder 53 + 46 = 99 Zeichen, wenn Sie andere Teile Ihres Programms unten links weiterleiten möchten.
Platzieren Sie zuerst die umzurechnende Zahl auf dem Stapel, dann die Basis und geben Sie diese Funktion von links oben nach rechts ein. Gibt die Zeichenfolge für Sie aus (da Befunge keine Zeichenfolgenvariablen unterstützt) und geht von unten
$
nach unten. Benötigt die(1,1)
Zelle für die Radix-Speicherung.ZB für das angegebene Beispiel
351837066319
in die Eingabe eingeben und ausführen:quelle
Golfscript - 32 Zeichen
quelle
Ruby 1.9 -
807468t = -> n, b {d = 0 ... 9, & Dgr; a ... & Dgr; z, * & Dgr; A ... & Dgr; Z; s = ''; (s = d [n% b] + s; n / = b) solange n> 0 ist; s}
Mit '0' für leere Zeichenfolge,
958982 Zeichen:Ruby 1.9 - funktioniert leider nur bis zur Basis 36:
quelle
]+[
‚s mit,
.Bash, 79 Zeichen
quelle
sysconf(_SC_BC_BASE_MAX)
Gibt auf meinem System 99 zurück, mindestens 16.dc
anstelle von verwendenbc
.