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

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]

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


Seberapa tinggi angka karakter tunggal dalam CJam?
xnor


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.


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


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


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
$

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.


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


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

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.

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

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

1

Python, 37 karakter

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

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


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


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




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.


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


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!


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.

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

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

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

Menghasilkan -1untuk test case [].
OldCurmudgeon

0

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

Bagus dan sederhana! Perhatikan loop kosong saat.


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

0

PHP, 38 Bytes

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

PHP, 39 Bytes

<?for(;in_array($i++,$_GET););echo$i-1;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.