La liste unique de codes PIN de cadenas!

16

introduction

Dans une conversation privée, un de mes amis est apparemment récemment tombé sur un système de sécurité qui a les deux restrictions suivantes sur ses broches valides:

  • Chaque chiffre doit être unique (c'est-à-dire que "1" ne peut apparaître qu'une seule fois)
  • L'ordre des chiffres n'a pas d'importance ("1234" = "4321")

Donc, pour illustrer la gravité de ce système de cadenas, énumérons en fait tous les codes PIN valides!

Contribution

Votre saisie consistera en un seul entier positif, qui indique la longueur du code PIN.

Production

Votre sortie se compose d'une liste d'entiers ou de chaînes non négatifs *, qui énumèrent tous les codes PIN valides de la longueur donnée.

* Plus précisément quelque chose qu'un humain peut utiliser pour essayer toutes les combinaisons si vous l'imprimez pour lui. Cela signifie qu'un ensemble d'ensembles de chiffres et de tableaux de tableaux de chiffres est correct.

Qui gagne?

Il s'agit de donc la réponse la plus courte en octets l'emporte! Des règles et des lacunes standard s'appliquent.

Étuis d'angle

  • Le comportement de sortie n'est pas défini si un entier supérieur à 10 est entré.
  • L'ordre des chiffres dans chaque entrée de sortie n'est pas défini, car les entrées avec un zéro contiennent réellement ledit zéro, c'est-à-dire que vous ne pouvez pas supprimer "0123" à "123" mais "1230", "1203" et "1023" sont tous valides comme "0123".

Cas de test

1
[0,1,2,3,4,5,6,7,8,9]

2
[10,20,30,40,50,60,70,80,90,21,31,41,51,61,71,81,91,32,42,52,62,72,82,92,43,53,63,73,83,93,54,64,74,84,94,65,75,85,95,76,86,96,87,97,98]

3
[210,310,410,510,610,710,810,910,320,420,520,620,720,820,920,430,530,630,730,830,930,540,640,740,840,940,650,750,850,950,760,860,960,870,970,980,321,421,521,621,721,821,921,431,531,631,731,831,931,541,641,741,841,941,651,751,851,951,761,861,961,871,971,981,432,532,632,732,832,932,542,642,742,842,942,652,752,852,952,762,862,962,872,972,982,543,643,743,843,943,653,753,853,953,763,863,963,873,973,983,654,754,854,954,764,864,964,874,974,984,765,865,965,875,975,985,876,976,986,987]

4
[3210,4210,5210,6210,7210,8210,9210,4310,5310,6310,7310,8310,9310,5410,6410,7410,8410,9410,6510,7510,8510,9510,7610,8610,9610,8710,9710,9810,4320,5320,6320,7320,8320,9320,5420,6420,7420,8420,9420,6520,7520,8520,9520,7620,8620,9620,8720,9720,9820,5430,6430,7430,8430,9430,6530,7530,8530,9530,7630,8630,9630,8730,9730,9830,6540,7540,8540,9540,7640,8640,9640,8740,9740,9840,7650,8650,9650,8750,9750,9850,8760,9760,9860,9870,4321,5321,6321,7321,8321,9321,5421,6421,7421,8421,9421,6521,7521,8521,9521,7621,8621,9621,8721,9721,9821,5431,6431,7431,8431,9431,6531,7531,8531,9531,7631,8631,9631,8731,9731,9831,6541,7541,8541,9541,7641,8641,9641,8741,9741,9841,7651,8651,9651,8751,9751,9851,8761,9761,9861,9871,5432,6432,7432,8432,9432,6532,7532,8532,9532,7632,8632,9632,8732,9732,9832,6542,7542,8542,9542,7642,8642,9642,8742,9742,9842,7652,8652,9652,8752,9752,9852,8762,9762,9862,9872,6543,7543,8543,9543,7643,8643,9643,8743,9743,9843,7653,8653,9653,8753,9753,9853,8763,9763,9863,9873,7654,8654,9654,8754,9754,9854,8764,9764,9864,9874,8765,9765,9865,9875,9876]
SEJPM
la source
1
L'entrée n'est pas négative - donc à l'entrée zéro, le programme devrait être une liste contenant une valeur, la chaîne vide?
aschepler
@aschepler en effet, le cas zéro est à peu près aussi sensible que le cas 11, j'ai donc changé cela en "entier positif".
SEJPM

