Số loại trừ tối thiểu


14

Đây được dự định là một môn đánh gôn dễ chơi, có kích thước vừa phải.

Các mex (tối thiểu số tự túc) của một bộ sưu tập hữu hạn các số là số nguyên không âm nhỏ nhất 0, 1, 2, 3, 4, ...không xuất hiện trong bộ sưu tập. Nói cách khác, đó là mức tối thiểu của phần bù. Hoạt động mex là trung tâm để phân tích các trò chơi vô tư trong lý thuyết trò chơi kết hợp .

Mục tiêu của bạn là viết một chương trình hoặc hàm được đặt tên để tính toán mex bằng cách sử dụng càng ít byte càng tốt.

Đầu vào:

Một danh sách các số nguyên không âm theo thứ tự bất kỳ. Có thể chứa lặp lại. Để cụ thể, độ dài của danh sách và phạm vi cho phép của các yếu tố sẽ nằm giữa 020bao gồm.

Định nghĩa của "danh sách" ở đây là linh hoạt. Bất kỳ cấu trúc nào đại diện cho một tập hợp các số đều ổn, miễn là nó có thứ tự cố định các phần tử và cho phép lặp lại. Nó có thể không bao gồm bất kỳ thông tin phụ trợ ngoại trừ chiều dài của nó.

Đầu vào có thể được lấy làm đối số chức năng hoặc thông qua STDIN.

Đầu ra

Số loại trừ nhỏ nhất. Đầu ra hoặc in nó.

Các trường hợp thử nghiệm

[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
Việc giới hạn các số trong một phạm vi cố định làm cho vấn đề này trở nên đơn giản hơn.
Martin Ender

@ MartinBüttner Nếu mảng chứa tất cả các số 0tới 20, sản lượng chính xác là 21. Tôi sẽ thêm một trường hợp thử nghiệm. Có, phạm vi cố định chắc chắn làm cho nó dễ dàng hơn, mặc dù người ta vẫn có thể sử dụng sys.maxinthoặc 2**64nếu tôi không chỉ định nó.
xnor

Không cần cho trường hợp thử nghiệm đó. Bạn nói, đầu vào chỉ có thể chứa 21 yếu tố.
Martin Ender

@ MartinBüttner Phải, hàng rào. Cảm ơn.
xnor

1
@KevinFegan Có, sản lượng tối đa có thể là 20. Nhận xét của tôi đã bị nhầm và tôi nghĩ MartinBüttner đã đánh máy.
xnor

Câu trả lời:


11

Bình thường , 6 byte

h-U21Q

Chạy ví dụ

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

Làm thế nào nó hoạt động

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

Khi tập hợp được chuyển đổi thành danh sách, nó luôn luôn theo thứ tự được sắp xếp?
xnor

Sự khác biệt thiết lập của Pyth duy trì thứ tự của đối số đầu tiên ( range(21)), được sắp xếp. (Điều này cũng có nghĩa là lời giải thích không hoàn toàn chính xác. Pyth và Python 3 đều khá mới đối với tôi.)
Dennis

1
Để làm rõ, -trong Pyth thực sự là một bộ lọc - nó lọc đối số đầu tiên vắng mặt khỏi đối số thứ hai, sau đó chuyển đổi nó thành dạng của đối số thứ nhất (chuỗi, danh sách hoặc bộ).
isaacg

Ngoài ra, Dennis, nó sẽ là h-U22Qnhư vậy, nó sẽ cung cấp đầu ra chính xác là 21 trên đầu vào chứa phạm vi cho phép đầy đủ.
isaacg

@isaacg: Độ dài của danh sách cũng bị giới hạn ở mức 20, vì vậy nó không thể chứa tất cả 21 số từ 0 đến 20.
Dennis

6

CJam, 11 8 byte

K),l~^1<

Làm thế nào nó hoạt động:

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"

Đầu vào mẫu:

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

Đầu ra:

10

Dùng thử trực tuyến tại đây


Làm thế nào cao số lượng nhân vật duy nhất trong CJam đi?
xnor


Một sự lựa chọn may mắn!
xnor

5

J - 13 char

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

Những hành động rất đơn giản trong J, và do đó rất khó để thực hiện nhỏ hơn.

