L'elenco PIN unico del lucchetto!


16

introduzione

In una chat privata, un mio amico apparentemente di recente si è imbattuto in un sistema di sicurezza che ha le seguenti due restrizioni sui suoi pin validi:

  • Ogni cifra deve essere unica (ovvero "1" può apparire una sola volta)
  • L'ordine delle cifre non ha importanza ("1234" = "4321")

Quindi, per illustrare quanto sia cattivo questo sistema di lucchetti, enumeriamo effettivamente tutti i PIN validi!

Ingresso

Il tuo input sarà costituito da un singolo numero intero positivo, che indica la lunghezza del PIN.

Produzione

L'output è costituito da un elenco di numeri interi o stringhe non negativi *, che enumera tutti i PIN validi della lunghezza specificata.

* Più precisamente qualcosa che un essere umano può usare per provare tutte le combinazioni se lo stampi per loro. Ciò significa che l'insieme di insiemi di cifre e gli array di array di cifre vanno bene.

Chi vince?

Questo è quindi vince la risposta più breve in byte! Si applicano regole standard e scappatoie .

Custodie angolari

  • Il comportamento dell'output non è definito se viene inserito un numero intero maggiore di 10.
  • L'ordinamento delle cifre all'interno di ciascuna voce di output non è definito, poiché le voci con uno zero in realtà contengono detto zero, vale a dire che non è possibile eseguire lo striping da "0123" a "123" ma "1230", "1203" e "1023" sono tutti validi come è "0123".

Casi 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]

1
L'input è non negativo - quindi sull'input zero, il programma dovrebbe essere un elenco contenente un valore, la stringa vuota?
aschepler,

@aschepler in effetti, il caso zero è sensuale quanto l'11 caso, quindi l'ho cambiato in "numero intero positivo".
SEJPM,

Risposte:


7

Gelatina , 4 byte

ØDœc

Provalo online!

Spiegazione

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

Il comportamento per n > 10è un elenco vuoto.


come funziona con input maggiori di 10 (provato e mi è sembrato strano)?
Windmill Cookies,

2
@ gnu-nobody dà la lista vuota perché non puoi avere una combinazione di 11 elementi con 10 scelte.
HyperNeutrino,

oh, il ØD è il "0123456789". Grazie.
Windmill Cookies,

6

05AB1E , 5 byte

žhæsù

Provalo online!

Spiegazione

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789

Non sapevo ùfosse una cosa. Abbastanza sicuro di aver usato il filtro prima. Quanto è nuovo quello?
Magic Octopus Urn

1
@MagicOctopusUrn: piuttosto vecchio. Ci sono stato per molto tempo: P
Emigna,

Io cervello non vedo il comando prima di adesso. Io cervello no sono intelligente.
Magic Octopus Urn,

Mi è successo un paio di volte. Più di una volta anche su alcuni comandi, che è ...
Emigna,

... accettabile di una divinità 05AB1Er (05AB1E-ite? 05AB1E-an?) come te.
Magic Octopus Urn

6

JavaScript (ES7), 89 byte

Restituisce un elenco di elenchi di cifre (come caratteri) o un elenco vuoto se n> 10 .

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

Provalo online!

Come?

Generiamo innanzitutto un elenco di tutte le cifre decimali come caratteri calcolando 2Generiamo 29 = 536870912 , aggiungendo i '4' mancantie suddividendo:

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

Quindi calcoliamo il powerset:

.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

Infine, filtriamo i risultati sulla loro lunghezza:

.filter(a=>a.length==n)

4

Python 3 , 57 byte

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

Provalo online!

Trova tutte le combinazioni 0 .. 9di lunghezzal .

Il comportamento per n > 10è un elenco vuoto.




3

Pyth, 4 byte

.cUT

Provalo qui

Spiegazione

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

3

R , 17 byte

combn(0:9,scan())

Provalo online!

Errori per input maggiore di 10 .

Restituisce un punto in matrixcui ogni colonna è un PIN.



2

MATL , 6 byte

4Y2wXN

Provalo online!

Restituisce nulla (array vuoto) per 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



2

Haskell , 47 byte

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

Provalo online!

Spiegazione

Quando il numero di cifre è zero c'è solo una combinazione, quella vuota:

f 0=[[]]

Quando il numero di cifre è ne n/=0le combinazioni sono tutti i modi per aggiungere cifre alle combinazioni in modo f$n-1tale che nessuna cifra sia aggiunta a una combinazione che già lo contiene.

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

2

Gaia ,  4  3 byte

₸…K

Provalo online!

È passato un po 'di tempo da quando ho pubblicato una risposta in Gaia! Grazie a Mr. Xcoder per aver salvato un byte!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly

Non hai bisogno @.
Mr. Xcoder,

