Est-ce un numéro cyclique?

20

Un nombre cyclique est un nombre de "n" chiffres qui, multiplié par 1, 2, 3, ... n, donne les mêmes chiffres mais dans un ordre différent.

Par exemple, le nombre 142 857 est un nombre cyclique puisque 142 857 x 2 = 285 714, 142 857 x 3 = 428 571, 142 857 x 4 = 571 428, etc. Étant donné une entrée entière, déterminez s'il s'agit d'un nombre cyclique en émettant une valeur véridique dans le cas contraire et une valeur fausse dans le cas contraire.

De plus, pour être clair, l'entrée peut contenir des 0 en tête: par exemple 0344827586206896551724137931

En effet, si les zéros non significatifs ne sont pas autorisés sur les chiffres, 142857 est le seul nombre cyclique en décimal.

Puisqu'il s'agit de code-golf, la réponse la plus courte en octets gagne!

FantaC
la source
1
Salut et bienvenue à PPCG. Ce n'est pas une mauvaise question, mais si vous jetez un œil à certaines des questions récemment publiées, je pense que vous verrez que cela pourrait être mieux. Plus précisément, il serait très avantageux pour la communauté que vous fournissiez plus de cas de test avec lesquels travailler. Lors de la publication de futurs défis, pensez à utiliser le bac à sable .
FryAmTheEggman

Réponses:

3

05AB1E , 9 6 octets

Merci à Emigna pour avoir économisé 3 octets!

ā*€{ïË

Explication:

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

Utilise l' encodage 05AB1E . Essayez-le en ligne!

Adnan
la source
1
Quelle en est la raison ¦‚˜?
kalsowerus
1
@kalsowerus Si l'entrée a un zéro en tête, la multiplication par 1 la ferait disparaître, ce qui la rendrait inopérante 0588235294117647.
Adnan
2
@tfbninja Oh d'accord, l'ajout de zéros non significatifs après la multiplication est-il également quelque chose à prendre en compte? Ce sont les résultats triés individuels que j'obtiens après multiplication, avec quelques zéros manquants, ce qui indiquerait probablement le problème ici.
Adnan
1
Considérez le nombre 0212765957446808510638297872340425531914893617comme mentionné dans les commentaires d'une autre réponse. En regardant les numéros triés, je suppose qu'il renvoie faux, mais lorsque vous supprimez les zéros, cela devient vrai.
Emigna
2
@tfbninja La sortie du scénario de test d'Emigna est-elle vraie ou fausse?
Adnan
4

En fait , 18 octets

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

Essayez-le en ligne! (attend l'entrée citée)

Explication:

;;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
la source
1
@tfbninja J'ai posté ceci avant le morceau sur les zéros non significatifs. J'ai une autre solution de 15 octets qui fonctionnera avec des zéros de tête que je modifierai bientôt.
Mego
1
Quel codage de caractères utilisez-vous pour obtenir 18 octets? J'ai essayé UTF-8 et il pesait 32 octets. EDIT: Oh, je vois, c'est la page de codes 437.
Pseudonyme
3

Python, 86 octets

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

Essayez-le en ligne!

Entrez les nombres sous forme de chaînes.

Uriel
la source
1
@tfbninja devrait fonctionner sur n'importe quel python (2 et 3)
Uriel
1
pourquoi échoue-t-il avec 0212765957446808510638297872340425531914893617?
J42161217
@Jenny_mathy maintenant ce n'est pas le cas.
Uriel
2

PHP, 64 octets

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

Version en ligne

Jörg Hülsermann
la source
2

Haskell, 36 33 32 45 octets

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

Exemple d'utilisation:

*Main> c "142857"
True

Je ne pense pas que cet algorithme ait besoin d'explication.

TOL

Merci pour les suggestions: Nom d'affichage générique, Laikoni.

Merci pour la correction: Antony Hatchkins.

EDIT Non, échoue sur "33".

Pseudonyme
la source
1
ça marche pour 052631578947368421?
J42161217
Oui, il renvoie True dans ce cas.
Pseudonyme
2
Économisez quelques octets en remplaçant ns par n
Nom d'affichage générique
1
Pouvez-vous utiliser à la <1place de ==0? Voici également un lien TIO: Essayez-le en ligne!
Laikoni
Que diriez-vous 111111?
Antony Hatchkins
2

dc, 24 25 octets

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

Imprime "0" si le nombre n'est pas cyclique, sinon "1". Nécessite que le nombre soit entré sous forme de chaîne.

Exemple d'utilisation:

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

TOL

Explication: même algorithme que ma soumission Haskell.

EDIT Non, échoue sur "33".

Pseudonyme
la source
1

Mathematica, 81 octets

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

Essayez-le en ligne!

chaîne d'entrée

Contribution

"010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567"

Production

Vrai

J42161217
la source
FromDigitsest plus court queToExpression
JungHwan Min
1
parce que dans ce défi, vous devez travailler avec des entrées comme 034324 ...
J42161217