Tutti gli xenodromi


15

introduzione

Uno xenodromo nella base n è un numero intero in cui tutte le sue cifre nella base n sono diverse. Ecco alcune sequenze OEIS di xenodromi.

Ad esempio, in base 16, FACE, 42e FEDCBA9876543210sono alcuni xenodromes (che sono 64206, 66e 18364758544493064720in base 10), ma 11e DEFACEDnon lo sono.

Sfida

Data una base di input, n , emette tutti gli xenodromi per quella base nella base 10 .

L'output dovrebbe essere nell'ordine dal minimo al massimo. Dovrebbe essere chiaro dove termina un termine nella sequenza e ne inizia uno nuovo (ad es. [0, 1, 2]È chiaro dove 012non lo è).

n sarà un numero intero maggiore di 0.

chiarimenti

Questa sfida fa IO in modo specifico nella base 10 per evitare di gestire numeri interi e la loro base come stringhe. La sfida consiste nel gestire in modo astratto qualsiasi base. Come tale, sto aggiungendo questa regola aggiuntiva:

I numeri interi non possono essere memorizzati come stringhe in una base diversa dalla base 10.

Il tuo programma dovrebbe essere in grado di gestire teoricamente un valore n elevato se non ci fossero tempi, memoria, precisione o altre restrizioni tecniche nell'implementazione di un linguaggio.

Questo è , quindi vince il programma più breve, in byte.

Esempio di input e output

1  # Input
0  # Output
2
0, 1, 2
3
0, 1, 2, 3, 5, 6, 7, 11, 15, 19, 21
4
0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 18, 19, 24, 27, 28, 30, 33, 35, 36, 39, 44, 45, 49, 50, 52, 54, 56, 57, 75, 78, 99, 108, 114, 120, 135, 141, 147, 156, 177, 180, 198, 201, 210, 216, 225, 228

1
c'è un limite ad n?
FlipTack,

@ Flp.Tkc No. Dovrebbe essere in grado di gestire n. Non voglio che la sfida sia limitata da quanto può gestire una conversione base di una lingua.
Artyer,

@Artyer Questo avrebbe dovuto essere parte del testo della sfida, quindi. Sembra che alcune risposte lo stiano già facendo
Luis Mendo,

So che la conversione di base in Pyth può gestire valori maggiori di 36 , ma poiché ciò richiede tutti gli xenodromi, il pitone sottostante si interrompe quando l'elenco diventa troppo grande, dicendo che non può contenere un valore in a ssize_t. La rottura in questo modo è accettabile?
FryAmTheEggman,

2
Qualcuno sembra aver sottovalutato tutte le risposte che non sono in grado di gestire basi più grandi a causa di un limite di precisione incorporato, che sembra anche un'implementazione piuttosto che un problema di algoritmo. Potresti chiarire?
Dennis,

Risposte:


10

Pyth , 8 byte

