Hariç tutulan minimum sayı


14

Bu, kolay, ısırık büyüklüğünde bir kod golfü olarak tasarlanmıştır.

Mex sayıların sonlu toplama (minimum hariç numara) en küçük negatif olmayan tamsayıdır 0, 1, 2, 3, 4, ...yok değil koleksiyonunda görünür. Başka bir deyişle, tamamlayıcı minimumdur. Mex operasyon analizi merkezidir tarafsız oyunlarda yer kombinatoryal oyun teorisi .

Amacınız , mümkün olduğunca az bayt kullanarak mex'i hesaplamak için bir program veya adlandırılmış işlev yazmaktır .

Giriş:

Herhangi bir sırada negatif olmayan tam sayıların listesi. Tekrar içerebilir. Kesinleştirmek için, liste uzunluğu ve elemanların izin aralığı her iki arasında olacaktır 0ve 20dahildir.

Burada "liste" tanımı esnektir. Bir sayı koleksiyonunu temsil eden herhangi bir yapı, öğelerin sabit bir sırasına sahip olduğu ve tekrarlara izin verdiği sürece iyidir. Uzunluğu dışında herhangi bir yardımcı bilgi içermeyebilir.

Giriş bir işlev bağımsız değişkeni olarak veya STDIN aracılığıyla alınabilir.

Çıktı

Hariç tutulan en küçük sayı. Çıktı alın veya yazdırın.

Test senaryoları

[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
Sayıları sabit bir aralıkla sınırlamak bu sorunu daha da basitleştirir.
Martin Ender

Dizi tüm numara varsa @ MartinBüttner 0için 20doğru çıktı 21. Ben bir test vakası ekleriz olduğunu. Evet, sabit aralık kesinlikle daha kolay hale geliyor, ancak biri hala tartışmalı olarak kullanabilir sys.maxintveya 2**64belirtmediysem.
xnor

Bu test senaryosuna gerek yok. Giriş yalnızca 21 eleman içerebilir.
Martin Ender

@ MartinBüttner Doğru, çit direği. Teşekkürler.
xnor

1
@KevinFegan Evet, mümkün olan maksimum çıktı 20'dir. Yorumum yanlış ve bence MartinBüttner yazıyor.
xnor

Yanıtlar:


11

Pyth , 6 bayt

h-U21Q

Örnek çalışma

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

Nasıl çalışır

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

Set listeye dönüştürüldüğünde, her zaman sıralı mıdır?
xnor

Pyth'in set farkı, sipariş edilen ilk argümanın ( range(21)) sırasını korur . (Bu aynı zamanda açıklamanın tamamen doğru olmadığı anlamına gelir. Pyth ve Python 3'ün ikisi de benim için oldukça yeni.)
Dennis

1
-Açıklığa kavuşturmak için, Pyth'te aslında bir filtredir - ikinci argümandan yoksunluk için ilk argümanı filtreler, ardından ilk argümanın (dize, liste veya küme) biçimine dönüştürür.
isaacg

Ayrıca, Dennis, h-U22Qizin verilen tam aralığı içeren girişe doğru 21 çıkışını vermelidir.
isaacg

@isaacg: Listenin uzunluğu da 20 ile sınırlıdır, bu nedenle 0'dan 20'ye kadar olan 21 sayının tümünü içeremez
Dennis

6

CJam, 11 8 bayt

K),l~^1<

Nasıl çalışır:

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"

Örnek giriş:

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

Çıktı:

10

Buradan çevrimiçi deneyin


CJam'deki tek karakterli sayılar ne kadar yükseliyor?
xnor

@xnor Ne yazık ki, 20 - sourceforge.net/p/cjam/wiki/Variables
Doktor

Şanslı bir seçim!
xnor

5

J - 13 karakter

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

J'de çok basit eylemler ve dolayısıyla daha küçük yapmak çok zor.

