Número mínimo excluído


14

Pretende-se ser um código de golfe fácil e pequeno.

O mex (número mínimo excluído) de uma coleção finita de números é o menor número inteiro não negativo 0, 1, 2, 3, 4, ...que não aparece na coleção. Em outras palavras, é o mínimo do complemento. A operação mex é central para a análise de jogos imparciais na teoria combinatória dos jogos .

Seu objetivo é escrever um programa ou função nomeada para calcular o mex usando o mínimo de bytes possível.

Entrada:

Uma lista de números inteiros não negativos em qualquer ordem. Pode conter repetições. Para concretização, o comprimento da lista e o intervalo permitido de elementos serão entre 0e 20inclusive.

A definição de "lista" aqui é flexível. Qualquer estrutura que represente uma coleção de números é boa, desde que tenha uma ordem fixa de elementos e permita repetições. Não pode incluir nenhuma informação auxiliar, exceto seu comprimento.

A entrada pode ser tomada como argumento de função ou através de STDIN.

Resultado

O menor número excluído. Saída ou imprima.

Casos de teste

[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
A restrição dos números para um intervalo fixo torna esse problema ainda mais simples.
Martin Ender

@ MartinBüttner Se a matriz contiver todo o número 0para 20, a saída correta será 21. Vou adicionar um caso de teste. Sim, o alcance fixo definitivamente facilita, embora ainda se possa usar sem dúvida sys.maxintou 2**64se eu não o especificou.
xnor

Não há necessidade desse caso de teste. Você disse que a entrada pode conter apenas 21 elementos.
Martin Ender

@ MartinBüttner Certo, poste. Obrigado.
Xnor

1
@KevinFegan Sim, a saída máxima possível é 20. Meu comentário foi equivocado e acho que o MartinBüttner digitou.
Xnor

Respostas:


11

Pitão , 6 bytes

h-U21Q

Exemplo de execução

$ pyth -c h-U21Q <<< '[5, 4, 1, 5, 4, 8, 2, 1, 5, 4, 0, 7, 7]'
3

Como funciona

  U21   range(21)
     Q  eval(input())
 -U21Q  setwisedifference(range(21), eval(input))          # Pyth function. Preserves order.
h-U21Q  setwisedifference(range(21), eval(input))[0]

Quando o conjunto é convertido em lista, ele está sempre na ordem de classificação?
Xnor

A diferença de conjunto de Pyth preserva a ordem do primeiro argumento ( range(21)), que é ordenado. (Isto também significa a explicação não é inteiramente correta Pyth e Python 3 são ambos bastante novo para mim..)
Dennis

1
Para esclarecer, -em Pyth , na verdade, é um filtro - ele filtra o primeiro argumento por ausência do segundo argumento e depois o converte na forma do primeiro argumento (string, lista ou conjunto).
Isaacg #

Além disso, Dennis, deve ser h-U22Qassim, para fornecer a saída correta de 21 na entrada que contém toda a faixa permitida.
Isaacg #

@isaacg: O comprimento da lista também é limitado a 20, por isso não pode conter todos os 21 números de 0 a 20.
Dennis

6

CJam, 11 8 bytes

K),l~^1<

Como funciona:

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"

Entrada de amostra:

[1 0 7 6 3 11 15 1 9 2 3 1 5 2 3 4 6 8 1 18]

Resultado:

10

Experimente online aqui


Qual o nível dos números de um caractere no CJam?
Xnor


Uma escolha de sorte!
Xnor

5

J - 13 car

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

Ações muito simples em J e, portanto, muito difíceis de diminuir.

i.@21cria uma lista de 0 a 20 inclusive. -.executa set-subtrai a entrada desta lista. 0{pega o primeiro elemento do que resta, ou seja, o menor número. f=:define uma função nomeada. No 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

Desde o lançamento do J806 em novembro de 2017, existe uma nova sintaxe que economiza um byte, permitindo o uso i.@21do antigo (i.21)neste contexto.


Você precisa f=:?
Esolanging Fruit

Desde novembro de 2017 i.@21-.], economizaria 1 byte.
FrownyFrog

4

Golfscript 7

~21,^0=

Uma versão mais avançada da resposta de Peter Taylor. Wiki da comunidade, pois não tenho o representante para comentar sua postagem.

A diferença é usar o tamanho máximo da lista conhecido da pergunta em vez do tamanho +1 para salvar um personagem e eliminar o $ irrelevante.

Experimente online


1
Droga Golfscript para salvar um personagem de modo a não ler a entrada -_-
Optimizer

4

Burlesco - 9 bytes

20rzj\\<]

Recebe entrada de stdin no formato {7 6 5 5 1 2 2 4 2 0}

Explicado:

 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.

Tente alguns exemplos:

{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
Isso não fornece nenhuma saída na entrada {0 1 2}, porque você precisa de rzum a mais que o maior número. Apenas indo direto para 20rzj\\<]corrigir isso e salva um caractere.
algoritmshark

@algorithmshark De jeito nenhum, você está muito certo. Fixo. E obrigada.
AndoDaan

3

Bash + coreutils, 23 bytes

seq 0 20|egrep -vwm1 $1

Isso pressupõe a entrada como uma |lista separada (canal). Por exemplo:

$ ./mex.sh "5|4|1|5|4|8|2|1|5|4|0|7|7"
3
$

1
Eu não acho que você precisa em "(...)"torno do $1.
Dennis

1
Separado por tubo é bom, ele atende à condição de lista das especificações.
xnor

2

Ruby, 32 bytes

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

Define uma função fa ser chamada com uma matriz.


