Ce défi est un hommage à l' utilisateur de PPCG, Dennis, qui a remporté le jeu des voleurs du Quiz sur le langage de programmation .
En regardant la page de profil de PPCG de Dennis, on peut voir des choses assez impressionnantes:
Il a actuellement plus de soixante-huit mille joueurs, ce qui le place au deuxième rang des représentants , dépassant de près de trente mille la troisième place. Il a récemment remporté notre élection pour un nouveau modérateur et a reçu un nouveau diamant brillant à côté de son nom. Mais personnellement, je pense que la partie la plus intéressante de Dennis est son numéro d’identifiant PPCG: 12012.
À première vue, cela 12012
ressemble presque à un palindrome , un nombre qui lit la même chose une fois inversé, mais un peu éteint. Il peut devenir le palindrome 21012
si nous échangeons les positions du premier 1
et 2
, et il peut devenir le palindrome 12021
si nous échangeons le dernier 1
et 2
. De plus, suivant la convention voulant que les zéros non-majuscules d’un nombre ne soient pas écrits, permutez le premier 1
et les 0
résultats 02112
ou plutôt 2112
un autre palindrome.
Définissons un nombre de Dennis comme un entier positif qui n'est pas le palindrome lui-même mais qui peut être transformé en un palindrome en permutant les positions d'au moins une paire de deux chiffres. L' ordre d'un numéro de Dennis est le nombre de paires de chiffres distinctes qui peuvent être échangés pour former un palindrome (pas nécessairement distinct).
Donc , l'ordre 12012
est 3 depuis trois paires distinctes de ses chiffres ( 12012
, , ) peuvent être interchangés pour produire palindromes. se trouve être le plus petit ordre numéro 3 Dennis.12012
12012
12012
10
est le plus petit numéro de Dennis et a l'ordre 1 parce que commuter autour de 1
et 0
donne 01
aka 1
qui est un palindrome.
Les zéros non significatifs d'un nombre ne comptent pas comme des chiffres commutables. Par exemple, le changement 8908
de 08908
et échanger les deux premiers chiffres pour obtenir le palindrome 80908
est invalide. 8908
n'est pas un numéro de Dennis.
On pourrait dire que les nombres non-Dennis ont un ordre 0.
Défi
Ecrivez un programme ou une fonction qui prend un entier positif N et imprime ou renvoie le Nième plus petit nombre de Dennis avec son ordre dans un format raisonnable, tel que 12012 3
ou (12012, 3)
.
Par exemple, 12012
est le 774ème numéro de Dennis, donc si 774
est l’entrée de votre programme, le résultat devrait ressembler à quelque chose 12012 3
. (Curieusement, 774 est un autre numéro de Dennis.)
Le code le plus court en octets gagne.
Voici les 20 premiers numéros de Dennis et leurs commandes pour référence:
N Dennis Order
1 10 1
2 20 1
3 30 1
4 40 1
5 50 1
6 60 1
7 70 1
8 80 1
9 90 1
10 100 1
11 110 2
12 112 1
13 113 1
14 114 1
15 115 1
16 116 1
17 117 1
18 118 1
19 119 1
20 122 1
la source
Réponses:
Pyth, 44 octets
Essayez-le en ligne: démonstration ou suite de tests
Un petit bug stupide (?) Dans Pyth a gâché une solution de 41 octets.
Explication:
la source
.f
. Voici la demande de traction que j'ai faite à cause de cette question: github.com/isaacg1/pyth/pull/151CJam, 45 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Haskell, 174 octets
p
vérifie si une liste est un palindrome.x!y
estTrue
ssi les listesx
ety
( ce qui devrait avoir la même longueur) diffèrent dans exactement deux endroits. Plus précisément, six
est une permutation dey
,x!y
détermine s'il s'agit d'un "échange".o n
trouve l'ordre de Dennisn
. Il filtre pour les échanges entre les permutations dex = show n
, puis compte combien de ces échanges sont des palindromes. La compréhension de liste qui effectue ce compte a une garde supplémentairenot (p x)
, ce qui signifie qu'elle reviendra0
s'iln
s'agissait d'un palindrome pour commencer.Le
snd (span (<'1') v)
bit est justedropWhile
qu'un octet plus court; il se transforme"01221"
en"1221"
.f
index à partir d’une liste d’(i, o i)
oùo i > 0
(c’est-ài
- dire un numéro de Dennis.) Il y aurait normalement une erreur unique, comme(!!)
compte à partir de 0 mais le problème compte à partir de 1. J’ai réussi à y remédier en démarrant la recherche-10
(à partir de s'est avéré être considéré comme un numéro Dennis par mon programme!), plaçant ainsi tous les numéros aux bons endroits.f 774
est(12012,3)
.la source
Python 2, 176
Je ne peux pas imaginer que mon code d'échange est particulièrement optimal, mais c'est le meilleur que j'ai pu obtenir. Je n'aime pas non plus combien de fois je convertis entre chaîne et entier ...
Pour chaque numéro, il crée une liste indiquant si tous les échanges de deux chiffres sont des palindromes. Il décrémente le compteur lorsqu'au moins l'une de ces valeurs est vraie et que le nombre d'origine n'est pas un palindrome. Étant donné que
0+True
python évalue à1
la somme de la liste finale fonctionne pour l'ordre du nombre de Dennis.la source
Rouille, 390 octets
La nouvelle Java? : /
Ungolfed et commenté:
la source
Gelée , 33 octets (non concurrente)
Essayez-le en ligne!
Comment ça fonctionne
la source
APL, 87
Le corps de la boucle renvoie un vecteur de 4 nombres: 1) son argument de gauche
⍺
lu à partir de l'entrée, 2) le nombre de nombres de Dennis jusqu'à présent, 3) la valeur actuelle duX
compteur de boucle et 4) son ordreK
calculé comme la somme des palindromes. dans les permutations 1-swap. Il se termine lorsque les deux premiers éléments deviennent égaux et que les deux derniers sont alors renvoyés en tant que résultat.la source
JavaScript (ES6), 229
Comme d'habitude, JavaScript brille par son incompétence pour la combinatoire (ou, peut-être est-ce mon incompétence ...). Ici, j’obtiens toutes les positions d’échange possibles recherchant tous les nombres binaires de la longueur donnée et seulement 2 unités.
Testez l'exécution de l'extrait de code ci-dessous dans Firefox (MSIE étant loin d'être conforme à EcmaScript 6 et à Chrome, les paramètres par défaut sont toujours manquants)
la source
awk, 199
Structure
Usage
Collez-le sur votre console et remplacez le numéro après
echo
si vous le souhaitez.Il devient lent à des nombres plus élevés;)
Version réutilisable non-golfée
la source
Ruby, 156
Utilise la fonction Ruby où l’appel
"19".next!
revient"20"
pour éviter d’avoir à convertir les types dans les deux sens; nous utilisons simplement une regex pour ignorer les majuscules0s
. Parcourt toutes les paires de positions de chaîne pour vérifier les commutateurs palindromiques. A l'origine, j'avais écrit cela comme une fonction récursive, mais cela volait la pile.La sortie pour 774 est
["12012", 3]
(supprimer les guillemets coûterait 4 octets de plus, mais je pense que les spécifications le leur permettent).la source