@ Grazie Mr.Xcoder. Non me ne sono reso conto; non sembra essere documentato molto chiaramente.
Giuseppe,

2

Retina , 51 36 byte

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

Provalo online! Non produce nulla per n>10. Spiegazione:

.+
10*

Sostituire l'ingresso con 10 _s.

"$+"{

Ripeti il ​​resto dei ntempi del programma .

%`^.
*_$&

Prefisso ogni numero con _ripetuto in base alla sua prima cifra.

L$v`_+

Abbina tutti _i messaggi, ma includi anche tutti i messaggi seguenti _nella partita, per i quali dobbiamo abilitare le partite sovrapposte.

$.%`$%'

Per ogni _trovato, aggiungi il numero di_ s alla sua sinistra al numero.

Questo è un po 'complicato, quindi forse un caso reale sarebbe meglio. Supponiamo che abbiamo già eseguito il ciclo due volte, in modo che tutti i PIN a 2 cifre siano stati generati e attualmente stiamo lavorando su di essi per creare PIN a 3 cifre. Vedremo cosa succede 36: la prima cifra è 3, quindi tre _s hanno il prefisso, da fare ___36. Questo crea quindi le seguenti corrispondenze, contrassegnate qui con `'s:

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

$%'evalutes a 36tutti e tre i casi, con conseguente i PIN 3 cifre 036, 136e 236.

Se dovessimo continuare con la creazione di PIN a 4 cifre, 036non avremmo alcun _prefisso e quindi non produrrebbe alcuna corrispondenza nell'output finale.


La domanda dice che l'input non è negativo. All'ingresso zero, vengono emessi dieci caratteri di sottolineatura.
aschepler,

@aschepler Indeed; Vedo l'OP ha deciso di escludere quel caso, ma nel caso vi stiate chiedendo, la correzione potrebbe essere quella di anteporre ^0e ad un costo di 5 byte.
Neil,

1

Proton , 43 byte

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

Provalo online!

Alla fine Proton supera Python: il pensiero di DI (import itertools)avrebbe restituito il valore ma a quanto pare non ci sono riuscito. Anche l'importazione *successiva non funziona perché non si trova in una lambda, è un'espressione di livello superiore.


1

Japt, 5 byte

Emette un array di array di cifre. Emette tutte le combinazioni se l'input è 0o un array vuoto se l'input è <0o >10.

Ao àU

Provalo


Spiegazione

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U

Non penso che l'uscita per l'ingresso 0 sia corretta. L'output dovrebbe essere un elenco contenente un elemento, che è vuoto.
aschepler

@aschepler, da dove lo prendi?
Shaggy,

1

Stax , 4 byte

Vd,S

Provalo online!

Vdlo è "0123456789". ,spinge l'input nello stack principale. Sottiene combinazioni della dimensione specificata.

Nel collegamento tio, mviene utilizzato nel piè di pagina per stampare ogni output.


1

Standard ML , 124 122 121 byte

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))))

Provalo online!Esempio di utilizzo: !2rese [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...].

Ungolfed:

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))))

Alcune alternative:

125 123 byte

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;

Provalo online! Definisce una funzione anonima cui è associatait .

127 124 byte

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

Provalo online!



1

Oracle 18 SQL, 169 byte

Non una lingua da golf ma:

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

Si aspettava che l'input fosse in una tabella icon colonna a:

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

Provalo online su Oracle Live SQL (è necessario un accesso gratuito, quindi copia e incolla la soluzione in un foglio di lavoro) o SQLFiddle (nessun accesso ma richiede +7 byte per funzionare sulla versione Oracle inferiore).


1

CJam , 13 11 byte

{Ae!f<:$_|}

Provalo online!

Tecnicamente non funziona su tio.run, poiché lo spazio dell'heap si esaurisce. Tuttavia, funziona correttamente per tastiere fino a 9 cifre e dovrebbe funzionare bene con più RAM.

Salvato 2 byte grazie a Dennis


0

Bash , 113 99 byte

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;}

Provalo online!


r 0non funziona
aschepler,

rè la funzione ricorsiva: non è pensata per essere lanciata con solo 1 parametro. p 0il comportamento non è specificato nella domanda.
Glenn Jackman,

0

JavaScript (Firefox 30-57), 67 byte

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

Port of my Retina risponde, ma funziona n=0anche per (restituendo un elenco di una stringa vuota, distinto da un elenco vuoto per n>10).


0

Carbone , 21 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

⊞υω

Spingere la stringa vuota nell'elenco predefinito.

Fχ

Passa sopra ogni cifra.

Eυ⁺κIι

Aggiungi la cifra a ogni stringa nell'elenco.

≔⁺υ...υ

Aggiungi il risultato all'elenco originale.

Φυ⁼θLι

Stampa tutte le stringhe con il numero corretto di cifre.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.