เล่นเกมกำจัด


12

บทนำ

ในความท้าทายนี้งานของคุณคือจำลองเกมการกำจัดบางประเภท ในเกมผู้เข้าร่วมยืนเป็นวงกลมและทุกคนถือเลขจำนวนเต็ม ในแต่ละรอบของเกมผู้เข้าร่วมทุกคนจะได้คะแนนจากคนที่nก้าวออกไปถ้าnเป็นตัวเลขที่พวกเขาถืออยู่ ถ้าnเป็นบวกพวกเขานับไปทางขวาหากnเป็นลบพวกเขานับทางซ้ายและถ้าnเป็นศูนย์พวกเขาจะชี้ไปที่ตัวเอง ผู้เข้าร่วมทุกคนที่มีคนชี้ไปที่พวกเขาจะถูกกำจัดและออกจากวงกลม จบรอบนี้ รอบต่อไปจนกว่าจะไม่มีผู้เข้าร่วมเหลือ

อินพุต

ข้อมูลที่คุณป้อนเป็นรายการจำนวนเต็มที่ไม่ว่างเปล่าในรูปแบบที่เหมาะสม มันหมายถึงตัวเลขที่ผู้เข้าร่วมของเกมจะถือ

เอาท์พุต

ผลลัพธ์ของคุณคือจำนวนรอบที่ใช้จนกว่าเกมจะจบลง

ตัวอย่าง

[3,1,-2,0,8]พิจารณารายชื่อการป้อนข้อมูล ในรอบแรกสิ่งต่อไปนี้จะเกิดขึ้น:

  • คนถือจุดที่เหมาะสมในการถือครองคน30
  • คนถือจุดที่เหมาะสมในการถือครองคน1-2
  • คนที่ถือครองจุดซ้ายที่ถือครองคน-23
  • คนที่ถือ0คะแนนในตัวเอง
  • บุคคลที่ถือ8คะแนนอยู่ที่บุคคลที่ถือ-2(รายการแสดงถึงวงกลมดังนั้นจึงล้อมรอบที่ปลาย)

ซึ่งหมายความว่า0, -2และจะถูกตัดออกเพื่อให้รอบที่สองจะทำกับรายการ3 [1,8]ที่นี่1ชี้ไปที่8และ8ชี้ไปที่ตัวเองจึง8ถูกกำจัด รอบที่สามจะทำกับรายการ[1]ที่1เพียงแค่ชี้ที่ตัวเองและจะถูกกำจัดออก 3มันต้องใช้เวลาสามรอบเพื่อกำจัดผู้เข้าร่วมทั้งหมดเพื่อการส่งออกที่ถูกต้องคือ

กฎและการให้คะแนน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต

กรณีทดสอบ

[3] -> 1
[0,0,0] -> 1
[-2,-1,0,1,2,3,4,5,6,7] -> 2
[5,5,5,6,6,6] -> 2
[3,-7,-13,18,-10,8] -> 2
[-7,5,1,-5,-13,-10,9] -> 2
[4,20,19,16,8,-9,-14,-2,17,7,2,-2,10,0,18,-5,-5,20] -> 3
[11,2,7,-6,-15,-8,15,-12,-2,-8,-17,6,-6,-5,0,-20,-2,11,1] -> 4
[2,-12,-11,7,-16,9,15,-10,7,3,-17,18,6,6,13,0,18,10,-7,-1] -> 3
[18,-18,-16,-2,-19,1,-9,-18,2,1,6,-15,12,3,-10,8,-3,7,-4,-11,5,-15,17,17,-20,11,-13,9,15] -> 6

คุณแน่ใจเกี่ยวกับกรณีทดสอบสุดท้ายฉันได้รับ 5 หรือไม่
ข้อบกพร่อง

@flawr ฉันสามารถตรวจสอบการใช้งานอ้างอิงของฉันในอีกประมาณหนึ่งชั่วโมง (ต้องออกจากคอมพิวเตอร์ของฉัน) แต่ควรจะถูกต้อง
Zgarb

เพื่อให้ชัดเจน: nหมายเลขที่บุคคลนั้นถืออยู่หรือไม่
Peter Taylor

@PeterTaylor ใช่มันเป็น ฉันจะชี้แจงว่าต่อมาในการท้าทาย
Zgarb

คำตอบ:


4

Pyth, 15 ไบต์

f!=.DQ.e%+bklQQ

ชุดทดสอบต้องขอบคุณเคอร์บี้

