É um número cíclico?

20

Um número cíclico é um número de "n" dígitos que, quando multiplicados por 1, 2, 3, ... n, resulta nos mesmos dígitos, mas em uma ordem diferente.

Por exemplo, o número 142.857 é um número cíclico, pois 142.857 x 2 = 285.714, 142.857 x 3 = 428.571, 142.857 x 4 = 571.428 e assim por diante. Dada uma entrada inteira, determine se é um número cíclico emitindo um valor verdadeiro, se for, e um valor falso, se não.

Além disso, para ficar claro, a entrada pode conter 0s iniciais: por exemplo, 0344827586206896551724137931

Isso ocorre porque, se zeros à esquerda não são permitidos em números, 142857 é o único número cíclico em decimal.

Como é código-golfe, a resposta mais curta em bytes vence!

FantaC
fonte
1
Olá e bem-vindo ao PPCG. Esta não é uma pergunta ruim, mas se você der uma olhada em algumas das perguntas postadas recentemente, acho que verá que poderia ser melhor. Especificamente, seria muito benéfico para a comunidade se você fornecesse mais casos de teste para trabalhar. Ao postar desafios futuros, considere usar a sandbox .
FryAmTheEggman 29/05

Respostas:

3

05AB1E , 9 6 bytes

Agradecimentos a Emigna por salvar 3 bytes!

ā*€{ïË

Explicação:

ā        # Push range(1, len(input) + 1)
 *       # Multiply by the input
  €{     # Sort each element
    ï    # Convert to int to remove leading zeros
     Ë   # Check if all elements are equal

Usa a codificação 05AB1E . Experimente online!

Adnan
fonte
1
Qual o motivo disso ¦‚˜?
Kalsowerus 29/05
1
@kalsowerus Se a entrada tiver um zero à esquerda, multiplicar por 1 fará com que desapareça, o que faz com que não funcione 0588235294117647.
Adnan
2
@tfbninja Ah, tudo bem, adicionar zeros à esquerda após a multiplicação também é algo a ser levado em consideração? Estes são os resultados individuais classificados depois de multiplicados, com alguns zeros iniciais ausentes, o que provavelmente indicaria o problema aqui.
Adnan
1
Considere o número 0212765957446808510638297872340425531914893617mencionado nos comentários de outra resposta. Olhando para os números ordenados, eu assumiria que retornaria falso, mas ao remover zeros, ele se torna verdadeiro.
Emigna
2
@tfbninja A saída do caso de teste de Emigna é verdadeira ou falsa?
Adnan
4

Na verdade , 18 bytes

;;ru@≈*♂$♂S♂≈╔@S≈=

Experimente online! (espera entrada citada)

Explicação:

;;ru@≈*♂$♂S♂≈╔@S≈=
;;                  duplicate input twice
  ru                range(1, len(input)+1)
    @≈              convert input to an integer
      *             multiply input by each element in range
       ♂$♂S♂≈       convert each product to a string, sort the digits, and convert back to int
             ╔      uniquify: remove duplicate elements
              @S≈   sort input and convert to int
                 =  compare equality
Mego
fonte
1
@tfbninja Eu publiquei isso antes sobre os zeros à esquerda. Eu tenho outra solução de 15 bytes que funcionará com os zeros iniciais que editarei em breve.
Mego 29/05
1
Qual codificação de caracteres você usa para atingir 18 bytes? Eu tentei UTF-8 e pesava 32 bytes. EDIT: Ah, entendo, é a página de código 437.
Pseudônimo
3

Python, 86 bytes

lambda n:all(sorted(n)==sorted(str(int(n)*i).zfill(len(n)))for i in range(2,len(n)+1))

Experimente online!

Introduzir números como cadeias.

Uriel
fonte
1
@tfbninja deve funcionar em qualquer python (2 e 3)
Uriel
1
por que ele falha com 0212765957446808510638297872340425531914893617?
J42161217
@Jenny_mathy agora não.
Uriel
2

PHP, 64 bytes

for(;$i++<9;)$r+=($c=count_chars)($argn)==$c($argn*$i);echo$r>1;

Versão Online

Jörg Hülsermann
fonte
2

Haskell, 36 33 32 45 bytes

c n=let l=length n in(10^l-1)`div`read n==l+1

Exemplo de uso:

*Main> c "142857"
True

Eu não acho que esse algoritmo precise de explicação.

PARA MIM

Obrigado por sugestões: Nome genérico para exibição, Laikoni.

Obrigado pela correção: Antony Hatchkins.

EDIT Não, falha em "33".

Pseudônimo
fonte
1
funciona para 052631578947368421?
J42161217 #
Sim, ele retorna True nesse caso.
Pseudônimo
2
Salve alguns bytes substituindo ns por n
Nome genérico para exibição
1
Você pode usar em <1vez de ==0? Também aqui está um link do TIO: Experimente online!
Laikoni
Que tal 111111?
Antony Hatchkins
2

dc, 24 25 bytes

[1]sa0?dZd10r^1-r1+/rx=ap

Imprime "0" se o número não for cíclico, caso contrário "1". Requer que o número seja inserido como uma sequência.

Exemplo de uso:

$ echo "[052631578947368421]" | dc -e '[1]sa0?dZd10r^1-r1+/rx=ap'
1
$ echo "[052631578947368422]" | dc -e '[1]sa0?dZd10r^1-r1+/rx=ap'
0

PARA MIM

Explicação: O mesmo algoritmo que meu envio Haskell.

EDIT Não, falha em "33".

Pseudônimo
fonte
1

Mathematica, 81 bytes

Length@Union@PadLeft[Sort/@IntegerDigits[ToExpression@#*Range@StringLength@#]]<2&

Experimente online!

sequência de entrada

Entrada

"010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567"

Saída

Verdade

J42161217
fonte
FromDigitsé mais curto queToExpression
JungHwan Min 29/05
1
porque neste desafio que você precisa para trabalhar com entradas como 034.324 ...
J42161217