Benzersiz Asma Kilit PIN Listesi!


16

Giriş

Özel bir sohbette, bir arkadaşım görünüşe göre yakın zamanda geçerli pimlerinde aşağıdaki iki kısıtlamaya sahip bir güvenlik sistemine rastladı:

  • Her basamak benzersiz olmalıdır (yani "1" yalnızca bir kez görünebilir)
  • Rakamların sırası önemli değil ("1234" = "4321")

Bu asma kilit sisteminin ne kadar kötü olduğunu göstermek için, tüm geçerli PIN'leri sıralayalım!

Giriş

Girişiniz, PIN'in uzunluğunu gösteren tek bir pozitif tamsayıdan oluşacaktır.

Çıktı

Çıktınız, belirtilen uzunlukta tüm geçerli PIN'leri numaralandıran, negatif olmayan tamsayıların veya dizelerin * bir listesinden oluşur.

* Daha doğrusu, bir insanın tüm kombinasyonları denemek için kullanabileceği bir şey. Bu, bir dizi rakam kümesi ve rakam dizilerinin dizilerinin iyi olduğu anlamına gelir.

Kim kazanır?

Bu yani bayt en kısa cevap kazanır! Standart kurallar ve boşluklar geçerlidir.

Köşe Kılıfları

  • 10'dan büyük bir tamsayı girilirse, çıkış davranışı tanımsızdır.
  • Her çıkış girişi içindeki rakamların sıralaması tanımlanmamıştır, çünkü sıfır olan girişler aslında adı geçen sıfırı içerir, yani "0123" ü "123" e şeritleyemezsiniz, "1230", "1203" ve "1023" hepsi geçerlidir "0123" gibi.

Test Durumları

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
Giriş negatif değil - sıfır girişinde, program bir değer, boş dize içeren bir liste olmalıdır?
aschepler

@aschepler gerçekten, sıfır vaka yaklaşık 11 vaka kadar hassas, bu yüzden bunu "pozitif tamsayı" olarak değiştirdim.
SEJPM

Yanıtlar:


7

Jöle , 4 bayt

ØDœc

Çevrimiçi deneyin!

açıklama

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

İçin davranışı n > 10boş liste.


10'dan büyük girdilerle nasıl çalışmıyor (denedi ve bana garip geldi)?
Yel Değirmeni Çerezleri

2
@ gnu-kimse boş liste verir, çünkü 10 seçenekli 11 öğeden oluşan bir kombinasyona sahip olamazsınız.
HyperNeutrino

oh, ØD "0123456789" dur. Teşekkürler.
Yel Değirmeni Çerezleri

6

05AB1E , 5 bayt

žhæsù

Çevrimiçi deneyin!

açıklama

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

ùBir şey olduğunu bilmiyordum . Daha önce filtre kullandýđýmdan eminim. Bu ne kadar yeni?
Sihirli Ahtapot Urn

1
@MagicOctopusUrn: Oldukça yaşlı. Uzun zamandır
oradayız

Ben beynim şu anki komutu göremiyorum. Ben beyin akıllı değilim.
Sihirli Ahtapot Urn

Bana birkaç kez oldu. Devamı ... olduğu gibi bazı komutlar, bir kez daha
Emigna

... senin gibi tanrısal bir 05AB1Er (05AB1E-ite? 05AB1E-an?)
Sihirli Ahtapot Urn

6

JavaScript (ES7), 89 bayt

Rakam listelerinin listesini (karakter olarak) veya n> 10 ise boş bir liste döndürür .

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

Çevrimiçi deneyin!

Nasıl?

Öncelikle , 2 29 = 536870912 değerini hesaplayarak , eksik '4' ekleyerek ve bölerek tüm ondalık basamakların bir listesini karakterler olarak oluştururuz :

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

Daha sonra güç kümesini hesaplıyoruz:

.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

Son olarak, sonuçları uzunluklarına göre filtreliyoruz:

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




3

Pyth, 4 bayt

.cUT

Burada deneyin

açıklama

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



2

MATL , 6 bayt

4Y2wXN

Çevrimiçi deneyin!

İçin hiçbir şey (boş dizi) döndürür 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 bayt

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

Çevrimiçi deneyin!

açıklama

Basamak sayısı sıfır olduğunda yalnızca bir kombinasyon vardır, bu boş olan:

f 0=[[]]

Rakam sayısı nve kombinasyonlar, zaten içeren bir kombinasyona n/=0rakam eklenmeyecek şekilde kombinasyonlara rakam eklemenin tüm yolları olduğunda f$n-1.

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

2

Gaia ,  4  3 bayt

₸…K

Çevrimiçi deneyin!

Gaia'ya bir cevap gönderdiğimden beri bir süre geçti! Bay Xcoder'a bir bayt kaydettiği için teşekkürler!

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

İhtiyacınız yok @.
Bay Xcoder

@ Mr.Xcoder teşekkürler. Farkında değildim; çok açık bir şekilde belgelenmemiş gibi görünüyor.
Giuseppe

