Zu Ehren, wie viel Wiederholung ich vor einigen Stunden hatte, als ich zum ersten Mal über diese Herausforderung nachdachte:
Zahlen wie diese, die sich aus einer einzelnen Ziffer zusammensetzen, werden repdigits genannt . Repdigits machen Spaß! Jeder Körper wäre froh, wenn die Anzahl der Wiederholungen eine Wiederholungszahl wäre ¹ , aber ich bin ungeduldig. Sie müssen mir also helfen, den schnellsten Weg zu einer Wiederholungszahl zu finden.
Hier ist Ihre Herausforderung:
Geben Sie bei positiven Ganzzahlen, die den Ruf repräsentieren, die Mindestanzahl an Wiederholungen aus, die erforderlich sind, um zu einer Wiederholungsziffer zu gelangen. Zum Zeitpunkt der Erstellung dieser Challenge hatte der Benutzer Martin Ender beispielsweise 102.856 Mitarbeiter. Die nächste Wiederholungsziffer ist 111.111, daher müsste er gewinnen: 8255 Wiederholungen, um eine Wiederholungsziffer zu haben.
Da die Leute es nicht mögen, Repräsentanten zu verlieren, werden wir nur nicht negative Veränderungen berücksichtigen. Dies bedeutet, dass zum Beispiel, wenn jemand 12 Wiederholungen hat, anstatt 1 Wiederholung zu verlieren, die Lösung darin besteht, 10 Wiederholungen zu gewinnen. Dies ermöglicht, dass '0' eine gültige Ausgabe ist, da jeder, der 111 Wiederholungen hat, bereits eine Wiederholungsziffer hat.
Die Eingabe und Ausgabe kann in jedem vernünftigen Format erfolgen , und da es unmöglich ist, weniger als eine Wiederholung auf einer Stack Exchange-Site zu haben, können Sie davon ausgehen, dass keine Eingabe weniger als 1 ist.
Ein Eckfall zu beachten:
Wenn ein Benutzer weniger als 10 Wiederholungen hat, hat er bereits eine Wiederholungsziffer und benötigt daher auch '0'.
Test IO:
#Input #Ouput
8 0
100 11
113 109
87654321 1234567
42 2
20000 2222
11132 11090
Es gelten Standardlücken, und die kürzeste Lösung in Bytes gewinnt!
110
sollte geben1
, auch wenn es keine Möglichkeit gibt, eine Wiederholung zu erhalten.Antworten:
Gelee , 6 Bytes
Die Ausgabe ist ein Singleton-Array.
Probieren Sie es online! oder überprüfen Sie die meisten Testfälle . Der Testfall 87654321 ist für TIO zu langsam.
Wie es funktioniert
quelle
Haskell, 39 Bytes
Probieren Sie es online aus
quelle
Brachylog , 9 Bytes
Probieren Sie es online!
Dies ist ziemlich effizient, da es sich der arithmetischen Bedingungen bedient.
Erläuterung
quelle
This is the answer you're looking for. Figure it out for me
:)call_reside_vars/2
, rufen Sie die CLP-Variablen (FD) ab und kennzeichnen Sie sie. Zum Beispiel:call_residue_vars(Program, Vs0), include(fd_var, Vs0, Vs), label(Vs)
. Was denkst du?Python 2,
4140 BytesNicht der kürzeste Ansatz, aber sehr effizient. Teste es auf Ideone .
Wie es funktioniert
Für die Eingabe
10**len(`n`)
Runden n bis zur nächsten Leistung von 10 . Anschließend teilen wir das Ergebnis durch 9 . Dies gibt die repdigit 1… 1 zurück , die so viele Ziffern wie n hat . Wir speichern das Ergebnis in r . Wenn beispielsweise n = 87654321 , dann ist r = 11111111 .Die gewünschte Nachkommastelle ist ein Vielfaches oder r . Um zu entscheiden, welche, führen wir eine Deckenteilung von n durch r durch . Seit Python 2's Division Operator
/
Floors kann dies-n/r
mit negativem Vorzeichen erreicht werden , was den korrekten Absolutwert ergibt. Wenn beispielsweise n = 87654321 ist , wird -8 zurückgegeben .Schließlich multiplizieren wir den berechneten Quotienten mit -r , um den Quotienten einmal für jede Ziffer in n zu wiederholen . Wenn beispielsweise n = 87654321 , kehrt diese 88888888 , der die gewünschte Schnapszahl ist.
Um das erforderliche Inkrement zu berechnen, subtrahieren wir schließlich n vom vorherigen Ergebnis. Für unser Beispiel ist n = 87654321 , dieser kehrt 1234567 , je nach Wunsch.
quelle
lambda n:10**len(`n`)/9*-~int(`n*9`[0])-n
. Es funktioniert fastlambda n:int(`n*9`[0]*len(`n`))-n
, aber die Ziffer ist eine zu kleine und ich sehe keinen guten Weg, um es zu beheben.O(1)
.O(1)
, aber ich denke, es macht Sinn.Python 2, 37 Bytes
Teste es auf Ideone . Beachten Sie, dass dieser Ansatz für den Testfall 87654321 zu ineffizient ist .
Wie es funktioniert
Wenn n bereits eine Nachkommastelle ist,
1-len(set(`n`))
wird 0 zurückgegeben, da die Länge der Menge der Ziffern von n in der Basis 10 1 ist . In diesem Fall f Erträge 0 .Wenn n kein Wert ist, wird f
f(n+1)
rekursiv mit dem nächstmöglichen Wert von n aufgerufen . Inkremente den Rückgabewert von f ( 0 , wenn ein Schnapszahl gefunden wird) um 1 jedes Mal f wird rekursiv aufgerufen, so dass der endgültige Rücklaufwert die Anzahl von Malen gleich f , dh aufgerufen wurde, die Anzahl von Malen n mußten werden inkrementierten ein repdigit bekommen.-~
quelle
L
On Longs gehandhabt werden müssen.-~
kann die Funktion die Anzahl der getätigten Anrufe zählen.Perl 6 , 23 Bytes
Ein Lambda, das die eingegebene Zahl als Argument verwendet und das Ergebnis zurückgibt.
Erläuterung:
...
Sequenzoperator, um die Eingabenummer zu erhöhen, bis eine neue Ziffer erreicht ist (getestet, indem die Zeichenfolgendarstellung in Zeichen aufgeteilt und geprüft wird, ob alle gleich sind) .quelle
/(.)$0*/
Java 7,
11676 BytesVerwendete @Dennis 'erstaunlichen Ansatz , um die Byteanzahl um satte 40 Bytes zu senken.
Ungolfed & Testfälle:
Probieren Sie es hier aus.
Ausgabe:
quelle
2222
und die vierte Ausgabe sein12345678
?2222
statt222
. Ich habe einen Fehler im Code behoben, aber aus Versehen immer noch die alte Ausgabe hier verwendet. Es ist jetzt behoben. Was das vierte betrifft, sollte es nein sein123467
(wie Sie auch bei der Frage von OP sehen können).Pyth,
987 Bytes1 Byte danke an @FryAmTheEggman.
Probieren Sie es online aus.
Sehr ineffizient, durchläuft alle Zahlen von der Eingabe bis zur nächsten Stelle.
quelle
Brain-Flak
690358 BytesHier ist mein Versuch
Probieren Sie es online
Erläuterung
Beginnen Sie, indem Sie eine zweite Kopie der Eingabe erstellen, die um eine Kopie geringer ist als die des Originals. Wir werden die Kopie verwenden, um nach dem nächsten Nachkomma zu suchen. Wir subtrahieren eins, falls die Zahl selbst eine Umstellung war
Drücken Sie eine, um die kommende Schleife zu erfüllen. (muss nicht eins sein, nur nicht null)
Diese Schleife wird solange ausgeführt, bis sich eine neue Ziffer auf dem Stapel befindet
Pop den Mist. Oben ist ein "Boolescher Wert", der die Schleife ansteuert, da er nicht mehr benötigt wird. Wir platzieren ihn.
Fügen Sie einen hinzu und duplizieren Sie den oberen. Die Kopie wird in ihre Ziffern zerlegt.
Während die Kopie nicht Null ist ...
Kopieren Sie erneut
Mod 10 und gehe zum anderen Stapel
Teilen durch 10 (Ganzzahlige Division)
Pop die Null, die unsere Kopie war
Wir haben die Zahl nun in ihre 10-stelligen Basiszahlen zerlegt und wechseln mit allen Ziffern zum Stapel.
Während die führende Ziffer nicht Null ist
Wir nehmen eine Kopie der Stapelhöhe (dh die Anzahl der Stellen) ...
Subtrahieren Sie still von jeder Zahl auf dem Stapel eine
Stellen Sie die Stapelhöhe, die wir aufgenommen haben, auf den Tisch. (und zum anderen Stapel wechseln)
Wir verwenden die Stapelhöhe, um alle Ziffern, die wir auf dem anderen Stapel platziert haben, wieder auf den richtigen Stapel zu ziehen.
Pop die Null, die unsere Stapelhöhe war
Tausche mit den Ziffern (oder was waren die Ziffern) zurück auf den Stapel
Schleife beenden
Jetzt haben wir die oberste Ziffer von allen anderen Ziffern abgezogen. Wenn alle Ziffern Null sind, war die ursprüngliche Nummer (nicht die Eingabe, sondern die Nummer, die wir überprüfen) eine neue Ziffer. [Zitat benötigt] . Wir müssen also nach Nicht-Nullen suchen.
Während die Stapelhöhe nicht Null ist
Wenn die Ziffer nicht Null ist, verschieben Sie sie auf den anderen Stapel und ersetzen Sie sie durch eine Null.
Pop it (jetzt ist es eine Null)
Schleife beenden
Wechseln Sie auf den anderen Stapel (duh ..)
Nehmen Sie sich eine Kopie der Stapelhöhe minus zwei
Während die Stapelhöhe nicht zwei ist (das Original und der Akku)
Pop die Spitze
Beende die Weile
Legen Sie unsere Kopie der Stapelhöhe minus zwei ab. Dies ist die Anzahl der Ziffern, die nicht mit der ersten Ziffer übereinstimmen. Mit anderen Worten, wenn es Null ist, handelt es sich um eine Neuziffer.
Wenn diese Schleife endet, haben wir eine neue Ziffer gefunden
Pop der "Boolesche"
Subtrahieren Sie das Original von der Umstellziffer
quelle
Python 2, 52 Bytes
Python 2 hat mehrere Tricks, die dies verkürzen. Zum Beispiel ist die Eingabe numerisch, sodass wir nicht nach int umwandeln müssen. (-5 bytes) Wir müssen auch keine Klammern um das setzen
a-b
(-1 byte) setzenVerwenden Sie dieses Skript, um alle Testfälle zu überprüfen:
Sie können es auch online ausprobieren!
quelle
GNU sed, 223 + 1 (r Flag) = 224 Bytes
Lauf:
Ausgabe:
Dies ist eine reine sed-Lösung , die Arithmetik wird nur mit regulären Ausdrücken simuliert. Der Algorithmus funktioniert wie folgt:
^current_reputation:needed_reputation%$
a) Wendet
%:
das Inkrement auf needed_reputation an.b) Wendet
:%
das Inkrement auf an current_reputationquelle
Java,
7472 Bytes(Wenn der andere Java-Eintrag 76 Byte umfasst, ist dies der Fall
7472, da es istzweivier Bytes kürzer).Inkrementieren Sie die Eingabe einfach, bis sie eine neue Ziffer ist, während Sie einen Zähler inkrementieren. Senden Sie den Zähler zurück.
Ja, das sind drei Pluszeichen in einer Reihe, zwei, um die Eingabe zu erhöhen, eines, um eine leere Zeichenfolge zu verketten, um sie zu einer Zeichenfolge zu machen.
Nein, ich hätte nicht gedacht, dass es legal wäre, wenn dazwischen kein Leerzeichen wäre, aber los geht's. Das ist, was ein Tippfehler für Sie tun wird: ein Byte kürzer.
Die Verwendung einer for-Schleife anstelle einer while-Schleife benötigt genau so viele Bytes:
Bearbeiten:
Eine frühere Version musste
matches("^(\\d)\\1*$")
nach einem Repdigit suchen, aber da wir gerade ein Int in einen String konvertiert haben, reicht es aus, ein To.
Match zu verwenden.Ungolfed & Testfälle:
Probieren Sie es hier aus.
}
Ausgabe:
quelle
R,
1029891 BytesUngolfed:
Das Herumspielen mit dem Format (
) fügt einige Bytes hinzu, aber R ist nicht wirklich flexibel!as.numeric
undas.character
quelle
Perl, 40 + 1 (
-n
) = 41 BytesWenn nichts gedruckt werden soll, anstatt
0
dass die Zahl bereits ein Neudigit ist, sind 37 Bytes ausreichend:Führen Sie mit
-n
(1 Byte) und-E
oder-M5.010
(frei) aus:Erklärungen : Der Code besteht aus zwei Hauptteilen:
/^(.)\1*$/&&say$v
und$_++&&++$v&&redo
. Der erste Test$_
ist ein Repdigit; Wenn ja, wird die Nummer gedruckt, die wir zur ursprünglichen Nummer hinzugefügt haben, um sie zu einem repdigit ($v
) zu machen , und wenn nein, hatten wir eine 1 für beide$_
und$v
und fangen von vorne an.quelle
perl -pe '@x=sort/./g;//;$_=(($x[-1]>$&)+$&)x+@x-$_'
JavaScript (ES6), 42 Byte
Erläuterung: Wird rekursiv
p
als nächste Potenz von10
after berechnetn
. Die zu wiederholende Ziffer wird dann berechnet als1+floor(9n/p)
und die Wiederholung ist einfach(p-1)/9
, woraus das Ergebnis folgt.quelle
05AB1E ,
106 BytesProbieren Sie es online!
Erläuterung
quelle
§
und ändern¹-
inα
. Und hier eine ziemlich ähnliche 8-Byte-Alternative:∞+.ΔÙg}α
Pyke,
1311 BytesProbieren Sie es hier aus!
quelle
Eigentlich 15 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Qualle , 20 Bytes
Probieren Sie es online! TIO kann die längeren Testfälle nicht bewältigen, sollte aber bei genügend Zeit und Speicher auch funktionieren.
Erläuterung
i
eingegeben wird, und<
dekrementiert. Dieser Wert wird der Funktion auf der linken Seite zugeführt.\>
erhöht den Wert (mindestens einmal), bis die Funktion rechts einen Wahrheitswert ergibt.&
s) von vier Funktionen.0~j
Konvertiert in einen String.u
Entfernt doppelte Ziffern.>
Entfernt den Kopf der resultierenden Zeichenfolge.N
ist logische Negation: Es gibt1
für eine leere Zeichenfolge und0
für nicht leer. Somit prüft die Funktion auf eine Wiederholungsziffer, und das Ergebnis von\
ist die nächste Wiederholungsziffer, die ab zählt<i
.)-
subtrahiert das Ergebnis von der Funktionseingabe, d. h<i
.<
verringert. Zum Schluss wirdp
das Ergebnis gedruckt.quelle
PowerShell v2 +, 66 Byte
Das normalerweise sehr lockere Casting von PowerShell, das für das Golfen gut ist, ist hier ein schwerwiegender Nachteil.
Nimmt Eingaben
$n
als Zeichenfolge und gibt einefor
Schleife ein. Für den Setup-Schritt extrahieren wir das erste Zeichen$n[0]
, müssen es jedoch wieder in einen String konvertieren,"$(...)"
bevor wir es als int umwandeln+
und in speichern$x
. Andernfalls verwendet die spätere Arithmetik den ASCII-Wert des Zeichencodes.Die Bedingung prüft, ob eine Zeichenkette, die aus
$n.length
"$x"
s aufgebaut ist und in der sie zwischengespeichert$y
ist, kleiner als ist$n
. Solange dies nicht der Fall ist$x++
, erhöhen wir die Bedingung für die nächste Schleife.Bei der Eingabe
123
ist beispielsweise der Wert für$y
die erste Prüfung der Bedingung111
kleiner als$n
, sodass die Schleife fortgesetzt wird. Da sich nichts im Schleifenkörper befindet, wird das Schrittinkrement ausgeführt$x++
und die Bedingung erneut überprüft.$y
Ist diese Zeit222
größer als$n
, wird die Schleife beendet. Wenn die Eingabe bereits ein Repdigit ist, ist die Bedingung nicht erfüllt, da an diesem Punkt$y
gleich ist$n
.Sobald wir die Schleife verlassen haben, werden wir
$y
zu einer ganzen Zahl umgewandelt+
und dann subtrahieren$n
. Dieses Ergebnis verbleibt in der Pipeline und die Ausgabe ist implizit.quelle
PHP 5.6,
59535150 BytesGespeichert
68 Bytes dank @manatwork.Testen Sie mit:
Die
count_chars()
Funktion mit 3 als zweitem Parameter gibt eine Zeichenfolge mit den verschiedenen Zeichen in einer Zeichenfolge zurück. Wenn diese Zeichenfolge 1 Zeichen lang ist ([1]
wird false zurückgeben, wenn sie 1 Zeichen lang ist ), wird ein Echo ausgegeben$b
, andernfalls wird inkrementiert$b
und die Schleife erneut ausgeführt.quelle
count_chars()
. Was ist mit 3 als $ mode Parameter? So wäre dies der seinwhile
Zustand:count_chars($argv[1]+$b,3)[1]
.count
oderstrlen
so, es stellte sich heraus, dass es die gleiche Länge hatte.echo$b?:0;
MATL , 10 Bytes
Probieren Sie es online!
Dadurch wird die Eingabe so lange inkrementiert, bis alle Ziffern gleich sind. Daher ist die Eingabe langsam. Der Testfall für die Eingabe
87654321
läuft im Online-Compiler ab.quelle
Ruby, 42 Zeichen
Erwartet eine Zeichenfolgeeingabe.
Probelauf:
Ruby, 39 Zeichen
Rekursiver Aufruf, führt zu "SystemStackError: Stapelebene zu tief" bei größeren Ergebnissen.
Probelauf:
quelle
Matlab,
6564 BytesWegen der while-Schleife ist es ziemlich langsam ...
Erläuterung
Ein Byte sparen dank sparen @Luis Mendo .
quelle
+0
?diff
Wirkt automatisch Zeichen in Zahlendiff
die Zeichenfolge als sym behandelt und es wird versucht, zu differenzieren.Excel,
8579 BytesFügen Sie die folgende Formel in eine beliebige Zelle mit Ausnahme der Zelle ein
N
da dies ein Name für die Referenzzelle der Eingabe ist:Erläuterung:
N
ist der Eingang und auch Name der Referenzzelle .LEFT(N)
nimm die erste Ziffer des Eingabewerts.LEN(N)
Gibt die Länge des Eingabewerts zurück.REPT(LEFT(N),LEN(N))
Wiederholen Sie die erste Ziffer des EingabewertsLEN(N)
und multiplizieren Sie sie mit 1, um das Textformat in das Zahlenformat umzuwandeln, damit wir es für den Zahlenvergleich verwenden können.quelle
Num_chars
inLEFT
4 Bytes und sparen:LEFT(N)
IF
Bedingung in eine zwingen1
oder0
verwenden,--
sodass Sie sich nicht wiederholen müssen, nur um+1
:=REPT(LEFT(N)+(--1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
=REPT(LEFT(N)+(1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
Brachylog v2, 6 Bytes
Probieren Sie es online!
Das 5-Byte-System
+↙.=∧
kommt mit dem Weglassen davon,ℕ
weil es überhaupt keine positiven Ausgaben versucht, aber es schlägt auch fehl, wenn eine Zahl angegeben wird, die bereits eine neue Ziffer ist, weil es überhaupt keine positiven Ausgaben versucht.quelle
Java, 59 Bytes
(Ich bin mir immer noch nicht sicher, wie ich Java - Einträge zählen soll, aber gemäß dem Standard von den ersten Java-Eintrag festgelegt wurde ist dieser Eintrag 59 Byte lang, da er 17 Byte kürzer ist).
Wie auch immer, wenn wir eine repdigit haben, geben Sie 0 zurück, fügen Sie 1 zur Eingabe hinzu, rufen Sie sich selbst auf und fügen Sie 1 zum Ergebnis hinzu.
Ungolfed & Testfälle:
Probieren Sie es hier aus.
Ausgabe:
Wie Sie sehen, hat der letzte Eintrag nicht mehr genügend Speicher, bevor er beendet werden kann. Das (sehr passende)
StackOverflowError
ist weggeworfenjava.util.regex.Pattern.sequence(Pattern.java:2134)
, aber ich bin mir ziemlich sicher, dass an der Regex selbst nichts auszusetzen ist, da es das gleiche ist, das ich in meinem vorherigen Eintrag verwendet habe .quelle
82 Bytes
quelle
C 84 Bytes
Testleitung:
quelle
Prolog, 120 Bytes
Probieren Sie es online!
quelle