ใช้กลไกการวนซ้ำเช่นเดียวกับ @orlp แต่ตรวจจับจำนวนการวนซ้ำที่ใช้ฟังก์ชันf"ทำซ้ำจนกระทั่งเป็นเท็จ" เพื่อตรวจจับ[]เมื่อเราเสร็จสิ้น


5

Matlab, 91 77 ไบต์

function k=f(a);k=0;while a*0+1;l=numel(a);a(mod((1:l)+a-1,l)+1)=[];k=k+1;end

เวอร์ชั่นเก่า:

function k=f(a);for k=1:numel(a);a(mod((1:l)+a-1,l)+1)=[];l=numel(a);if l==0;break;end;end

นี่เป็นความท้าทายที่ MATLAB ส่องหัวใจของรหัสนี้คือการลบรายการอาร์เรย์: a(mod((1:l)+a-1,l)+1)=[]ซึ่งฉันคิดว่าค่อนข้างสง่างาม


4

CJam, 21 ไบต์

q~{__ee{~+0t}/0-}h],(

ชุดทดสอบ

ใช้อินพุตเป็นรายการสไตล์ CJam แต่ชุดทดสอบจะดูแลการแปลงจากรูปแบบในการท้าทาย

คำอธิบาย

q~     e# Read and evaluate the input.
{      e# While the array is non-empty...
  _    e#   Copy the array. The original is left on the stack so that we can use the
       e#   stack depth to count the number of iterations later.
  _ee  e#   Make another copy and enumerate it, which means that each element is replaced
       e#   by a pair containing the element and its index in the array.
  {    e#   For each such pair...
    ~+ e#     Add the value to the index, giving the index it points at.
    0t e#     Set the value in the original array at the pointed-at index to 0.
       e#     This works without giving false positives because all 0s point to themselves.
  }/
  0-   e#   Remove all 0s from the array.
}h
],(    e# Wrap the stack in an array, get its length and decrement it to determine how
       e# many iterations this process took.

ขอบคุณ: eeเกือบเป็นสิ่งที่ฉันกำลังมองหาเมื่อวานสำหรับคำถามอื่น
Peter Taylor

3

C #, 251 219 211 197 193 ไบต์

ภาษาที่ไม่ลึกลับซึ่งไม่น่ารังเกียจที่สุดกระทบใจอีกครั้ง

using System.Linq;class X{static void Main(string[]a){int i=0,c;for(;(c=a.Length)>0;i++)a=a.Where((e,x)=>!a.Where((f,y)=>((int.Parse(f)+y)%c+c)%c==x).Any()).ToArray();System.Console.Write(i);}}

โปรแกรมนี้คาดว่าลำดับการป้อนข้อมูลเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ยกตัวอย่างเช่นการป้อนข้อมูลรายการเรียกว่ามีข้อโต้แย้งบรรทัดคำสั่ง[5,5,5,6,6,6]5 5 5 6 6 6

ขอบคุณ Martin Büttnerสำหรับคำแนะนำ

นำมารวมกันที่197โดยตระหนักว่าฉันสามารถนำargsอาเรย์กลับมาใช้ใหม่ได้แม้ว่ามันจะเป็นสตริง ฉันจะต้องแยกพวกเขาเป็นจำนวนเต็มในที่เดียว

แข็งแรงเล่นกอล์ฟไป193โดยตระหนักว่าจะสั้นกว่า.Where(...==x).Any().Select(...).Contains(x)

Ungolfed

using System.Linq;
class X
{
    static void Main(string[] args)
    {
        var iterations = 0, count;

        // In the golfed version, this is a `for` loop instead.
        while ((count = args.Length) > 0)
        {
            // Create a new args array containing the items to be kept.
            args = args.Where((item, index) =>
            {
                // Should the item at index `index` be deleted?
                var deleteThisIndex = args.Where((item2, index2) =>
                    // Modulo that works with negative numbers...
                    ((int.Parse(item2) + index2) % count + count) % count
                        == index);

                return !deleteThisIndex.Any();

            }).ToArray();

            iterations++;
        }

        System.Console.Write(iterations);
    }
}

5
C # เป็นสิ่งที่เลวร้ายที่สุด? แน่นอนคุณต้องเข้าใจผิด ทุกคนรู้ว่านั่นคือ Java : P
Alex A.

@AlexA Pfft ฉันอยู่กับ Timwi ในอันนี้ ฉันใช้ภาษา C # กับ Java หลายครั้ง: P
Geobits

3
คุณผิด Pythe หรือ CJam เป็นคนที่น่ารังเกียจมากที่สุด C # เป็นภาษาที่ไม่สามารถเอาชนะได้มากที่สุด!
สลายตัวเบต้า


2

R, 105 ไบต์

รหัส

l=scan();o=c();z=0;while((n=length(l))>0){for(i in 1:n)o=c(o,(i+l[i]-1)%%n+1);l=l[-o];o=c();z=z+1};cat(z)

ungolfed

l <- scan()                  # get input as a 'l' vector from user
o <- c()                     # create a empty vector
z=0                          # create a counter starting at 0   
while((n=length(l))>0){      # while the length of the input is more than 0
  for(i in 1:n){             # iterate through the vector
    o=c(o,(i+l[i]-1)%%n+1)   # add the index that will be deleted to the 'o' vector
  }
  l=l[-o]                    # remove the 'o' vector indexes from 'l'
  o=c()                      # empty 'o'
  z=z+1                      # add 1 to counter
}
cat(z)                       # print the counter


2

Mathematica, 71 ไบต์

Length@FixedPointList[#~Delete~Mod[Plus~MapIndexed~#,Length@#,1]&,#]-2&

1
67:(i=0;#//.l:{__}:>l~Delete~Mod[++i;Plus~MapIndexed~l,Length@l,1];i)&
Martin Ender

1
Plus~MapIndexed~#เป็นคนฉลาดจริงๆ l+Range@Length@lแต่ฉันสงสัยว่ามีไม่ได้เป็นวิธีที่สั้นลงโดยใช้
Martin Ender

1

STATA, 146 ไบต์

inf a using a.
gl b=0
qui while _N>0{
g q$b=0
g c$b=mod(_n+a-1,_N)+1
forv y=1/`=_N'{
replace q$b=1 if _n==c$b[`y']
}
drop if q$b
gl b=$b+1
}
di $b

ใช้ STATA รุ่นที่ต้องชำระเงิน a.ถือว่าการป้อนข้อมูลที่อยู่ในการขึ้นบรรทัดใหม่แยกไฟล์ที่เรียกว่า จำกัด เฉพาะสถานการณ์ที่ไม่ต้องการเกิน 1,023 รอบเนื่องจากมีจำนวนตัวแปรสูงสุดที่อนุญาต (สามารถแก้ไขได้ที่ราคา 10 ไบต์) มันอ่านข้อมูลและรันลูปจนกว่าจะไม่มีข้อสังเกตอีกต่อไป ในการวนซ้ำแต่ละครั้งให้สร้างตัวแปรด้วยค่าของดัชนีที่ชี้ไป สำหรับการสังเกตแต่ละครั้งหากมีการสังเกตอีกจุดหนึ่งให้ตั้งตัวบ่งชี้เพื่อปล่อยตัวแปร จากนั้นให้วางข้อสังเกตทั้งหมดด้วยตัวบ่งชี้นั้นและเพิ่มตัวนับ หลังจากวนรอบพิมพ์ตัวนับ



1

awk, 66 ไบต์

{for(;n=split($0=$0,a);++r)for(i in a)$((i+a[i]%n+n-1)%n+1)=X}$0=r

เพียงใช้mod length arrayเพื่อเก็บไว้ในอาร์เรย์ ในการป้อนตัวเลขจะต้องคั่นด้วยช่องว่าง

ตัวอย่างการใช้งาน

echo "-2 -1 0 1 2 3 4 5 6 7" | awk '{for(;n=split($0=$0,a);++r)for(i in a)$((i+a[i]%n+n-1)%n+1)=X}$0=r'

นี่คือตัวอย่างอินพุตทั้งหมดในรูปแบบที่เหมาะสม

3
0 0 0
-2 -1 0 1 2 3 4 5 6 7
5 5 5 6 6 6
3 -7 -13 18 -10 8
-7 5 1 -5 -13 -10 9
4 20 19 16 8 -9 -14 -2 17 7 2 -2 10 0 18 -5 -5 20
11 2 7 -6 -15 -8 15 -12 -2 -8 -17 -6 6 -6 -5 0 -20 -2 11 1
2 -12 -11 7 -16 9 15 -10 7 3 -17 18 6 6 13 0 18 10 -7 -1
18 -18 -16 -2 -19 1 -9 -18 2 1 6 -15 12 3 -10 8 -3 7 -4 -11 5 -15 17 17 -20 11 -13 9 15

0

Python 2, 122 ไบต์

def f(l):
 if not l:return 0
 L=len(l);x=[1]*L
 for i in range(L):x[(i+l[i])%L]=0
 return 1+e([v for i,v in zip(x,l)if i])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.