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


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

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)в этом контексте.


Тебе нужно f=:?
Esolanging Fruit

С ноября 2017 года i.@21-.]сэкономил бы 1 байт.
FrownyFrog

4

Golfscript 7

~21,^0=

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

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

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


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


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

Руби, 22

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

объяснение

  • Ввод принимается в качестве аргумента лямбда-выражения. Это ожидает ArrayотInteger с.
  • Ввод вычитается из массива [0,1,2..20].
  • Поскольку Array [0,1,2..20]сортируется, первый элемент должен быть мекс.

Милый, это была моя первая попытка, но я не мог заставить деструктуризацию работать - я не думал окружать ее скобками. Кстати, вы можете использовать 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

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

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


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

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

Производит -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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.