Zagraj w grę eliminacyjną


12

Wprowadzenie

W tym wyzwaniu Twoim zadaniem jest symulacja pewnego rodzaju gry eliminacyjnej. W grze uczestnicy stoją w kręgu, a wszyscy trzymają liczbę całkowitą. W każdej rundzie gry każdy uczestnik wskazuje na osobę noddalającą się, jeśli njest to liczba, którą trzyma. Jeśli njest dodatnia, liczą się po prawej stronie, jeśli njest ujemna, liczą po lewej, a jeśli nwynosi zero, wskazują na siebie. Każdy uczestnik, który ma na siebie kogoś wskazującego, zostaje wyeliminowany i opuszcza krąg; to kończy rundę. Rundy trwają, dopóki nie pozostanie żaden uczestnik.

Wejście

Twoje dane wejściowe to niepusta lista liczb całkowitych, w dowolnym rozsądnym formacie. Reprezentuje liczby, które trzymają uczestnicy gry.

Wynik

Twój wynik to liczba rund potrzebnych do zakończenia gry.

Przykład

Rozważ listę danych wejściowych [3,1,-2,0,8]. W pierwszej rundzie następują:

  • Osoba trzymająca 3wskazuje bezpośrednio na osobę trzymającą 0.
  • Osoba trzymająca 1wskazuje bezpośrednio na osobę trzymającą -2.
  • Osoba trzymająca -2punkty pozostawione na osobę trzymającą 3.
  • Osoba trzymająca 0wskazuje na siebie.
  • Osoba trzymająca 8wskazuje bezpośrednio na osobę trzymającą -2(lista reprezentuje okrąg, więc zawija się na końcach).

Oznacza to, że 0, -2i 3są eliminowane, więc druga tura odbywa się z listy [1,8]. Tutaj 1wskazuje na 8i 8punktów na samym sobą, więc 8jest wyeliminowana. Trzecia runda składa się z listy [1], w której 1po prostu wskazuje na siebie i jest eliminowana. Eliminacja wszystkich uczestników zajęła trzy rundy, więc prawidłowy wynik to 3.

Zasady i punktacja

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Przypadki testowe

[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

Czy jesteś pewien ostatniego testu, mam 5?
flawr

@flawr Mogę sprawdzić implementację referencji za około godzinę (musiałem opuścić komputer), ale powinna być poprawna.
Zgarb

Żeby było jasne: nczy numer jest w posiadaniu osoby?
Peter Taylor

@PeterTaylor Tak, to prawda. Wyjaśnię to później w wyzwaniu.
Zgarb

Odpowiedzi:


4

Pyth, 15 bajtów

f!=.DQ.e%+bklQQ

Zestaw testowy dzięki Kirby

Używa tego samego mechanizmu iteracji co @orlp, ale wykrywa liczbę iteracji za pomocą ffunkcji „Powtarzaj do fałszowania”, aby wykryć [], kiedy skończymy.


5

Matlab, 91 77 bajtów

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

Stara wersja:

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

Jest to wyzwanie, w którym Matlab świeci. Sercem tego kodu jest usunięcie wpisów z tablicy: a(mod((1:l)+a-1,l)+1)=[]myślę, że jest dość elegancki.


4

CJam, 21 bajtów

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

Zestaw testowy.

Pobiera dane wejściowe jako listę stylów CJam, ale pakiet testowy zajmuje się konwersją z formatu w wyzwaniu.

Wyjaśnienie

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.

Dzięki: eejest prawie dokładnie tym, czego szukałem wczoraj dla innego pytania.
Peter Taylor

3

C #, 251 219 211 197 193 bajtów

Najbardziej nieludzki nieezoteryczny język uderza ponownie.

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

Ten program oczekuje sekwencji wejściowej jako argumentów wiersza poleceń. Na przykład, aby wprowadzić listę [5,5,5,6,6,6], wywołaj ją z argumentami wiersza poleceń 5 5 5 6 6 6.

Podziękowania dla Martina Büttnera za wskazówki.

Grałem w golfa do 197 , zdając sobie sprawę, że mogę ponownie użyć argstablicy, mimo że jest to tablica ciągów. Muszę tylko parsować je w liczbę całkowitą w jednym miejscu.

Grał w golfa do 193 , zdając sobie sprawę, że .Where(...==x).Any()jest krótszy niż .Select(...).Contains(x).

Nie golfił

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 # jest najbardziej niestosowny? Na pewno się mylicie; wszyscy wiedzą, że to Java. : P
Alex A.,

@AlexA. Pfft, jestem z Timwi w tej sprawie. Wiele razy
pokonałem

3
Mylisz się, Pyth lub CJam są najbardziej nieuleczalne, C # to najbardziej nie do zdobycia język!
Beta Decay


2

R, 105 bajtów

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)

bez golfa

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 bajtów

tl.u.DN.e%+kblNNQ

Przypadkowo bardzo podobny do odpowiedzi Kirbyfana.


2

Mathematica, 71 bajtów

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
To Plus~MapIndexed~#jest naprawdę sprytne, ale zastanawiam się, czy nie ma krótszego sposobu użycia l+Range@Length@l.
Martin Ender

1

STATA, 146 bajtów

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

Korzysta z płatnej wersji STATA. Zakłada, że ​​dane wejściowe znajdują się w pliku oddzielonym znakiem nowej linii o nazwie a.. Ograniczone do sytuacji, w których wymagane jest nie więcej niż 1023 rund ze względu na maksymalną dozwoloną liczbę zmiennych (można to ustalić kosztem 10 bajtów). Odczytuje dane i uruchamia pętlę, aż nie będzie już żadnych obserwacji. W każdej iteracji utwórz zmienną o wartości indeksu, na który wskazuje. Jeśli dla każdej obserwacji wskazuje na to inna obserwacja, ustaw wskaźnik, aby upuścić zmienną. Następnie upuść wszystkie obserwacje z tym wskaźnikiem i zwiększ licznik. Po pętli wydrukuj licznik.


1

Rubinowy, 78 74 bajtów

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 bajtów

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

Po prostu używa, mod length arrayaby utrzymać go w tablicy. Na wejściu liczby muszą być oddzielone spacjami.

Przykład użycia

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'

Oto wszystkie przykłady wprowadzania w odpowiednim formacie

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

0

Python 2, 122 bajty

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])
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.