จำนวนที่ไม่รวมขั้นต่ำ


14

สิ่งนี้มีจุดประสงค์เพื่อให้ง่ายต่อการเล่นกอล์ฟ

MEX (หมายเลขยกเว้นน้อยที่สุด) ของคอลเลกชัน จำกัด ของตัวเลขเป็นจำนวนเต็มไม่ใช่เชิงลบที่เล็กที่สุด0, 1, 2, 3, 4, ...ที่ไม่ได้ปรากฏอยู่ในคอลเลกชัน มันเป็นส่วนประกอบขั้นต่ำ การดำเนินการ MEX เป็นศูนย์กลางในการวิเคราะห์ของเกมที่เป็นกลางในทฤษฎีเกม combinatorial

เป้าหมายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่มีชื่อเพื่อคำนวณ 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
การ จำกัด หมายเลขให้อยู่ในช่วงคงที่ทำให้ปัญหานี้ง่ายยิ่งขึ้น
Martin Ender

@ MartinBüttnerถ้าอาร์เรย์มีตัวเลขทั้งหมด0เพื่อ20การแสดงผลที่ถูกต้องคือ 21. ฉันจะเพิ่มกรณีทดสอบ ใช่ช่วงที่แน่นอนทำให้มันง่ายขึ้นแม้ว่าจะยังสามารถใช้งานได้sys.maxintหรือ2**64ถ้าฉันไม่ได้ระบุ
xnor

ไม่จำเป็นสำหรับกรณีทดสอบนั้น คุณกล่าวว่าอินพุตมีได้เพียง 21 องค์ประกอบเท่านั้น
Martin Ender

@ 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 ทั้งคู่ค่อนข้างใหม่สำหรับฉัน)
Dennis

1
เพื่อชี้แจง-ใน Pyth เป็นจริงตัวกรอง - มันกรองอาร์กิวเมนต์แรกสำหรับการขาดจากอาร์กิวเมนต์ที่สองจากนั้นแปลงเป็นรูปแบบของอาร์กิวเมนต์แรก (สตริงรายการหรือชุด)
isaacg

นอกจากนี้เดนนิสก็ควรที่h-U22Qจะให้เอาต์พุตที่ถูกต้องที่ 21 บนอินพุตที่มีช่วงเต็มที่อนุญาต
isaacg

@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

5

J - 13 ตัวอักษร

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

การกระทำที่ง่ายมากใน J และยากมากที่จะทำให้เล็กลง

i.@21 สร้างรายการจาก 0 ถึง 20 รวม -.ดำเนินการตั้งค่าลบอินพุตจากรายการนี้ 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=:ไหม
แยกผลไม้

ตั้งแต่เดือนพฤศจิกายน 2017 i.@21-.]จะประหยัด 1 ไบต์
FrownyFrog

4

Golfscript 7

~21,^0=

คำตอบของ Peter Taylor รุ่นต่อไป ชุมชน wiki เนื่องจากฉันไม่มีตัวแทนที่จะแสดงความคิดเห็นในโพสต์ของเขา

ความแตกต่างคือการใช้ขนาดรายการสูงสุดที่ทราบจากคำถามแทนความยาว +1 เพื่อบันทึกอักขระและวาง $ ที่ไม่เกี่ยวข้อง

ลองออนไลน์


1
Dammit Golfscript สำหรับบันทึก 1 ตัวอักษรเพื่อไม่ให้อ่านอินพุต -_-
เครื่องมือเพิ่มประสิทธิภาพ

4

Burlesque - 9 ไบต์

20rzj\\<]

รับอินพุตจาก stdin ในรูปแบบ {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

Ruby, 32 ไบต์

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

กำหนดฟังก์ชั่นที่fจะถูกเรียกด้วยอาเรย์


ความคิดเห็นใด ๆ จากผู้ลงคะแนน? ฉันพลาดบางส่วนของข้อมูลจำเพาะหรือไม่
Martin Ender

ฉันสงสัยมัน. คำตอบอื่น ๆ อีกหลาย (รวมถึงของฉัน) มี downvote ลึกลับ
เกร็กฮิวกิล

@ipi แต่ใช้ ... ในรูปแบบเดียวกันกับที่ระบุไว้ในตัวอย่างในโพสต์ท้าทายเช่นf[[0, 1]](โดยที่วงเล็บด้านนอกเป็นไวยากรณ์การเรียกใช้และวงเล็บภายในจะกำหนดอาร์เรย์)
Martin Ender

ทำไมคุณต้องการf=?
ผลไม้แยกแยะ

2

GolfScript ( 10 9 ไบต์)

~.,),^$0=

นำข้อมูลจาก stdin [5 4 1 5 4 8 2 1 5 4 0 7 7]ในรูปแบบ

การสาธิตออนไลน์


ไม่ควรนับ;ก่อนสตริงอินพุตในโปรแกรมเองใช่หรือไม่
เครื่องมือเพิ่มประสิทธิภาพ

1
@Optimizer นั่นเป็นการจำลองอินพุตจาก stdin เนื่องจากเว็บไซต์ GolfScript ออนไลน์ไม่สนับสนุนฟิลด์อินพุตแยกต่างหาก
Peter Taylor


2

ทับทิม, 22

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

คำอธิบาย

  • อินพุตถูกใช้เป็นอาร์กิวเมนต์สำหรับแลมบ์ดา มันคาดหวังArrayของInteger s
  • อินพุตถูกลบออกจากอาร์เรย์ [0,1,2..20]การป้อนข้อมูลที่ถูกลบออกจากอาร์เรย์
  • เนื่องจากArray [0,1,2..20]มีการเรียงลำดับองค์ประกอบแรกจะต้องเป็น mex

น่ารักนั่นเป็นความพยายามครั้งแรกของฉัน แต่ฉันไม่สามารถทำลายการทำงานได้ - ฉันไม่ได้คิดถึงการล้อมรอบด้วยวงเล็บ Btw คุณสามารถใช้20แทน21เพราะอินพุตสามารถมีได้ 20 องค์ประกอบเท่านั้น
Martin Ender

2

Haskell, 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))))

ไม่ค่อยมีการแข่งขัน แต่ฉันชอบรูปแบบการเขียน :)

นี่คือรหัส ungolfed:

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

เอาชนะฉันสักสองสามวินาที BTW 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

Heh ห้องสมุด
Leun Nun



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 ไบต์

อีกแนวทางหนึ่ง สามารถนำมาใช้ในห่วงโซ่ที่มี arity ใด ๆ และไม่จำเป็นต้องมีตัวคั่นโซ่หรืออะไร

‘Ṭ;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

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

Produces -1 for test case [].
OldCurmudgeon



0

JavaScript (E6) 35

Recursive function, array parameter in input and returning the mex. Not limited to 20

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

Test in FireFox/FireBug console

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

Output

[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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.