Tous les xénodromes


15

introduction

Un xénodrome en base n est un entier où tous ses chiffres en base n sont différents. Voici quelques séquences OEIS de xénodromes.

Par exemple, dans la base 16, FACE, 42et FEDCBA9876543210quelques xenodromes (qui sont 64206, 66et 18364758544493064720en base 10), mais 11et DEFACEDne sont pas.

Défi

Étant donné une base d'entrée, n , sortez tous les xénodromes pour cette base dans la base 10 .

La sortie doit être dans l'ordre du plus petit au plus grand. Il doit être clair où un terme dans la séquence se termine et un nouveau commence (par exemple, il [0, 1, 2]est clair où il 012ne l'est pas.)

n sera un entier supérieur à 0.

Clarifications

Ce défi fait IO spécifiquement dans la base 10 pour éviter de manipuler des entiers et leur base comme des chaînes. Le défi consiste à gérer de manière abstraite n'importe quelle base. En tant que tel, j'ajoute cette règle supplémentaire:

Les entiers ne peuvent pas être stockés sous forme de chaînes dans une base autre que la base 10.

Votre programme devrait être en mesure de gérer théoriquement un n élevé s'il n'y avait pas de temps, de mémoire, de précision ou d'autres restrictions techniques dans la mise en œuvre d'un langage.

C'est le , donc le programme le plus court, en octets, gagne.

Exemple d'entrée et de sortie

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
y a-t-il une limite à n?
FlipTack

@ Flp.Tkc Non. Il devrait être capable de gérer un n assez élevé. Je ne veux pas que le défi soit limité par la hauteur d'une base que la conversion de base intégrée d'un langage peut gérer.
Artyer

@Artyer Cela aurait dû faire partie du texte du défi, alors. Il semble que certaines réponses le font déjà
Luis Mendo

Je sais que la conversion de base en Pyth peut gérer des valeurs supérieures à 36 , mais comme cela veut tous les xénodromes, le python sous-jacent se casse lorsque la liste devient trop grande, disant qu'elle ne peut pas contenir une valeur dans a ssize_t. Est-ce que la rupture de cette manière est acceptable?
FryAmTheEggman

2
Quelqu'un semble avoir voté contre toutes les réponses qui ne peuvent pas gérer des bases plus grandes en raison d'une limite de précision intégrée, qui semble également être une implémentation plutôt qu'un problème d'algorithme. Pourriez-vous clarifier?
Dennis

Réponses:


10

Pyth , 8 octets

f{IjTQU^

Filtre les nombres dans [0, n ^ n - 1] s'il n'y a pas d'éléments en double dans la base n . La conversion de base en Pyth fonctionnera avec n'importe quelle base, mais comme il s'agit d'une liste de nombres qui augmente très rapidement, il sera finalement impossible de stocker les valeurs en mémoire.

Essayez-le en ligne!

Explication:

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

Wow, une solution plus courte que la solution Jelly que Dennis a faite! : 'P
HyperNeutrino

3
Personne ne bat Jelly. ¶:
Roman Gräf

5

Python 2, 87 octets

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 des lignes vierges supplémentaires pour les non-xénodromes:

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

5
6
7



11



15



19

21

5

Gelée , 9 8 octets

ð*ḶbQ€Qḅ

Merci à @JonathanAllan d'avoir joué au golf sur 1 octet!

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça fonctionne

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

Gelée , 12 octets

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

TryItOnline!

Fonctionnera pour tout n, avec suffisamment de mémoire, la conversion de base de Jelly n'est pas restrictive.

Comment?

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

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}

Échoue pour 1(devrait produire [0], mais RangeErrors.)
Artyer

Exactement ce que j'avais, mais cela échouerait théoriquement 37si la précision n'était pas un problème, ce qui, je pense, le rend invalide ...
ETHproductions

@Artyer J'ai porté ma version Batch, donc maintenant cela fonctionnera nde 1à 13avant que la précision à virgule flottante ne la tue.
Neil

J'aime la façon dont les solutions commencent très rapidement, puis sautent soudainement d'un ordre de grandeur.
Nissa

2

Perl 6 , 47 octets

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

Renvoie un Seq . ( Seq est un wrapper Iterable de base pour les itérateurs )

Avec une entrée de 16cela prend 20 secondes pour calculer le 53905ème élément de la Seq ( 87887).

Étendu:

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

Lot, 204 200 octets

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

Ne fonctionnera pas pour n> 9 car Batch n'a qu'une arithmétique 32 bits. Idéalement, lot évalue f &= b ^= f = 1 << j % ncomme f = 1 << j % n, b = b ^ f, f = f & bplutôt que f = f & (b = b ^ (f = 1 << j % n)).


2

Mathematica, 59 48 octets

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

Contient le caractère U + F4A1 "Usage privé"

Explication

Range[#^#]-1

Générez {1, 2, ..., n^n}. Soustrayez 1. (rendements {0, 1, ..., n^n - 1})

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

Une fonction booléenne: Truesi chaque chiffre apparaît au plus une fois dans la base n.

Select[ ... ]

Dans la liste {0, 1, ..., n^n - 1}, sélectionnez ceux qui donnent Truelorsque la fonction booléenne ci-dessus est appliquée.

Version 59 octets

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

2

Mathematica, 48 55 octets

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

(Le triple espace entre les xs doit être remplacé par le caractère à 3 octets \ uF4A1 pour que le code fonctionne.)

Fonction sans nom d'un seul argument. Plutôt que de tester des entiers pour la xénodromicité, il génère simplement toutes les permutations possibles des sous-ensembles des chiffres autorisés (ce qui évite automatiquement la répétition) et convertit les entiers correspondants en base 10. Chaque xénodrome est généré deux fois, avec et sans un 0 en tête; Unionsupprime les doublons et trie la liste pour démarrer.


1
Échoue pour 2. La fonction donne {0, 1}. Je crois que vous avez besoin Permutations[Range@#-1, #]de Subsets[Range@#-1].
JungHwan Min

Gah, quelle erreur osée. Merci de l'observer et de proposer la solution parfaite!
Greg Martin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.