Minimale ausgeschlossene Anzahl

14

Dies soll ein einfacher, mundgerechter Code-Golf sein.

Das mex (minimale ausgeschlossene Zahl) einer endlichen Auflistung von Zahlen ist die kleinste nicht negative Ganzzahl 0, 1, 2, 3, 4, ..., die nicht in der Auflistung enthalten ist. Mit anderen Worten, es ist das Minimum des Komplements. Die mex-Operation spielt eine zentrale Rolle bei der Analyse unparteiischer Spiele in der kombinatorischen Spieltheorie .

Ihr Ziel ist es, ein Programm oder eine benannte Funktion zu schreiben , um den mex mit möglichst wenigen Bytes zu berechnen.

Eingang:

Eine Liste nicht negativer Ganzzahlen in beliebiger Reihenfolge. Kann Wiederholungen enthalten. Der Vollständigkeit halber werden die Länge der Liste und der zulässige Bereich von Elementen sowohl zwischen 0als auch 20einschließlich liegen.

Die Definition von "Liste" ist hier flexibel. Jede Struktur, die eine Sammlung von Zahlen darstellt, ist in Ordnung, solange sie eine feste Reihenfolge von Elementen aufweist und Wiederholungen zulässt. Sie darf außer ihrer Länge keine zusätzlichen Informationen enthalten.

Die Eingabe kann als Funktionsargument oder über STDIN erfolgen.

Ausgabe

Die kleinste ausgeschlossene Zahl. Ausgeben oder ausdrucken.

Testfälle

[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
quelle
2
Das Beschränken der Zahlen auf einen festen Bereich macht dieses Problem noch einfacher.
Martin Ender
@ MartinBüttner Wenn das Array alle Nummer enthält 0zu 20, ist die korrekte Ausgabe 21. Ich werde einen Testfall hinzuzufügen. Ja, der feste Bereich macht es definitiv einfacher, obwohl man ihn immer noch verwenden könnte sys.maxintoder 2**64wenn ich ihn nicht spezifiziert hätte.
Xnor
Dieser Testfall ist nicht erforderlich. Sie sagten, die Eingabe kann nur 21 Elemente enthalten.
Martin Ender
@ MartinBüttner Richtig, Zaunpfosten. Vielen Dank.
Xnor
1
@ KevinFegan Ja, die maximal mögliche Ausgabe ist 20. Mein Kommentar war falsch und ich denke, MartinBüttner hat Tippfehler gemacht.
Xnor

Antworten:

11

Pyth , 6 Bytes

h-U21Q

Beispiellauf

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

Wie es funktioniert

  U21   range(21)
     Q  eval(input())
 -U21Q  setwisedifference(range(21), eval(input))          # Pyth function. Preserves order.
h-U21Q  setwisedifference(range(21), eval(input))[0]
Dennis
quelle
Wenn das Set in eine Liste konvertiert wird, ist es immer in sortierter Reihenfolge?
30.
Pyths Mengenunterschied behält die Reihenfolge des ersten Arguments ( range(21)) bei, das geordnet ist. (Dies bedeutet auch, dass die Erklärung nicht ganz korrekt ist. Pyth und Python 3 sind für mich beide ziemlich neu.)
Dennis
1
Zur Verdeutlichung ist -in Pyth tatsächlich ein Filter - es filtert das erste Argument auf Abwesenheit vom zweiten Argument und konvertiert es dann in die Form des ersten Arguments (Zeichenfolge, Liste oder Menge).
Isaacg
Außerdem, Dennis, sollte es h-U22Qso sein, dass es die korrekte Ausgabe von 21 für die Eingabe gibt, die den gesamten zulässigen Bereich enthält.
Isaacg
@isaacg: Die Länge der Liste ist ebenfalls auf 20 begrenzt, daher kann sie nicht alle 21 Nummern von 0 bis 20 enthalten.
Dennis
6

CJam, 11 8 Bytes

K),l~^1<

Wie es funktioniert:

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"

Beispieleingabe:

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

Ausgabe:

10

Probieren Sie es hier online aus

Optimierer
quelle
Wie hoch sind die Ein-Zeichen-Zahlen in CJam?
Xnor
@xnor Leider 20 - sourceforge.net/p/cjam/wiki/Variables
Optimizer
Eine glückliche Wahl!
Xnor
5

J - 13 Zeichen

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

Sehr einfache Aktionen in J und daher sehr schwer zu verkleinern.

i.@21Erstellt eine Liste von 0 bis einschließlich 20. -.führt set-subtrahiert die Eingabe von dieser Liste aus. 0{Nimmt das erste Element von dem, was übrig ist, dh die kleinste Zahl. f=:definiert eine benannte Funktion. Auf der 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

Seit dem Release von J806 im November 2017 gibt es eine neue Syntax, die uns ein Byte erspart, indem wir in diesem Kontext i.@21die alte verwenden (i.21)können.

algorithmshark
quelle
Sie braucht f=:?
Esolanging Fruit
Seit November 2017 i.@21-.]würde 1 Byte gespart.
FrownyFrog
4

