Spielen Sie das Ausscheidungsspiel

12

Einführung

In dieser Herausforderung musst du eine bestimmte Art von Ausscheidungsspiel simulieren. Im Spiel stehen die Teilnehmer in einem Kreis und jeder hält eine ganze Zahl. In jeder Runde des Spiels zeigt jeder Teilnehmer auf die Person n, die sich entfernt, wenn nes sich um die Nummer handelt, die er hält. Wenn nes positiv ist, zählen sie zu ihrer Rechten, wenn nes negativ ist, zählen sie zu ihrer Linken und wenn nes null ist, zeigen sie auf sich selbst. Jeder Teilnehmer, auf den jemand zeigt, scheidet aus und verlässt den Kreis. Damit ist die Runde beendet. Die Runden werden fortgesetzt, bis keine Teilnehmer mehr übrig sind.

Eingang

Ihre Eingabe ist eine nicht leere Liste von ganzen Zahlen in einem beliebigen vernünftigen Format. Es stellt die Zahlen dar, die die Teilnehmer des Spiels halten.

Ausgabe

Ihre Ausgabe ist die Anzahl der Runden, die es dauert, bis das Spiel endet.

Beispiel

Betrachten Sie die Eingabeliste [3,1,-2,0,8]. In der ersten Runde passiert Folgendes:

  • Die Person, die hält, 3zeigt direkt auf die Person, die hält 0.
  • Die Person, die hält, 1zeigt direkt auf die Person, die hält -2.
  • Die Person, die -2Punkte bei der Person, die hält, übrig hat 3.
  • Die Person, die 0Punkte auf sich hält.
  • Die Person, die hält, 8zeigt direkt auf die Person, die hält -2(die Liste stellt einen Kreis dar, sodass sie an den Enden umläuft).

Dies bedeutet , dass 0, -2und 3eliminiert werden, so dass die zweite Runde mit der Liste getan [1,8]. Hier 1zeigt auf 8und 8zeigt auf sich selbst, so 8wird beseitigt. Die dritte Runde erfolgt mit der Liste [1], in der 1einfach auf sich selbst zeigt und beseitigt wird. Es dauerte drei Runden, um alle Teilnehmer auszuschließen, daher ist die Ausgabe korrekt 3.

Regeln und Wertung

Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.

Testfälle

[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
quelle
Bist du dir sicher, dass ich im letzten Testfall 5 bekomme?
Fehler
@flawr Ich kann meine Referenzimplementierung in ungefähr einer Stunde überprüfen (musste meinen Computer verlassen), aber es sollte korrekt sein.
Zgarb
Um ganz klar zu sein: nIst die Nummer, die die Person in der Hand hält?
Peter Taylor
@ PeterTaylor Ja, das ist es. Ich werde das später in der Herausforderung klären.
Zgarb

Antworten:

4

Pyth, 15 Bytes

f!=.DQ.e%+bklQQ

Testsuite dank kirby

Verwendet den gleichen Iterationsmechanismus wie @orlp, ermittelt jedoch die Anzahl der Iterationen mithilfe fder Funktion "Wiederholen bis zur Ungenauigkeit", um das Ergebnis zu ermitteln [].

isaacg
quelle
5

Matlab, 91.77 Bytes

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

Alte Version:

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

Dies ist eine Herausforderung, bei der matlab glänzt. Das Herz dieses Codes ist das Löschen der Array-Einträge. a(mod((1:l)+a-1,l)+1)=[]Das finde ich ziemlich elegant.

Fehler
quelle
4

CJam, 21 Bytes

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

Testsuite.

Nimmt Eingaben als CJam-Style-Liste auf, aber die Testsuite übernimmt die Konvertierung aus dem Format in der Challenge.

Erläuterung

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
quelle
Danke: eeist fast genau das, wonach ich gestern für eine andere Frage gesucht habe.
Peter Taylor
3

C #, 251 219 211 197 193 Bytes

Die unrühmlichste nicht-esoterische Sprache schlägt wieder zu.

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

Dieses Programm erwartet die Eingabesequenz als Befehlszeilenargumente. Um die Liste beispielsweise einzugeben [5,5,5,6,6,6], rufen Sie sie mit Befehlszeilenargumenten auf 5 5 5 6 6 6.

Vielen Dank an Martin Büttner für ein paar Tipps.

Golfed es bis 197 durch die Erkenntnis, dass ich das argsArray wiederverwenden kann , obwohl es ein Array von Saiten ist. Ich muss sie nur an einer Stelle in eine ganze Zahl zerlegen.

Golf bis 193 durch die Erkenntnis, dass .Where(...==x).Any()kürzer als .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);
    }
}
Timwi
quelle
5
C # ist am ungolfbarsten? Sicherlich müssen Sie sich irren; Jeder weiß, dass das Java ist. : P
Alex A.
@AlexA. Pfft, ich bin mit Timwi dabei. Ich habe C # mit Java oft geschlagen: P
Geobits 16.10.15
3
Sie irren sich, Pyth oder CJam sind die am wenigsten spielbare, C # die am wenigsten spielbare Sprache!
Beta Decay
2

R, 105 Bytes

Code

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
quelle
2

Pyth, 17 Bytes

tl.u.DN.e%+kblNNQ

Zufälligerweise sehr ähnlich zu Kirbyfans Antwort.

orlp
quelle
2

Mathematica, 71 Bytes

Length@FixedPointList[#~Delete~Mod[Plus~MapIndexed~#,Length@#,1]&,#]-2&
Alephalpha
quelle
1
67:(i=0;#//.l:{__}:>l~Delete~Mod[++i;Plus~MapIndexed~l,Length@l,1];i)&
Martin Ender
1
Das Plus~MapIndexed~#ist wirklich klug, aber ich frage mich, ob es keinen kürzeren Weg gibt l+Range@Length@l.
Martin Ender
1

STATA, 146 Bytes

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

Verwendet die kostenpflichtige Version von STATA. Angenommen, die Eingabe befindet sich in einer durch Zeilenumbrüche getrennten Datei mit dem Namen a.. Beschränkt auf Situationen, in denen aufgrund der maximal zulässigen Anzahl von Variablen nicht mehr als 1023 Runden erforderlich sind (kann auf Kosten von 10 Byte festgelegt werden). Es liest die Daten und führt eine Schleife aus, bis keine Beobachtungen mehr vorliegen. Erstellen Sie in jeder Iteration eine Variable mit dem Wert des Indexes, auf den sie zeigt. Wenn für jede Beobachtung eine andere Beobachtung darauf hinweist, setzen Sie ein Kennzeichen, um die Variable fallen zu lassen. Lassen Sie dann alle Beobachtungen mit diesem Indikator fallen und erhöhen Sie den Zähler. Drucken Sie nach der Schleife den Zähler aus.

Markierungen
quelle
1

Ruby, 78 74 Bytes

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
quelle
1

awk, 66 bytes

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

Einfach benutzt mod length array , um es im Array zu behalten. In der Eingabe müssen die Zahlen durch Leerzeichen getrennt werden.

Anwendungsbeispiel

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'

Hier finden Sie alle Eingabebeispiele im entsprechenden Format

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
quelle
0

Python 2, 122 Bytes

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
quelle