최소 제외 번호


14

이것은 쉬운 바이트 크기의 코드 골프입니다.

MEX 번호 한정된 컬렉션 (최소 수는 제외) 최소 음이 아닌 정수이다 0, 1, 2, 3, 4, ...않는 하지 컬렉션에 나타난다. 즉, 보완의 최소값입니다. mex 작업은 조합 게임 이론 에서 공정한 게임 분석의 핵심 입니다.

당신의 목표는 가능한 적은 바이트를 사용하여 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

배열이 모든 숫자가 포함 된 경우 @ MartinBüttner 0에를 20올바른 출력 21. 테스트 케이스를 추가 할 것입니다. 예, 고정 범위는 확실히 사용하기가 쉽지만 확실하게 사용할 수 sys.maxint있거나 2**64지정하지 않은 경우 에는 훨씬 쉽습니다 .
xnor

해당 테스트 사례가 필요하지 않습니다. 입력에는 21 개의 요소 만 포함될 수 있습니다.
Martin Ender

@ MartinBüttner 맞습니다. 감사.
xnor

1
@KevinFegan 예, 가능한 최대 출력은 20입니다. 내 의견이 잘못되어 MartinBüttner가 잘못 입력 한 것 같습니다.
xnor

답변:


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

Pyth의 집합 차이는 순서가 지정된 첫 번째 인수 ( range(21)) 의 순서를 유지합니다 . (이것은 또한 설명이 완전히 정확하지 않다는 것을 의미합니다. Pyth와 Python 3은 나에게 아주 새로운 것입니다.)
Dennis

1
명확히하기 위해 -Pyth에서는 실제로 필터입니다. 두 번째 인수가없는 첫 번째 인수를 필터링 한 다음 첫 번째 인수 형식 (문자열, 목록 또는 집합)으로 변환합니다.
isaacg

또한 Dennis h-U22Q는 전체 허용 범위를 포함하는 입력에서 21의 정확한 출력을 제공 해야합니다 .
isaacg

@isaacg : 목록의 길이도 20으로 제한되므로 0에서 20까지의 21 개 숫자를 모두 포함 할 수 없습니다.
Dennis

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


운이 좋은 선택!
xnor

5

J-13 자

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

J에서는 매우 간단한 동작이므로 작게 만들기가 매우 어렵습니다.

i.@210에서 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)에 사용할 수 있도록하여 1 바이트를 절약 할 수 있습니다 .


당신은 필요 f=:합니까?
Esolanging 과일 0

2017 년 11 월부터 i.@21-.]1 바이트를 절약 할 수 있습니다.
FrownyFrog

4

골프 스크립트 7

~21,^0=

피터 테일러의 대답의 골퍼 버전. 그의 게시물에 대해 언급 할 담당자가 없기 때문에 커뮤니티 위키.

차이점은 길이 +1 대신 질문에서 알려진 최대 목록 크기를 사용하여 문자를 저장하고 관련이없는 $를 삭제하는 것입니다.

온라인으로 사용해보십시오


1
입력을 읽지 않도록 1 문자를 저장하기위한 Golfscript Dammit -_-
Optimizer

4

해 학적 인 -9 바이트

20rzj\\<]

stdin에서 {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.

몇 가지 예를 시도하십시오.

{10 6 6 3 11 15 1 9 2 3 5 5 3 34 6 8 1 18} 20rzj \\ <]

{5 45 5 8 8 15 7 7} 20rzj \\ <]


1
가장 큰 숫자보다 두 개 이상이 {0 1 2}필요하기 때문에 input에 출력을 제공하지 못합니다 rz. 바로 가기 만하면 문제가 20rzj\\<]해결되고 문자가 저장됩니다.
algorithmshark

@algorithmshark 주위에 방법이 없습니다, 당신은 매우 맞습니다. 결정된. 그리고 고마워
AndoDaan

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.
Dennis

1
파이프 분리는 양호하며 사양의 목록과 같은 조건을 충족합니다.
xnor

2

루비, 32 바이트

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

f배열과 함께 호출 할 함수 를 정의합니다 .


downvoter의 의견이 있습니까? 사양의 일부를 놓쳤습니까?
Martin Ender

나는 그것을 의심한다. 몇 가지 다른 답변 (내 포함)은 미스터리 공감대를 얻었습니다.
Greg Hewgill

@ipi 그러나 그것은 ... 도전 게시물의 예에서 주어진 것과 정확히 같은 형식으로 f[[0, 1]]( 예 : 외부 괄호는 호출 구문이고 내부 괄호는 배열을 정의합니다).
Martin Ender

왜 필요한 f=가요?
Esolanging 과일

2

GolfScript ( 10 9 바이트)

~.,),^$0=

stdin 형식으로 입력을받습니다 [5 4 1 5 4 8 2 1 5 4 0 7 7].

온라인 데모


;입력 문자열을 프로그램 자체에서 계산 해서는 안 됩니까?
Optimizer

1
@Optimizer, 온라인 GolfScript 사이트가 별도의 입력 필드를 지원하지 않기 때문에 stdin의 입력을 시뮬레이션합니다.
피터 테일러

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

설명

  • 입력은 람다에 대한 인수로 간주됩니다. 그것은 기대 ArrayInteger들.
  • 배열에서 입력을 뺍니다 [0,1,2..20].
  • Array [0,1,2..20]가 정렬 되었으므로 첫 번째 요소는 mex 여야합니다.

Sweet, 그게 첫 시도 였지만 파괴 작업을 수행 할 수 없었습니다. 대괄호로 둘러 쌀 생각은 없었습니다. Btw 에는 입력에 20 개의 요소 만 포함될 수 있으므로 20대신 대신 사용할 수 있습니다 21.
Martin Ender

2

하스켈, 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))))

경쟁이 심하지 않습니다. 그러나 나는 쓰기 체계를 좋아한다 :),

ungolfed 코드는 다음과 같습니다.

(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

파이썬, 37 자

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

몇 초만 날 이겼어 BTW range(21)입니다.
qwr

이것이 가장 짧은 해결책 인 것 같습니다. 재귀 솔루션 f=lambda l,i=0:i in l and f(l,i+1)or i은 1 문자 더 길고 반복 솔루션 i=0;l=input()\nwhile i in l:i+=1\nprint i은 2 문자 더 길다 (입력을 저장하지 않으면 반복적으로 가져옵니다). 20한계가 없다면 이러한 접근 방식이 우선 할 것입니다.
xnor

이것이 익명의 기능 일 수 없습니까? 가능하면 2 바이트를 절약 할 수 있습니다.
Mega Man

1

C #-64 자

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

항상 최고의 골프 ​​언어는 아니지만 작성하고 이해하기 쉽습니다. :)


1

스칼라, 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

자바 7, 69 66 바이트

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

@LeakyNun 덕분에 -3 바이트

설명:

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

파워 쉘, 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

MathGolf , 5 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에는 10 ^ 8의 1 바이트 리터럴이 있으므로 눈에 띄지 않아야합니다.
maxb

이것이 내가 가진 정확한 해결책 이었습니다 (게으 르기 때문에 Z대신 사용 했습니다 J).
maxb

0

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

0

코브라-50

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

0

자바 스크립트, 74

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

좋고 간단합니다! 비어있는 while 루프에 유의하십시오.


0

자바 스크립트 (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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.