Jumlah minimum yang dikecualikan

14

Ini dimaksudkan untuk menjadi golf kode yang mudah dan seukuran gigitan.

The mex (minimal jumlah dikecualikan) dari koleksi terbatas angka adalah yang terkecil bilangan bulat non-negatif 0, 1, 2, 3, 4, ...yang tidak tidak muncul dalam koleksi. Dengan kata lain, ini adalah minimum dari komplemen. Operasi mex merupakan pusat analisis game yang tidak memihak dalam teori permainan kombinatorial .

Tujuan Anda adalah untuk menulis program atau fungsi bernama untuk menghitung mex menggunakan sesedikit mungkin byte.

Memasukkan:

Daftar bilangan bulat non-negatif dalam urutan apa pun. Dapat berisi pengulangan. Untuk konkret, panjang daftar dan rentang elemen yang diizinkan akan berada di antara 0dan 20inklusif.

Definisi "daftar" di sini fleksibel. Setiap struktur yang mewakili kumpulan angka baik-baik saja, asalkan memiliki urutan elemen tetap dan memungkinkan pengulangan. Itu mungkin tidak termasuk informasi tambahan apa pun kecuali panjangnya.

Input dapat diambil sebagai argumen fungsi atau melalui STDIN.

Keluaran

Nomor terkecil yang dikecualikan. Keluarkan atau cetak.

Uji kasus

[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
Tidak
sumber
2
Membatasi angka ke rentang tetap membuat masalah ini lebih mudah.
Martin Ender
@ MartinBüttner Jika array berisi semua nomor 0untuk 20, output yang benar adalah 21. Saya akan menambahkan kasus uji. Ya, rentang tetap pasti membuatnya lebih mudah, meskipun orang masih bisa menggunakan sys.maxintatau 2**64jika saya tidak menentukannya.
xnor
Tidak perlu untuk test case itu. Katamu, input hanya bisa berisi 21 elemen.
Martin Ender
@ MartinBüttner Benar, fencepost. Terima kasih.
xnor
1
@KevinFegan Ya, output maksimum yang mungkin adalah 20. Komentar saya salah dan saya pikir MartinBüttner salah ketik.
xnor

Jawaban:

11

Pyth , 6 byte

h-U21Q

Contoh dijalankan

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

Bagaimana itu bekerja

  U21   range(21)
     Q  eval(input())
 -U21Q  setwisedifference(range(21), eval(input))          # Pyth function. Preserves order.
h-U21Q  setwisedifference(range(21), eval(input))[0]
Dennis
sumber
Ketika set dikonversi ke daftar, apakah selalu dalam urutan?
xnor
Perbedaan set Pyth mempertahankan urutan argumen pertama ( range(21)), yang dipesan. (Ini juga berarti penjelasannya tidak sepenuhnya akurat. Pyth dan Python 3 sama sekali baru bagi saya.)
Dennis
1
Untuk memperjelas, -dalam Pyth sebenarnya adalah filter - filter memfilter argumen pertama karena tidak ada argumen kedua, kemudian mengubahnya menjadi bentuk argumen pertama (string, daftar atau set).
isaacg
Juga, Dennis, seharusnya h-U22Qbegitu itu akan memberikan output yang benar dari 21 pada input yang berisi rentang penuh yang diijinkan.
isaacg
@isaacg: Panjang daftar juga dibatasi hingga 20, sehingga tidak dapat memuat semua 21 angka dari 0 hingga 20.
Dennis
6

CJam, 11 8 byte

K),l~^1<

Bagaimana itu bekerja:

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"

Input sampel:

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

Keluaran:

10

Cobalah online di sini

Pengoptimal
sumber
Seberapa tinggi angka karakter tunggal dalam CJam?
xnor
@xnor Sedih, 20 - sourceforge.net/p/cjam/wiki/Variables
Pengoptimal
Pilihan yang beruntung!
xnor
5

J - 13 char

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

Tindakan yang sangat sederhana di J, dan karenanya sangat sulit untuk dibuat lebih kecil.

i.@21membuat daftar dari 0 hingga 20 inklusif. -.melakukan set-kurangi input dari daftar ini. 0{mengambil elemen pertama dari apa yang tersisa, yaitu jumlah terkecil. f=:mendefinisikan fungsi bernama. Di 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

Sejak rilis J806 pada November 2017, ada sintaks baru yang menghemat satu byte dengan membiarkan kami menggunakan i.@21yang lama (i.21)dalam konteks ini.

algoritme hiu
sumber
Apakah Anda perlu f=:?
Buah Esolanging
Sejak November 2017 i.@21-.]akan menghemat 1 byte.
FrownyFrog
4