i.@210 ile 20 (dahil) arasında bir liste oluşturur. -.girişi bu listeden alır-çıkarır. 0{kalanın ilk öğesini, yani en küçük sayıyı alır. f=:adlandırılmış bir işlevi tanımlar. REPL'de:

   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'nın Kasım 2017'de piyasaya sürülmesinden bu yana, bu bağlamda i.@21yaşlılar için kullanmamıza izin vererek bizi bir bayt tasarruf eden yeni bir sözdizimi var (i.21).


İhtiyacın var f=:mı?
Esolanging Fruit

Kasım 2017'den bu yana i.@21-.]1 bayt tasarruf edecekti.
FrownyFrog

4

Golf Yazıları 7

~21,^0=

Peter Taylor'ın cevabının daha golf edilmiş bir versiyonu. Topluluk wiki beri onun yazı üzerine yorum temsilcisi yok.

Aradaki fark, bir karakteri kaydetmek ve alakasız $ 'ı düşürmek için uzunluk +1 yerine sorudan bilinen maksimum liste boyutunu kullanmaktır.

Çevrimiçi deneyin


1
-_-
Optimizer

4

Burlesque - 9 Bayt

20rzj\\<]

Stdin'den {7 6 5 5 1 2 2 4 2 0} formatında girdi alır

Açıklaması:

 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.

Bazı örnekleri deneyin:

{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
Bu, girişte herhangi bir çıkış veremez {0 1 2}, çünkü rzen büyük sayıdan daha fazlasına ihtiyacınız vardır . Sadece 20rzj\\<]düzeltmek için düz gitmek ve bir char kaydeder.
algorithmmshark

@algorithmshark Bunun bir yolu yok, çok haklısın. Sabit. Ve teşekkür ederim.
AndoDaan

3

Bash + coreutils, 23 bayt

seq 0 20|egrep -vwm1 $1

Bu, girişin |(boru) ayrılmış bir liste olduğunu varsayar . Örneğin:

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

1
"(...)"Etrafında ihtiyacın olduğunu sanmıyorum $1.
Dennis

1
Borudan ayrılmış iyidir, spesifikasyonların liste benzeri koşullarını karşılar.
xnor

2

Ruby, 32 bayt

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

fBir dizi ile çağrılacak bir işlevi tanımlar .


Downvoter'ın yorumları var mı? Spesifikasyonun bir kısmını kaçırdım mı?
Martin Ender

Şüpheliyim. Diğer bazı cevaplar (benimki dahil) gizemli bir düşüşe sahip oldu.
Greg Hewgill

@ipi, ancak ... meydan okuma direklerindeki örneklerde verilenle aynı formatta, örn. f[[0, 1]](burada dış parantezler çağırma sözdizimi ve iç parantezler diziyi tanımlar).
Martin Ender

Neden ihtiyacın var f=?
Esolanging Fruit

2

GolfScript ( 10 9 bayt)

~.,),^$0=

Stdin'den formatta girdi alır [5 4 1 5 4 8 2 1 5 4 0 7 7].

Çevrimiçi demo


Olmamalı ;girdi dizesi programında kendisi sayılır önce?
Optimizer

1
@Optimizer, çevrimiçi GolfScript sitesi ayrı bir giriş alanını desteklemediğinden stdin'den gelen girişi simüle eder.
Peter Taylor

2

Xojo, 55 bayt

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

2

Ruby, 22

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

açıklama

  • Girdi bir lambda'ya argüman olarak alınır. Bir beklediğini Arrayait Integers.
  • Giriş diziden çıkarılır [0,1,2..20].
  • Sıralandığından, Array [0,1,2..20]ilk öğe meks olmalıdır.

Tatlı, bu benim ilk denememdi, ama yıkımın işe yaramasını sağlayamadım - parantez içine almayı düşünmedim. Btw, 20bunun yerine kullanabilirsiniz 21, çünkü giriş yalnızca 20 öğe içerebilir.
Martin Ender

2

Haskell, 30

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

