Eliminasyon oyunu oyna


12

Giriş

Bu meydan okumada, göreviniz belirli bir tür eleme oyunu simüle etmektir. Oyunda katılımcılar bir daire içinde duruyor ve herkes bir tamsayı tutuyor. Oyunun her turunda, her katılımcı , elinde tuttuğu sayı nise n, uzaklaşır . Eğer npozitif ise, onlar, onların sağa saymak nnegatif onların sola saymak ve eğer nsıfırdır, kendi kendilerini etmektedir. Birini işaret eden her katılımcı elenir ve daireyi terk eder; bu tur sona erer. Hiç katılımcı kalmayıncaya kadar turlar devam eder.

Giriş

Girişiniz, herhangi bir makul biçimde boş olmayan bir tamsayı listesidir. Oyunun katılımcılarının sahip olduğu sayıları temsil eder.

Çıktı

Çıktınız oyun bitene kadar geçen tur sayısıdır.

Misal

Giriş listesini düşünün [3,1,-2,0,8]. İlk turda aşağıdakiler olur:

  • Holding kişi, tutan kişiye 3işaret eder 0.
  • Holding kişi, tutan kişiye 1işaret eder -2.
  • Puan tutan kişi, tutan kişiye -2bırakıldı 3.
  • 0Kendini tutan kişi kendini gösteriyor .
  • Tutan kişi, doğrudan tutulan kişiye 8işaret -2eder (liste bir daireyi temsil eder, bu nedenle uçlarda sarar).

Bu demektir ki 0, -2ve 3yok edilir, böylece ikinci tur listesi ile yapılır [1,8]. Burada, 1en noktaları 8ve 8kendi kendilerine de noktalarında, yani 8elimine edilir. Üçüncü tur listesi ile yapılır [1], 1sadece kendi kendilerine işaret ve elimine edilir. Tüm katılımcıları ortadan kaldırmak üç tur aldı, bu yüzden doğru çıktı 3.

Kurallar ve puanlama

Tam bir program veya işlev yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test senaryoları

[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

Son test durumundan emin misin, 5 olsun?
Kusur

@flawr Referans uygulamamı yaklaşık bir saat içinde kontrol edebilirim (bilgisayarımdan ayrılmak zorunda kaldım), ama doğru olmalı.
Zgarb

Açık olmak ngerekirse: kişinin elinde tuttuğu sayı mı?
Peter Taylor

@PeterTaylor Evet, öyle. Bunu meydan okumada daha sonra açıklığa kavuşturacağım.
Zgarb

Yanıtlar:


4

Pyth, 15 bayt

f!=.DQ.e%+bklQQ

Kirby sayesinde test takımı

@Orlp ile aynı yineleme mekanizmasını kullanır, ancak bir kez yapıldığımızı ftespit etmek için "Falsiye kadar tekrarla" işlevini kullanarak yineleme sayısını algılar [].


5

Matlab, 91 77 bayt

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

Eski versiyon:

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

Bu matlab parlayan bir meydan okuma, bu kodun kalbi dizi girişlerinin silinmesi: a(mod((1:l)+a-1,l)+1)=[]bence oldukça zarif.


4

CJam, 21 bayt

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

Test odası.

Bir CJam stil listesi olarak girdi alır, ancak test paketi, meydan okumadaki formattan dönüşümle ilgilenir.

açıklama

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.

Teşekkürler: eehemen hemen farklı bir soru için dün aradığım şeydi.
Peter Taylor

3

C #, 251 219 211 197 193 bayt

En ungolfable olmayan ezoterik olmayan dil tekrar vuruyor.

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

Bu program giriş sırasını komut satırı bağımsız değişkenleri olarak bekler. Örneğin, listeyi girmek için listeyi [5,5,5,6,6,6]komut satırı bağımsız değişkenleriyle çağırın 5 5 5 6 6 6.

Bazı ipuçları için Martin Büttner'a teşekkürler.

Dizeleri bir dizi olmasına rağmen dizi yeniden kullanabilirsiniz fark ederek 197 Golf args. Onları tek bir yerde tamsayı olarak ayrıştırmam gerekiyor.

Bunun daha kısa olduğunu fark ederek 193'e golf oynadı ..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 # en ungolfable nedir? Elbette yanılmış olmalısınız; herkes bunun Java olduğunu biliyor. : P
Alex

@AlexA. Pfft, bu konuda Timwi ile birlikteyim. C # ile Java'yı defalarca
yedim

3
Yanılıyorsun, Pyth veya CJam en ungolfable, C # en yenilmez dil!
Beta Çürümesi


2

R, 105 bayt

kod

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

Pyth, 17 bayt

tl.u.DN.e%+kblNNQ

Tesadüfen kirbyfan'ın cevabına çok benziyor.


2

Mathematica, 71 bayt

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~#Gerçekten akıllıca, ama kullanan daha kısa bir yol yoktur acaba l+Range@Length@l.
Martin Ender

1

STATA, 146 bayt

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'nın ücretli sürümünü kullanır. Girdinin yeni satırla ayrılmış dosyada olduğunu varsayar a.. İzin verilen maksimum değişken sayısı nedeniyle 1023'den fazla turun gerekmediği durumlarla sınırlıdır (10 baytlık maliyetle sabitlenebilir). Verileri okur ve daha fazla gözlem kalmayana kadar bir döngü çalıştırır. Her yinelemede, işaret ettiği dizinin değeriyle bir değişken yapın. Her gözlem için, başka bir gözlem bunu gösteriyorsa, değişkeni bırakmak için bir gösterge ayarlayın. Ardından bu göstergeyle tüm gözlemleri bırakın ve sayacı artırın. Döngüden sonra sayacı yazdırın.


1

Yakut, 78 74 bayt

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

1

awk, 66 bayt

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

mod length arrayDizinin içinde tutmak için kullanır . Girişte sayıların boşluklarla ayrılması gerekir.

Kullanım örneği

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'

İşte uygun formattaki tüm giriş örnekleri

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 19-9-18 18 1 6-15 12 3-10 8 -3 7-4-11 5-15 17 17-20 11-13 9 15

0

Python 2, 122 bayt

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])
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.