Ce numéro est-il un repère?


33

Défi

Un repdigit est un entier non négatif dont les chiffres sont tous égaux.

Créez une fonction ou un programme complet qui prend un seul entier en entrée et génère une valeur de vérité si le nombre entré est un chiffre de référence en base 10 et une valeur falsy dans le cas contraire.

L'entrée est garantie d'être un entier positif .

Vous pouvez utiliser et utiliser l'entrée en tant que représentation sous forme de chaîne en base 10 en toute impunité.

Cas de test

Ce sont tous des repdigits inférieurs à 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

Une liste plus longue peut être trouvée sur OEIS .

Gagnant

Le code le plus court en octets gagne. Cela ne veut pas dire que des réponses intelligentes dans les langues verbeuses ne seront pas les bienvenues.



@ AidanF.Pierce Quel est le plus grand nombre d'entrées?
stevefestl

Réponses:



19

C (gcc) , 33 30 29 octets

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

Essayez-le en ligne!


Très belle astuce avec la récursivité et la cession au lieu de return(pensez que je vais voler cette dernière pour ma réponse :)).
Poignée de porte

@Doorknob Allez-y. :) Vous devrez cependant spécifier un compilateur; Je m'attends à ce que ce soit à peu près gcc / tcc seulement.
Dennis

Saviez-vous à l’avance que gcc -O0écrira avec nexactement le résultat final de eaxmanière à en faire la valeur de retour? Pourriez-vous préciser la logique pour laquelle vous saviez que cela fonctionnerait?
Ruslan

@Ruslan Je ne suis pas sûr de savoir pourquoi gcc se comporte de la sorte, mais la dernière assignation de variable à l'intérieur d'une fonction aboutit plus souvent à eax. Si je devais deviner, je dirais que c'est parce que cela permet return nd'être un nop, et il n'y a aucune raison d'assigner une variable locale à la fin d'une fonction si vous ne voulez pas renvoyer le résultat.
Dennis

9

COBOL , 139 BYTES

J'ai l'impression que COBOL n'a pas d'amour en code golf (probablement parce qu'il n'y a aucun moyen de gagner), mais voici:

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 est défini comme un PIC 9 (4).


2
Vous pouvez TRUEFALSE
jouer au


6

Python 3, 25, 24 19 octets.

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

Un stdin => variante de code d'erreur.

Retourne le code d'erreur 0 s'il s'agit d'un repdigit - ou une erreur en cas d'échec.

Merci à Dennis de m'avoir aidé dans les commentaires.


Puisque le code de sortie 0 indique un succès, je pense que vous devriez tester >1plutôt que <2. L'augmentation d'une erreur réelle serait plus courte que l'utilisation de exitBTW.
Dennis

Je me demandais à ce sujet. Le défi dit "une valeur de vérité". Je vais le changer pour générer une erreur.
Shadow

1
Oui, if python3 repdigit.py; then echo truthy; else echo falsy; fidoit fonctionner conformément à la définition, donc 0 est la vérité et tout le reste est de la fausseté.
Dennis

Ça a du sens. Ok je vais faire ce changement aussi.
Shadow

2
@ Arc676 Unary décompresse *un itérable. Par exemple, {*'123'}génère l'ensemble {'1','2','3'}.
Dennis

6

Mathematica, 27 octets

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

Cela ne bat pas Equal@@IntegerDigits@#&, mais cela bat l’autre solution Mathematica basée sur l’arithmétique.

Les repdigits sont de la forme n = d (10 m -1) / 9m est le nombre de chiffres et d le chiffre répété. On peut récupérer d de n en prenant le modulo 10 (car s'il s'agit d'un chiffre de représentation, son dernier chiffre sera d ). Nous pouvons donc simplement réorganiser ceci en m = log 10 (9 n / (n% 10) + 1) et vérifier si m est un entier.


5

Haskell , 15 octets

all=<<(==).head

Essayez-le en ligne! Prend une entrée de chaîne.

Équivalent à \s->all(==head s)s. De justesse bat les alternatives:

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)C'est une idée très intéressante, je n'étais pas au courant de ce comportement d' <*avant.
Laikoni

5

C (gcc), 41 octets

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

C'est une fonction qui prend l'entrée en tant que chaîne et retourne 1s'il s'agit d'un repdigit et 0sinon.

Pour ce faire, il utilise la strspnfonction, qui prend deux chaînes et renvoie la longueur du préfixe le plus long de la première chaîne, composé uniquement de caractères de la deuxième chaîne. Ici, la première chaîne est l'entrée et la deuxième chaîne est le dernier chiffre de l'entrée, obtenu en passant un pointeur sur le dernier caractère de la chaîne d'entrée.

