Mainkan game eliminasi

12

pengantar

Dalam tantangan ini, tugas Anda adalah mensimulasikan jenis permainan eliminasi tertentu. Dalam permainan, para peserta berdiri dalam lingkaran, dan semua orang memegang bilangan bulat. Pada setiap putaran permainan, setiap peserta menunjuk pada orang tersebut nmenjauh, jika nnomor yang mereka pegang. Jika npositif, mereka menghitung ke kanan, jika nnegatif, mereka menghitung ke kiri, dan jika nnol, mereka menunjuk pada diri mereka sendiri. Setiap peserta yang memiliki seseorang yang menunjuk pada mereka dihilangkan, dan meninggalkan lingkaran; ini mengakhiri babak. Putaran berlanjut sampai tidak ada peserta yang tersisa.

Memasukkan

Input Anda adalah daftar bilangan bulat yang tidak kosong, dalam format apa pun yang masuk akal. Ini mewakili angka yang dipegang oleh para peserta game.

Keluaran

Output Anda adalah jumlah putaran yang dibutuhkan hingga permainan berakhir.

Contoh

Pertimbangkan daftar input [3,1,-2,0,8]. Di babak pertama, berikut ini terjadi:

  • Orang yang memegang 3menunjuk tepat ke orang yang memegang 0.
  • Orang yang memegang 1menunjuk tepat ke orang yang memegang -2.
  • Orang yang memegang -2poin tertinggal di orang yang memegang 3.
  • Orang yang memegang 0poin pada dirinya sendiri.
  • Orang yang memegang 8titik tepat di orang yang memegang -2(daftar mewakili lingkaran, sehingga membungkus di ujungnya).

Ini berarti 0, -2dan 3dihilangkan, sehingga putaran kedua dilakukan dengan daftar [1,8]. Di sini, 1menunjuk pada 8, dan 8menunjuk pada diri mereka sendiri, jadi 8dihilangkan. Babak ketiga dilakukan dengan daftar [1], di mana 1hanya menunjuk pada diri mereka sendiri dan dihilangkan. Butuh tiga putaran untuk menghilangkan semua peserta, sehingga hasil yang benar adalah 3.

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji kasus

[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
Zgarb
sumber
Anda yakin tentang test case terakhir, saya mendapat 5?
flawr
@ flawr Saya dapat memeriksa implementasi referensi saya dalam waktu sekitar satu jam (harus meninggalkan komputer saya), tetapi harus benar.
Zgarb
Untuk memperjelas: napakah nomor yang dipegang orang itu?
Peter Taylor
@PeterTaylor Ya, benar. Saya akan mengklarifikasi itu nanti dalam tantangan.
Zgarb

Jawaban:

4

Pyth, 15 byte

f!=.DQ.e%+bklQQ

Test suite berkat kirby

Menggunakan mekanisme iterasi yang sama dengan @orlp, tetapi mendeteksi jumlah iterasi menggunakan f, fungsi "Ulangi hingga falsy", untuk mendeteksi []begitu kita selesai.

isaacg
sumber
5

Matlab, 91 77 byte

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

Versi lama:

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

Ini adalah tantangan di mana matlab bersinar, inti dari kode ini adalah penghapusan entri array: a(mod((1:l)+a-1,l)+1)=[]menurut saya cukup elegan.

cacat
sumber
4

CJam, 21 byte

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

Suite uji.

Mengambil input sebagai daftar gaya CJam, tetapi test suite menangani konversi dari format dalam tantangan.

Penjelasan

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.
Martin Ender
sumber
Terima kasih: eehampir persis apa yang saya cari kemarin untuk pertanyaan yang berbeda.
Peter Taylor
3

C #, 251 219 211 197 193 byte

Bahasa non-esoterik yang paling tidak dapat diserang menyerang lagi.

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

Program ini mengharapkan urutan input sebagai argumen baris perintah. Misalnya, untuk memasukkan daftar [5,5,5,6,6,6], panggil saja dengan argumen baris perintah 5 5 5 6 6 6.

Terima kasih kepada Martin Büttner untuk beberapa tips.

Diubah menjadi 197 dengan menyadari bahwa saya dapat menggunakan kembali argsarray meskipun itu adalah array string. Saya hanya perlu menguraikannya menjadi bilangan bulat di satu tempat.

Bermain golf ke 193 dengan menyadari bahwa .Where(...==x).Any()itu lebih pendek dari .Select(...).Contains(x).

Tidak disatukan

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);
    }
}
Timwi
sumber
5
C # apakah yang paling tidak dapat ditiru? Tentunya Anda pasti salah; semua orang tahu itu Java. : P
Alex A.
@AlexA. Pfft, saya dengan Timwi yang satu ini. Saya telah mengalahkan C # dengan Java berkali-kali: P
Geobits
3
Anda salah, Pyth atau CJam adalah yang paling tidak dapat ditiru, C # adalah bahasa yang paling tidak dapat dimenangkan!
Beta Decay
2

R, 105 byte

kode

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
Mutador
sumber
2

Pyth, 17 byte

tl.u.DN.e%+kblNNQ

Kebetulan sangat mirip dengan jawaban Kirbyfan.

orlp
sumber
2

Mathematica, 71 byte

Length@FixedPointList[#~Delete~Mod[Plus~MapIndexed~#,Length@#,1]&,#]-2&
alephalpha
sumber
1
67:(i=0;#//.l:{__}:>l~Delete~Mod[++i;Plus~MapIndexed~l,Length@l,1];i)&
Martin Ender
1
The Plus~MapIndexed~#benar-benar pintar, tapi saya bertanya-tanya apakah tidak ada cara yang lebih pendek menggunakan l+Range@Length@l.
Martin Ender
1

STATA, 146 byte

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

Menggunakan versi berbayar dari STATA. Mengasumsikan input dalam file baris baru yang disebut a.. Terbatas pada situasi di mana tidak lebih dari 1.023 putaran diperlukan karena jumlah variabel maksimum yang diizinkan (dapat diperbaiki dengan biaya 10 byte). Itu membaca data dan menjalankan loop sampai tidak ada lagi pengamatan. Di setiap iterasi, buat variabel dengan nilai indeks yang ditunjuknya. Untuk setiap pengamatan, jika pengamatan lain menunjukkannya, tetapkan indikator untuk menjatuhkan variabel. Kemudian letakkan semua pengamatan dengan indikator itu dan tambahkan penghitung. Setelah loop, cetak penghitung.

tanda
sumber
1

Ruby, 78 74 byte

f=->a{b,i=[],0;(a.map{|e|b<<a[(e+i)%a.size]};a-=b;i+=1)while a.size>0;p i}
Peter Lenkefi
sumber
1

awk, 66 byte

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

Cukup gunakan mod length arrayuntuk menyimpannya di dalam array. Dalam input angka harus dipisahkan dengan spasi.

Contoh penggunaan

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'

Inilah semua contoh input dalam format yang sesuai

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 -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
Cabbie407
sumber
0

Python 2, 122 byte

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])
TFeld
sumber