2

Retina , 51 36 bayt

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

Çevrimiçi deneyin! İçin hiçbir şey çıktılar n>10. Açıklama:

.+
10*

Girişi 10 _s ile değiştirin .

"$+"{

Programın geri kalan nsürelerini tekrarlayın.

%`^.
*_$&

Her rakamı _ilk basamağına göre tekrarlayın.

L$v`_+

Tüm maçları eşleştirin _, ancak _çakışan maçları etkinleştirmemiz gereken aşağıdaki maçları da ekleyin .

$.%`$%'

_Bulunan her biri için,_ için, soldaki s .

Bu biraz zor, belki de gerçek bir durum daha iyi olurdu. Döngüyü zaten iki kez çalıştırdığımızı varsayalım, böylece tüm 2 basamaklı PIN'ler üretildi ve şu anda 3 basamaklı PIN'ler oluşturmak için bunlar üzerinde çalışıyoruz. Ne olacağına bakacağız 36: İlk hane 3, yapmak için üç _s öneklidir ___36. Bu daha sonra burada `'s ile işaretlenmiş aşağıdaki eşleşmeleri oluşturur :

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

$%'için evalutes 363 haneli PIN kodlarında sonuçlanan her üç durumda da 036, 136ve236 .

4 basamaklı PIN'ler oluşturmaya devam edersek, 036herhangi bir _s öneki olmazdı ve bu nedenle son çıktıda hiç eşleşme olmazdı.


Soru, girdinin negatif olmadığını söylüyor. Sıfır girişinde, bu on alt çizgi karakteri çıkarır.
aschepler

@aschepler Gerçekten; OP'nin bu davayı hariç tutmaya karar verdiğini görüyorum, ancak merak ediyorsanız, düzeltme 5 baytlık bir maliyetle başa çıkmak ^0ve maliyette olacaktır.
Neil

1

Proton , 43 bayt

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

Çevrimiçi deneyin!

Proton sonunda Python: DI (import itertools)değerini geri vereceğini düşündü ama görünüşe göre ben başarısız oldum. *Daha sonra içe aktarma da işe yaramıyor çünkü lambdada değil, üst düzey bir ifade.


1

Japt, 5 bayt

Bir dizi basamak dizisi çıkarır. Çıkışlar tüm giriş olduğu kombinasyonlar halinde 0, giriş ise, ya da boş bir dizi <0ya da >10.

Ao àU

Dene


açıklama

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

Giriş 0 için çıkışın doğru olduğunu düşünmüyorum. Çıktı, boş bir öğe içeren bir liste olmalıdır.
aschepler

@aschepler, bunu nereden alıyorsun?
Shaggy

1

Stax , 4 bayt

Vd,S

Çevrimiçi deneyin!

Vdolduğunu "0123456789". ,girişi ana yığına iter.Sbelirtilen boyuttaki kombinasyonları alır.

Tio bağlantısında, mher çıktıyı yazdırmak için altbilgide kullanılır.


1

Standart ML , 124 122 121 bayt

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

Çevrimiçi deneyin! Örnek kullanım:!2 verim [[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))))

Bazı alternatifler:

125 123 bayt

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;

Çevrimiçi deneyin! Bağlı olan anonim bir işlevi tanımlar it.

127124 bayt

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

Çevrimiçi deneyin!



1

Oracle 18 SQL, 169 bayt

Golf dili değil ama:

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

Girdinin isütun içeren bir tabloda olması bekleniyor a:

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

Çevrimiçi olarak Oracle Live SQL'de deneyin (ücretsiz bir oturum açma gereklidir, ardından çözümü bir çalışma sayfasına kopyalayıp yapıştırın) veya SQLFiddle (giriş yok, ancak alt Oracle sürümü üzerinde çalışmak için +7 bayt gerektirir).


1

CJam , 13 11 bayt

{Ae!f<:$_|}

Çevrimiçi deneyin!

Öbek alanı tükendiği için teknik olarak tio.run'da çalışmaz. Bununla birlikte, 9 basamaklı tuş takımları için düzgün çalışır ve daha fazla RAM ile iyi çalışmalıdır.

Dennis sayesinde 2 bayt tasarruf edildi



0

JavaScript (Firefox 30-57), 67 bayt

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

Retina yanıtımın bağlantı n=0noktası , ancak çok işe yarıyor (boş bir dizenin listesini boş bir listeden farklı olarak döndürmek için n>10).


0

Odun kömürü , 21 bayt

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

Çevrimiçi deneyin!Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

⊞υω

Boş dizeyi önceden tanımlanmış listeye itin.

Fχ

Her basamak üzerinde döngü yapın.

Eυ⁺κIι

Rakamı listedeki her dizeye ekleyin.

≔⁺υ...υ

Sonucu orijinal listeye ekleyin.

Φυ⁼θLι

Tüm dizeleri doğru sayıda basamakla yazdırın.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.