Entrée: une séquence de lettres majuscules (ASCII [65; 90]) qui est la N ème * permutation lexicographique du multiset de ses caractères
* les permutations sont numérotées de 0 ou 1 vers le haut
Sortie: base 10 entier N
Rulez
- Il peut y avoir des doublons (c'est en quoi ce défi diffère de celui-ci )
- Les caractères sont classés par leur valeur ASCII
- Dans le cas d'une entrée de longueur inférieure ou égale à 1, l'entrée est la première permutation et le résultat est
0
ou1
respectivement - La première permutation est celle dans laquelle le caractère le plus à gauche a la valeur la plus basse, le caractère le plus à droite a la valeur la plus élevée, et la séquence de caractères entre le premier et le dernier caractère est la première permutation du multiset de ses caractères (définition récursive!)
- Victoires les plus courtes
Exemple
- L'entrée
AAB
produit la sortie0
- L'entrée
ABA
produit la sortie1
- L'entrée
BAA
produit la sortie2
- L'entrée
ZZZ
produit la sortie0
- L'entrée
DCBA
produit la sortie23
ÉDITER
Bravo à celui qui peut trouver une solution qui ne produit pas toutes les permutations et rechercher ensuite l'entrée. Voilà un défi.
code-golf
permutations
kyrill
la source
la source
zzz
etdcba
n'est pas majuscule.Réponses:
Gelée , 5 octets
Essayez-le en ligne!
Sortie indexée 1.
la source
Python 2, 69 octets
Essayez-le en ligne
la source
Python,
302287 octetsDead Possum a déjà publié une courte solution Pythonic, j'ai donc décidé d'aller chercher les félicitations supplémentaires. Cette solution ne génère pas toutes les permutations. Il peut calculer rapidement l'indice de permutation d'une chaîne assez grande; il gère également correctement une chaîne vide.
Code de test:
production
Version non golfée:
Sur
lexico_permute_string
Cet algorithme, dû à Narayana Pandita, provient de https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
Pour produire la prochaine permutation dans l'ordre lexicographique de séquence
a
FWIW, vous pouvez voir une version annotée de cette fonction ici .
FWIW, voici la fonction inverse.
production
Et voici une fonction que j'ai écrite tout en développant
perm_unrank
qui montre la répartition des sous-comptes.production
la source
z=0
et le remplacer part[0]
ett[1:]
où ils sont utilisés (actuellementh
ett
) pour économiser 8 octets.True
pour des valeurs de 1 ou moins, mais je pense qu'avec votre code ça devrait aller?f=lambda n:n<2or n*f(n-1)
05AB1E , 5 octets
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
05AB1E , 5 octets
Essayez-le en ligne!
Découvert indépendamment de la réponse d'Adnan.
la source
PHP, 124 octets
PHP, 136 octets
Version en ligne
Courir avec
Calculer avec factorielle
Version étendue
Sortie pour la chaîne PPCG
Version en ligne
la source
print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add
$ n = 0` dans la boucle alors le cast en entier ne fonctionne pas dans ce changementJulia,
121125 octetsNon compétitif, car il ne traite pas correctement les lettres en double. J'ai porté cela à partir d'une autre langue, d'une partie d'une solution à un problème Project Euler que j'avais fait il y a plusieurs années, et la première version de 121 octets avait un bogue parce que j'avais transposé l'utilisation de la chaîne permutée et la référence canonique triée chaîne.
Pour les grandes entrées, cette version utilise des bignums au prix de 8 octets supplémentaires:
Non golfé:
Utilise un système de nombres factoriadique , qv Ainsi, il ne produit pas toutes les permutations et pour de grandes entrées, il fonctionnera énormément plus rapidement que ceux qui le font.
Par exemple, l'alphabet peut être permuté dans la phrase plutôt artificielle "Travail de glyphe de quartz vex'd cwm finks." Cette phrase est la 259.985.607.122.410.643.097.474.123ème permutation lexicographique des lettres de l'alphabet. (Environ 260 septillionième permutation.) Ce programme trouve cela dans environ 65 µs sur ma machine.
Notez que le nombre se termine par ... 122 plutôt que par ... 123 car OP a demandé que les permutations soient numérotées de 0 plutôt que de 1.
Julia, 375 octets
J'ai laissé l'indentation pour plus de lisibilité, mais le nombre d'octets est sans elle.
Celui-ci n'est qu'un simple port Julia de la brillante solution Python de PM 2Ring. J'ai eu faim, alors j'ai décidé que je voulais le cookie après tout. Il est intéressant de voir les similitudes et les différences entre les deux langues. J'ai implémenté
itertools.groupby
(sous une forme limitée) en tant queg(w)
.Mais la logique n'est pas la mienne, alors allez voter la réponse de PM 2Ring .
Remplacez
f=factorial
parf(x)=factorial(BigInt(x))
si vous voulez être capable de gérer de grandes entrées comme p ("QUARTZGLYPHJOBVEXDCWMFINKS").la source
BAA
- prévu2
, réel3
.MATL ,
131211 octets1 octet économisé grâce à GB !
La sortie est basée sur 1.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
q
droit?Mathematica,
3331 octetsLa modification de la spécification du problème a permis une économie de 2 octets.
Fonction pure prenant une liste en entrée et retournant un entier non négatif
N
sous la forme{{N}}
.la source
-1
.JavaScript (ES6), 130 octets
Moins golfé
Tester
la source
CJam , 7 octets
Essayez-le en ligne!
la source
Pyth, 5 octets
Interprète en ligne
Prend l'entrée citée.
la source
'BAA'
doit retourner2
car il est indexé zéro, mais il retourne à la4
place.Scala, 40 octets
Pour l'utiliser, affectez cette fonction à une variable:
Essayez-le en ligne sur ideone
Malheureusement,
permutations
retourne un itérateur, qui n'a pas desorted
méthode, il doit donc être converti en unSeq
la source
C ++, 96 octets
Nous pouvons utiliser pleinement la bibliothèque standard ici. La liste des lettres est transmise en tant qu'itérateurs de début / fin dans le style C ++ standard.
Nous n'avons pas besoin de générer toutes les permutations - puisque nous avons une transformation d'une permutation à son prédécesseur, nous comptons simplement le nombre d'itérations nécessaires pour atteindre la valeur zéro.
Programme de test:
Résultats de test:
la source
Japt, 6 octets
0 indexé
Essayez-le
la source
Rubis, 50 octets
Je m'attendais à ce que ce soit plus court. Je n'aurais pas ajouté le
sort
si les documents n'avaient pas dit "la mise en œuvre ne donne aucune garantie quant à l'ordre dans lequel les permutations sont produites".la source