È un numero ciclico?


20

Un numero ciclico è un numero di cifre "n" che, se moltiplicate per 1, 2, 3, ... n, risultano nelle stesse cifre ma in un ordine diverso.

Ad esempio, il numero 142.857 è un numero ciclico poiché 142.857 x 2 = 285.714, 142.857 x 3 = 428.571, 142.857 x 4 = 571.428 e così via. Dato un input intero, determinare se si tratta di un numero ciclico emettendo un valore di verità se lo è e un valore di falsa in caso contrario.

Inoltre, per essere chiari, l'ingresso può contenere 0 iniziali: ad es. 0344827586206896551724137931

Questo perché, se gli zeri iniziali non sono consentiti sui numeri, 142857 è l'unico numero ciclico in decimale.

Dato che si tratta di code-golf, vince la risposta più breve in byte!


1
Ciao e benvenuto in PPCG. Questa non è una brutta domanda, ma se dai un'occhiata ad alcune delle domande pubblicate di recente, penso che vedrai che potrebbe essere migliore. In particolare, sarebbe molto utile per la comunità se fornissi più casi di test con cui lavorare. Quando pubblichi sfide future, ti preghiamo di considerare l'utilizzo della sandbox .
FryAmTheEggman,

Risposte:


3

05AB1E , 9 6 byte

Grazie a Emigna per aver salvato 3 byte!

ā*€{ïË

Spiegazione:

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

Utilizza la codifica 05AB1E . Provalo online!


1
Qual è il motivo ¦‚˜?
kalsowerus,

1
@kalsowerus Se l'ingresso ha uno zero iniziale, la moltiplicazione per 1 lo farebbe scomparire, per cui non funziona 0588235294117647.
Adnan,

2
@tfbninja Oh okay, anche l'aggiunta di zero iniziali dopo la moltiplicazione è qualcosa da tenere in considerazione? Questi sono i singoli risultati ordinati che ottengo dopo la moltiplicazione, con alcuni zero iniziali mancanti, che probabilmente indicherebbero qui il problema.
Adnan,

1
Considera il numero 0212765957446808510638297872340425531914893617come indicato nei commenti di un'altra risposta. Osservando i numeri ordinati, suppongo che restituisca false, ma quando si rimuovono gli zeri diventa vero.
Emigna,

2
@tfbninja L'output del test case di Emigna è veritiero o falso?
Adnan,

4

In realtà , 18 byte

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

Provalo online! (si aspetta input quotato)

Spiegazione:

;;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 L'ho pubblicato prima del bit sugli zeri iniziali. Ho un'altra soluzione a 15 byte che funzionerà con zero iniziali che modificherò presto.
Mego

1
Quale codifica dei caratteri usi per raggiungere 18 byte? Ho provato UTF-8 e pesava 32 byte. EDIT: Oh, vedo, è la code page 437.
Pseudonimo

3

Python, 86 byte

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

Provalo online!

Immettere i numeri come stringhe.


1
@tfbninja dovrebbe funzionare su qualsiasi pitone (2 e 3)
Uriel

1
perché non riesce con 0212765957446808510638297872340425531914893617?
J42161217

@Jenny_mathy ora no.
Uriel,


2

Haskell, 36 33 32 45 byte

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

Esempio di utilizzo:

*Main> c "142857"
True

Non credo che questo algoritmo abbia bisogno di spiegazioni.

TOL

Grazie per i suggerimenti: Nome visualizzato generico, Laikoni.

Grazie per la correzione: Antony Hatchkins.

EDIT No, non riesce su "33".


1
funziona per 052631578947368421?
J42161217

Sì, restituisce True in quel caso.
Pseudonimo del

2
Salvare alcuni byte sostituendo ns con n
Nome visualizzato generico

1
Puoi usare <1invece di ==0? Anche qui c'è un link TIO: provalo online!
Laikoni,

Che ne dici di 111111?
Antony Hatchkins,

2

dc, 24 25 byte

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

Stampa "0" se il numero non è ciclico, altrimenti "1". Richiede che il numero sia inserito come stringa.

Esempio di utilizzo:

$ 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

Spiegazione: Stesso algoritmo della mia presentazione Haskell.

EDIT No, non riesce su "33".


1

Mathematica, 81 byte

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

Provalo online!

stringa di input

Ingresso

"010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567"

Produzione

Vero


FromDigitsè più corto diToExpression
JungHwan Min

1
perché in questa sfida devi lavorare con input come 034324 ...
J42161217
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.