Algum comentário do downvoter? Perdi alguma parte das especificações?
Martin Ender

Eu duvido. Várias outras respostas (incluindo a minha) tiveram um voto negativo de mistério.
Greg Hewgill

@ipi, mas existe ... exatamente no mesmo formato dado nos exemplos nos posts de desafio, por exemplo f[[0, 1]](onde os colchetes externos são sintaxe de chamada e os colchetes definem a matriz).
Martin Ender

Por que você precisa do f=?
Esolanging Fruit

2

GolfScript ( 10 9 bytes)

~.,),^$0=

Recebe a entrada de stdin no formato [5 4 1 5 4 8 2 1 5 4 0 7 7].

Demonstração online


O ;antes da sequência de entrada não deve ser contado no próprio programa?
Optimizer

1
@Optimizer, que simula a entrada do stdin, porque o site online do GolfScript não suporta um campo de entrada separado.
Peter Taylor

2

Xojo, 55 bytes

dim x as int8
while a.indexOf(x)>-1
x=x+1
wend
return x

2

Ruby, 22

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

Explicação

  • A entrada é tomada como argumento para uma lambda. Espera um ArraydeInteger s.
  • A entrada é subtraída da matriz [0,1,2..20] .
  • Como o Array [0,1,2..20]é classificado, o primeiro elemento deve ser o mex.

Doce, essa foi minha primeira tentativa, mas não consegui fazer a desestruturação funcionar - não pensei em cercá-la entre parênteses. Aliás, você pode usar em 20vez de 21, porque a entrada pode conter apenas 20 elementos.
Martin Ender

2

Haskell, 30

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

Isso funciona para listas de todos os tamanhos e listas além de 20. Isso pode ter 15 bytes de comprimento se Data.List for importado:

f s=[0..]\\s!!0

2

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

Não é muito competitivo. Mas eu gosto de escrever esquemas :),

Aqui está o código não destruído:

(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 caracteres

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

Bata-me por alguns segundos. Aliás, é range(21).
QWR

Esta parece ser a solução mais curta. A solução recursiva f=lambda l,i=0:i in l and f(l,i+1)or item um caractere a mais e a solução iterativa i=0;l=input()\nwhile i in l:i+=1\nprint ié dois caracteres a mais (não armazenar a entrada faz com que ela seja tomada repetidamente). Sem esse 20limite, acho que essas abordagens prevaleceriam.
xnor

Não poderia ser uma função anônima? Se possível, você pode salvar 2 bytes.
Mega Man

1

C # - 64 caracteres

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

Nem sempre Raramente a melhor linguagem de golfe, mas é fácil de escrever e entender :)


1

Scala, 18 bytes

0 to 20 diff l min

l é uma lista de 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 bytes

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

-3 bytes graças a @LeakyNun

Explicação:

Suporta não apenas 0-20, mas 0-2147483647 (o que realmente salva bytes).

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

Código do teste:

Experimente aqui.

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

Resultado:

0
1
1
2
0
0
3
4
4
10




1

TI-BASIC, 24 bytes

: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

Se Prompt Xreceber uma lista em vez de um único número, ele criará automaticamente uma lista nomeada Xque pode ser acessada ʟX.


20 bytes utilizando Ans:Prompt X:0:While not(prod(ʟX-Ans:Ans+1:End:Ans
JosiahRyanW

1

Stax , 6 bytes

¢╔⌂♀╠▬

Execute e depure

Explicação

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

Geléia , 7 bytes

Outra abordagem. Pode ser usado em uma corrente com qualquer aridade e não precisa de separador de corrente nem nada.

‘Ṭ;0i0’

Como a resposta é garantida em menos de 256, isso também funciona:

Gelatina , 5 bytes

⁹ḶḟµḢ

Experimente online!


1

Powershell, 28 bytes

for(;+$i-in$args){$i++}+$i

Script de teste:

$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"
}

Resultado:

True: 0
True: 1
True: 2
True: 0
True: 0
True: 3
True: 4
True: 4
True: 10

Explicação:

  • Incremento $ienquanto o$args matriz contém o valor inteiro+$i .
  • Emite um último valor inteiro +$i.

1

MathGolf , 5 4 bytes

Jr,╓

Experimente online!

Essa solução é restrita apenas ao intervalo de 0 a 20, embora isso possa ser estendido facilmente, aumentando o intervalo inicial.

Explicação:

Jr     Range from 0 to 20
  ,    Remove elements from the input list from this range
   ╓   Return the minimum element

Como alternativa, uma solução de 5 bytes para todos os números:

Åï╧▲ï

Experimente online!

Explicação:

Å  ▲   Do while true
  ╧    Does the input contain
 ï     The index of the loop?
    ï  Push the number of iterations of the last loop

Com as novas alterações que estão sendo esperadas hoje no TIO, há uma solução de 4 bytes para esse problema. Ele é restrito a um limite superior definido no código, mas como o MathGolf possui um literal de 1 byte para 10 ^ 8, não deve ser perceptível.
maxb

Esta foi a solução exata que eu tinha (usei em Zvez deJ ser preguiçosa).
Maxb 28/11

0

Perl - 34

Aqui está uma sub-rotina.

sub f{$_~~@_?1:return$_ for0..20}

Teste com:

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

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

Produz -1para o caso de teste [].
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)

Agradável e simples! Observe o loop while vazio.


0

JavaScript (E6) 35

Função recursiva, parâmetro de matriz na entrada e retornando o mex. Não limitado a 20

F=(l,i=0)=>~l.indexOf(i)?F(l,++i):i

Teste no console do 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)))

Resultado

[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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.