Golfscript 7

~21,^0=

Eine weitergehende Version von Peter Taylors Antwort. Community-Wiki, da ich nicht den Repräsentanten habe, der seinen Beitrag kommentiert.

Der Unterschied besteht darin, dass anstelle der Länge +1 die bekannte maximale Listengröße aus der Frage verwendet wird, um ein Zeichen zu speichern und das irrelevante $ zu löschen.

Probieren Sie es online aus

Paradigmensort
quelle
1
Verdammt Golfscript für das Speichern von 1 Zeichen, um die Eingabe nicht zu lesen -_-
Optimizer
4

Burlesque - 9 Bytes

20rzj\\<]

Übernimmt die Eingabe von stdin im Format {7 6 5 5 1 2 2 4 2 0}

Erklärt:

 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.

Probieren Sie einige Beispiele aus:

{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
quelle
1
Dies liefert keine Ausgabe für die Eingabe {0 1 2}, da Sie rzmehr als die größte Zahl benötigen . Einfach loslegen, um das 20rzj\\<]Problem zu beheben und einen Buchstaben zu sparen.
Algorithmushai
@algorithmshark Auf keinen Fall umgehen, Sie sind sehr richtig. Fest. Und danke dir.
AndoDaan
3

Bash + Coreutils, 23 Bytes

seq 0 20|egrep -vwm1 $1

Dies setzt die Eingabe als |(Pipe-) getrennte Liste voraus . Z.B:

$ ./mex.sh "5|4|1|5|4|8|2|1|5|4|0|7|7"
3
$
Digitales Trauma
quelle
1
Ich glaube nicht, dass Sie "(...)"um die brauchen $1.
Dennis
1
Rohrgetrennt ist in Ordnung, es erfüllt die listeähnliche Bedingung der Spezifikation.
30.
2

Ruby, 32 Bytes

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

Definiert eine Funktion f, die mit einem Array aufgerufen werden soll.

Martin Ender
quelle
Irgendwelche Kommentare vom Downvoter? Habe ich einen Teil der Spezifikation verpasst?
Martin Ender
Das bezweifle ich. Einige andere Antworten (einschließlich meiner) erhielten eine mysteriöse Gegenstimme.
Greg Hewgill
@ipi, aber es funktioniert ... in genau demselben Format, das in den Beispielen in den Challenge-Posts angegeben ist, z. B. f[[0, 1]](wobei die äußeren Klammern die Aufrufsyntax und die inneren Klammern das Array definieren).
Martin Ender
Warum brauchst du das f=?
Esolanging Fruit
2

GolfScript ( 10 9 Bytes)

~.,),^$0=

Übernimmt die Eingabe von stdin im Format [5 4 1 5 4 8 2 1 5 4 0 7 7].

Online-Demo

Peter Taylor
quelle
Sollte nicht das, ;bevor die Eingabezeichenfolge im Programm selbst gezählt werden?
Optimierer
1
@Optimizer, das simuliert die Eingabe von stdin, da die Online-GolfScript-Site kein separates Eingabefeld unterstützt.
Peter Taylor
2

Xojo, 55 Bytes

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

Rubin, 22

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

Erläuterung

  • Die Eingabe wird als Argument für ein Lambda verwendet. Es erwartet einen Arrayvon Integers.
  • Die Eingabe wird vom Array abgezogen [0,1,2..20].
  • Da das Array [0,1,2..20]sortiert ist, muss das erste Element das mex sein.
britishtea
quelle
Süß, das war mein erster Versuch, aber ich konnte die Destrukturierung nicht zum Laufen bringen - ich dachte nicht daran, sie mit Klammern zu umgeben. Übrigens können Sie 20statt verwenden 21, da die Eingabe nur 20 Elemente enthalten kann.
Martin Ender
2

Haskell, 30

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

Dies funktioniert für Listen aller Größen und Listen jenseits von 20. Dies kann zu einer Länge von 15 Byte gemacht werden, wenn Data.List importiert wird:

f s=[0..]\\s!!0
stolzer haskeller
quelle
2

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

Nicht sehr wettbewerbsfähig. Aber ich schreibe gerne Schema :),

Hier ist der ungolfed Code:

(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
quelle
1

Python, 37 Zeichen

f=lambda a:min(set(range(21))-set(a))
Greg Hewgill
quelle
Schlage mich um ein paar Sekunden. Übrigens, es ist range(21).
Qwr
Dies scheint die kürzeste Lösung zu sein. Die rekursive Lösung f=lambda l,i=0:i in l and f(l,i+1)or iist ein i=0;l=input()\nwhile i in l:i+=1\nprint iZeichen länger und die iterative Lösung ist zwei Zeichen länger (wenn die Eingabe nicht gespeichert wird, wird sie wiederholt verwendet). 20Ich denke, dass diese Ansätze sich ohne diese Grenzen durchsetzen würden.
30.
Könnte dies nicht eine anonyme Funktion sein? Wenn es könnte, können Sie 2 Bytes sparen.
Mega Man
1

C # - 64 Zeichen

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

Nicht immer Selten die beste Golfsprache, aber einfach zu schreiben und zu verstehen :)

