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


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.