Unikalna lista PIN kłódki!

16

Wprowadzenie

Na prywatnym czacie mój przyjaciel najwyraźniej niedawno natknął się na system bezpieczeństwa, który ma następujące dwa ograniczenia dotyczące ważnych pinów:

  • Każda cyfra musi być unikalna (tzn. „1” może pojawić się tylko raz)
  • Kolejność cyfr nie ma znaczenia („1234” = „4321”)

Aby zilustrować, jak zły jest ten system kłódek, wyliczyć wszystkie prawidłowe kody PIN!

Wejście

Dane wejściowe będą składały się z jednej dodatniej liczby całkowitej, która oznacza długość kodu PIN.

Wynik

Dane wyjściowe składają się z listy nieujemnych liczb całkowitych lub ciągów *, które wyliczają wszystkie prawidłowe kody PIN o podanej długości.

* A ściślej coś, czego człowiek może użyć, aby wypróbować wszystkie kombinacje, gdybyś wydrukował to dla nich. Oznacza to, że zestaw zestawów cyfr i tablic tablic cyfr jest w porządku.

Kto wygrywa?

To jest więc wygrywa najkrótsza odpowiedź w bajtach! Obowiązują standardowe zasady i luki .

Obudowy narożne

  • Zachowanie wyjściowe jest niezdefiniowane, jeśli wprowadzona zostanie liczba całkowita większa niż 10.
  • Kolejność cyfr w każdym wpisie wyjściowym jest niezdefiniowana, ponieważ wpisy zawierające zero faktycznie zawierają wspomniane zero, to znaczy, że nie można rozdzielić „0123” na „123”, ale „1230”, „1203” i „1023” są prawidłowe tak jak „0123”.

Przypadki testowe

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
źródło
1
Dane wejściowe są nieujemne - więc na wejściu zero program powinien być listą zawierającą jedną wartość, pusty ciąg?
aschepler
@aschepler rzeczywiście, przypadek zerowy jest mniej więcej tak samo sensowny jak przypadek 11, więc zmieniłem go na „dodatnią liczbę całkowitą”.
SEJPM

Odpowiedzi:

7

Galaretka , 4 bajty

ØDœc

Wypróbuj online!

Wyjaśnienie

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

Zachowanie dla n > 10pustej listy.

HyperNeutrino
źródło
jak to nie działa z wejściem większym niż 10 (wypróbowałem to i wydawało mi się dziwne)?
Windmill Cookies
2
@ gnu-nobody daje pustą listę, ponieważ nie możesz mieć kombinacji 11 elementów z 10 wyborami.
HyperNeutrino
och, ØD to „0123456789”. dzięki.
Windmill Cookies
6

05AB1E , 5 bajtów

žhæsù

Wypróbuj online!

Wyjaśnienie

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789
Emigna
źródło
Nie wiedziałem, że ùto coś. Jestem pewien, że wcześniej użyłem filtra. Jak nowy to jest?
Magic Octopus Urn
1
@MagicOctopusUrn: Dość stary. Byłem tam przez długi czas: P
Emigna
Mój mózg nie widział wcześniej polecenia. Mój mózg nie jest mądry.
Magic Octopus Urn
Zdarzyło mi się kilka razy. Więcej niż raz w przypadku niektórych poleceń, czyli ...
Emigna,
... akceptowalny dla boskiego poziomu 05AB1Er (05AB1E-ite? 05AB1E-an?) takiego jak ty.
Magiczna Urna Ośmiornicy
6

JavaScript (ES7), 89 bajtów

Zwraca listę list cyfr (jako znaków) lub pustą listę, jeśli n> 10 .

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

Wypróbuj online!

W jaki sposób?

Najpierw generujemy listę wszystkich cyfr dziesiętnych jako znaków, obliczając 2 29 = 536870912 , dodając brakujące „4” i dzieląc:

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

Następnie obliczamy zestaw mocy:

.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

Na koniec filtrujemy wyniki według ich długości:

.filter(a=>a.length==n)
Arnauld
źródło
4

Python 3 , 57 bajtów

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

Wypróbuj online!

Znajduje wszystkie kombinacje 0 .. 9długościl .

Zachowanie dla n > 10pustej listy.

HyperNeutrino
źródło
4

Python 2 , 62 bajty

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

Zwraca zestaw ciągów.

Wypróbuj online!

Dennis
źródło
3

Pyth, 4 bajty

.cUT

Wypróbuj tutaj

Wyjaśnienie

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

źródło
3

R , 17 bajtów

combn(0:9,scan())

Wypróbuj online!

Błędy wejściowe większe niż 10.

Zwraca miejsce, w matrixktórym każda kolumna jest numerem PIN.

Giuseppe
źródło
2

MATL , 6 bajtów

4Y2wXN

Wypróbuj online!

Nic nie zwraca (pusta tablica) dla 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
źródło
2

Java (JDK 10) , 105 bajtów

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

Wypróbuj online!

Olivier Grégoire
źródło
2

Haskell , 47 bajtów

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

Wypróbuj online!

Wyjaśnienie

Gdy liczba cyfr wynosi zero, istnieje tylko jedna kombinacja, czyli pusta:

f 0=[[]]

Gdy liczba cyfr jest równa, na n/=0kombinacje są wszystkimi sposobami dodawania cyfr do kombinacji, f$n-1tak że żadna cyfra nie jest dodawana do kombinacji, która już ją zawiera.

f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]
Post Rock Garf Hunter
źródło
2

Gaia ,  4  3 bajty

₸…K

Wypróbuj online!

