最小排除人数


14

这旨在成为一个简单的,可识别大小的代码高尔夫球。

所述MEX数字的有限集合(不包括最小数目)是最小的非负整数0, 1, 2, 3, 4, ...,它出现藏。换句话说,这是补码的最小值。混合运算对于组合博弈论公正博弈的分析至关重要。

您的目标是编写一个程序命名函数以使用尽可能少的字节来计算mex。

输入:

任意顺序的非负整数列表。可能包含重复。为了具体起见,列表的长度和元素的允许范围将介于两者之间020包括两者之间)。

这里“列表”的定义是灵活的。代表数字集合的任何结构都可以,只要它具有固定的元素顺序并允许重复即可。除其长度外,它可能不包含任何辅助信息。

输入可以作为函数参数或通过STDIN进行。

输出量

最小排除数。输出或打印。

测试用例

[1]
0
[0]
1
[2, 0]
1
[3, 1, 0, 1, 3, 3]
2
[]
0
[1, 2, 3]
0
[5, 4, 1, 5, 4, 8, 2, 1, 5, 4, 0, 7, 7]
3
[3, 2, 1, 0]
4
[0, 0, 1, 1, 2, 2, 3]
4
[1, 0, 7, 6, 3, 11, 15, 1, 9, 2, 3, 1, 5, 2, 3, 4, 6, 8, 1, 18]
10

2
将数字限制在固定范围内会使此问题更加简单。
Martin Ender 2014年

@MartinBüttner如果数组包含0to的所有数字20,则正确的输出为21。我将添加一个测试用例。是的,虽然可以说还是可以使用sys.maxint或者2**64如果我没有指定它,那么固定范围肯定会更容易。
xnor 2014年

无需该测试用例。您说过,输入只能包含21个元素。
Martin Ender 2014年

@MartinBüttner对,栅栏柱。谢谢。
xnor 2014年

1
@KevinFegan是的,最大可能的输出是20。
xnor 2014年

Answers:


11

Pyth,6个字节

h-U21Q

运行示例

$ pyth -c h-U21Q <<< '[5, 4, 1, 5, 4, 8, 2, 1, 5, 4, 0, 7, 7]'
3

怎么运行的

  U21   range(21)
     Q  eval(input())
 -U21Q  setwisedifference(range(21), eval(input))          # Pyth function. Preserves order.
h-U21Q  setwisedifference(range(21), eval(input))[0]

将集合转换为列表时,是否始终按排序顺序?
xnor 2014年

Pyth的集合差保留第一个参数(range(21))的顺序,该顺序是有序的。(这也意味着解释并不完全正确。Pyth和Python 3对我来说都是相当新的东西。)
Dennis,

1
要澄清的是,-在Pyth中实际上是一个过滤器-它过滤掉第一个参数中第二个参数中是否缺少第一个参数,然后将其转换为第一个参数的形式(字符串,列表或集合)。
isaacg 2014年

同样,丹尼斯,应该这样,h-U22Q以便在包含整个允许范围的输入上给出正确的输出21。
isaacg

@isaacg:该列表的长度也被限制为20,所以它可以不包含所有21号从0至20
丹尼斯

6

CJam,11个 8字节

K),l~^1<

怎么运行的:

K),         "Create an array with numbers 0 through 20"
   l~       "Read the input and eval it, resulting to an array"
     ^      "XOR the elements of two arrays, resulting in a complement array"
      1<    "Take the first element of the resultant array"

输入样例:

[1 0 7 6 3 11 15 1 9 2 3 1 5 2 3 4 6 8 1 18]

输出:

10

在这里在线尝试


CJam中的单字符数字有多高?
xnor 2014年

@xnor可悲的是,20 - sourceforge.net/p/cjam/wiki/Variables
优化

幸运的选择!
xnor 2014年

5

J-13个字符