DLeh
quelle
1

Scala, 18 Bytes

0 to 20 diff l min

l ist eine Liste von 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
quelle
1

Java , 91 Bytes

int f(int[]a){int i=0,j=1,k;for(;j>0;i++)for(k=j=0;k<a.length;j=a[k++]==i?1:j);return i-1;}

Probieren Sie es online!

Undichte Nonne
quelle
1

Java 7, 69 66 Bytes

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

-3 Bytes dank @LeakyNun

Erläuterung:

Unterstützt stattdessen nicht nur 0-20, sondern 0-2147483647 (was tatsächlich Bytes spart).

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

Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

0
1
1
2
0
0
3
4
4
10
Kevin Cruijssen
quelle
He, Bibliotheken .
Undichte Nonne
1
3 Bytes aus
Leaky Nun
1

APL (Dyalog) , 19 Bytes

(0⍳⍨⊢=⍳∘⍴)∘(⊂∘⍋⌷⊢)∪

Probieren Sie es online!

Ich vermisse hier wahrscheinlich etwas Wichtiges. Golfen im Gange ...

Kritixi Lithos
quelle
1

TI-BASIC, 24 Byte

: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

Wenn Prompt Xanstelle einer einzelnen Nummer eine Liste angegeben wird, wird automatisch eine Liste mit dem Namen erstellt X, auf die zugegriffen werden kann ʟX.

Scott Milner
quelle
20 Bytes mit Ans:Prompt X:0:While not(prod(ʟX-Ans:Ans+1:End:Ans
JosiahRyanW
1

Stax , 6 Bytes

¢╔⌂♀╠▬

Führen Sie es aus und debuggen Sie es

Erläuterung

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
Multi
quelle
1

Gelee , 7 Bytes

Ein anderer Ansatz. Kann in einer Kette beliebiger Art verwendet werden und benötigt keinen Kettentrenner oder ähnliches.

‘Ṭ;0i0’

Da die Antwort garantiert weniger als 256 ist, funktioniert dies auch:

Gelee , 5 Bytes

⁹ḶḟµḢ

Probieren Sie es online!

user202729
quelle
1

Powershell, 28 Bytes

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

Testskript:

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

Ausgabe:

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

Erläuterung:

  • Inkrementieren Sie, $iwährend das $argsArray den ganzzahligen Wert enthält+$i .
  • Gibt einen letzten ganzzahligen Wert aus +$i.
mazzy
quelle
1

MathGolf , 5 4 Bytes

Jr,╓

Probieren Sie es online!

Diese Lösung ist auf den Bereich von 0 bis 20 beschränkt, kann jedoch durch Erhöhen des Anfangsbereichs problemlos erweitert werden.

Erläuterung:

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

Alternativ eine 5-Byte-Lösung für alle Zahlen:

Åï╧▲ï

Probieren Sie es online!

Erläuterung:

Å  ▲   Do while true
  ╧    Does the input contain
 ï     The index of the loop?
    ï  Push the number of iterations of the last loop
Scherzen
quelle
Mit den neuen Änderungen, die (hoffentlich) heute zu TIO hinzugefügt werden, gibt es eine 4-Byte-Lösung für dieses Problem. Es ist auf eine im Code festgelegte Obergrenze beschränkt, aber da MathGolf ein 1-Byte-Literal für 10 ^ 8 hat, sollte es nicht auffallen.
Maxb
Dies war genau die Lösung, die ich hatte (ich habe sie verwendet, Zanstatt Jweil ich faul war).
Maxb
0

Perl - 34

Hier ist eine Unterroutine.

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

Testen Sie mit:

perl -e'print f(0,1,3,4,5,6,7); sub f{$_~~@_?1:return$_ for 0..20}'
hmatt1
quelle
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;
}
Ypnypn
quelle
Erzeugt -1für Testfall [].
OldCurmudgeon
0

Cobra - 50

def f(l)
    for n in 22,if n not in l,break
    print n
Οurous
quelle
0

Javascript, 74

i=-1;a=prompt().split(',');while(i<21&&a.indexOf(String(++i))>=0);alert(i)

Schön und einfach! Beachten Sie die leere while-Schleife.

Sean Latham
quelle
0

JavaScript (E6) 35

Rekursive Funktion, Array-Parameter in Eingabe und Rückgabe der mex. Nicht auf 20 begrenzt

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

Test in der FireFox / FireBug-Konsole

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

Ausgabe

[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
quelle
0

PHP, 38 Bytes

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

PHP, 39 Bytes

<?for(;in_array($i++,$_GET););echo$i-1;
Jörg Hülsermann
quelle