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

14

Это предназначено, чтобы быть простым, размером с укус размером с клюшку для гольфа.

MEX (минимальное количество исключены) из конечного набора чисел является наименьшим неотрицательным целым числом , 0, 1, 2, 3, 4, ...что вовсе не в коллекции. Другими словами, это минимум дополнения. Операция mex занимает центральное место в анализе беспристрастных игр в теории комбинаторных игр .

Ваша цель - написать программу или именованную функцию для вычисления 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
XNOR
источник
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)), который упорядочен. (Это также означает, что объяснение не совсем точное. Pyth и Python 3 оба довольно новы для меня.)
Деннис
1
Чтобы уточнить, -в Pyth на самом деле есть фильтр - он фильтрует первый аргумент для отсутствия из второго аргумента, а затем преобразует его в форму первого аргумента (строка, список или набор).
Исаак
Кроме того, Деннис, это должно быть h-U22Qтак, чтобы он выдавал правильное значение 21 на входе, содержащем полный допустимый диапазон.
Исаак
@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 К сожалению, 20 лет - sourceforge.net/p/cjam/wiki/Variables
Оптимизатор
Удачный выбор!
xnor
5

J - 13 символов

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

Очень простые действия в J, и поэтому очень трудно сделать меньше.

i.@21создает список от 0 до 20 включительно. -.выполняет set-вычитает входные данные из этого списка. 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

Начиная с выпуска J806 в ноябре 2017 года, существует новый синтаксис, который экономит нам один байт, позволяя нам использовать i.@21старое (i.21)в этом контексте.

algorithmshark
источник
Тебе нужно f=:?
Esolanging Fruit
С ноября 2017 года i.@21-.]сэкономил бы 1 байт.
FrownyFrog
4

Golfscript 7

~21,^0=

Еще одна версия ответа Питера Тейлора. Сообщество вики, так как у меня нет представителя, чтобы комментировать его пост.

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

Попробуйте онлайн

paradigmsort
источник
1
Черт возьми Golfscript для сохранения 1 символа, чтобы не читать вводные данные -_-
Оптимизатор
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 \\ <]

AndoDaan
источник
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=

Принимает ввод от стандартного ввода в формате [5 4 1 5 4 8 2 1 5 4 0 7 7].

Онлайн демо

Питер Тейлор
источник
Не следует ;ли считать входную строку перед самой программой?
Оптимизатор
1
@Optimizer, это имитирует ввод от stdin, потому что онлайн-сайт GolfScript не поддерживает отдельное поле ввода.
Питер Тейлор
2

Xojo, 55 байтов

dim x as int8
while a.indexOf(x)>-1
x=x+1
wend
return x
silverpie
источник
2

Руби, 22

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

объяснение

  • Ввод принимается в качестве аргумента лямбда-выражения. Это ожидает ArrayотInteger с.
  • Ввод вычитается из массива [0,1,2..20].
  • Поскольку Array [0,1,2..20]сортируется, первый элемент должен быть мекс.
britishtea
источник
Милый, это была моя первая попытка, но я не мог заставить деструктуризацию работать - я не думал окружать ее скобками. Кстати, вы можете использовать 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)
     ))
  )
)
Cruncher
источник
1

Python, 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 байта.
Mega Man
1

C # - 64 символа

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

Не всегда лучший язык для игры в гольф, но его легко написать и понять :)

DLeh
источник
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
2xsaiko
источник
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
3 байта
Leaky Nun
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 байт

⁹ḶḟµḢ

Попробуйте онлайн!

user202729
источник
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.
Mazzy
источник
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}'
hmatt1
источник
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;}

Ungolfed:

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
источник
Производит -1для тестового случая [].
OldCurmudgeon
0

Кобра - 50

def f(l)
    for n in 22,if n not in l,break
    print n
Οurous
источник
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
edc65
источник
0

PHP, 38 байт

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

PHP, 39 байт

<?for(;in_array($i++,$_GET););echo$i-1;
Йорг Хюльсерманн
источник