Réponses:

7

Gelée , 4 octets

ØDœc

Essayez-le en ligne!

Explication

ØDœc  Double-builtin; main link
  œc  Number of combinations of          of length
ØD                              [digits]
                                                   <right argument>

Le comportement de n > 10est une liste vide.

HyperNeutrino
la source
comment cela ne fonctionne-t-il pas avec une entrée supérieure à 10?
Windmill Cookies
2
@ gnu-nobody donne la liste vide car vous ne pouvez pas avoir une combinaison de 11 éléments avec 10 choix.
HyperNeutrino
oh, le ØD est le "0123456789". Merci.
Windmill Cookies
6

05AB1E , 5 octets

žhæsù

Essayez-le en ligne!

Explication

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789
Emigna
la source
Je ne savais pas que ùc'était une chose. Je suis sûr que j'ai déjà utilisé un filtre. Quelle est sa nouveauté?
Magic Octopus Urn
1
@MagicOctopusUrn: Assez vieux.
J'y suis
Mon cerveau ne voit pas la commande avant maintenant. Mon cerveau n'est pas intelligent.
Magic Octopus Urn
Cela m'est arrivé plusieurs fois. Plus d'une fois sur certaines commandes également, ce qui est ...
Emigna
... acceptable d'un niveau divin 05AB1Er (05AB1E-ite? 05AB1E-an?) comme vous.
Magic Octopus Urn
6

JavaScript (ES7), 89 octets

Renvoie une liste de listes de chiffres (sous forme de caractères) ou une liste vide si n> 10 .

n=>[...2**29+'4'].reduce((a,x)=>[...a,...a.map(y=>[x,...y])],[[]]).filter(a=>a.length==n)

Essayez-le en ligne!

Comment?

Nous générons d'abord une liste de tous les chiffres décimaux sous forme de caractères en calculant 2 29 = 536870912 , en ajoutant le «4» manquant et en divisant:

[...2**29+'4']  [ '5', '3', '6', '8', '7', '0', '9', '1', '2', '4' ]

Nous calculons ensuite l'ensemble de puissance:

.reduce(                                   ,[[]]) // starting with a[] holding an empty list
        (a,x)=>[                          ]       // for each decimal digit x:
                ...a,                             //   copy all previous entries in a[]
                     ...a.map(y=>        )        //   and duplicate each previous entry y
                                 [x,...y]         //   with x prepended at the beginning

Enfin, nous filtrons les résultats sur leur longueur:

.filter(a=>a.length==n)
Arnauld
la source
4

Python 3 , 57 octets

lambda l:combinations(range(10),l)
from itertools import*

Essayez-le en ligne!

Trouve toutes les combinaisons 0 .. 9de longueur l.

Le comportement de n > 10est une liste vide.

HyperNeutrino
la source
4

Python 2 , 62 octets

f=lambda n:{d+s for d in`5**19`*n for s in f(n-1)if d>s}or{''}

Renvoie un ensemble de chaînes.

Essayez-le en ligne!

Dennis
la source
3

Pyth, 4 octets

.cUT

Essayez-le ici

Explication

.cUT
  UT     [0, 1, ..., 9].
.c  Q    All (implicit input)-element subsets.

la source
3

R , 17 octets

combn(0:9,scan())

Essayez-le en ligne!

Erreurs d'entrée supérieures à 10 .

Renvoie un matrixoù chaque colonne est un code PIN.

Giuseppe
la source
2

MATL , 6 octets

4Y2wXN

Essayez-le en ligne!

Ne renvoie rien (tableau vide) pour k>10.

          % implicit input k
4Y2       % push '0':'9'
   w      % swap top two elements of stack
    XN    % nchoosek, select all k-combinations of '0':'9' as a char array
          % implicit output
Giuseppe
la source
2

Java (JDK 10) , 105 octets

