Auf 4chan ist ein beliebtes Spiel zu bekommen. Jeder Beitrag auf der Website erhält eine fortlaufende Beitrags-ID. Da Sie sie nicht beeinflussen oder bestimmen können, versuchen die Leute, ihre eigene Beitragsnummer (zumindest einen Teil davon) zu erraten, normalerweise die ersten Ziffern. Eine andere Version des Spiels heißt Dubs. Ziel ist es, sich wiederholende Ziffern am Ende der Zahl zu erhalten (z. B. 1234555).
Wenn Sie dies akzeptieren möchten, müssen Sie ein Programm schreiben, das eine Post-ID als Eingabe verwendet (Standard-Ganzzahl, die Sie unter 2 ^ 32 annehmen können) und zurückgibt, wie viele sich wiederholende Ziffern am Ende stehen.
Regeln
- Standardlücken sind nicht zulässig .
- Das Programm kann eine Funktion, ein vollständiges Programm, ein REPL-Befehl sein, was auch immer wirklich funktioniert, solange kein externer, nicht gezählter Code / keine nicht gezählten Argumente benötigt werden, um es auszuführen.
- Die Eingabe kann von STDIN, Funktionsargumenten, Befehlszeilenargumenten und Dateien kommen, je nachdem, was Ihnen passt.
Testfälle
Input: 14892093
Output: 1
Input: 12344444
Output: 5
Input: 112311
Output: 2
Input: 888888
Output: 6
Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1
code-golf
number
number-theory
counting
sagiksp
quelle
quelle
Antworten:
Mathematica, 29 Bytes
Wie wäre es mit einer arithmetischen Lösung?
Ich bin sehr erfreut zu sehen, dass dies den einfachen Mathematica-Ansatz übertrifft.
Erläuterung
Der Code selbst berechnet 9 * n + n% 10 und ermittelt dann die größte Potenz von 10 , die die Eingabe teilt, oder mit anderen Worten, die nachfolgenden Nullen zählt. Wir müssen , wenn zeigen n Ende in k wiederholt Ziffern, dass 9 * n + n% 10 hat k nacheilenden Nullen.
Wiederholungsziffern lassen sich am einfachsten mathematisch ausdrücken, indem eine Zahl wie 99999 (das sind 10 5 -1 ) durch 9 geteilt und dann mit der wiederholten Ziffer multipliziert wird. Wir können also n = m * 10 k + d * (10 k -1) / 9 schreiben , wobei m ≢ d (mod 10) , um sicherzustellen, dass n nicht mit mehr als k wiederholten Ziffern endet . Beachten Sie, dass d = n% 10 .
Stecken wir das in unsere Formel 9 * n + n% 10 . Wir erhalten 9 * m * 10 k + d * (10 k -1) + d . Das d am Ende wird gestrichen, so dass wir übrig haben: 9 * m * 10 k + d * 10 k = (9 * m + d) * 10 k . Aber 9 ≤ -1 (mod 10) , also 9 * m + d ≤ d - m (mod 10) . Aber wir haben behauptet, dass m ≤ d (mod 10) und damit d - m ≤ 0 (mod 10) ist .
Mit anderen Worten, haben wir gezeigt , daß 9 * m + d durch nicht teilbar ist 10 , und daher die größte Leistung von 10 , dass Trennlinien 9 * n + n% 10 = (9 · m + d) * 10 k ist k , Die Anzahl der nachfolgenden wiederholten Ziffern.
Als Bonus druckt diese Lösung das richtige Ergebnis
∞
für die Eingabe0
.quelle
Netzhaut , 9 Bytes
Probieren Sie es online!
Zählt die Anzahl überlappender Übereinstimmungen, bei
(.)\1*$
denen es sich um eine Regex handelt, die mit einem Suffix identischer Zeichen übereinstimmt.quelle
(.)(?=\1*$)
.(?=(.)\1*$)
(also im Grunde das gleiche wie bei dir).Brachylog , 4 Bytes
Probieren Sie es online!
Erläuterung
Wenn
ḅ
direkt an ganzen Zahlen gearbeitet würde (und ich bin nicht sicher, warum ich es nicht implementiert habe), wären dies nur 3 Bytes, da dieẹ
nicht benötigt würden.quelle
Python 2 ,
4741 BytesProbieren Sie es online!
36 Bytes - Für eine flexiblere Eingabe
Probieren Sie es online!
quelle
dir(object)
ist unser Freund c:Javascript (ES6),
55523230 BytesVerwenden Sie einen regulären Ausdruck, um mit der letzten Gruppe der letzten Ziffer übereinzustimmen
Hinweis: Erstmaliges Posten. Zögern Sie nicht, Anmerkungen zu machen.
quelle
/(.)\1*$/
f=
.C
62564847 BytesDank @Steadybox ein Byte gespeichert!
Probieren Sie es online!
quelle
PHP,
474540 BytesLaufen Sie mit
echo <n> | php -nR '<code>
anscheinend ist eine schleife noch kleiner als meine erste antwort. Zähle einfach die Zeichen, die gleich dem letzten sind. Dies verwendet negative String-Offsets von PHP 7.1 .
-5 Bytes von Titus. Vielen Dank !
Alte Antwort:
Entfernt von rechts jedes Zeichen, das mit dem am weitesten rechts stehenden Zeichen übereinstimmt, und berechnet den Längenunterschied.
quelle
-R
und$argn
könnte 5 Bytes sparen.05AB1E , 4 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
CJam , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
Gelee , 5 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl 5 , 22 Bytes
21 Byte Code +
-p
Flag.Probieren Sie es online!
/(.)\1*$/
Ruft die letzten identischen Zahlen ab und$_=length$&
weist dann deren Länge zu$_
, die dank-p
flag implizit gedruckt wird .quelle
C (GCC) ,
3229 BytesDies ist ein Port meiner Python-Antwort .
Dies funktioniert mit gcc, aber das Fehlen einer
return
Aussage ist undefiniertes Verhalten.Probieren Sie es online!
quelle
return
Anweisung speichert lediglich den Rückgabewert in EAX. Mit gcc geschieht das gleiche, wenn Sie es einer Variablen zuweisen. Bei der Zeigerarithmetik wird beim Hinzufügen von 1 zu einem int-Zeiger zum nächsten int und nicht zum nächsten Byte gewechselt.Python 2, 51 Bytes
Übernimmt eine Ganzzahl als Eingabe. Probieren Sie es online aus
48 Bytes für String als Eingabe. Probieren Sie es online aus
quelle
C # ,
6362 BytesGolf gespielt
Ungolfed
Ungolfed lesbar
Vollständiger Code
Releases
- 1 byte
- Dank Kevins Kommentar.63 bytes
- Anfangslösung.Anmerkungen
Nichts hinzuzufügen
quelle
i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Python 2 ,
3832 BytesVielen Dank an @xnor für das Speichern von 6 Bytes!
Probieren Sie es online!
quelle
MATL ,
65 Bytes1 Byte gespart dank @Luis
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
&
hat das zuY'
Folgendem geführt :-D Warum nicht Eingaben in Anführungszeichen nehmen und loswerdenj
?Cubix,
2419 BytesHinweis
Probieren Sie es hier aus
Erläuterung
Erweitern wir zunächst den Cube
Die Schritte in der Ausführung können in drei Phasen unterteilt werden:
Phase 1: Eingabe
Die ersten beiden Zeichen, die ausgeführt werden, sind
A
undB
.A
Liest alle Eingaben und schiebt sie als Zeichencodes auf den Stapel. Beachten Sie, dass dies in umgekehrter Reihenfolge erfolgt. Das erste Zeichen landet oben auf dem Stapel, das letzte Zeichen fast unten. Ganz unten steht-1
(EOF
), das als Zähler für die Anzahl aufeinanderfolgender Zeichen am Ende der Zeichenfolge verwendet wird. Da der obere Teil des Stapels die letzten beiden Zeichen enthalten muss, kehren wir den Stapel um, bevor wir in die Schleife eintreten. Beachten Sie, dass der obere Teil des Stapels sieht nun so:..., C[n-1], C[n], -1
.Die IP-Adresse auf dem Cube befindet sich dort, wo sie sich
E
befindet, und sie zeigt nach rechts. Alle Anweisungen, die noch nicht ausgeführt wurden, wurden durch No-Ops (Punkt) ersetzt.Phase 2: Charaktervergleich
Der Stapel ist
..., C[a-1], C[a], counter
, wobeicounter
die Zähler zu inkrementieren , wenn die zwei Zeichen (zu überprüfenC[a]
undC[a-1]
) gleich sind. Die IP tritt zuerst an der Stelle in diese Schleife einS
und bewegt sich nach rechts. DasE
Zeichen ist die Position , wo die IP wird am Ende (nach rechts) , wennC[a]
undC[a-1]
haben nicht den gleichen Wert, was bedeutet , dass SubtrahierenC[a]
vonC[a-1]
nicht nachgibt0
, in welchem Fall der Befehl die folgenden!
wird übersprungen (die einew
).Hier sind die Anweisungen, die während einer vollständigen Schleife ausgeführt werden:
Und dann dreht es sich.
Phase 3: Druckergebnis
Da wir die Schleife vorzeitig verlassen, wie der Stapel sieht folgendermaßen aus :
counter, ..., C[a-1]-C[a]
. Es ist einfach, den Zähler auszudrucken, aber wir müssen den Zähler einmal inkrementieren, weil wir ihn in der letzten Iteration der Schleife nicht ausgeführt haben, und noch einmal, weil wir-1
stattdessen mit dem Zählen begonnen haben0
. Der Pfad auf dem Würfel sieht wie folgt aus: Er beginnt beiS
und zeigt nach rechts. Die beiden No-Ops, die von der IP ausgeführt werden, werden durch Pfeile ersetzt, die in Richtung der IP zeigen.Die Anweisungen werden in der folgenden Reihenfolge ausgeführt. Beachten Sie, dass die
B)
Anweisungen am Ende den Stapel ändern, das Programm jedoch nicht beeinflussen, da wir kurz davor stehen, ihn zu beenden, und den Stapel nicht mehr verwenden.Alea iacta est.
quelle
Batch, 91 Bytes
Das
-
verhindert , dass der Test der Ausführung von dem Anfang des Strings ab.quelle
JavaScript (ES6), 34 Byte
Nicht kürzer als die Regex-Lösung.
Rekursive Funktion, die die Ziffern von rechts nach links auswertet und stoppt, wenn eine andere Ziffer angetroffen wird. Das Ergebnis ist die Anzahl der Iterationen.
p
istundefined
bei der ersten Iteration, was bedeutet ,n%10-p
zurückkehrtNaN
(falsy). Danachp
entspricht die vorherige Ziffer mitn%10
. Wenn die aktuelle Ziffer (n%10
) und die vorherige (p
) unterschiedlich sind, endet die Schleife.quelle
Röda , 12 Bytes
Probieren Sie es online!
Dies ist eine anonyme Funktion, die erwartet, dass jedes Zeichen der Eingabezeichenfolge in den Stream verschoben wird (ich denke, dies gilt im Sinne einer aktuellen Meta-Frage ).
Es werden zwei integrierte Funktionen verwendet:
count
undtail
:count
Liest Werte aus dem Stream und überträgt die Anzahl aufeinanderfolgender Elemente in den Stream.tail
Gibt den letzten Wert im Stream zurück.quelle
T-SQL,
238214 BytesOder:
quelle
Java 7, 78 Bytes
Probieren Sie es hier aus.
Ich habe einige Dinge mit Rekursion oder einer Schleife ausprobiert, aber beide endeten über 100 Bytes.
quelle
Powershell, 41 Bytes
Wenn ein Zeichen nicht mit dem letzten Zeichen in der Zeichenfolge übereinstimmt, geben Sie den Index dieses Zeichens -1 zurück.
-3 dank @AdmBorkBork - mit einer for-Schleife statt einer Weile.
quelle
Mathematica,
33-30BytesVielen Dank an Greg Martin für das Speichern von 3 Bytes.
Übernimmt die Eingabe als Zeichenfolge.
Ruft die Dezimalstellen (in Form von Zeichen) ab, teilt sie in Läufe identischer Elemente auf, ruft den letzten Lauf ab und berechnet die Länge mit dem Standardtrick der Summe des Vektors
1^list
.quelle
Characters
stattIntegerDigits
?Bash + Unix-Dienstprogramme, 34 Byte
Probieren Sie es online!
quelle
JavaScript (ES6),
39383727 BytesVielleicht nicht kürzer als die auf Regex basierende Lösung, aber ich konnte nicht widerstehen, eine Lösung zu schreiben, die ausschließlich auf Arithmetik basiert. Die Technik besteht darin, wiederholt zu nehmen
n % 100 % 11
und durch 10 zu dividieren, bis das Ergebnis ungleich Null ist, und dann die Iterationen zu zählen. Das funktioniert, weil wenn die letzten beiden Ziffern gleich sind,n % 100 % 11
werden0
.quelle
f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
Haskell , 33 Bytes
Probieren Sie es online!
Übernimmt die Zeichenketteneingabe. Schneidet das erste Zeichen wiederholt ab und fügt 1 hinzu, wenn alle Zeichen im Suffix mit dem ersten Zeichen übereinstimmen.
quelle
R, 35 Bytes
Kurze Erklärung
quelle
Befunge-98 , 19 Bytes
Probieren Sie es online!
Dies könnte verkürzt werden, wenn ich nur den Stack verwenden könnte.
Wie es funktioniert:
quelle
Python 3 -
5044 BytesVollständiges Programm (in Python 3 wird
input()
unabhängig von der Eingabe ein String zurückgegeben):quelle