Si l'entrée est un repdigit, alors le résultat de l'appel à strspnsera strlen(s). Ensuite, l'indexation dans sretournera un octet nul si c'est le cas ( str[strlen(str)]c'est toujours \0) ou le premier chiffre qui ne correspond pas au dernier chiffre sinon. La négation de ceci avec des !résultats en si sreprésente un repdigit.

Essayez-le en ligne!

Merci à @Dennis de m'avoir rappelé de manière indirecte le truc assigner plutôt que de retourner via sa réponse incroyablement impressionnante , économisant 4 octets!


Vous pouvez raccourcir ceci un peu plus loin en évitant strlenet en créant une nouvelle chaîne de *s: c;f(char*s){c=*s;c=!s[strspn(s,&c)];}pour 37.
hvd

5

PHP, 25 28 25

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

supprime tous les caractères de la droite qui sont égaux au premier et affiche 1si tous les caractères ont été supprimés.


5

R, 31 octets

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

Cette fonction fonctionne avec les entrées de chaîne et utilise une expression régulière pour déterminer si l'entrée est un repdigit.

Exemple

> 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 octets en passant de la fonction (x) à la fonction scan (, '') tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwA
Sumner18

5

/// , 110 octets

/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

Essayez-le en ligne!

Le langage /// n'a pas de concept de vérité et de falsey, donc il génère "T" si l'entrée est un repdigit, et ne génère aucun caractère si l'entrée n'est pas un repdigit.



4

Octave , 11 octets

@(s)s==s(1)

Essayez-le en ligne!

Prend l'entrée sous forme de chaîne.

Il vérifie que tous les caractères sont égaux aux premiers. Si tous sont égaux, le résultat sera un vecteur avec seulement 1(vrai dans Octave), sinon il y en aura au moins un 0(faux dans Octave). Voici une preuve .


N'auriez-vous pas besoin de l'envelopper all(...)pour obtenir une sortie de valeur vérité / fausseté?
Tom Carpenter

Avez-vous testé la preuve? Ce morceau de code est la définition (méta consensus) de vrai / faux sur ppcg.
Stewie Griffin

4

grep, 17 octets

grep -xP '(.)\1*'

Correspond à n'importe quelle chaîne qui répète son premier caractère.


4

C #, 42 33 28 octets

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

i doit être une chaîne.

Réduit beaucoup grâce à @LethalCoder


2
i[0].ToString()peut être raccourci à i[0]+"", <1est plus court que ==0.
TheLethalCoder

1
Aussi .Length<1peut juste être==""
TheLethalCoder

3

Braingolf , 6 octets

iul1-n

Essayez-le en ligne!

Malheureusement, l'entrée implicite de Braingolf à partir d'arguments en ligne de commande ne peut pas accepter une entrée composée uniquement de chiffres, elle le convertira toujours en nombre. La solution consiste donc à la transmettre via STDIN, ce qui ajoute 1 octet pour la lecture de STDIN (i ).

Explication:

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

Après u, la longueur de la pile est égale au nombre de caractères uniques dans l'entrée, soustraction de 1 signifie que ce sera 0si et seulement s'il y a exactement 1 caractère unique dans l'entrée, 0est le seul numéro de Falsey dans Python, nremplace donc 0par 1, et tout le reste avec 0.



3

JavaScript (ES6), 23 21 octets

2 octets sauvés grâce à Neil

Prend l'entrée sous forme de nombre entier ou de chaîne. Retourne un booléen.

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

Démo


Ne pas utiliser testau lieu de !!execsauvegarder 2 octets?
Neil

(Bien que, pour une entrée chaîne uniquement, le portage de la réponse PHP soit encore plus court.)
Neil

@ Neil Je ne sais pas ce que je pensais. Merci!
Arnauld

3

Ohm , 4 octets

Ul2<

Essayez-le en ligne!

Explication

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

Je pense que ça Ul≤devrait marcher.
Christoph

@Christoph Yee Je l'avais, mais je n'étais pas sûr que 0 soit considéré comme une valeur de vérité. (Assez nouveau à cette chose de codegolf ^^)
Date de livraison 8/08/17

Ah zut 0est falsey et chaque autre nombre est la vérité. Je viens de remarquer que nous avons besoin exactement du contraire pour ce défi (nous sommes souvent autorisés à échanger dès lors que nous déclarons quelle affaire est la vérité et laquelle est Falsey). La vérité est définie par "prendrait une franche".
Christoph

Ul1Edevrait aussi fonctionner (bien que je ne sache pas Ohm) car il n'a pas besoin de gérer 0.
Esolanging Fruit

3

APL, 5 octets

2 octets enregistrés grâce à @KritixiLithos

⍕≡1⌽⍕

Essayez-le en ligne!


Vous pouvez jouer au golf la solution de 7 octets à 5 octets en utilisant un train ⊢≡1⌽⊢.
Kritixi Lithos

@KritixiLithos merci!
Uriel

Remplacez par pour gérer les chaînes et les nombres.
Adám

@ Adám merci! Je ne pensais pas que le formatage était un moyen d’obtenir un tableau de chiffres.
Uriel

3

Java, 21 octets:

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

lest MutableList<Character>issu des collections eclipse.


1
lpourrait aussi être un CharAdapter.
Donald Raab

@ DonaldRaab oooh, je n'ai jamais vu cette classe. Belle trouvaille.
Nathan Merrill

Il existe également CodePointAdapter et CodePointList.
Donald Raab

1
@DonaldRaab J'utilise assez souvent les collections eclipse, mais j'ai toujours du mal à trouver quoi que ce soit en dehors des collections standard List / Map / Set. Votre connaissance est-elle basée sur le développement des bibliothèques, ou y a-t-il un endroit (autre que le javadoc) où je peux trouver une meilleure référence pour tout ce qu'EC fournit?
Nathan Merrill

Content de l'entendre. Je suis un partisan du framework ... J'ai écrit ces classes liées à String il y a un an environ. Il existe un Guide de référence que beaucoup de gens ignorent. J'ai récemment mis au point une carte mentale pour aider les gens à apprendre et à naviguer dans la pléthore de fonctions de la bibliothèque. C'est le dernier lien dans la table des matières de la réf. Guider. github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab

3

Kotlin , 28 19 octets

{it.toSet().size<2}

Essayez-le en ligne!

Prend en entrée String cause

Vous pouvez utiliser et utiliser l'entrée en tant que représentation sous forme de chaîne en base 10 en toute impunité.

Explication

{
    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
}

Si vous n'aimez pas le fait que cela prend un String, vous pouvez en avoir un qui prend un Intpour 24 octets .

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

3

Regex (ECMAScript), 31 octets

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

Essayez-le en ligne!

Prend les entrées de manière unaire, comme d'habitude pour les expressions rationnelles mathématiques (notez que le problème est trivial avec une entrée décimale: juste ^(.)\1*$).

Explication:

^(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 Oups, j'ai oublié de mettre ça dedans, merci!
Grimmy


2

Neim , 1 octet

𝐐

Vérifie simplement que tous les éléments sont égaux.

Sans construit, 2 octets:

𝐮𝐥

Explication:

𝐮     Calculate unique digits
 𝐥    Get the length

Cela fonctionne parce que seule la 1vérité est considérée dans Neim, et tout le reste est faux.

Alternativement, pour 4 octets:

𝐮𝐣μ𝕃

Explication:

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

Essayez le!


2

C, 38 octets

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

Marche récursivement une chaîne. Si les deux premiers caractères diffèrent ( *s^s[1]), alors nous ne réussirons que si nous sommes à la fin de la chaîne ( !s[1]), sinon nous répétons le test à la position suivante (f(s+1) ).

Programme de test

#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 octets

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

nest un String, naturellement.

Notez que ^...$l'expression régulière n'est pas nécessaire, car elle est automatiquement utilisée pour la correspondance exacte (telle que la matchméthode), par rapport à la recherche dans la chaîne.

Essayez le!

Enregistre

  • -5 octets: utilisé Stringdepuis "Vous pouvez utiliser et utiliser les entrées comme une chaîne en toute impunité."
  • -10 octets: regex est apparemment un bon choix.

Was about to post this exact solution, including the explanation about the matches not requiring ^$ because it matches the entire String. So a definite +1 from me. ;)
Kevin Cruijssen

2

R, 25 bytes

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

Try it online

Best non-regex solution I could come up with was 36 bytes:

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

1
for another option on the non-regex rle(charToRaw(scan(,'')))$v[2]<1
MickyT

2

Cubix, 15 bytes

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

Try it online!

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

Watch It Run

Outputs 1 for truthy and nothing for falsey

Very simply read reads in the input one character at a time. It takes the current character away from the previous. If a non zero result then it halts immediately. Otherwise it continues inputting and comparing until the EOI. On EOI (-1), negate and exit


2

QBasic 4.5, 55 bytes

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

I've mathed it! The FOR-loop checks the number of digits in the input, then creates c, which is a series of 1's of length equal to the input. A number then is repdigit if it modulo the one-string == 0.

Try it online! Note that the online interpreter is a bit quirky and I had to write out a couple of statements that the DOS-based QBasic IDE would expand automatically.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.