Daftar PIN Gembok Unik!

16

pengantar

Dalam obrolan pribadi, seorang teman saya tampaknya baru-baru ini menemukan sistem keamanan yang memiliki dua batasan berikut pada pin yang valid:

  • Setiap digit harus unik (yaitu "1" hanya dapat muncul sekali)
  • Urutan digit tidak masalah ("1234" = "4321")

Jadi untuk menggambarkan betapa buruknya sistem gembok ini, mari sebutkan semua PIN yang valid!

Memasukkan

Input Anda akan terdiri dari bilangan bulat tunggal, positif, yang menunjukkan panjang PIN.

Keluaran

Output Anda terdiri dari daftar bilangan bulat atau string non-negatif *, yang menyebutkan semua PIN yang valid dengan panjang yang diberikan.

* Lebih tepatnya sesuatu yang dapat digunakan manusia untuk mencoba semua kombinasi jika Anda ingin mencetaknya. Ini berarti mengatur set angka dan array dari array dari angka-baik saja.

Yang menang?

Ini adalah sehingga jawaban tersingkat dalam byte menang! Aturan dan celah standar berlaku.

Kasus sudut

  • Perilaku output tidak terdefinisi jika bilangan bulat lebih besar dari 10 adalah input.
  • Urutan digit dalam setiap entri keluaran tidak ditentukan, karena entri dengan nol sebenarnya mengandung kata nol, yaitu Anda tidak boleh menghapus "0123" menjadi "123" tetapi "1230", "1203" dan "1023" semuanya valid seperti "0123".

Uji Kasus

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
sumber
1
Inputnya non-negatif - jadi pada input nol, program harus berupa daftar yang berisi satu nilai, string kosong?
aschepler
@aschepler memang, kasus nol adalah tentang sensis seperti kasus 11, jadi saya mengubahnya menjadi "bilangan bulat positif".
SEJPM

Jawaban:

7

Jelly , 4 byte

ØDœc

Cobalah online!

Penjelasan

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

Perilaku untuk n > 10 daftar kosong.

HyperNeutrino
sumber
bagaimana tidak bekerja dengan input lebih besar dari 10 (mencobanya, dan terasa aneh bagi saya)?
Kue Windmill
2
@ gnu-tidak ada yang memberikan daftar kosong karena Anda tidak dapat memiliki kombinasi 11 elemen dengan 10 pilihan.
HyperNeutrino
oh, ØD adalah "0123456789". Terima kasih.
Windmill Cookies
6

05AB1E , 5 byte

žhæsù

Cobalah online!

Penjelasan

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789
Emigna
sumber
Tidak tahu ùapa-apa. Cukup yakin saya pernah menggunakan filter sebelumnya. Seberapa baru itu?
Magic Gurita Guci
1
@MagicOctopusUrn: Cukup tua. Sudah lama di sana: P
Emigna
Saya otak tidak melihat perintah sebelum sekarang. Otak saya tidak pintar.
Magic Gurita Guci
Telah terjadi pada saya beberapa kali. Lebih dari sekali pada beberapa perintah juga, yaitu ...
Emigna
... dapat diterima dari 05AB1Er dewa-tier (05AB1E-ite? 05AB1E-an?) seperti Anda.
Magic Gurita Guci
6

JavaScript (ES7), 89 byte

Mengembalikan daftar daftar digit (sebagai karakter), atau daftar kosong jika n> 10 .

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

Cobalah online!

Bagaimana?

Kami pertama-tama menghasilkan daftar semua digit desimal sebagai karakter dengan menghitung 2 29 = 536870912 , menambahkan '4' yang hilang dan memisahkan:

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

Kami kemudian menghitung 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

Akhirnya, kami memfilter hasil menurut panjangnya:

.filter(a=>a.length==n)
Arnauld
sumber
4

Python 3 , 57 byte

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

Cobalah online!

Temukan semua kombinasi 0 .. 9panjang l.

Perilaku untukn > 10 daftar kosong.

HyperNeutrino
sumber
4

Python 2 , 62 bytes

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

Mengembalikan serangkaian string.

Cobalah online!

Dennis
sumber
3

Pyth, 4 byte

.cUT

Coba di sini

Penjelasan

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

sumber
3

R , 17 byte

combn(0:9,scan())

Cobalah online!

Kesalahan untuk input lebih besar dari 10.

Mengembalikan di matrixmana setiap kolom adalah PIN.

Giuseppe
sumber
2

MATL , 6 byte

4Y2wXN

Cobalah online!

Tidak menghasilkan apa-apa (array kosong) untuk 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
sumber
2

Java (JDK 10) , 105 byte

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

Cobalah online!

Olivier Grégoire
sumber
2

Haskell , 47 byte

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

Cobalah online!

Penjelasan

Ketika jumlah digit nol, hanya ada satu kombinasi, yaitu yang kosong:

f 0=[[]]

Ketika jumlah digit ndan n/=0kombinasinya adalah semua cara untuk menambahkan digit ke kombinasinya f$n-1sehingga tidak ada digit yang ditambahkan ke kombinasi yang sudah mengandungnya.

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

Gaia ,  4  3 byte

₸…K

Cobalah online!

