Мінімальна виключена кількість


14

Це призначено для легкого гольфу з кодом розміру.

MEX (мінімальна кількість виключені) з кінцевого набору чисел є найменшим невід'ємним цілим числом , 0, 1, 2, 3, 4, ...що зовсім НЕ в колекції. Іншими словами, це мінімум доповнення. Операція mex займає ключове значення в аналізі неупереджених ігор в теорії комбінаторних ігор .

Ваша мета - написати програму або названу функцію для обчислення мексики, використовуючи якомога менше байтів.

Вхід:

Список невід’ємних цілих чисел у будь-якому порядку. Може містити повтори. Для конкретності, довжина списку та дозволений діапазон елементів будуть як між, так 0і 20включно.

Визначення "списку" тут є гнучким. Будь-яка структура, що представляє собою сукупність чисел, добре, якщо вона має фіксований впорядкованість елементів і дозволяє повторювати. Він не може містити будь-яку допоміжну інформацію, крім її довжини.

Вхід може бути сприйнятий як аргумент функції або через 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
Обмеження чисел до фіксованого діапазону робить цю проблему ще простішою.
Мартін Ендер

@ MartinBüttner Якщо масив містить все число 0до 20, правильний вихід 21. Я додам тестовий випадок. Так, фіксований діапазон, безумовно, полегшує, хоча можна все-таки використовувати, sys.maxintабо 2**64якщо я його не вказав.
xnor

Немає потреби в цьому тестовому випадку. Ви сказали, що вхід може містити лише 21 елемент.
Мартін Ендер

@ 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)), який впорядковано. (Це також означає, що пояснення не зовсім точні. Піт і Python 3 для мене досить нові.)
Денніс

1
Для уточнення, -в Pyth насправді є фільтр - він фільтрує перший аргумент на відсутність у другого аргументу, а потім перетворює його у форму першого аргументу (рядок, список або набір).
isaacg

Також, Деннісе, так і має бути, h-U22Qвін дасть правильний вихід 21 на вході, що містить повний допустимий діапазон.
isaacg

@isaacg: Довжина списку також обмежена 20, тому він не може містити всі 21 числа від 0 до 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?
xnor


Щасливий вибір!
xnor

5

J - 13 char

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

Дуже прості дії в J, і тому дуже важко зробити меншими.

i.@21створює список від 0 до 20 включно. -.виконує набір-віднімає вхід із цього списку. 0{бере перший елемент того, що залишилося, тобто найменше число. f=:визначає названу функцію. У відповіді:

   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

З моменту виходу J806 в листопаді 2017 року існує новий синтаксис, який зберігає нам один байт, дозволяючи нам використовувати i.@21для старого (i.21)в цьому контексті.


Вам потрібно f=:?
Esolanging Fruit

З листопада 2017 року i.@21-.]було б збережено 1 байт.
FrownyFrog

4

Гольфскрипт 7

~21,^0=

Подальша версія відповіді Пітера Тейлора. Вікі спільноти, оскільки я не маю представника, щоб коментувати його повідомлення.

Різниця полягає у використанні відомого розміру максимального списку від питання замість довжини +1 для збереження символу та випадання невідповідного $.

Спробуйте в Інтернеті


1
Dammit Golfscript для збереження 1 символу, щоб не читати введення -_-
Оптимізатор

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.

Спробуйте кілька прикладів:

{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
Це не дає жодного результату на вході {0 1 2}, оскільки вам потрібно rzодин більше, ніж найбільше число. Якщо 20rzj\\<]виправити це, виправте це та заощадите чарку.
Алгоритм

@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.
Денніс

1
Розділену трубу добре, вона відповідає списковій умові специфікації.
xnor

2

Рубін, 32 байти

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

Визначає функцію, fяку потрібно викликати масивом.


Будь-які зауваження від downvoter? Я пропустив якусь частину специфікації?
Мартін Ендер

Я сумніваюся в цьому. Кілька інших відповідей (включаючи мою) отримали таємничий відгук.
Грег Х'югілл

@ipi, але це ... в точно такому ж форматі, який наведено в прикладах в публікаціях викликів, наприклад f[[0, 1]](де зовнішні дужки є синтаксисом виклику, а внутрішні дужки визначають масив).
Мартін Ендер

Навіщо вам це потрібно f=?
Esolanging Fruit

2

GolfScript ( 10 9 байт)

~.,),^$0=

Здійснює введення з stdin у форматі [5 4 1 5 4 8 2 1 5 4 0 7 7].

Демонстрація в Інтернеті


Чи не ;слід вважати вхідний рядок у самій програмі?
Оптимізатор

1
@Optimizer, це імітує вхід із stdin, оскільки інтернет-сайт GolfScript не підтримує окремого поля введення.
Пітер Тейлор


2

Рубі, 22

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

Пояснення

  • Введення розглядається як аргумент лямбда. Він очікує Arrayвід Integerс.
  • Вхід віднімається з масиву [0,1,2..20].
  • Оскільки Array [0,1,2..20]сортування сортоване, першим елементом має бути мекс.

Солодке, це була моя перша спроба, але я не міг змусити руйнувати роботу - я не думав оточити це дужками. Btw, ви можете використовувати 20замість 21, тому що вхід може містити лише 20 елементів.
Мартін Ендер

2

Хаскелл, 30

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

Це працює для списків усіх розмірів та списків, що перевищують 20. Це може бути довжиною 15 байт, якщо імпортується Data.List:

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

Пітон, 37 символів

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

Побий мене пару секунд. До речі, це range(21).
qwr

Це здається найкоротшим рішенням. Рекурсивне рішення f=lambda l,i=0:i in l and f(l,i+1)or iна одну таблицю довше, а ітеративне рішення i=0;l=input()\nwhile i in l:i+=1\nprint i- на два символи довше (якщо не зберігати вхід, його потрібно приймати повторно). Без 20обмеження я думаю, що ці підходи переважали б.
xnor

Не може це бути анонімною функцією? Якщо це можливо, ви можете зберегти 2 байти.
Мега-людина

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

Java 7, 69 66 байт

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

-3 байти завдяки @LeakyNun

Пояснення:

Підтримується не лише 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.


20 байт, використовуючи Ans:Prompt X:0:While not(prod(ʟX-Ans:Ans+1:End:Ans
JosiahRyanW



1

Желе , 7 байт

Ще один підхід. Може використовуватися в ланцюжку з будь-якою сукупністю, і не потрібен роздільник ланцюга чи що-небудь інше.

‘Ṭ;0i0’

Оскільки відповідь гарантована менше 256, це також працює:

Желе , 5 байт

⁹ḶḟµḢ

Спробуйте в Інтернеті!


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

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 має 1-байтовий літерал для 10 ^ 8, це не повинно бути помітно.
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

Ява, 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)

Приємно і просто! Зверніть увагу на порожній цикл.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.