Eingang:
Eine positive ganze Zahl n, die aus Ziffern im Bereich von 0 bis 9 besteht .
Herausforderung:
Wenn d die höchste Ziffer in der ganzen Zahl ist, wird angenommen, dass die Basis der Zahl d + 1 ist . Wenn die Ganzzahl beispielsweise 1256 ist, nehmen Sie an, dass sie zur Basis 7 gehört , wenn sie 10110 ist, dann nehmen Sie an, dass sie zur Basis 2 (binär) gehört, und wenn sie 159 ist, dann ist sie dezimal.
Führen Sie nun die folgenden Schritte aus, bis Sie entweder 1: eine Ganzzahl zur Basis 10 oder 2: eine einstellige Ganzzahl erreichen.
- Konvertiere die ganze Zahl von base- (d + 1) zu base-10
- Finden Sie die Basis dieser neuen Ganzzahl (wieder base- (d + 1), wobei d die höchste Ziffer in der neuen Zahl ist)
- Fahren Sie mit Schritt 1 fort .
Beispiele:
Angenommen, die Eingabe ist n = 413574 . Die höchste Ziffer d = 7 , also ist dies die Basis 8 (oktal). Wandle dies in eine Dezimalzahl um und erhalte 137084 . Die höchste Ziffer d = 8 , das ist also die Basis 9 . Wandle dies in eine Dezimalzahl um und erhalte 83911 . Die höchste Ziffer ist 9 , das ist also eine Dezimalzahl, und wir hören auf. Die Ausgabe soll 83911 sein .
Angenommen, die Eingabe ist n = 13552 . Die höchste Ziffer ist d = 5 , dies ist also die Basis 6 . Wandle dies in eine Dezimalzahl um und erhalte 2156 . Die höchste Ziffer d = 6 , also ist dies die Basis 7 . Wandle dies in eine Dezimalzahl um und erhalte 776 . Die höchste Ziffer ist d = 7 , dies ist also die Basis 8 . Wandle dies in eine Dezimalzahl um und erhalte 510 . Die höchste Ziffer ist d = 5 , dies ist also die Basis 6 . Wandle dies in eine Dezimalzahl um und erhalte 186 . Die höchste Ziffer ist 8 , dies ist also die Basis 9 . Wandle dies in eine Dezimalzahl um und erhalte 159. Die höchste Ziffer ist 9 , das ist also eine Dezimalzahl und wir hören auf. Die Ausgabe soll 159 sein .
Angenommen, die Eingabe ist n = 17 . Dies gibt uns 15 , dann 11 , dann 3 , die wir ausgeben, da es eine einzelne Ziffer ist.
Testfälle:
5
5
17
3
999
999
87654321 (base-9 -> 42374116 in decimal -> base-7 -> 90419978 in decimal)
9041998
41253 (5505 -> 1265 -> 488 -> 404 -> 104 -> 29)
29
Anmerkungen:
- Standardregeln für E / A, Lücken usw. Sie können die Eingabe als Zeichenfolge verwenden
- Erklärungen sind erwünscht
- Sie können integrierte Base-Conversion-Befehle verwenden
- Lösungen, die die in der Sprache integrierten Funktionen zur Basiskonvertierung (sofern vorhanden) nicht verwenden, sind willkommen, auch wenn sie viel länger dauern als die offensichtliche Vorgehensweise bei Verwendung integrierter Funktionen.
Anscheinend ist dies OEIS A091047 .
quelle
Antworten:
Mathematica, 56 Bytes
Probieren Sie es online! (Verwenden von Mathematik.)
Ich dachte, ich würde nachsehen, wie die Sequenz aussieht:
Und hier ist eine grafische Darstellung der Anzahl der Schritte, die erforderlich sind, um das Ergebnis zu finden:
(Klicken Sie hier, um eine größere Version zu erhalten. In der Überarbeitungshistorie werden nur Darstellungen bis n = 1000 angezeigt .)
Sieht aus wie eine sehr interessante Mischung aus großräumiger Struktur und feinräumigem Chaos. Ich frage mich, was mit den größeren Lücken zwischen 30.000 und 60.000 los ist.
quelle
9
Zehnerpotenz führen, a enthalten , sie sind also bereits in der Basis 10. Aber für 30k und 60k scheint es, dass Zahlen mit einer 8 oder sogar 7 (müssen) check) statt der 9 wird nach höchstens einem schritt immer die basis 10.Java 8,
17216616315215114013811611499 BytesNimmt die Eingabe als
String
.-64 Bytes dank @ OlivierGrégoire . Und hier dachte ich, dass meine anfänglichen 172 nicht so schlimm waren ..;)
Probieren Sie es hier aus.
Erläuterung:
quelle
s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}
. Außerdem habe ich die meisten meiner Kommentare gelöscht, da sie jetzt völlig irrelevant sind (b
ist die Basis, Ihrea
; unds
ist die Nummer, an der wir arbeiten).Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));
(88) zu entfernen , aber ich bin brandneu darin, Golf zu codieren. Das ist ein Schnipsel, oder? Gibt es eine Möglichkeit, dies als Methode zu deklarieren, ohne es hinzufügen zu müssenpublic String c(String s)
?public
, aber ich befürchte, Sie müssen es tatsächlichString c(String s){}
für rekursive Aufrufe verwenden, auch in Java 8. Wenn Sie ein Lambda mitjava.util.function.Function<String, String> c=s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c.apply(""+b.valueOf(s,b));}
oder eine Schnittstelleinterface N{String c(String s);}N n = s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:n.c(""+b.valueOf(s,b));};
damit erstellen, wird im Initialisierer eine " Selbstreferenz " angezeigt Fehler "in beiden Fällen. Trotzdem sehr nette Herangehensweise!Pyth, 9 Bytes
Testsuite
Erläuterung:
quelle
Q
undQ
, ich verstehe.u
Ohne die dritte Eingabe wird sie bis zur Wiederholung angewendet, während bei einer dritten Eingabe eine feste Anzahl von Malen angewendet wird.u
Lambda hatG
undH
, aber Sie müssen nicht verwendenH
.G
mitH
das gleiche Ergebnis gehabt ... BTW implizite Variable istG
?G
yes.H
zählt bei jeder Iteration von 0 aufwärts, es ist also völlig anders. Ich bin mir nicht sicher, wovon du sprichst. Hier ist ein Beispielprogramm, das Ihnen zeigt, was los ist: pyth.herokuapp.com/…JavaScript (ES6),
63 57 5453 Bytes8 Bytes gespart dank Shaggy und Dom Hastings
quelle
+a>9||b<9
und das Ternär umkehren.f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Python 3 ,
91 78 76 7573 Bytes@Emigna 5 Bytes rasiert. @FelipeNardiBatista 1 Byte gespeichert. @ RomanGräf 2 Bytes gespart
Probieren Sie es online!
Erläuterung
quelle
05AB1E ,
105 Bytes5 Bytes gespart dank Magic Octopus Urn
Da dies bei großen Eingaben sehr schnell langsam wird, lasse ich die alte, viel schnellere Version hier zum Testen. Der Algorithmus ist derselbe, nur die Anzahl der Iterationen unterscheidet sich.
Probieren Sie es online!
Erläuterung
quelle
тFZ>ö§
? Sehen Sie, wie die Anzahl der Iterationen ( wie hier zu sehen ) zu Plateau scheint? Wenn Sie technische erhalten möchten, ist die Geschwindigkeit , die Iterationen steigen wahrscheinlich logarithmisch ... So einfach so etwas wie verwenden:DFZ>ö§
Staat und es wird nicht für große laufenn
. ODER vielleicht sogar:T.n>FZ>ö§
um die Anzahl der Iterationen direkt zu berechnen alslog_10(n)
.F§Z>ö
sein scheint, sollten Sie den Trick machen.§
.§
,Z
wird die höchste Zahl auf dem Stapel anstelle der höchsten Ziffer in der Zahl oben auf dem Stapel genommen.APL (Dyalog) ,
20 bis16 BytesNimmt und gibt einen String zurück
(
...)⍣≡
gilt die folgende Funktion , bis zwei aufeinander folgenden Begriffe sind identisch:⍎¨
führe jedes Zeichen aus (verwandelt die Zeichenkette in eine Liste von Zahlen)(
…)
Wenden darauf folgende implizite Funktion an:⌈/
finde das Maximum des Arguments1+
füge eins hinzu⊢⊥⍨
bewerte das Argument in dieser Basis⍕
Format (stringify, in Vorbereitung auf eine andere Anwendung der äußeren Funktion)Probieren Sie es online!
quelle
Ruby ,
6056 BytesProbieren Sie es online!
quelle
Mathematica, 52 Bytes
Reine Funktion, die eine nichtnegative Ganzzahl als Eingabe verwendet und eine nichtnegative Ganzzahl zurückgibt. Verwendet die gleiche Kernmechanik
FromDigits[s=IntegerDigits@#,Max@s+1]
wie Jenny_mathys Antwort , nutzt sie jedoch ausFixedPoint
, um die Iteration durchzuführen .quelle
Perl 6 , 49 Bytes
Probier es aus
Erweitert:
quelle
PHP , 71 Bytes
Probieren Sie es online!
quelle
Pip , 17 Bytes
Übernimmt Eingaben als Befehlszeilenargument. Probieren Sie es online!
Erläuterung
Das hat Spaß gemacht - ich musste die Verkettungsvergleichsoperatoren herausziehen.
Wir wollen eine Schleife machen, bis die Zahl eine einzelne Ziffer ist ODER eine 9 enthält. Entsprechend wollen wir eine Schleife machen, während die Zahl mehrere Ziffern hat UND keine 9 enthält. Entsprechend wollen wir eine Schleife machen, während die Zahl größer als 9 ist UND die maximale Ziffer ist weniger als 9:
a>9>MXa
.quelle
Python 2 ,
60595653 Bytes4 Byte dank Felipe Nardi Batista
gespeichert 3 Byte dank ovs gespeichert
Probieren Sie es online!
Verwenden Sie ein rekursives Lambda und vergleichen Sie das Ergebnis der Basiskonvertierung mit der vorherigen Iteration.
quelle
x==y and x or ...
wiex
es niemals sein wird0
(Basis 1)? oder sogar(x==y)*x or ...
x and x==y or ...
was nichtC #,
257244243244233222 BytesNun, C # braucht immer eine Menge Bytes, aber das ist einfach lächerlich. Keines der eingebauten Systeme kann mit einer beliebigen Basis umgehen, daher musste ich die Umrechnung selbst berechnen. Ungolfed:
quelle
Mathematica, 92 Bytes
quelle
Javascript (ES6) mit 0 Pfeilfunktion, 74 Bytes
quelle
f('11')
nach der Funktion an? Es sei denn, ich vermisse etwas, das nur als Verwendung erscheint und nicht Teil der Einreichung ist. Wenn ja, sollten Sie es aus dem CodeabschnittK4 , 19 Bytes
Lösung:
Beispiele:
Erläuterung:
Verwenden Sie die
/:
integrierte Funktion, um die Basis zu konvertieren.quelle
Kotlin , 97 Bytes
Verschönert
Prüfung
TIO
TryItOnline
quelle
Japt , 25 Bytes
Probieren Sie es online!
quelle
Gelee , 9 Bytes
Probieren Sie es online!
quelle
C,
159157 Bytesquelle
Scala , 119 Bytes
Probieren Sie es online!
Scala , 119 Bytes
Probieren Sie es online!
Beide Methoden funktionieren auf die gleiche Weise, aber in der ersten habe ich
x.length-1
eine Variable eingegeben und in der zweiten nicht.quelle