Todos os xenodromos


15

Introdução

Um xenódromo na base n é um número inteiro em que todos os seus dígitos na base n são diferentes. Aqui estão algumas seqüências OEIS de xenodromos.

Por exemplo, na base 16, FACE, 42e FEDCBA9876543210são algumas xenodromes (que são 64206, 66e 18364758544493064720na base 10), mas 11e DEFACEDnão são.

Desafio

Dada uma base de entrada, n , produza todos os xenodromos dessa base na base 10 .

A saída deve estar na ordem do menor para o maior. Deve ficar claro onde um termo na sequência termina e um novo começa (por exemplo, [0, 1, 2]fica claro onde 012não está).

n será um número inteiro maior que 0.

Esclarecimentos

Esse desafio faz E / S especificamente na base 10 para evitar manipular números inteiros e sua base como seqüências de caracteres. O desafio é lidar abstratamente com qualquer base. Como tal, estou adicionando esta regra adicional:

Os números inteiros não podem ser armazenados como seqüências de caracteres em uma base diferente da base 10.

Seu programa deve ser capaz de lidar teoricamente com n razoavelmente alto se não houver tempo, memória, precisão ou outras restrições técnicas na implementação de uma linguagem.

Isso é , então o programa mais curto, em bytes, vence.

Exemplo de entrada e saída

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
existe um limite para n?
FlipTack

@ Flp.Tkc No. Ele deve ser capaz de lidar com n razoavelmente alto. Não quero que o desafio seja limitado pela capacidade de conversão da base incorporada de uma linguagem.
Artyer

@Artyer Isso deveria ter sido parte do texto do desafio, então. Parece que algumas respostas já estão fazendo isso
Luis Mendo 26/11

Eu sei que a conversão base no Pyth pode manipular valores maiores que 36 , mas como isso quer todos os xenodromes, o python subjacente é interrompido quando a lista fica muito grande, dizendo que não pode ajustar um valor em a ssize_t. Está quebrando desta maneira aceitável?
FryAmTheEggman

2
Alguém parece ter rebaixado todas as respostas que não conseguem lidar com bases maiores por causa de um limite de precisão interno, que também parece mais uma implementação do que um problema de algoritmo. Você poderia esclarecer?
Dennis

Respostas:


10

Pitão , 8 bytes

f{IjTQU^

Filtra os números em [0, n ^ n - 1] por não ter elementos duplicados na base n . A conversão de base no Pyth funcionará com qualquer base, mas como essa lista de números está aumentando rapidamente, ela não poderá armazenar os valores na memória.

Experimente online!

Explicação:

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

Uau, uma solução mais curta que a solução Jelly que Dennis fez! : 'P
HyperNeutrino 26/11

3
Ninguém vence Jelly. ¶:
Gräf Roman

5

Python 2, 87 bytes

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`

Imprime linhas em branco extras para não-xenodromos:

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

5
6
7



11



15



19

21

5

Gelatina , 9 8 bytes

ð*ḶbQ€Qḅ

Graças a @ JonathanAllan por jogar fora um byte!

Experimente online! ou verifique todos os casos de teste .

Como funciona

ð*Ḷ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 bytes

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

TryItOnline!

Trabalhará para qualquer n , com memória suficiente, a conversão de base do Jelly não é restritiva.

Quão?

*`Ḷ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 bytes

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}

Falhar por 1(saída deve [0], mas RangeErrors.)
Artyer

Exatamente o que eu tinha, mas isso seria teoricamente falhar por 37se a precisão não fosse um problema, que eu acho que o torna inválido ...
ETHproductions

@Artyer Eu tenho portado minha versão em lote, então agora isso funcionará nde 1para 13antes que a precisão do ponto flutuante a mate.
31516 Neil

Gosto de como as soluções começam muito curtas e, de repente, saltam em uma ordem de magnitude.
N27 Nov16

2

Perl 6 , 47 bytes

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

Retorna uma Seq . ( Seq é um invólucro Iterável básico para Iterator )

Com uma entrada 16, leva 20 segundos para calcular o 53905º elemento da Seq ( 87887).

Expandido:

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

Lote, 204 200 bytes

@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%

Não funcionará para n> 9 porque o Lote possui apenas aritmética de 32 bits. Convenientemente, o Lote avalia f &= b ^= f = 1 << j % ncomo f = 1 << j % n, b = b ^ f, f = f & be não f = f & (b = b ^ (f = 1 << j % n)).


2

Mathematica, 59 48 bytes

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

Contém o caractere "Uso Privado" U + F4A1

Explicação

Range[#^#]-1

Gerar {1, 2, ..., n^n}. Subtrair 1. (rendimentos {0, 1, ..., n^n - 1})

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

Uma função booleana: Truese cada dígito ocorrer no máximo uma vez na base n.

Select[ ... ]

Na lista {0, 1, ..., n^n - 1}, selecione aqueles que oferecemTrue quando a função booleana acima é aplicada.

Versão de 59 bytes

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

2

Mathematica, 48 55 bytes

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

(O espaço triplo entre o x s precisa ser substituído pelo caractere de 3 bytes \ uF4A1 para que o código funcione.)

Função sem nome de um único argumento. Em vez de testar xenodromicidade em números inteiros, ele simplesmente gera todas as permutações possíveis de subconjuntos dos dígitos permitidos (o que evita automaticamente a repetição) e converte os números inteiros correspondentes na base 10. Cada xenódromo é gerado duas vezes, com e sem um 0 inicial; Unionremove as duplicatas e classifica a lista para inicializar.


1
Falha em 2. A função fornece {0, 1}. Eu acredito que você precisa em Permutations[Range@#-1, #]vez de Subsets[Range@#-1].
JungHwan Min

Gah, que erro estúpido. Obrigado por observá-lo e por sugerir a solução perfeita!
Greg Martin
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.