独特的挂锁PIN列表!


16

介绍

在一次私人聊天中,我的一个朋友显然是最近偶然发现了一个安全系统,该系统的有效密码有以下两个限制:

  • 每个数字必须唯一(即“ 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
输入是非负的-如此输入零,程序应该是一个包含一个值的列表,空字符串?
aschepler

@aschepler的确,零大小写与11大小写差不多,因此我将其更改为“正整数”。
SEJPM

Answers:


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它提供了空列表,因为您不能将11个元素与10个选择组合在一起。
HyperNeutrino

哦,ØD是“ 0123456789”。谢谢。
风车饼干

6

05AB1E,5个字节

žhæsù

在线尝试!

说明

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

不知道ù是一件事。可以肯定的是我以前使用过过滤器。那是什么新东西?
魔术章鱼缸

1
@MagicOctopusUrn:很老了。在那里呆了很长时间:P
Emigna

我脑子现在看不到命令​​。我的大脑不聪明。
魔术章鱼缸

我发生了几次。在某些命令上还不止一次,这是……
Emigna

...像你这样的神级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'并进行分割:

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




3

Pyth,4个字节

.cUT

在这里尝试

说明

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



2

MATL,6个字节

4Y2wXN

在线尝试!

不为返回任何值(空数组)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个字节

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

在线尝试!

说明

当数字位数为零时,只有一种组合,即空的一种:

f 0=[[]]

当位数为nn/=0组合为数字时,从f$n-1都是从不向已包含。

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

2

盖亚 4  3个字节

₸…K

在线尝试!

自从我在盖亚(Gaia)发布答案以来已经有一段时间了!感谢Xcoder先生节省了一个字节!

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

您不需要@
Xcoder先生18年

@ Mr.Xcoder谢谢。没意识到;它似乎没有被非常清楚地记录下来。
朱塞佩

2

视网膜51 36字节

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

在线尝试!不输出任何信息n>10。说明:

.+
10*

用10 _s 替换输入。

"$+"{

重复该程序的其余n时间。

%`^.
*_$&

_根据每个数字的第一位重复该数字的前缀。

L$v`_+

匹配所有_,但还要_在匹配中包括以下所有,我们需要启用重叠匹配。

$.%`$%'

对于_找到的每个对象,在_s的左边添加数字s。

这有点棘手,所以也许实际情况会更好。假设我们已经运行了两次循环,因此已经生成了所有2位PIN,并且目前正在研究它们以创建3位PIN。我们将看看发生了什么36:第一个数字是make 3,因此三个_前缀为___36。然后,创建以下匹配项,并在此处标记为`' s:

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

$%'36在所有这三种情况下均评估为,则输入PIN码为3位数字036136并且236

如果我们接着继续创建4位PIN,036则将不带任何_s前缀,因此最终输出将完全不匹配。


问题是输入为非负数。输入零时,将输出十个下划线字符。
aschepler

@aschepler确实;我看到OP已决定排除这种情况,但如果您想知道,解决方法是先行安装^0费用为5个字节。
尼尔

1

质子,43字节

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

在线尝试!

Proton最终超越了Python:DI以为(import itertools)会返回该值,但是显然我失败了。同样,*事后导入也不起作用,因为它不在lambda中,而是顶级表达式。


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的输出不正确。输出应为包含一个元素的列表,该元素为空。
aschepler

@aschepler,您从哪里得到的?
粗野的

1

Stax,4个字节

Vd,S

在线尝试!

Vd"0123456789",将输入压入主堆栈。S获取指定大小的组合。

在tio链接中,m用于页脚中以打印每个输出。


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字节

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(无需登录,但需要+7字节才能在较低的Oracle版本上运行)上在线尝试。


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ι

用正确的数字打印所有字符串。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.