Minęło trochę czasu, odkąd opublikowałem odpowiedź w Gai! Dzięki panu Xcoderowi za uratowanie bajtu!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly
Giuseppe
źródło
Nie trzeba @.
Pan Xcoder,
@ Mr.Xcoder dzięki. Nie zdawałem sobie z tego sprawy; wydaje się, że nie jest to bardzo dobrze udokumentowane.
Giuseppe
2

Retina , 51 36 bajtów

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

Wypróbuj online! Nie wyświetla niczego n>10. Wyjaśnienie:

.+
10*

Wymień wejście na 10 _s.

"$+"{

Powtórz pozostałe nczasy programu .

%`^.
*_$&

Poprzedź każdą cyfrę _powtórzeniem zgodnie z pierwszą cyfrą.

L$v`_+

Dopasuj wszystkie _s, ale uwzględnij również wszystkie następujące _s w meczu, dla których musimy włączyć nakładające się mecze.

$.%`$%'

Dla każdego _znalezionego poprzedź liczbę _s po jego lewej stronie do liczby.

Jest to nieco trudne, więc być może rzeczywisty przypadek byłby lepszy. Załóżmy, że już uruchomiliśmy pętlę dwa razy, aby wszystkie 2-cyfrowe kody PIN zostały wygenerowane i obecnie pracujemy nad ich utworzeniem 3-cyfrowych kodów PIN. Zobaczymy, co się stanie 36: Pierwsza cyfra to 3, więc trzy _s są poprzedzone, aby ___36. Spowoduje to utworzenie następujących dopasowań, oznaczonych tutaj `'s:

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

$%'zmienia się na 36we wszystkich trzech przypadkach, co skutkuje trzycyfrowymi kodami PIN 036, 136oraz 236.

Gdybyśmy mieli następnie tworzyć 4-cyfrowe PIN-y, 036nie mielibyśmy żadnych _prefiksów, a zatem nie doprowadzilibyśmy do żadnego dopasowania w końcowym wyniku.

Neil
źródło
Pytanie mówi, że dane wejściowe są nieujemne. Po wprowadzeniu zera wyprowadza dziesięć znaków podkreślenia.
aschepler
@aschepler Rzeczywiście; Widzę, że OP zdecydował się wykluczyć tę sprawę, ale jeśli się zastanawiasz, poprawka polegałaby na dodaniu ^0i kosztem 5 bajtów.
Neil
1

Proton , 43 bajty

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

Wypróbuj online!

Proton wreszcie przerósł Pythona: DI myślał, (import itertools)że zwróci wartość, ale najwyraźniej mi się to nie udało. Również importowanie *później nie działa, ponieważ nie jest to lambda, jest to wyrażenie najwyższego poziomu.

HyperNeutrino
źródło
1

Japt, 5 bajtów

Wyprowadza tablicę tablic cyfrowych. Wyprowadza wszystkie kombinacje, jeśli dane wejściowe są, 0lub pustą tablicę, jeśli dane wejściowe są <0lub >10.

Ao àU

Spróbuj


Wyjaśnienie

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U
Kudłaty
źródło
Nie sądzę, aby dane wyjściowe dla wejścia 0 były poprawne. Dane wyjściowe powinny być listą zawierającą jeden element, który jest pusty.
aschepler
@aschepler, skąd to bierzesz?
Shaggy
1

Stax , 4 bajty

Vd,S

Wypróbuj online!

Vdjest "0123456789". ,wypycha dane wejściowe do głównego stosu. Spobiera kombinacje określonego rozmiaru.

W łączu tio msłuży w stopce do wydrukowania każdego wydruku.

rekurencyjny
źródło
1

Standardowy ML , 124 122 121 bajtów

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

Wypróbuj online! Przykładowe użycie: !2daje [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...].

Nie golfowany:

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

Niektóre alternatywy:

125 123 bajtów

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;

Wypróbuj online! Definiuje anonimową funkcję, z którą jest związana it.

127 124 bajtów

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

Wypróbuj online!

Laikoni
źródło
1

Oracle 18 SQL, 169 bajtów

Nie jest to język golfowy, ale:

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

Oczekiwano, że dane wejściowe znajdą się w tabeli iz kolumną a:

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

Wypróbuj online w Oracle Live SQL (wymagane jest bezpłatne logowanie, a następnie skopiuj i wklej rozwiązanie do arkusza roboczego ) lub SQLFiddle (bez logowania, ale wymaga +7 bajtów do pracy w niższej wersji Oracle).

MT0
źródło
1

CJam , 13 11 bajtów

{Ae!f<:$_|}

Wypróbuj online!

Technicznie nie działa na tio.run, ponieważ kończy się miejsce na stosie. Działa jednak poprawnie dla maksymalnie 9-cyfrowych klawiatur i powinien działać dobrze z większą ilością pamięci RAM.

Zaoszczędzono 2 bajty dzięki Dennisowi

maxb
źródło
0

Bash , 113 99 bajtów

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

Wypróbuj online!

Glenn Jackman
źródło
r 0nie działa
aschepler
rjest funkcją rekurencyjną: nie ma być uruchamiana tylko z jednym parametrem. p 0zachowanie nie jest określone w pytaniu.
glenn jackman
0

JavaScript (Firefox 30-57), 67 bajtów

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

Port mojej odpowiedzi Retina, ale działa n=0również dla (zwracając listę pustych ciągów, w odróżnieniu od pustej listy dla n>10).

Neil
źródło
0

Węgiel drzewny , 21 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

⊞υω

Wciśnij pusty ciąg do wstępnie zdefiniowanej listy.

Fχ

Pętla nad każdą cyfrą.

Eυ⁺κIι

Dołącz cyfrę do każdego łańcucha na liście.

≔⁺υ...υ

Dołącz wynik do oryginalnej listy.

Φυ⁼θLι

Wydrukuj wszystkie ciągi z prawidłową liczbą cyfr.

Neil
źródło