f=:0{i.@21&-.

J中非常简单的动作,因此很难使其更小。

i.@21创建一个从0到20(含)的列表。-.执行从该列表中减去输入的设置。0{取剩下的第一个元素,即最小的数字。f=:定义一个命名函数。在REPL:

   f=:0{(i.21)&-.
   f 1
0
   f 0
1
   f 2 0
1
   f 3 1 0 1 3 3
2
   f ''    NB. empty list
0
   f 1 2 3
0
   f 5 4 1 5 4 8 2 1 5 4 0 7 7
3
   f 3 2 1 0
4
   f 0 0 1 1 2 2 3
4
   f 1 0 7 6 3 11 15 1 9 2 3 1 5 2 3 4 6 8 1 18
10

自2017年11月发布J806以来,存在一种新语法,该语法可以让我们在这种情况下使用i.@21旧语法,从而节省了一个字节(i.21)


需要f=:
硕果累累

自2017年11月以来i.@21-.]将节省1个字节。
FrownyFrog

4

高尔夫脚本7

~21,^0=

彼得·泰勒(Peter Taylor)的答案的另一版本。社区Wiki,因为我没有代表对他的帖子发表评论。

区别在于使用问题的已知最大列表大小而不是长度+1来保存字符并删除无关的$。

在线尝试


1
该死的Golfscript用于保存1个字符,以便不读取输入-_-
优化器

4

滑稽 -9字节

20rzj\\<]

从标准输入中以{7 6 5 5 1 2 2 4 2 0}格式输入

解释:

 20 rz   map a range from 0 to 20. (thanks to algorithmshark for the cocde fix)
  j \\    swaps the two arrays, and collects the difference between the two into a new array
  <]      gets the smallest element of the resulting array.

尝试一些示例:

{1 0 7 6 3 11 15 1 9 2 3 1 5 2 3 4 6 8 1 18} 20rzj \\ <]

{5 4 1 5 4 8 2 1 5 4 0 7 7} 20rzj \\ <]


1
这无法在输入上提供任何输出{0 1 2},因为您需要rz的数量比最大数量多一。直接20rzj\\<]解决这个问题并节省字符。
algorithmhark

@algorithmshark没办法,您说得很对。固定。谢谢你
AndoDaan 2014年

3

Bash + coreutils,23个字节

seq 0 20|egrep -vwm1 $1

这假定输入是一个|(管道)分隔的列表。例如:

$ ./mex.sh "5|4|1|5|4|8|2|1|5|4|0|7|7"
3
$

1
我不认为你需要"(...)"周围$1
丹尼斯

1
管道分隔符很好,它满足规范的列表式条件。
xnor 2014年

2

Ruby,32个字节

f=->n{(0..20).find{|i|n-[i]==n}}

定义f要用数组调用的函数。


下票者有何评论?我是否错过了部分规格?
Martin Ender 2014年

我对此表示怀疑。其他几个答案(包括我的答案)遭到了神秘的质疑。
Greg Hewgill 2014年

@ipi,但确实...以与挑战文章中示例中给出的格式完全相同的格式f[[0, 1]](例如,其中的方括号是调用语法,而内部的括号定义了数组)。
Martin Ender 2014年

为什么需要f=
硕果累累

2

GolfScript(10 9个字节)

~.,),^$0=

从标准输入中以格式输入[5 4 1 5 4 8 2 1 5 4 0 7 7]

在线演示


;输入的字符串之前的数字不应该在程序本身中计数吗?
Optimizer

1
@Optimizer,它模拟了stdin的输入,因为在线GolfScript网站不支持单独的输入字段。
彼得·泰勒

2

Xojo,55个字节

dim x as int8
while a.indexOf(x)>-1
x=x+1
wend
return x

2

红宝石,22岁

x=->n{([*0..20]-n)[0]}

说明

  • 输入被作为lambda的参数。预期的Array值为Integer
  • 从数组中减去输入[0,1,2..20]
  • 由于Array [0,1,2..20]排序,因此第一个元素必须是mex。

亲爱的,那是我的第一次尝试,但是我无法进行解构工作-我没想到要用括号将其包围。顺便说一句,您可以使用20代替21,因为输入只能包含20个元素。
Martin Ender 2014年

2

Haskell,30岁

f s=filter(`notElem`s)[0..]!!0

这适用于所有大小的列表和超过20的列表。如果导入了Data.List,则可以将其设置为15个字节长:

f s=[0..]\\s!!0

2

设计方案-219

