ユニークな南京錠PINリスト!


16

前書き

プライベートチャットで、私の友人が最近有効なピンに次の2つの制限があるセキュリティシステムを偶然見つけました。

  • 各数字は一意である必要があります(つまり、「1」は一度しか表示されません)
  • 数字の順序は関係ありません( "1234" = "4321")

この南京錠システムがどれほど悪いかを示すために、実際にすべての有効なPINを列挙しましょう!

入力

入力は、PINの長さを示す単一の正の整数で構成されます。

出力

出力は、指定された長さのすべての有効なPINを列挙する非負の整数または文字列*のリストで構成されます。

*より正確には、すべての組み合わせを印刷する場合に、人間がすべての組み合わせを試すために使用できるもの。これは、数字のセットのセットと数字のアレイの配列が適切であることを意味します。

誰が勝ちますか?

これはので、バイト単位の最短回答が勝ちです!標準ルールと抜け穴が適用されます。

コーナーケース

  • 10より大きい整数が入力された場合の出力動作は未定義です。
  • ゼロのエントリには実際にゼロが含まれるため、各出力エントリ内の数字の順序は未定義です。つまり、「0123」から「123」を除去することはできませんが、「1230」、「1203」、「1023」はすべて有効です「0123」と同様です。

テストケース

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
入力は負ではありません-したがって、入力ゼロでは、プログラムは1つの値、空の文字列を含むリストである必要がありますか?
アシェプラー

実際、@ ascheplerでは、ゼロのケースは11のケースとほぼ同じ意味を持つため、これを「正の整数」に変更しました。
SEJPM

回答:


7

ゼリー、4バイト

ØDœc

オンラインでお試しください!

説明

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

の動作n > 10は空のリストです。


10を超える入力ではどのように機能しないのですか(試してみて、私には奇妙に思えました)?
風車クッキー

2
@ gnu-nobodyは、10個の選択肢を持つ11個の要素の組み合わせを持つことができないため、空のリストを提供します。
ハイパーニュートリノ

ああ、ØDは「0123456789」です。ありがとう。
風車クッキー

6

05AB1E、5バイト

žhæsù

オンラインでお試しください!

説明

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

知らなかったことùは事でした。以前にフィルターを使用したことがあることを確認してください。それはどれくらい新しいですか?
魔法のタコ

1
@MagicOctopusUrn:かなり古い。長い間そこにいた:P
エミグナ

私の脳は今の前にコマンドを参照しないでください。私の脳は賢くありません。
魔法のタコ

何回か私に起こった。一部のコマンドでも複数回、つまり...
エミグナ

...自分のようなゴッドティア05AB1Er(05AB1E-ite?05AB1E-an?)を受け入れます。
魔法のタコ

6

JavaScript(ES7)、89バイト

数字のリストのリスト(文字として)を返します。n> 10の場合は空のリストを返します。

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

オンラインでお試しください!

どうやって?

最初に、2 29 = 536870912を計算し、欠落している「4」を追加して分割することにより、すべての10進数字のリストを文字として生成します。

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

次に、パワーセットを計算します。

.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

最後に、結果を長さでフィルタリングします。

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










2

Haskell、47バイト

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

オンラインでお試しください!

説明

桁数がゼロの場合、空の組み合わせが1つだけあります。

f 0=[[]]

桁数がnありn/=0、組み合わせがすべての組み合わせに数字を追加する方法でありf$n-1、既にそれを含む組み合わせに数字が追加されない場合。

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

2

ガイア 4  3バイト

₸…K

オンラインでお試しください!

ガイアに回答を投稿してからしばらく経ちました!バイトを保存してくれたXcoder氏に感謝します!

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

必要ありません@
ミスターXcoder

@ Mr.Xcoderありがとう。気づかなかった。あまり明確に文書化されていないようです。
ジュゼッペ

2

網膜51 36バイト

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

オンラインでお試しください!については何も出力しませんn>10。説明:

.+
10*

入力を10 _秒に置き換えます。

"$+"{

残りのプログラムをn繰り返します。

%`^.
*_$&

各数字の_先頭に、最初の数字に従って繰り返されます。

L$v`_+

すべて_のsに一致しますが、次_のsのすべても一致に含めるため、重複する一致を有効にする必要があります。

$.%`$%'

_見つかったそれぞれについて、番号の_左にs の数をプレフィックスします。

これは少し難しいので、おそらく実際のケースの方が良いでしょう。すでにループを2回実行したため、すべての2桁のPINが生成され、現在、3桁のPINの作成に取り組んでいるとします。何が起こるかを見てみましょう36:最初の数字は3ですので_、を作るために3つの接頭辞が付けられます___36。これにより、次の一致が作成され、ここに`'sのマークが付けられます。

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

$%'evalutes 363桁のPINをもたらす、3つ全ての場合において036136そして236

私たちは4桁のピンを作成するために行くために次いであれば、036任意の持っていない_のは、接頭辞ので、最終的な出力にまったく一致してしまいます。


質問は、入力が負でないことを示しています。入力ゼロでは、10個の下線文字が出力されます。
アシェプラー

@aschepler Indeed; 私は、OPはそのケースを除外することを決定しました見ていますが、迷っている場合には、修正は付加するだろう^0し、5バイトのコストで。
ニール


1

Japt、5バイト

数字配列の配列を出力します。出力全ての組み合わせの入力がある場合に0入力された場合、空の配列または<0または>10

Ao àU

それを試してみてください


説明

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

入力0の出力が正しいとは思わない。出力は、空の要素を1つ含むリストでなければなりません。
アシェプラー

@aschepler、どこからそれを入手していますか?
シャギー


1

標準ML124の 122 121バイト

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

オンラインでお試しください!使用例:!2yields [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...]

ゴルフをしていない:

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

いくつかの選択肢:

125 123バイト

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;

オンラインでお試しください!にバインドされている匿名関数を定義しitます。

127 124バイト

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

オンラインでお試しください!



1

Oracle 18 SQL、169バイト

ゴルフ言語ではありませんが:

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

入力iが列のあるテーブルにあると予想されましたa

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

Oracle Live SQL(無料ログインが必要な場合はソリューションをワークシートにコピーして貼り付けます)またはSQLFiddle(ログインなしですが、下位のOracleバージョンで作業するには+7バイトが必要です)でオンラインでお試しください。


1

CJam13 11バイト

{Ae!f<:$_|}

オンラインでお試しください!

技術的には、ヒープスペースがなくなるため、tio.runでは実行されません。ただし、最大9桁のキーパッドで適切に動作し、RAMを増やしても正常に動作するはずです。

デニスのおかげで2バイト節約



0

JavaScript(Firefox 30-57)、67バイト

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

私のRetina回答のポートですが、それでも動作しn=0ます(空の文字列のリストを返しn>10ます。空のリストとは異なります)。


0

、21バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

⊞υω

空の文字列を事前定義されたリストにプッシュします。

Fχ

各桁をループします。

Eυ⁺κIι

リスト内のすべての文字列に数字を追加します。

≔⁺υ...υ

結果を元のリストに追加します。

Φυ⁼θLι

すべての文字列を正しい桁数で印刷します。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.