Esse número é um repdigit?

33

Desafio

Um repdigit é um número inteiro não negativo cujos dígitos são todos iguais.

Crie uma função ou programa completo que utilize um único número inteiro como entrada e emita um valor verdadeiro se o número de entrada for um re-dígito na base 10 e, caso contrário, o valor falso.

A entrada é garantida como um número inteiro positivo .

Você pode pegar e usar a entrada como uma representação de string na base 10 com impunidade.

Casos de teste

Todos esses são redigits abaixo de 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

Uma lista maior pode ser encontrada no OEIS .

Ganhando

O código mais curto em bytes vence. Isso não quer dizer que respostas inteligentes em idiomas detalhados não sejam bem-vindas.

Aidan F. Pierce
fonte
2
Relacionado .
Freira vazada
@ AidanF.Pierce Qual é o maior número de entradas?
stevefestl

Respostas:

21

Braquilog , 1 byte

=

Experimente online!

Isso atua em números inteiros.

De src/predicates.pl#L1151:

brachylog_equal('integer':0, 'integer':0, 'integer':0).
brachylog_equal('integer':0, 'integer':I, 'integer':I) :-
    H #\= 0,
    integer_value('integer':_:[H|T], I),
    brachylog_equal('integer':0, [H|T], [H|T]).
Freira Furada
fonte
Decidi aceitar esse porque é o primeiro envio de 1 byte.
Aidan F. Pierce
19

C (gcc) , 33 30 29 bytes

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

Experimente online!

Dennis
fonte
Um truque muito bom com a recursão e a tarefa em vez de return(acho que vou roubar o último pela minha resposta :)).
Maçaneta
@Doorknob Vá em frente. :) Você terá que especificar um compilador; Espero que isso seja basicamente apenas gcc / tcc.
Dennis
Você sabia de antemão que o gcc com -O0escreverá o resultado final nexatamente de eax, para torná-lo o valor de retorno? Você poderia elaborar a lógica por que sabia que funcionaria?
Ruslan
@Ruslan Não sei ao certo por que o gcc se comporta dessa maneira, mas a última atribuição de variável dentro de uma função acaba no eax com mais frequência do que nunca. Se eu tivesse que adivinhar, diria que é porque permite return nser um nop, e não há razão para atribuir a uma variável local no final de uma função se você não quiser retornar o resultado.
Dennis
9

COBOL , 139 BYTES

Eu sinto que o COBOL não gosta de golfe de código (provavelmente porque não há como ele vencer), mas aqui vai:

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 é definido como um PIC 9 (4).

SaggingRufus
fonte
2
Você pode golfe isto mudando TRUEe FALSEa 1 e 0, respectivamente
caird coinheringaahing
6

Python 3, 25, 24 e 19 bytes.

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

Uma variante de código de erro stdin =>.

Retorna o código de erro 0 se for um repdigit - ou um erro na falha.

Agradeço ao Dennis por me ajudar nos comentários.

Sombra
fonte
Como o código de saída 0 indica sucesso, acho que você deve testar >1e não <2. Gerar um erro real seria mais curto do que usar exitbtw.
Dennis
Eu estava me perguntando sobre isso. O desafio diz "um valor verdadeiro". Vou alterá-lo para gerar um erro.
Shadow
1
Sim, if python3 repdigit.py; then echo truthy; else echo falsy; fitem que funcionar de acordo com a definição, então 0 é verdadeiro e todo o resto é falso.
Dennis
Isso faz sentido. Ok, eu vou fazer essa mudança também.
Shadow
2
@ Arc676 Unary *descompacta um iterável. Por exemplo, {*'123'}gera o conjunto {'1','2','3'}.
Dennis
6

Mathematica, 27 bytes

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

Não bate Equal@@IntegerDigits@#&, mas supera a outra solução Mathematica baseada em aritmética.

Os repdígitos têm a forma n = d (10 m -1) / 9, em que m é o número de dígitos ed é o dígito repetido. Podemos recuperar d de n usando o módulo 10 (porque se for um dígito repetitivo, será o último dígito d ). Portanto, podemos apenas reorganizar isso como m = log 10 (9 n / (n% 10) + 1) e verificar se m é um número inteiro.

Martin Ender
fonte
5

Haskell , 15 bytes

all=<<(==).head

Experimente online!Pega a entrada da string.

Equivalente a \s->all(==head s)s. Estreitamente supera alternativas:

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]
xnor
fonte
f s=(s<*s)==(s*>s)é uma ideia muito interessante, eu não estava ciente desse comportamento de <*antes.
Laikoni 8/17
5

C (gcc), 41 bytes

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

Esta é uma função que recebe a entrada como uma string e retorna 1se for um repdigit e0 não.

Faz isso fazendo uso do strspn função, que pega duas cadeias e retorna o comprimento do prefixo mais longo da primeira cadeia, consistindo apenas em caracteres da segunda cadeia. Aqui, a primeira string é a entrada e a segunda string é o último dígito da entrada, obtido ao passar um ponteiro para o último caractere da string de entrada.