i.@21tạo một danh sách bao gồm từ 0 đến 20. -.thực hiện thiết lập - trừ đầu vào từ danh sách này. 0{lấy phần tử đầu tiên của những gì còn lại, tức là số nhỏ nhất. f=:định nghĩa một hàm được đặt tên. Tại 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

Kể từ khi phát hành J806 vào tháng 11 năm 2017, một cú pháp mới tồn tại giúp chúng ta tiết kiệm một byte bằng cách cho phép chúng ta sử dụng i.@21cho cái cũ (i.21)trong ngữ cảnh này.


Bạn có cần f=:không
Esolanging Fruit

Kể từ tháng 11 năm 2017 i.@21-.]sẽ tiết kiệm 1 byte.
FrownyFrog

4

Golf 7

~21,^0=

Một phiên bản tiếp theo của câu trả lời của Peter Taylor. Wiki cộng đồng vì tôi không có đại diện để bình luận về bài đăng của anh ấy.

Sự khác biệt là sử dụng kích thước danh sách tối đa đã biết từ câu hỏi thay vì độ dài +1 để lưu ký tự và bỏ $ không liên quan.

Dùng thử trực tuyến


1
Dammit Golfscript để lưu 1 ký tự để không đọc đầu vào -_-
Trình tối ưu hóa

4

Burlesque - 9 byte

20rzj\\<]

Lấy đầu vào từ stdin theo định dạng {7 6 5 5 1 2 2 4 2 0}

Giải thích:

 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.

Hãy thử một số ví dụ:

{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
Điều này không cung cấp bất kỳ đầu ra nào trên đầu vào {0 1 2}, bởi vì bạn cần rznhiều hơn một số lớn nhất. Chỉ cần đi thẳng để 20rzj\\<]sửa lỗi này và tiết kiệm một char.
thuật toán

@alerskymshark Không có cách nào khác, bạn rất đúng. Đã sửa. Và cảm ơn.
AndoDaan

3

Bash + coreutils, 23 byte

seq 0 20|egrep -vwm1 $1

Điều này giả định đầu vào là một |danh sách (ống) tách biệt. Ví dụ:

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

1
Tôi không nghĩ rằng bạn cần "(...)"xung quanh $1.
Dennis

1
Tách ống là tốt, nó đáp ứng điều kiện giống như danh sách của thông số kỹ thuật.
xnor

2

Ruby, 32 byte

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

Xác định một hàm fđược gọi với một mảng.


Bất kỳ ý kiến ​​từ downvoter? Tôi đã bỏ lỡ một phần của thông số kỹ thuật?
Martin Ender

Tôi nghi ngờ điều đó. Một số câu trả lời khác (bao gồm cả của tôi) có một downvote bí ẩn.
Greg Hewgill

@ipi nhưng nó ... có cùng định dạng được đưa ra trong các ví dụ trong các bài viết thách thức, ví dụ f[[0, 1]](trong đó dấu ngoặc ngoài là cú pháp gọi và dấu ngoặc trong xác định mảng).
Martin Ender

Tại sao bạn cần f=?
Esolanging Fruit

2

GolfScript ( 10 9 byte)

~.,),^$0=

Lấy đầu vào từ stdin trong định dạng [5 4 1 5 4 8 2 1 5 4 0 7 7].

Bản demo trực tuyến


Không nên ;trước chuỗi đầu vào được tính trong chính chương trình?
Tối ưu hóa

1
@Optimizer, đó là mô phỏng đầu vào từ stdin vì trang GolfScript trực tuyến không hỗ trợ trường nhập riêng.
Peter Taylor

2

Xojo, 55 byte

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

2

Ruby, 22

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

Giải trình

  • Đầu vào được lấy làm đối số cho lambda. Hãng này hy vọng một Arraycủa Integers.
  • Đầu vào được trừ khỏi mảng [0,1,2..20] .
  • Bởi vì Array [0,1,2..20]được sắp xếp, phần tử đầu tiên phải là mex.

Thật ngọt ngào, đó là nỗ lực đầu tiên của tôi, nhưng tôi không thể phá hủy được công việc - tôi không nghĩ đến việc bao quanh nó bằng dấu ngoặc. Btw, bạn có thể sử dụng 20thay vì 21, vì đầu vào chỉ có thể chứa 20 phần tử.
Martin Ender

2

Haskell, 30

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

Điều này hoạt động cho các danh sách của tất cả các kích thước và danh sách ngoài 20. Điều này có thể được thực hiện dài 15 byte nếu Data.List được nhập:

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

2

Đề án - 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))))

