Ist diese Nummer eine Umstellung?


33

Herausforderung

Ein Repdigit ist eine nicht negative Ganzzahl, deren Ziffern alle gleich sind.

Erstellen Sie eine Funktion oder ein vollständiges Programm, das eine einzelne Ganzzahl als Eingabe annimmt und einen Wahrheitswert ausgibt, wenn die eingegebene Zahl in der Basis 10 eine Umstellziffer ist, andernfalls einen falschen Wert.

Die Eingabe ist garantiert eine positive Ganzzahl.

Sie können die Eingabe ungestraft als Zeichenfolgendarstellung in Basis 10 verwenden.

Testfälle

Dies sind alles Umbuchungen unter 1000.

1
2
3
4
5
6
7
8
9
11
22
33
44
55
66
77
88
99
111
222
333
444
555
666
777
888
999

Eine größere Liste finden Sie auf OEIS .

Gewinnen

Der kürzeste Code in Bytes gewinnt. Das heißt nicht, dass kluge Antworten in ausführlichen Sprachen nicht erwünscht sind.



@ AidanF.Pierce Was ist die größte Zahl, die der Eingang sein wird?
Stevefestl

Antworten:



19

C (GCC) , 33 30 29 Byte

f(n){n=n%100%11?9/n:f(n/10);}

Probieren Sie es online!


Sehr netter Trick mit der Rekursion und Zuweisung statt return(denke, ich werde letzteres für meine Antwort stehlen :)).
Türknauf

@Doorknob Mach weiter. :) Sie müssen jedoch einen Compiler angeben. Ich erwarte, dass dies nur ziemlich gcc / tcc ist.
Dennis

Wusstest du vorher, dass gcc mit -O0das Endergebnis nvon genau schreibt eax, um es zum Rückgabewert zu machen? Könnten Sie die Logik näher erläutern, warum Sie wussten, dass sie funktionieren würde?
Ruslan

@ Ruslan Ich bin mir nicht sicher, warum sich gcc so verhält, aber die letzte Variablenzuweisung in einer Funktion wird öfter in eax ausgeführt als nicht. Wenn ich raten müsste, würde ich sagen, es liegt daran, dass es erlaubt return n, ein NOP zu sein, und es gibt keinen Grund, eine lokale Variable am Ende einer Funktion zuzuweisen, wenn Sie das Ergebnis nicht zurückgeben wollen.
Dennis

9

COBOL , 139 BYTES

Ich habe das Gefühl, dass COBOL das Code-Golfen nicht mag (wahrscheinlich, weil es auf keinen Fall gewinnen kann), aber hier ist:

IF A = ALL '1' OR ALL '2' OR ALL '3' OR ALL '4' OR ALL '5' OR
ALL '6' OR ALL '7' OR ALL '8' OR ALL '9' DISPLAY "TRUE" ELSE   
DISPLAY "FALSE".

A ist als PIC 9 (4) definiert.


2
Sie können dies Golf spielen, indem Sie TRUEund FALSEauf 1 bzw. 0
ändern


6

Python 3, 25, 24, 19 Bytes.

len({*input()})>1>t

Eine stdin => Fehlercodevariante.

Gibt den Fehlercode 0 zurück, wenn es sich um eine Neuziffer handelt - oder um einen Fehler bei einem Fehler.

Vielen Dank an Dennis, der mir in den Kommentaren geholfen hat.


Da der Exit-Code 0 Erfolg anzeigt, sollten Sie >1eher testen als <2. Das Auslösen eines tatsächlichen Fehlers wäre kürzer als das Verwenden von exitBTW.
Dennis

Ich habe mich darüber gewundert. Die Herausforderung lautet "ein wahrer Wert". Ich werde es ändern, um einen Fehler auszulösen.
Shadow

1
Ja, if python3 repdigit.py; then echo truthy; else echo falsy; fimuss nach unserer Definition funktionieren, also ist 0 wahr und alles andere falsch.
Dennis