Se a entrada for um re-dígito, o resultado da chamada para strspnserá strlen(s). Em seguida, a indexação sretornará um byte nulo, se este for o caso ( str[strlen(str)]é sempre \0) ou o primeiro dígito que não corresponder ao último dígito. Negar isso com !resultados se srepresenta um repdigit.

Experimente online!

Agradeço ao @Dennis por me lembrar indiretamente do truque de atribuir em vez de retornar por meio de sua resposta incrivelmente impressionante , economizando 4 bytes!

Maçaneta da porta
fonte
Você pode encurtar isso um pouco mais, evitando strlene criando uma nova string a partir de *s: c;f(char*s){c=*s;c=!s[strspn(s,&c)];}for 37. #
737
5

PHP, 25 28 25

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

remova todos os caracteres da direita que sejam iguais ao primeiro e imprima 1se todos os caracteres foram removidos.

Christoph
fonte
5

R, 31 bytes

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

Essas funções funcionam com entradas de sequência e usam uma expressão regular para determinar se a entrada é um repdigit.

Exemplo

> 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
Sven Hohenstein
fonte
28 bytes, alternando da função (x) para usar 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

Experimente online!

A linguagem /// não tem nenhum conceito de verdade e falsey, portanto, gera "T" se a entrada é um re-dígito e não gera nenhum caractere se a entrada não é um re-dígito.

Tanner Swett
fonte
4

Oitava , 11 bytes

@(s)s==s(1)

Experimente online!

Toma a entrada como uma sequência.

Ele verifica a igualdade de todos os caracteres com os primeiros caracteres. Se todos forem iguais, o resultado será um vetor com apenas 1(verdadeiro no Octave), caso contrário, haverá pelo menos um 0(falso no Octave). Aqui está uma prova .

Stewie Griffin
fonte
Você não precisaria envolvê-lo all(...)para obter uma saída de valor verdadeiro / falso?
Tom Carpenter
Você testou a prova? Esse trecho de código é a definição (meta consenso) de true / false no ppcg.
Stewie Griffin
4

grep, 17 bytes

grep -xP '(.)\1*'

Corresponde a qualquer sequência que seja uma repetição de seu primeiro caractere.

Toby Speight
fonte
4

C #, 42 33 28 bytes

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

i tem que ser uma string.

Muito raspada graças a @LethalCoder

LiefdeWen
fonte
2
i[0].ToString()pode ser reduzido para i[0]+"", <1é menor que ==0.
TheLethalCoder
1
Também .Length<1pode ser apenas==""
TheLethalCoder
3

Braingolf , 6 bytes

iul1-n

Experimente online!

Infelizmente, a entrada implícita de Braingolf a partir dos argumentos da linha de comando não pode aceitar uma entrada com todos os dígitos como uma string; ela sempre a converterá em um número; portanto, a solução é transmiti-la via STDIN, que adiciona 1 byte para ler STDIN (i )

Explicação:

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

Depois u, o comprimento da pilha é igual ao número de caracteres únicos na entrada, subtraindo 1 significa que será 0se, e somente se houver exatamente 1 caractere exclusivo na entrada, 0for o único número falsey no Python, nsubstituindo 0por 1, e tudo mais com 0.

Skidsdev
fonte
3

JavaScript (ES6), 23 21 bytes

Economizou 2 bytes graças a Neil

Recebe a entrada como um número inteiro ou uma sequência. Retorna um booleano.

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

Demo

Arnauld
fonte
Não usa em testvez de !!execsalvar 2 bytes?
911 Neil
(Embora, para uma entrada única cordas, portando a resposta PHP é ainda mais curto.)
Neil
@ Neil Eu não sei o que estava pensando. Obrigado!
Arnauld
3

Ohm , 4 bytes

Ul2<

Experimente online!

Explicação

 Ul2<
 U    # Push uniquified input
  l   # Length
   2< # Is it smaller than 2?
Datboi
fonte
Eu acho que Ul≤deveria funcionar.
Christoph
@Christoph Yee, eu tinha isso, mas não tinha certeza se 0 conta como um valor verdadeiro. (Muito novo para essa coisa codegolf ^^)
Datboi
Ah, caramba, 0é falsey e todos os outros números são verdadeiros. Acabei de perceber que precisamos exatamente do oposto para esse desafio (geralmente podemos trocar, desde que declaremos qual caso é verdadeiro e qual é falsey). Truthy é definido por "tomaria um brench".
Christoph
Ul1Etambém deve funcionar (embora eu não sei Ohm), porque ele não precisa lidar com 0.
Esolanging Fruit
3

APL, 5 bytes

2 bytes salvos graças a @KritixiLithos

⍕≡1⌽⍕

Experimente online!

