最小除外数


14

これは、簡単な一口サイズのコードゴルフになることを目的としています。

数値の有限コレクションのメックス(最小の除外数)は、コレクションに現れない最小の非負整数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
数値を固定範囲に制限すると、この問題はさらに簡単になります。
マーティンエンダー14

@MartinBüttner配列にすべての数値0が含まれる場合、20正しい出力は21です。テストケースを追加します。1はまだ間違いなく使用することができてもはい、固定範囲は間違いなく、それが容易になりますsys.maxint2**64、私はそれを指定しなかった場合。
XNOR

そのテストケースは不要です。あなたは、入力には21個の要素しか含めることができないと言いました。
マーティンエンダー14

@MartinBüttner右、フェンスポスト。ありがとう。
xnor 14

1
@KevinFeganはい、可能な最大出力は20です。私のコメントが間違っていたため、MartinBüttnerがタイプミスしたと思います。
xnor 14年

回答:


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 14

Pythのセットの差range(21)は、順序付けられた最初の引数()の順序を保持します。(これは、説明が完全に正確ではないことも意味します。PythとPython 3はどちらも私にとってかなり新しいものです。)
デニス14

1
明確にするために-、Pythの実際のフィルターは、最初の引数をフィルター処理し、2番目の引数がないことを確認してから、最初の引数の形式(文字列、リスト、またはセット)に変換します。
isaacg 14年

また、デニス、h-U22Q完全な許容範囲を含む入力で21の正しい出力が得られるようにする必要があります。
isaacg 14年

@isaacg:それは0から20までのすべての21個の数字を含めることはできませんので、リストの長さも、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の1文字の数字はどれくらいの大きさになりますか?
XNOR


幸運な選択!
xnor 14

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古いものを使用できるようにして1バイトを節約する新しい構文が存在し(i.21)ます。


必要f=:ですか?
エソランジングフルーツ

2017年11月以降i.@21-.]は1バイト節約されます。
FrownyFrog

4

Golfscript 7

~21,^0=

ピーター・テイラーの答えのさらにゴルフバージョン。彼の投稿にコメントする担当者がいないので、コミュニティwiki。

違いは、文字を保存して無関係な$を削除するために、長さ+1の代わりに質問から既知の最大リストサイズを使用することです。

オンラインで試す


1
入力を読み取らないように1文字を保存するためのDammit Golfscript -_-
オプティマイザー14

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
最大数よりも1つ多い{0 1 2}必要があるため、これはinput に出力を提供できませんrz。ただのための直進20rzj\\<]修正このチャーが保存されます。
algorithmshark 14

@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
デニス14

1
パイプ区切りは問題ありません。仕様のリストのような条件を満たします。
XNOR

2

ルビー、32バイト

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

f配列で呼び出される関数を定義します。


投票者からのコメントはありますか?仕様の一部を見逃しましたか?
マーティンエンダー14

疑わしい。他にもいくつかの答え(私のものを含む)に謎の投票が行われました。
グレッグヒューギル14

@ipiしかし、それは...チャレンジポストの例で与えられたものとまったく同じ形式で、例えばf[[0, 1]](外側の括弧は呼び出し構文であり、内側の括弧は配列を定義します)。
マーティンエンダー14

なぜあなたは必要f=ですか?
エソランジングフルーツ

2

GolfScript(10 9バイト)

~.,),^$0=

形式で標準入力から入力を取得します[5 4 1 5 4 8 2 1 5 4 0 7 7]

オンラインデモ


;入力文字列の前がプログラム自体でカウントされるべきではありませんか?
オプティマイザー14

1
@Optimizer、これは、オンラインGolfScriptサイトが個別の入力フィールドをサポートしていないため、stdinからの入力をシミュレートしています。
ピーターテイラー14


2

ルビー、22

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

説明

  • 入力は、ラムダへの引数として取得されます。それは期待しArrayInteger秒。
  • 入力は配列から減算され[0,1,2..20]ます。
  • Array [0,1,2..20]はソートされるため、最初の要素はmexでなければなりません。

甘い、それが私の最初の試みでしたが、破壊を機能させることができませんでした-ブラケットで囲むことを考えていませんでした。ところで、入力には20個の要素しか含めることができないため、20代わりにを使用できます21
マーティンエンダー14

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

それほど競争的ではありません。しかし、私はスキームを書くことが好きです:)、

以下に、コード化されていないコードを示します。

(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 14

これが最短の解決策のようです。再帰的な解決策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 14

これは無名関数ではないでしょうか?可能であれば、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;}

@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

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には10 ^ 8の1バイトリテラルがあるため、目立たないはずです。
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

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

ゴルフをしていない:

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

Javascript、74

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

素敵でシンプル!空のwhileループに注意してください。


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

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