Sudah lama sejak saya memposting jawaban di Gaia! Terima kasih kepada Tn. Xcoder karena telah menghemat satu byte!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly
Giuseppe
sumber
Anda tidak perlu @.
Tn. Xcoder
@ Mr.Xcoder terima kasih. Tidak menyadarinya; sepertinya tidak didokumentasikan dengan sangat jelas.
Giuseppe
2

Retina , 51 36 byte

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

Cobalah online! Tidak menghasilkan apa-apa untuk n>10. Penjelasan:

.+
10*

Ganti input dengan 10 _dtk.

"$+"{

Ulangi sisa program n .

%`^.
*_$&

Awali setiap angka dengan _ diulang sesuai dengan digit pertama.

L$v`_+

Cocokkan semua _, tetapi sertakan semua yang berikut ini_ di dalam pertandingan juga, untuk itu kami harus mengaktifkan pertandingan yang tumpang tindih.

$.%`$%'

Untuk setiap _ ditemukan, awali angka _s ke kiri ke angka.

Ini agak rumit jadi mungkin kasus yang sebenarnya akan lebih baik. Misalkan kita sudah menjalankan loop dua kali, sehingga semua PIN 2 digit telah dibuat, dan saat ini kami sedang mengerjakannya untuk membuat PIN 3 digit. Kita akan melihat apa yang terjadi pada 36: Digit pertama adalah 3, jadi tiga _s diawali, untuk dibuat ___36. Ini kemudian menciptakan kecocokan berikut, ditandai di sini dengan `'s:

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

$%' evalutes ke 36 dalam semua tiga kasus, menghasilkan 3 digit PIN 036, 136dan 236.

Jika kami kemudian membuat PIN 4 digit, maka 036tidak akan ada _awalan, dan karenanya tidak akan menghasilkan kecocokan sama sekali dalam hasil akhir.

Neil
sumber
Pertanyaannya mengatakan inputnya tidak negatif. Pada input nol, ini menghasilkan sepuluh karakter garis bawah.
aschepler
@aschepler Memang; Saya melihat OP telah memutuskan untuk mengecualikan kasus itu, tetapi jika Anda bertanya-tanya, perbaikannya adalah dengan menambahkan ^0dan dengan biaya 5 byte.
Neil
1

Proton , 43 byte

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

Cobalah online!

Proton akhirnya mengungguli Python: DI pikir (import itertools)akan mengembalikan nilai tetapi ternyata saya gagal. Juga mengimpor *setelah itu tidak berfungsi karena tidak ada dalam lambda, itu adalah ekspresi tingkat atas.

HyperNeutrino
sumber
1

Japt, 5 byte

Output array array digit. Keluarkan semua kombinasi jika inputnya 0atau array kosong jika inputnya<0 atau >10.

Ao àU

Cobalah


Penjelasan

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U
Shaggy
sumber
Saya tidak berpikir output untuk input 0 sudah benar. Output harus berupa daftar yang mengandung satu elemen, yang kosong.
aschepler
@aschepler, dari mana Anda mendapatkan itu?
Shaggy
1

Stax , 4 byte

Vd,S

Cobalah online!

Vdadalah "0123456789". ,mendorong input ke tumpukan utama. Smendapat kombinasi ukuran yang ditentukan.

Di tautan tio, mdigunakan di footer untuk mencetak setiap output.

rekursif
sumber
1

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

Cobalah online! Contoh penggunaan: !2hasil [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...].

Tidak Terkumpul:

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

Beberapa alternatif:

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;

Cobalah online! Menentukan fungsi anonim yang terikat it.

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

Cobalah online!

Laikoni
sumber
1

Oracle 18 SQL, 169 byte

Bukan bahasa golf tetapi:

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

Diharapkan input berada dalam tabel idengan kolom a:

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

Cobalah online di Oracle Live SQL (diperlukan login gratis lalu salin-tempel solusi ke lembar kerja) atau SQLFiddle (tidak ada login tetapi membutuhkan +7 byte untuk bekerja pada versi Oracle yang lebih rendah).

MT0
sumber
1

CJam , 13 11 byte

{Ae!f<:$_|}

Cobalah online!

Secara teknis tidak berjalan pada tio.run, karena ruang tumpukan habis. Namun, ini berfungsi dengan baik untuk keypad keypad hingga 9 digit, dan harus berjalan baik dengan lebih banyak RAM.

Disimpan 2 byte berkat Dennis

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

Cobalah online!

glenn jackman
sumber
r 0tidak bekerja
aschepler
radalah fungsi rekursif: itu tidak dimaksudkan untuk diluncurkan dengan hanya 1 parameter. p 0perilaku tidak ditentukan dalam pertanyaan.
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 jawaban Retina saya, tetapi berfungsi n=0juga (mengembalikan daftar string kosong, berbeda dari daftar kosong untuk n>10).

Neil
sumber
0

Arang , 21 bytes

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

⊞υω

Dorong string kosong ke daftar yang telah ditentukan.

Fχ

Ulangi setiap digit.

Eυ⁺κIι

Tambahkan digit ke setiap string dalam daftar.

≔⁺υ...υ

Tambahkan hasilnya ke daftar asli.

Φυ⁼θLι

Cetak semua string dengan jumlah digit yang benar.

Neil
sumber
0

J , 32 byte

.. dengan frustrasi lebih lama dari Mathematica dan R f=:{[:(#@>"0]/.])[:<@I.@#:@i.2^] TIO

jayprich
sumber