n->{var s="";for(int i=1024,j;i-->0;s+=" ")for(j=10;n.bitCount(i)==n&j-->0;)s+=(1<<j&i)>0?j:"";return s;}

Essayez-le en ligne!

Olivier Grégoire
la source
2

Haskell , 47 octets

f 0=[[]]
f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]

Essayez-le en ligne!

Explication

Lorsque le nombre de chiffres est nul, il n'y a qu'une seule combinaison, celle qui est vide:

f 0=[[]]

Lorsque le nombre de chiffres est net n/=0les combinaisons sont toutes les façons d'ajouter des chiffres aux combinaisons de f$n-1telle sorte qu'aucun chiffre n'est ajouté à une combinaison qui le contient déjà.

f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]
Post Rock Garf Hunter
la source
2

Gaia ,  4  3 octets

₸…K

Essayez-le en ligne!

Cela fait un moment que je n'ai pas posté de réponse dans Gaia! Merci à M. Xcoder d'avoir enregistré un octet!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly
Giuseppe
la source
Tu n'as pas besoin @.
M. Xcoder
@ Mr.Xcoder merci. Je ne m'en suis pas rendu compte; cela ne semble pas être documenté très clairement.
Giuseppe
2

Rétine , 51 36 octets

.+
10*
"$+"{%`^.
*_$&
L$v`_+
$.%`$%'

Essayez-le en ligne! Ne produit rien pour n>10. Explication:

.+
10*

Remplacez l'entrée par 10 _ s.

"$+"{

Répétez le reste du programme n fois.

%`^.
*_$&

Préfixez chaque numéro avec _ répété selon son premier chiffre.

L$v`_+

Correspond à tous les _s, mais inclut tous les éléments suivants_ s dans la correspondance, pour lesquels nous devons activer les correspondances qui se chevauchent.

$.%`$%'

Pour chaque _ trouvé, préfixez le nombre de _s à sa gauche au nombre.

C'est un peu délicat, alors peut-être qu'un cas réel serait mieux. Supposons que nous ayons déjà exécuté la boucle deux fois, de sorte que tous les codes PIN à 2 chiffres aient été générés, et nous travaillons actuellement sur eux pour créer des codes PIN à 3 chiffres. Nous allons voir ce qui arrive à 36: Le premier chiffre est 3, donc trois _s sont préfixés, à faire ___36. Cela crée alors les correspondances suivantes, marquées ici avec`' s:

Match   $%` $.%`
`___'36     0
_`__'36 _   1
__`_'36 __  2

$%' évalue à 36 dans les trois cas, ce qui donne des NIP à 3 chiffres 036,136 et236 .

Si nous devions ensuite créer des codes PIN à 4 chiffres, 036aucun _s ne serait préfixé et, par conséquent, il n'y aurait aucune correspondance dans la sortie finale.

Neil
la source
La question dit que l'entrée n'est pas négative. À l'entrée zéro, cela produit dix caractères de soulignement.
aschepler
@aschepler En effet; Je vois que l'OP a décidé d'exclure ce cas, mais au cas où vous vous poseriez la question, le correctif consisterait à ajouter au début ^0et à un coût de 5 octets.
Neil
1

Proton , 43 octets

(0..9)&__import__("itertools").combinations

Essayez-le en ligne!

Proton a finalement devancé Python: DI pensait (import itertools)retourner la valeur mais apparemment j'ai échoué. L'importation *ultérieure ne fonctionne pas non plus car ce n'est pas dans un lambda, c'est une expression de niveau supérieur.

HyperNeutrino
la source
1

Japt, 5 octets

Génère un tableau de tableaux de chiffres. Génère toutes les combinaisons si l'entrée est 0ou un tableau vide si l'entrée est <0ou >10.

Ao àU

Essayez-le


Explication

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U
Hirsute
la source
Je ne pense pas que la sortie de l'entrée 0 soit correcte. La sortie doit être une liste contenant un élément, qui est vide.
aschepler
@aschepler, d'où tirez-vous cela?
Shaggy
1

Stax , 4 octets

Vd,S

Essayez-le en ligne!

Vd est "0123456789" . ,pousse l'entrée dans la pile principale.Sobtient des combinaisons de la taille spécifiée.

Dans le lien tio, mest utilisé dans le pied de page pour imprimer chaque sortie.

récursif
la source
1

Standard ML , 124 122 121 octets

open List;fun f(s:: &)m=(if exists(fn x=>x=m)s then[]else[m::s])@f&m|f&m= &
fun!0=[[]]| !n=concat(tabulate(10,f(!(n-1))))

Essayez-le en ligne! Exemple d'utilisation: !2rendements [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...].

Non golfé:

open List;

(* int list list -> int -> int list list *)
fun f (s::r) m =
    if exists (fn x => x=m) s 
    then f r m
    else (m::s) :: f r m
  | f [] m = []

(* int -> int list list *)
fun g 0 = [[]]
  | g n = concat(tabulate(10, f(g(n-1))))

Quelques alternatives:

125 123 octets

fun f(s:: &)m=(if List.exists(fn x=>x=m)s then[]else[m::s])@f&m|f&m= &
fun!m 0=[[]]| !10n=[]| !m n=f(!0(n-1))m@ !(m+1)n;!0;

Essayez-le en ligne!Définit une fonction anonyme qui est liée à it.

127 124 octets

fun!0=[[]]| !n=let fun f(s:: &)m=(if List.exists(fn x=>x=m)s then[]else[m::s])@f&m|f&9=[]|f&m=f(!(n-1))(m+1)in f(!(n-1))0end

Essayez-le en ligne!

Laikoni
la source
1

Oracle 18 SQL, 169 octets

Pas une langue de golf mais:

WITH t(v)AS(SELECT*FROM SYS.ODCINUMBERLIST(0,1,2,3,4,5,6,7,8,9)),n(a,b,c)AS(SELECT a,-1,''FROM i UNION ALL SELECT a-1,v,v||c FROM n,t WHERE v>b)SELECT c FROM n WHERE a=0

Attendu que l'entrée soit dans une table iavec une colonne a:

CREATE TABLE i (a INT);
INSERT INTO i VALUES ( 3 );

Essayez-le en ligne sur Oracle Live SQL (une connexion gratuite est requise puis copiez-collez la solution dans une feuille de calcul) ou SQLFiddle (pas de connexion mais nécessite +7 octets pour fonctionner sur la version Oracle inférieure).

MT0
la source
1

CJam , 13 11 octets

{Ae!f<:$_|}

Essayez-le en ligne!

Techniquement, ne s'exécute pas sur tio.run, car l'espace de tas est épuisé. Cependant, il fonctionne correctement pour les claviers jusqu'à 9 chiffres et devrait fonctionner correctement avec plus de RAM.

Enregistré 2 octets grâce à Dennis

maxb
la source
0

Bash , 113 99 octets

p()(r $1 0 $[10-$1])
r()for i in `seq $2 $3`;{ (($1>1))&&r $[$1-1] $[i+1] $[$3+1] $4$i||echo $4$i;}

Essayez-le en ligne!

glenn jackman
la source
r 0ne fonctionne pas.
aschepler
rest la fonction récursive: elle n'est pas destinée à être lancée avec seulement 1 paramètre. p 0le comportement n'est pas spécifié dans la question.
glenn jackman
0

JavaScript (Firefox 30-57), 67 octets

n=>n?[for(x of f(n-1))for(y of Array(x?+x[0]:10).keys())y+x]:['']

Port de ma réponse Retina, mais fonctionne n=0aussi (retour d'une liste d'une chaîne vide, distincte d'une liste vide pour n>10).

Neil
la source
0

Fusain , 21 octets

⊞υωFχ≔⁺υEυ⁺κIιυΦυ⁼θLι

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

⊞υω

Poussez la chaîne vide dans la liste prédéfinie.

Fχ

Faites une boucle sur chaque chiffre.

Eυ⁺κIι

Ajoutez le chiffre à chaque chaîne de la liste.

≔⁺υ...υ

Ajoutez le résultat à la liste d'origine.

Φυ⁼θLι

Imprimez toutes les chaînes avec le nombre correct de chiffres.

Neil
la source