Golfscript 7

~21,^0=

Versi lanjutan dari jawaban Peter Taylor. Komunitas wiki karena saya tidak punya perwakilan untuk mengomentari posnya.

Perbedaannya adalah menggunakan ukuran daftar maks yang diketahui dari pertanyaan alih-alih panjang +1 untuk menyimpan karakter dan menjatuhkan $ yang tidak relevan.

Cobalah online

paradigma
sumber
1
Skrip Golf untuk menyimpan 1 karakter agar tidak membaca input -_-
Pengoptimal
4

Bahan tertawaan - 9 Bytes

20rzj\\<]

Mengambil input dari stdin dalam format {7 6 5 5 1 2 2 4 2 0}

Dijelaskan:

 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.

Coba beberapa contoh:

{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 \\ <]

AndoDaan
sumber
1
Ini gagal memberikan output apa pun pada input {0 1 2}, karena Anda perlu rzsatu lebih dari jumlah terbesar. Langsung saja 20rzj\\<]memperbaiki ini dan menyimpan char.
algorithmshark
@algorithmshark Tidak ada jalan lain, Anda sangat benar. Tetap. Dan terima kasih.
AndoDaan
3

Bash + coreutils, 23 byte

seq 0 20|egrep -vwm1 $1

Ini mengasumsikan input sebagai daftar |(pipa) yang dipisahkan. Misalnya:

$ ./mex.sh "5|4|1|5|4|8|2|1|5|4|0|7|7"
3
$
Trauma Digital
sumber
1
Saya tidak berpikir Anda perlu "(...)"sekitar $1.
Dennis
1
Terpisah dengan pipa baik-baik saja, memenuhi persyaratan spesifikasi seperti daftar.
xnor
2

Ruby, 32 byte

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

Menentukan fungsi yang fakan dipanggil dengan array.

Martin Ender
sumber
Ada komentar dari downvoter? Apakah saya melewatkan beberapa bagian dari spec?
Martin Ender
Aku meragukan itu. Beberapa jawaban lain (termasuk saya) mendapat misteri downvote.
Greg Hewgill
@ipi tetapi tidak ... dalam format yang persis sama dengan yang diberikan dalam contoh di posting tantangan, misalnya f[[0, 1]](di mana kurung luar sintaks doa dan kurung dalam mendefinisikan array).
Martin Ender
Mengapa Anda membutuhkannya f=?
Buah Esolanging
2

GolfScript ( 10 9 byte)

~.,),^$0=

Mengambil input dari stdin dalam format [5 4 1 5 4 8 2 1 5 4 0 7 7].

Demo online

Peter Taylor
sumber
Bukankah seharusnya ;sebelum string input dihitung dalam program itu sendiri?
Pengoptimal
1
@Optimizer, yang mensimulasikan input dari stdin karena situs GolfScript online tidak mendukung bidang input yang terpisah.
Peter Taylor
2

Xojo, 55 byte

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

Ruby, 22

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

Penjelasan

  • Masukan diambil sebagai argumen ke lambda. Diharapkan Arraydari Integer.
  • Input dikurangi dari array [0,1,2..20].
  • Karena Array [0,1,2..20]diurutkan, elemen pertama harus mex.
britishtea
sumber
Manis, itu adalah usaha pertamaku, tapi aku tidak bisa membuat perusakannya berhasil - aku tidak berpikir mengitarinya dengan tanda kurung. Btw, Anda bisa menggunakan 20bukan 21, karena input hanya bisa berisi 20 elemen.
Martin Ender
2

Haskell, 30

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

Ini berfungsi untuk daftar semua ukuran dan daftar di luar 20. Ini dapat dibuat 15 byte panjang jika Data.List diimpor:

f s=[0..]\\s!!0
haskeller bangga
sumber
2

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

Tidak terlalu kompetitif. Tapi saya suka skema penulisan :),

Berikut adalah kode yang tidak dipisahkan:

(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)
     ))
  )
)
Cruncher
sumber
1

Python, 37 karakter

f=lambda a:min(set(range(21))-set(a))
Greg Hewgill
sumber
Kalahkan saya beberapa detik. BTW, ini range(21).
qwr
Ini tampaknya menjadi solusi terpendek. Solusi rekursif f=lambda l,i=0:i in l and f(l,i+1)or iadalah satu karakter lebih lama dan solusi berulang i=0;l=input()\nwhile i in l:i+=1\nprint idua karakter lebih lama (tidak menyimpan input membuatnya diambil berulang kali). Tanpa 20batas, saya pikir pendekatan ini akan menang.
xnor
Tidak bisakah ini merupakan fungsi anonim? Jika bisa, Anda bisa menghemat 2 byte.
Mega Man
1