Das macht Sinn. Ok, ich werde das auch ändern.
Shadow

2
@ Arc676 *Unary entpackt eine iterable. Beispielsweise {*'123'}erzeugt das Set {'1','2','3'}.
Dennis

6

Mathematica, 27 Bytes

AtomQ@Log10[9#/#~Mod~10+1]&

Es schlägt nicht Equal@@IntegerDigits@#&, aber es schlägt die andere arithmetikbasierte Mathematica-Lösung.

Wiederholungsziffern haben die Form n = d (10 m & supmin; ¹ ) / 9, wobei m die Anzahl der Ziffern und d die wiederholte Ziffer ist. Wir können d von n wiederherstellen, indem wir es modulo 10 nehmen (denn wenn es eine Wiederholungsziffer ist, ist es die letzte Ziffer d ). Wir können dies also einfach als m = log 10 (9 n / (n% 10) + 1) neu anordnen und prüfen, ob m eine ganze Zahl ist.


5

Haskell , 15 Bytes

all=<<(==).head

Probieren Sie es online! Übernimmt die Zeichenketteneingabe.

Entspricht \s->all(==head s)s. Schmale Alternativen:

f s=all(==s!!0)s
f s=s==(s!!0<$s)
f(h:t)=all(==h)t
f(h:t)=(h<$t)==t
f s=(s<*s)==(s*>s)
f(h:t)=h:t==t++[h]

f s=(s<*s)==(s*>s)ist eine sehr interessante idee, mir war dieses verhalten <*vorher nicht bewusst .
Laikoni

5

C (gcc), 41 Bytes

f(char*s){s=!s[strspn(s,s+strlen(s)-1)];}

Dies ist eine Funktion, die Eingaben als Zeichenfolge 1akzeptiert und zurückgibt, wenn es sich um eine Umdigit handelt, und 0ansonsten.

Hierzu wird die strspnFunktion verwendet, die zwei Zeichenfolgen verwendet und die Länge des längsten Präfixes der ersten Zeichenfolge zurückgibt, das nur aus Zeichen der zweiten Zeichenfolge besteht. Hier ist die erste Zeichenfolge die Eingabe, und die zweite Zeichenfolge ist die letzte Ziffer der Eingabe, die durch Übergeben eines Zeigers auf das letzte Zeichen der Eingabezeichenfolge erhalten wird.

Iff dem Eingang ist eine Schnapszahl, dann auf das Ergebnis des Aufrufs strspnwird strlen(s). Die Indizierung in gibt sdann ein Null-Byte zurück, wenn dies der Fall ist ( str[strlen(str)]immer der Fall ist \0) oder die erste Ziffer, die sonst nicht mit der letzten Ziffer übereinstimmt. Wenn Sie dies mit negieren, wird festgestellt, !ob es sich sum eine Neuziffer handelt.

Probieren Sie es online!

Vielen Dank an @Dennis, der mich indirekt über seine unglaublich beeindruckende Antwort an den Trick "Zuweisen statt Zurückgeben" erinnert hat und dabei 4 Bytes gespart hat!


Sie können dies ein bisschen weiter verkürzen, strlenindem Sie eine neue Zeichenfolge vermeiden und erstellen von *s: c;f(char*s){c=*s;c=!s[strspn(s,&c)];}für 37.
hvd

5

PHP, 25 28 25

<?=!chop($argn,$argn[0]);

entferne alle Zeichen von rechts, die gleich dem ersten sind und drucke, 1wenn alle Zeichen entfernt wurden.


5

R, 31 Bytes

function(x)grepl("^(.)\\1*$",x)

Diese Funktion arbeitet mit Zeichenfolgeneingaben und verwendet einen regulären Ausdruck, um zu bestimmen, ob die Eingabe eine Umstellziffer ist.

Beispiel

> f <- function(x)grepl("^(.)\\1*$",x)
> x <- c("1", "2", "11", "12", "100", "121", "333")
> f(x)
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE

28 Bytes durch Umschalten von Funktion (x) auf Scan (, '') tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwA
Sumner18

5

/// 110 Bytes

/11/1//22/2//33/3//44/4//55/5//66/6//77/7//88/8//99/9//1/.//2/.//3/.//4/.//5/.//6/.//7/.//8/.//9/.//T..///.//T

Probieren Sie es online!

Die /// Sprache hat kein Konzept von Wahrhaftigkeit und Falschheit, daher gibt diese "T" aus, wenn die Eingabe eine Umstellziffer ist, und gibt keine Zeichen aus, wenn die Eingabe keine Umstellziffer ist.



4

Oktave , 11 Bytes

@(s)s==s(1)

Probieren Sie es online!

Nimmt die Eingabe als String.

Es prüft alle Zeichen auf Gleichheit mit den ersten Zeichen. Wenn alle gleich sind, ist das Ergebnis ein Vektor mit nur 1(wahr in Oktave), andernfalls gibt es mindestens einen 0(falsch in Oktave). Hier ist ein Beweis .


all(...)Müssten Sie es nicht einpacken, um eine Ausgabe mit wahrem / falschem Wert zu erhalten?
Tom Carpenter

Hast du den Beweis getestet? Dies ist die Definition (Metakonsens) von true / false auf ppcg.
Stewie Griffin

4

grep, 17 bytes

grep -xP '(.)\1*'

Stimmt mit jeder Zeichenfolge überein, die eine Wiederholung des ersten Zeichens darstellt.


4

C #, 42 33 28 Bytes

i=>i.Replace(i[0]+"","")==""

i muss eine Zeichenfolge sein.

Dank @LethalCoder viel rasiert


2
i[0].ToString()verkürzt werden kann i[0]+"", <1ist kürzer als ==0.
TheLethalCoder

1
Auch .Length<1kann einfach sein==""
TheLethalCoder

3

Braingolf , 6 Bytes

iul1-n

Probieren Sie es online!

Leider kann Braingolfs implizite Eingabe von Kommandozeilenargumenten keine Ganzzahleingabe als Zeichenfolge akzeptieren. Sie wird immer in eine Zahl umgewandelt. Stattdessen besteht die Lösung darin, sie über STDIN zu übergeben, wodurch 1 Byte zum Lesen von STDIN ( i) hinzugefügt wird.

Erläuterung:

iul1-n
i       Read from STDIN as string, push each codepoint to stack
 u      Remove duplicates from stack
  l     Push length of stack
   1-   Subtract 1
     n  Boolean negate, replace each item on stack with 1 if it is a python falsey value
        replace each item on stack with 0 if it is a python truthy value
        Implicit output of last item on stack

Nachdem udie Länge des Stapels die Anzahl der eindeutigen Zeichen in der Eingabe entspricht, Subtrahieren von 1 bedeutet , dass es sein , 0wenn , und nur , wenn es genau 1 eindeutige Zeichen in der Eingabe ist, 0ist die einzige Falsey Zahl in Python, so nersetzt 0mit 1, und alles andere mit0 .



3

JavaScript (ES6), 23 21 Bytes

2 Bytes gespart dank Neil

Übernimmt die Eingabe entweder als Ganzzahl oder als Zeichenfolge. Gibt einen Booleschen Wert zurück.

n=>/^(.)\1*$/.test(n)

Demo


Verwendet testanstatt !!exec2 Bytes zu sparen?
Neil

(Obwohl für eine reine Zeichenfolge-Eingabe die Portierung der PHP-Antwort noch kürzer ist.)
Neil,

@Neil Ich weiß nicht, was ich gedacht habe. Vielen Dank!
Arnauld

3

Ohm , 4 Bytes

Ul2<

Probieren Sie es online!

Erläuterung

 Ul2<
 U    # Push uniquified input
  l   # Length
   2< # Is it smaller than 2?

Ich denke Ul≤sollte funktionieren.
Christoph

@Christoph Yee Ich hatte das, aber ich war mir nicht sicher, ob 0 als wahrer Wert gilt. (Ganz neu in dieser Codegolf-Sache ^^)
Datboi

Ah verdammt 0ist falsch und jede andere Zahl ist wahr. Mir ist gerade aufgefallen, dass wir für diese Herausforderung genau das Gegenteil brauchen (oft dürfen wir tauschen, solange wir erklären, welcher Fall wahr und welcher falsch ist). Wahrheit wird definiert durch "würde eine Pause einlegen".
Christoph

Ul1Esollte auch funktionieren (obwohl ich Ohm nicht kenne), da es nicht mit 0 umgehen muss.
Esolanging Fruit

3

APL, 5 Bytes

2 Bytes gespart dank @KritixiLithos

⍕≡1⌽⍕

Probieren Sie es online!


Sie können die 7-Byte-Lösung mit einem Zug auf 5 Byte verteilen ⊢≡1⌽⊢.
Kritixi Lithos

@KritixiLithos danke!
Uriel

Ersetzen Sie mit , um sowohl Zeichenfolgen als auch Zahlen zu behandeln.
Adám

@Adám danke! Ich dachte nicht an Formatierung, um eine Reihe von Ziffern zu erhalten.
Uriel

3

Java, 21 Bytes:

l->l.toSet().size()<2

list eine MutableList<Character>von Eclipse-Sammlungen.


1
lkönnte auch ein CharAdapter sein.
Donald Raab

@DonaldRaab oooh, ich habe diese Klasse noch nie gesehen. Schöner Fund.
Nathan Merrill

Es gibt auch CodePointAdapter und CodePointList.
Donald Raab

1
@DonaldRaab Ich verwende Eclipse-Sammlungen ziemlich oft, aber ich habe immer Schwierigkeiten, irgendetwas außerhalb der Standard-Listen- / Karten- / Set-Sammlungen zu finden. Basiert Ihr Wissen auf der Entwicklung der Bibliotheken oder gibt es irgendwo (außer im Javadoc) eine bessere Referenz für alles, was EC bietet?
Nathan Merrill

Froh das zu hören. Ich bin ein Committer für das Framework ... Ich habe diese speziellen String-bezogenen Klassen vor ungefähr einem Jahr geschrieben. Es gibt ein Nachschlagewerk, von dem viele Leute nichts wissen. Es gibt eine Mindmap, die ich kürzlich zusammengestellt habe, um den Leuten das Lernen und Navigieren durch die Fülle der Funktionen in der Bibliothek zu erleichtern. Es ist das letzte Glied im Inhaltsverzeichnis des Verweises. Führen. github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab

3

Kotlin , 28 19 Bytes

{it.toSet().size<2}

Probieren Sie es online!

Nimmt Eingaben als Stringweil

Sie können die Eingabe ungestraft als Zeichenfolgendarstellung in Basis 10 verwenden.

Erläuterung

{
    it.toSet()     // create a Set (collection with only unique entries)
                   // out of the characters of this string
        .size < 2  // not a repdigit if the set only has one entry
}

Wenn Sie die Tatsache nicht mögen, dass es eine braucht String, können Sie eine haben, die eine Intfür 24 Bytes benötigt .

{(""+it).toSet().size<2}

3

Regex (ECMAScript), 31 Bytes

^(x{0,9})((x+)\3{8}(?=\3$)\1)*$

Probieren Sie es online!

Nimmt Eingaben in Unary auf, wie es für mathematische Regexes üblich ist (beachte, dass das Problem bei Dezimaleingaben trivial ist: just ^(.)\1*$ ).

Erläuterung:

^(x{0,9})           # \1 = candidate digit, N -= \1
(                   # Loop the following:
  (x+)\3{8}(?=\3$)  # N /= 10 (fails and backtracks if N isn’t a multiple of 10)
  \1                # N -= \1
)* $                # End loop, assert N = 0


@Deadcode Whoops Ich habe vergessen, das einzutragen, danke!
Grimmy

2

PHP, 30 Bytes

<?=($a=$argn).$a[0]==$a[0].$a;

@Dada Nein. Es werden 4344 und 4434 verglichen.
user63956

Oh richtig, mein schlechtes. danke
Dada

2

Neim , 1 Byte

𝐐

Überprüft einfach, ob alle Elemente gleich sind.

Ohne eingebautes, 2 Bytes:

𝐮𝐥

Erläuterung:

𝐮     Calculate unique digits
 𝐥    Get the length

Das funktioniert da nur 1 in Neim als wahr angesehen wird und alles andere falsch ist.

Alternativ für 4 Bytes:

𝐮𝐣μ𝕃

Erläuterung:

𝐮      Calculate unique digits
 𝐣      Join list into an integer
   𝕃   Check that is is less than
  μ    Ten.

Versuch es!


2

C 38 Bytes

f(char*s){return*s^s[1]?!s[1]:f(s+1);}

Geht rekursiv eine Zeichenfolge. Wenn sich die ersten beiden Zeichen unterscheiden ( *s^s[1]), ist dies nur dann erfolgreich, wenn wir am Ende der Zeichenfolge ( !s[1]) sind, andernfalls wiederholen wir den Test an der nächsten Position ( f(s+1)).

Testprogramm

#include <stdio.h>
int main(int argc, char **argv)
{
    while (*++argv)
        printf("%s: %s\n", *argv, f(*argv)?"yes":"no");
}

2

Java, 38 33 23 Bytes

n->n.matches("(.)\\1*")

nist Stringnatürlich ein.

Beachten Sie, dass ^...$der reguläre Ausdruck nicht erforderlich ist, da er im matchVergleich zum Suchen in der Zeichenfolge automatisch für die exakte Zuordnung verwendet wird (z. B. die Methode).

Versuch es!

Speichert

  • -5 Bytes: verwendet String seit "Sie können Eingaben ungestraft als Zeichenfolge verwenden."
  • -10 Bytes: Regex ist anscheinend eine gute Passform.

War dabei, genau diese Lösung zu posten, einschließlich der Erklärung über das matchesNichterfordernis, ^$da es mit dem gesamten String übereinstimmt. Also ein definitives +1 von mir. ;)
Kevin Cruijssen