(define (A X) (define (B X) (if (equal? (length X) 1) (+ (car X) 1) (if (< (- (cadr X) (car X)) 2) (B (cdr X)) (+ (car X) 1)))) (if (empty? X) `() (if (equal? (car (sort X <)) 0) (B (sort X <)) (- (car (sort X <)) 1))))

不太有竞争力。但是我喜欢写方案:),

这是未完成的代码:

(define (minExclude X)
  (define (firstNonOneDifference X)
     (if (equal? (length X) 1)
         (+ (car X) 1)
     (if (< (- (cadr X) (car X)) 2) 
         (firstNonOneDifference (cdr X))
         (+ (car X) 1)
     ))
  )
  (let ([s (sort X <)])
     (if (empty? X)
         `()
     (if (equal? (car s) 0)
        (firstNonOneDifference s)
        (- (car s) 1)
     ))
  )
)

1

Python,37个字符

f=lambda a:min(set(range(21))-set(a))

击败我几秒钟。顺便说一句,是range(21)
qwr 2014年

这似乎是最短的解决方案。递归解决方案f=lambda l,i=0:i in l and f(l,i+1)or i要长一个字符,而迭代解决方案i=0;l=input()\nwhile i in l:i+=1\nprint i要长两个字符(不存储输入将导致它被重复使用)。不受限制20,我认为这些方法将占上风。
xnor 2014年

这不是匿名函数吗?如果可以,则可以节省2个字节。
洛克人

1

C#-64个字符

int f(int[] a){return Enumerable.Range(0,20).Except(a).First();}

并非总是最好的高尔夫语言,但是很容易编写和理解:)


1

Scala,18个字节

0 to 20 diff l min

l 是Int的列表。

scala> val l = List(0,1,5)
l: List[Int] = List(0, 1, 5)

scala> 0 to 20 diff l min
res0: Int = 2


1

Java 7,69 66字节

int c(java.util.List a){int r=0;for(;a.contains(r);r++);return r;}

-3个字节,感谢@LeakyNun

说明:

不仅支持0-20,而且支持0-2147483647(实际上节省了字节)。

int c(java.util.List a){    // Method with List parameter and integer return-type
  int r=0;                  //  Return integer
  for(;a.contains(r);r++);  //  Continue raising `r` as long as the list contains the current `r`
  return r;                 //  Return result-integer
}                           // End of method

测试代码:

在这里尝试。

import java.util.ArrayList;
import java.util.Arrays;
class M{
  static int c(java.util.List a){int r=0;for(;a.contains(r);r++);return r;}

  public static void main(String[] a){
    System.out.println(c(Arrays.asList(1)));
    System.out.println(c(Arrays.asList(0)));
    System.out.println(c(Arrays.asList(2, 0)));
    System.out.println(c(Arrays.asList(3, 1, 0, 1, 3, 3)));
    System.out.println(c(new ArrayList()));
    System.out.println(c(Arrays.asList(1, 2, 3)));
    System.out.println(c(Arrays.asList(5, 4, 1, 5, 4, 8, 2, 1, 5, 4, 0, 7, 7)));
    System.out.println(c(Arrays.asList(3, 2, 1, 0)));
    System.out.println(c(Arrays.asList(0, 0, 1, 1, 2, 2, 3)));
    System.out.println(c(Arrays.asList(1, 0, 7, 6, 3, 11, 15, 1, 9, 2, 3, 1, 5, 2, 3, 4, 6, 8, 1, 18)));
  }
}

输出:

0
1
1
2
0
0
3
4
4
10




1

TI-BASIC,24字节