Không cạnh tranh lắm. Nhưng tôi thích chương trình viết :),

Đây là mã không được mã hóa:

(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

Con trăn, 37 ký tự

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

Đánh bại tôi trong vài giây. BTW, nó range(21).
qwr

Đây dường như là giải pháp ngắn nhất. Giải pháp đệ quy f=lambda l,i=0:i in l and f(l,i+1)or idài hơn một char và giải pháp lặp i=0;l=input()\nwhile i in l:i+=1\nprint idài hơn hai ký tự (không lưu trữ đầu vào khiến nó được thực hiện nhiều lần). Không có 20ràng buộc, tôi nghĩ những cách tiếp cận này sẽ thắng thế.
xnor

Đây không phải là một chức năng ẩn danh? Nếu có thể, bạn có thể lưu 2 byte.
Mega Man

1

C # - 64 ký tự

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

Không phải lúc nào Hiếm khi là ngôn ngữ chơi golf tốt nhất, nhưng lại dễ viết và dễ hiểu :)


1

Scala, 18 byte

0 to 20 diff l min

l là một danh sách của 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 byte

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

-3 byte nhờ @LeakyNun

Giải trình:

Hỗ trợ không chỉ 0-20, mà thay vào đó là 0-2147483647 (thực sự tiết kiệm byte).

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

Mã kiểm tra:

Hãy thử nó ở đây.

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

Đầu ra:

0
1
1
2
0
0
3
4
4
10




1

TI-BASIC, 24 byte

: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

Nếu Prompt Xđược cung cấp một danh sách thay vì một số duy nhất, nó sẽ tự động tạo một danh sách có tên Xcó thể được truy cập ʟX.


20 byte sử dụng Ans:Prompt X:0:While not(prod(ʟX-Ans:Ans+1:End:Ans
JosiahRyanW

1

Stax , 6 byte

¢╔⌂♀╠▬

Chạy và gỡ lỗi nó

Giải trình

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

Thạch , 7 byte

Cách tiếp cận khác. Có thể được sử dụng trong một chuỗi với bất kỳ arity nào và không cần phân tách chuỗi hoặc bất cứ thứ gì.

‘Ṭ;0i0’

Vì câu trả lời được đảm bảo dưới 256, nên điều này cũng hoạt động:

Thạch , 5 byte

⁹ḶḟµḢ

Hãy thử trực tuyến!


1

Powershell, 28 byte

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

Kịch bản thử nghiệm:

$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"
}

Đầu ra:

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

Giải trình:

  • Tăng $itrong khi $argsmảng chứa giá trị nguyên +$i.
  • Xuất ra một giá trị số nguyên cuối cùng +$i.

1

MathGolf , 5 4 byte

Jr,╓

Hãy thử trực tuyến!

Giải pháp này được giới hạn trong phạm vi từ 0 đến 20, mặc dù điều này có thể được mở rộng dễ dàng bằng cách tăng phạm vi ban đầu.

Giải trình:

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

Ngoài ra, một giải pháp 5 byte cho tất cả các số:

Åï╧▲ï

Hãy thử trực tuyến!

Giải trình:

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

Với những thay đổi mới (hy vọng) sẽ được thêm vào TIO ngày hôm nay, có một giải pháp 4 byte cho vấn đề này. Nó bị giới hạn ở giới hạn trên được xác định trong mã, nhưng vì MathGolf có ký tự 1 byte cho 10 ^ 8, nên không đáng chú ý.
maxb

Đây là giải pháp chính xác mà tôi có (tôi đã sử dụng Zthay Jvì vì tôi lười biếng).
maxb

0

Perl - 34

Đây là một chương trình con.

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

Kiểm tra với:

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

0

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

Ung dung:

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

Sản xuất -1cho trường hợp thử nghiệm [].
OldCurmudgeon

0

Rắn hổ mang - 50

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

0

Javascript, 74

i=-1;a=prompt().split(',');while(i<21&&a.indexOf(String(++i))>=0);alert(i)

Đẹp và đơn giản! Lưu ý vòng lặp while trống.


0

JavaScript (E6) 35

Hàm đệ quy, tham số mảng trong đầu vào và trả về mex. Không giới hạn ở 20

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

Thử nghiệm trong bảng điều khiển 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)))

Đầu ra

[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 byte

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

PHP, 39 byte

<?for(;in_array($i++,$_GET););echo$i-1;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.