2

R, 25 Bytes

grepl("^(.)\\1*$",scan())

Probieren Sie es online aus

Die beste Nicht-Regex-Lösung, die ich finden konnte, war 36 Byte:

is.na(unique(el(strsplit(x,"")))[2])

1
für eine andere Option auf die Non-Regexrle(charToRaw(scan(,'')))$v[2]<1
MickyT

2

Cubix , 15 Bytes

uOn@ii?-?;.$@<_

Probieren Sie es online!

    u O
    n @
i i ? - ? ; . $
@ < _ . . . . .
    . .
    . .

Beobachten Sie es laufen

Gibt 1 für wahr und nichts für falsch aus

Ganz einfach lesen liest die Eingabe zeichenweise ein. Es entfernt das aktuelle Zeichen vom vorherigen. Wenn das Ergebnis nicht Null ist, wird es sofort angehalten. Andernfalls wird die Eingabe und der Vergleich bis zum EOI fortgesetzt. Negieren Sie auf EOI (-1) und beenden Sie


2

QBasic 4.5, 55 Bytes

INPUT a
FOR x=1TO LEN(STR$(a))
c=c*10+1
NEXT
?a MOD c=0

Ich habe es nachgerechnet! Die FOR-Schleife überprüft die Anzahl der Stellen in der Eingabe und erstellt dann ceine Reihe von Einsen , deren Länge der Eingabe entspricht. Eine Zahl ist dann repdigit, wenn sie den Einstring == 0 moduliert.

Probieren Sie es online! Beachten Sie, dass der Online-Interpreter etwas schrullig ist und ich einige Anweisungen schreiben musste, dass die DOS-basierte QBasic-IDE automatisch erweitert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.