Bu, tüm boyuttaki listeler ve 20'nin üzerindeki listeler için çalışır. Bu, Data.List içe aktarılırsa 15 bayt uzunluğunda yapılabilir:

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

2

Şema - 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))))

Çok rekabetçi değil. Ama şema yazmayı seviyorum :),

İşte kodlanmamış kod:

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

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

Beni birkaç saniye döv. BTW, öyle range(21).
qwr

Bu en kısa çözüm gibi görünüyor. Özyinelemeli çözüm f=lambda l,i=0:i in l and f(l,i+1)or ibir karakterden daha uzun ve yinelemeli çözüm i=0;l=input()\nwhile i in l:i+=1\nprint iiki karakterden daha uzundur (girişi saklamamak tekrar tekrar yapılmasını sağlar). Sınır olmadan, 20bu yaklaşımların geçerli olacağını düşünüyorum.
xnor

Bu anonim bir işlev olamaz mı? Eğer yapabilirse, 2 bayt kaydedebilirsiniz.
Mega Man

1

64 karakter

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

Her zaman değil Nadiren en iyi golf dili, ancak yazmak ve anlamak kolaydır :)


1

Scala, 18 bayt

0 to 20 diff l min

l Int listesidir.

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 bayt

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

@LeakyNun sayesinde -3 bayt

Açıklama:

Sadece 0-20 değil, 0-2147483647'yi de destekler (bu aslında bayt tasarrufu sağlar).

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

Test kodu:

Burada deneyin.

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

Çıktı:

0
1
1
2
0
0
3
4
4
10




1

TI-BASIC, 24 bayt

: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

Tek Prompt Xbir numara yerine bir liste verilirse, otomatik Xolarak erişilebilen bir liste oluşturur ʟX.


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

1

Stax , 6 bayt

¢╔⌂♀╠▬

Çalıştır ve hata ayıkla

açıklama

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

Jöle , 7 bayt

Başka bir yaklaşım. Herhangi bir çapa sahip bir zincirde kullanılabilir ve zincir ayırıcıya veya herhangi bir şeye ihtiyaç duymaz.

‘Ṭ;0i0’

Cevabın 256'dan az olduğu garanti edildiğinden, bu da işe yarar:

Jöle , 5 bayt

⁹ḶḟµḢ

Çevrimiçi deneyin!


1

Powershell, 28 bayt

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

Test komut dosyası:

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

Çıktı:

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

Açıklama:

  • Arttırır $iise $argsdizi tam sayı değeri içerir +$i.
  • Son bir tamsayı değeri çıktılar +$i.

1

MathGolf , 5 4 bayt

Jr,╓

Çevrimiçi deneyin!

Bu çözüm sadece 0 ila 20 aralığıyla sınırlıdır, ancak bu başlangıç ​​aralığı artırılarak kolayca genişletilebilir.

Açıklama:

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

Alternatif olarak, tüm sayılar için 5 baytlık bir çözüm:

Åï╧▲ï

Çevrimiçi deneyin!

Açıklama:

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

Bugün (umarız) TIO'ya eklenen yeni değişikliklerle, bu soruna 4 baytlık bir çözüm var. Kodda tanımlanan bir üst sınırla sınırlıdır, ancak MathGolf'un 10 ^ 8 için 1 baytlık bir değişmez değeri olduğundan, fark edilmemelidir.
maxb

Bu tam çözümümdü ( tembel olduğum Zyerine kullandım J).
maxb

0

Perl - 34

İşte bir altyordam.

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

Şununla test et:

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

-1Test çantası için üretilir [].
OldCurmudgeon

0

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

Güzel ve basit! Boş while döngüsüne dikkat edin.


0

JavaScript (E6) 35

Özyinelemeli işlev, girişte dizi parametresi ve döndürme mex. 20 ile sınırlı değil

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

FireFox / FireBug konsolunda test

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

Çıktı

[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 Bayt

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

PHP, 39 Bayt

<?for(;in_array($i++,$_GET););echo$i-1;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.