:0→A                 //Store 0 to A
:Prompt X            //Prompt list X
:While not(prod(ʟX-A //While A is not missing from list X
:A+1→A               //Increment A
:End                 //End While loop
:A                   //Print A

如果Prompt X给定一个列表而不是一个数字,它将自动创建一个名为的列表X,可以使用访问该列表ʟX


使用Ans的20个字节:Prompt X:0:While not(prod(ʟX-Ans:Ans+1:End:Ans
JosiahRyanW

1

Stax,6 个字节

¢╔⌂♀╠▬

运行并调试

说明

21r:IUI             # Full program, unpacked
21                  # Push 21
  r                 # Range from 0...20
   :I               # Find all elements in input that exist in range
    U               # push -1
     I              # Get index of first occurrence of


1

果冻,7个字节

另一种方法。可以与任何Arity一起用于链中,并且不需要链分隔符或其他任何东西。

‘Ṭ;0i0’

因为保证答案小于256,所以它也可以工作:

果冻,5个字节

⁹ḶḟµḢ

在线尝试!


1

Powershell,28个字节

for(;+$i-in$args){$i++}+$i

测试脚本:

$f = {
 for(;+$i-in$args){$i++}+$i
#for(;$i++-in$args){}(--$i)   # alternative version
}

@(
    ,(0 , 1)
    ,(1 , 0)
    ,(2 , 3, 1, 0, 1, 3, 3)
    ,(0 )
    ,(0 , 1, 2, 3)
    ,(3 , 5, 4, 1, 5, 4, 8, 2, 1, 5, 4, 0, 7, 7)
    ,(4 , 3, 2, 1, 0)
    ,(4 , 0, 0, 1, 1, 2, 2, 3)
    ,(10, 1, 0, 7, 6, 3, 11, 15, 1, 9, 2, 3, 1, 5, 2, 3, 4, 6, 8, 1, 18)
) | % {
    $e, $a = $_
    $r = &$f @a
    "$($r-eq$e): $r"
}

输出:

True: 0
True: 1
True: 2
True: 0
True: 0
True: 3
True: 4
True: 4
True: 10

说明:

  • 增量$i$args数组包含整数值+$i
  • 输出最后一个整数值+$i

1

MathGolf5 4字节

Jr,╓

在线尝试!

该解决方案仅限于0到20的范围,尽管可以通过增加初始范围来轻松扩展。

说明:

Jr     Range from 0 to 20
  ,    Remove elements from the input list from this range
   ╓   Return the minimum element

或者,为所有数字提供5字节的解决方案:

Åï╧▲ï

在线尝试!

说明:

Å  ▲   Do while true
  ╧    Does the input contain
 ï     The index of the loop?
    ï  Push the number of iterations of the last loop

随着(希望)今天已添加到TIO的新更改,此问题有4字节的解决方案。它被限制为代码中定义的上限,但是由于MathGolf具有1字节的10 ^ 8字面量,因此应该不会引起注意。
maxb

这是我的确切解决方案(我之所以使用Z而不是J因为我很懒)。
maxb

0

Perl-34

这是一个子例程。

sub f{$_~~@_?1:return$_ for0..20}

测试:

perl -e'print f(0,1,3,4,5,6,7); sub f{$_~~@_?1:return$_ for 0..20}'

0

爪哇,93

int f(int[]a){int i=0,j=0,k=a.length;for(;i++<20&j<k;){for(j=0;j<k&&a[j++]!=i;);}return i-1;}

取消高尔夫:

int f(int[] a) {
    int i = 0, j = 0, length = a.length;
    for (; i < 20 & j < length; i++) {
        for (j = 0; j < length && a[j] != i; j++) { }
    }
    return i - 1;
}

-1为测试用例生成[]
OldCurmudgeon 2014年

0

眼镜蛇-50

def f(l)
    for n in 22,if n not in l,break
    print n


0

JavaScript(E6)35

递归函数,输入中的数组参数并返回mex。不限于20

F=(l,i=0)=>~l.indexOf(i)?F(l,++i):i

在FireFox / FireBug控制台中测试

;[[1],[0],[2, 0],[3, 1, 0, 1, 3, 3],[],[1, 2, 3],
[5, 4, 1, 5, 4, 8, 2, 1, 5, 4, 0, 7, 7],[3, 2, 1, 0],[0, 0, 1, 1, 2, 2, 3],
[1, 0, 7, 6, 3, 11, 15, 1, 9, 2, 3, 1, 5, 2, 3, 4, 6, 8, 1, 18]]
.forEach(list => console.log(list, F(list)))

输出量

[1] 0
[0] 1
[2, 0] 1
[3, 1, 0, 1, 3, 3] 2
[] 0
[1, 2, 3] 0
[5, 4, 1, 5, 4, 8, 2, 1, 5, 4, 0, 7, 7] 3
[3, 2, 1, 0] 4
[0, 0, 1, 1, 2, 2, 3] 4
[1, 0, 7, 6, 3, 11, 15, 1, 9, 2, 3, 1, 5, 2, 3, 4, 6, 8, 1, 18] 10

0

PHP,38字节

<?=min(array_diff(range(0,20),$_GET));

PHP,39字节

<?for(;in_array($i++,$_GET););echo$i-1;
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.