C # - 64 karakter

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

Tidak selalu Jarang bahasa golf terbaik, tetapi mudah untuk ditulis dan dimengerti :)

DLeh
sumber
1

Scala, 18 byte

0 to 20 diff l min

l adalah daftar 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
2xsaiko
sumber
1

Java , 91 byte

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

Cobalah online!

Biarawati Bocor
sumber
1

Java 7, 69 66 byte

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

-3 byte terima kasih kepada @LeakyNun

Penjelasan:

Mendukung tidak hanya 0-20, tetapi 0-2147483647 sebagai gantinya (yang sebenarnya menyimpan 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

Kode uji:

Coba di sini.

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

Keluaran:

0
1
1
2
0
0
3
4
4
10
Kevin Cruijssen
sumber
Heh, perpustakaan .
Leaky Nun
1
Off 3 byte
Leaky Nun
1

APL (Dyalog) , 19 byte

(0⍳⍨⊢=⍳∘⍴)∘(⊂∘⍋⌷⊢)∪

Cobalah online!

Saya mungkin kehilangan sesuatu yang penting di sini. Golf sedang berlangsung ...

Kritixi Lithos
sumber
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

Jika Prompt Xdiberikan daftar alih-alih nomor tunggal, itu akan secara otomatis membuat daftar bernama Xyang dapat diakses dengan ʟX.

Scott Milner
sumber
20 byte menggunakan Ans:Prompt X:0:While not(prod(ʟX-Ans:Ans+1:End:Ans
JosiahRyanW
1

Stax , 6 byte

¢╔⌂♀╠▬

Jalankan dan debug itu

Penjelasan

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
Multi
sumber
1

Jeli , 7 byte

Pendekatan lain. Dapat digunakan dalam rantai dengan arity apa pun, dan tidak perlu rantai pemisah atau apa pun.

‘Ṭ;0i0’

Karena jawabannya dijamin kurang dari 256, ini juga berfungsi:

Jelly , 5 byte

⁹ḶḟµḢ

Cobalah online!

pengguna202729
sumber
1

Powershell, 28 byte

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

Skrip uji:

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

Keluaran:

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

Penjelasan:

  • Selisih $isementara $argsarray berisi nilai integer +$i.
  • Output nilai integer terakhir +$i.
mazzy
sumber
1

MathGolf , 5 4 byte

Jr,╓

Cobalah online!

Solusi ini dibatasi hanya pada kisaran 0 hingga 20, meskipun ini dapat diperpanjang dengan mudah dengan meningkatkan rentang awal.

Penjelasan:

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

Atau, solusi 5 byte untuk semua angka:

Åï╧▲ï

Cobalah online!

Penjelasan:

Å  ▲   Do while true
  ╧    Does the input contain
 ï     The index of the loop?
    ï  Push the number of iterations of the last loop
Jo King
sumber
Dengan perubahan baru yang (semoga) ditambahkan ke TIO hari ini, ada solusi 4 byte untuk masalah ini. Ini terbatas pada batas atas yang ditentukan dalam kode, tetapi karena MathGolf memiliki 1 byte literal untuk 10 ^ 8, itu tidak boleh terlihat.
Maks.
Ini adalah solusi tepat yang saya miliki (saya gunakan Zbukan Jkarena saya malas).
Maks.
0

Perl - 34

Inilah subrutin.

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

Uji dengan:

perl -e'print f(0,1,3,4,5,6,7); sub f{$_~~@_?1:return$_ for 0..20}'
hmatt1
sumber
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;}

Tidak Disatukan:

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;
}
Ypnypn
sumber
Menghasilkan -1untuk test case [].
OldCurmudgeon
0

Cobra - 50

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

Javascript, 74

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

Bagus dan sederhana! Perhatikan loop kosong saat.

Sean Latham
sumber
0

JavaScript (E6) 35

Fungsi rekursif, parameter array di input dan mengembalikan mex. Tidak terbatas pada 20

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

Uji di konsol 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)))

Keluaran

[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
edc65
sumber
0

PHP, 38 Bytes

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

PHP, 39 Bytes

<?for(;in_array($i++,$_GET););echo$i-1;
Jörg Hülsermann
sumber