Uriel
fonte
Você pode jogar a solução de 7 bytes em 5 bytes usando um trem ⊢≡1⌽⊢.
Kritixi Lithos
@KritixiLithos thanks!
Uriel
Substitua por para lidar com seqüências de caracteres e números.
Adám 8/06
@ Adám obrigado! Não pensei em formatação como uma maneira de obter uma matriz de dígitos.
Uriel
3

Java, 21 bytes:

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

lé uma MutableList<Character>das coleções do eclipse.

Nathan Merrill
fonte
1
ltambém poderia ser um CharAdapter.
Donald Raab
@DonaldRaab oooh, eu nunca vi essa classe. Bom achado.
Nathan Merrill
Existem também CodePointAdapter e CodePointList.
Donald Raab
1
@DonaldRaab Uso bastante as coleções eclipse, mas sempre luto para encontrar algo fora das coleções padrão List / Map / Set. Seu conhecimento é baseado no desenvolvimento das bibliotecas ou existe algum lugar (além do javadoc) em que posso encontrar uma referência melhor para tudo o que a CE fornece?
Nathan Merrill
Fico feliz em ouvir isso. Eu sou um colaborador da estrutura ... Eu escrevi essas classes específicas relacionadas a String há um ano ou mais. Existe um Guia de Referência que muitas pessoas desconhecem. Recentemente, criei um mapa mental para ajudar as pessoas a aprender e a navegar pela infinidade de recursos da biblioteca. É o último link no sumário da referência. Guia. github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab
3

Kotlin , 28 19 bytes

{it.toSet().size<2}

Experimente online!

Toma entrada como um Stringporque

Você pode pegar e usar a entrada como uma representação de string na base 10 com impunidade.

Explicação

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

Se você não gostar do fato de ser um String, pode ter um que sejaInt por 24 bytes .

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

Regex (ECMAScript), 31 bytes

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

Experimente online!

Recebe entrada unária, como de costume para expressões regulares matemáticas (observe que o problema é trivial com entrada decimal: apenas ^(.)\1*$ ).

Explicação:

^(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
Grimmy
fonte
@Deadcode Whoops Eu esqueci de colocar isso, obrigado!
Grimmy
2

PHP, 30 bytes

<?=($a=$argn).$a[0]==$a[0].$a;
user63956
fonte
@Dada No. Comparará 4344 e 4434. #
user63956 8/17/17
Oh, certo, meu mal. obrigado
Dada
2

Neim , 1 byte

𝐐

Simplesmente verifica se todos os elementos são iguais.

Sem embutido, 2 bytes:

𝐮𝐥

Explicação:

𝐮     Calculate unique digits
 𝐥    Get the length

Isso funciona porque apenas 1 é considerado verdadeiro em Neim, e todo o resto é falso.

Como alternativa, para 4 bytes:

𝐮𝐣μ𝕃

Explicação:

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

Tente!

Okx
fonte
2

C, 38 bytes

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

Recursivamente caminha uma corda. Se os dois primeiros caracteres diferirem ( *s^s[1]), teremos sucesso apenas se estivermos no final da string ( !s[1]), caso contrário, repetiremos o teste na próxima posição ( f(s+1)).

Programa de teste

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

Java, 38 33 23 bytes

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

né um String, naturalmente.

Observe que não há necessidade ^...$no regex, pois ele é usado automaticamente para a correspondência exata (como o matchmétodo), em comparação com a localização na string.

Tente!

Salva

  • -5 bytes: usado String desde "Você pode receber e usar a entrada como uma string com impunidade".
  • -10 bytes: o regex parece ser um bom ajuste.
Olivier Grégoire
fonte
Estava prestes a publicar esta solução exata, incluindo a explicação sobre o matchesnão requerimento, ^$porque corresponde à String inteira. Então, um +1 definitivo de mim. ;)
Kevin Cruijssen
2

R, 25 bytes

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

Experimente online

A melhor solução não-regex que eu consegui encontrar foi 36 bytes:

is.na(unique(el(strsplit(x,"")))[2])
user2390246
fonte
1
para outra opção no non-regexrle(charToRaw(scan(,'')))$v[2]<1
MickyT 8/17/17
2

Cubix , 15 bytes

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

Experimente online!

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

Assista

Saídas 1 para verdade e nada para falsey

Simplesmente leia leituras na entrada, um caractere de cada vez. Afasta o caractere atual do anterior. Se um resultado diferente de zero, ele será interrompido imediatamente. Caso contrário, ele continua inserindo e comparando até o EOI. No EOI (-1), negue e saia

MickyT
fonte
2

QBasic 4.5, 55 bytes

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

Eu calculei isso! O loop FOR verifica o número de dígitos na entrada e criac , que é uma série de 1's de comprimento igual à entrada. Um número é re-digitado se modular a string == 0.

Experimente online! Observe que o intérprete on-line é um pouco peculiar e eu tive que escrever algumas declarações de que o QBasic IDE baseado em DOS se expandia automaticamente.

steenbergh
fonte