f{IjTQU^

Filtra i numeri in [0, n ^ n - 1] per non avere elementi duplicati nella base n . La conversione di base in Pyth funzionerà con qualsiasi base, ma dal momento che questo esamina un elenco di numeri che aumenta molto rapidamente, alla fine non sarà in grado di memorizzare i valori in memoria.

Provalo online!

Spiegazione:

f{IjTQU^QQ    - Auto-fill variables
      U^QQ    - [0, n^n-1]
f             - keep only those that ...
 {I           - do not change when deduplicated
   jTQ        - are converted into base n

Caspita, una soluzione più corta della soluzione Jelly che Dennis ha realizzato! : 'P
HyperNeutrino,

3
Nessuno batte Jelly. ¶:
Roman Gräf,

5

Python 2, 87 byte

n=input()
for x in range(n**n):
 s={n};a=x
 while{a%n}|s>s:s|={a%n};a/=n
 print-~-a*`x`

Stampa righe vuote extra per i non xenodromi:

golf % python2.7 xenodromes.py <<<3
0
1
2
3

5
6
7



11



15



19

21

5

Gelatina , 9 8 byte

ð*ḶbQ€Qḅ

Grazie a @JonathanAllan per il golf off 1 byte!

Provalo online! o verifica tutti i casi di test .

Come funziona

ð*ḶbQ€Qḅ  Main link. Argument: n

ð         Make the chain dyadic, setting both left and right argument to n.
          This prevents us from having to reference n explicitly in the chain.
 *        Compute nⁿ.
  Ḷ       Unlength; yield A := [0, ..., nⁿ - 1].
   b      Convert each k in A to base n.
    Q€    Unique each; remove duplicate digits.
      Q   Unique; remove duplicate digit lists.
       ḅ  Convert each digit list from base n to integer.

4

Gelatina , 12 byte

*`ḶbµQ⁼$Ðfḅ³

TryItOnline!

Funzionerà per qualsiasi n, data sufficiente memoria, la conversione di base di Jelly non è restrittiva.

Come?

*`ḶbµQ⁼$Ðfḅ³ - Main link: n
    µ        - monadic chain separation
*            - exponentiation with
 `           - repeated argument, i.e. n^n
  Ḷ          - lowered range, i.e. [0,1,2,...,n^n-1]
   b         - covert to base n (vectorises)
        Ðf   - filter keep:
       $     -     last two links as a monad
     Q       -         unique elements
      ⁼      -         equals input (no vectorisation)
           ³ - first program argument (n)
          ḅ  - convert from base (vectorises)

3

JavaScript (ES7), 86 byte

n=>{a=[];for(i=n**n;i--;j||a.unshift(i))for(j=i,b=0;(b^=f=1<<j%n)&f;j=j/n|0);return a}

Non riesce 1(dovrebbe essere emesso [0], ma RangeErrors.)
Artyer,

Esattamente quello che avevo, ma teoricamente fallirebbe 37se la precisione non fosse un problema, che penso lo renda invalido ...
ETHproductions

@Artyer Ho porting mia versione Batch, così ora questo lavoro per nda 1a 13prima precisione in virgola mobile uccide.
Neil,

Mi piace il modo in cui le soluzioni iniziano molto rapidamente e poi saltano improvvisamente di un ordine di grandezza.
Nissa,

2

Perl 6 , 47 byte

{(0..$_**$_).grep: !*.polymod($_ xx*).repeated}

Restituisce un Seq . ( Seq è un wrapper Iterable di base per Iterator )

Con un input di 16esso occorrono 20 secondi per calcolare il 53905 ° elemento di Seq ( 87887).

Allargato:

{       # bare block lambda with implicit parameter 「$_」

  ( 0 .. ($_ ** $_) )    # Range of values to be tested

  .grep:                 # return only those values

    !\                   # Where the following isn't true
    *\                   # the value
    .polymod( $_ xx * )  # when put into the base being tested
    .repeated            # has repeated values
  }
}

2

Lotto, 204 200 byte

@set/an=%1,m=1
@for /l %%i in (1,1,%1)do @set/am*=n
@for /l %%i in (0,1,%m%)do @set/ab=0,j=i=%%i&call:l
@exit/b
:l
@set/a"f&=b^=f=1<<j%%n,j/=n"
@if %f%==0 exit/b
@if %j% gtr 0 goto l
@echo %i%

Non funzionerà per n> 9 perché Batch ha solo un'aritmetica a 32 bit. Convenientemente, Batch valuta f &= b ^= f = 1 << j % ncome f = 1 << j % n, b = b ^ f, f = f & bpiuttosto che f = f & (b = b ^ (f = 1 << j % n)).


2

Mathematica, 59 48 byte

Select[Range[#^#]-1,xMax[x~DigitCount~#]==1]&

Contiene il carattere "Uso privato" U + F4A1

Spiegazione

Range[#^#]-1

Genera {1, 2, ..., n^n}. Sottrai 1. (rendimenti {0, 1, ..., n^n - 1})

xMax[x~DigitCount~#]==1

Una funzione booleana: Truese ogni cifra si verifica al massimo una volta nella base n.

Select[ ... ]

Dall'elenco {0, 1, ..., n^n - 1}, selezionare quelli che danno Truequando viene applicata la funzione booleana sopra.

Versione da 59 byte

Select[Range[#^#]-1,xDuplicateFreeQ[x~IntegerDigits~#]]&

2

Mathematica, 48 55 byte

Union[(x   x~FromDigits~#)/@Permutations[Range@#-1,#]]&

(Lo spazio triplo tra le xs deve essere sostituito dal carattere a 3 byte \ uF4A1 per far funzionare il codice.)

Funzione senza nome di un singolo argomento. Invece di testare numeri interi per la xenodromicità, genera semplicemente tutte le possibili permutazioni di sottoinsiemi delle cifre consentite (che evita automaticamente la ripetizione) e converte i numeri interi corrispondenti in base 10. Ogni xenodromo viene generato due volte, sia con che senza 0 iniziale; Unionrimuove i duplicati e ordina l'elenco per l'avvio.


1
Non funziona per 2. La funzione dà {0, 1}. Credo che tu abbia bisogno Permutations[Range@#-1, #]invece di Subsets[Range@#-1].
JungHwan Min,

Gah, che errore scemo. Grazie per averlo osservato e per aver suggerito la soluzione perfetta!
Greg Martin,
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.