É 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!


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!


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

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.


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

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".


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".


1

Mathematica, 81 bytes

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

Experimente online!

sequência de entrada

Entrada

"010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567"

Saída

Verdade


FromDigitsé mais curto queToExpression
JungHwan Min 29/05

1
porque neste desafio que você precisa para trabalhar com entradas como 034.324 ...
J42161217
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.