Juega el juego de eliminación

12

Introducción

En este desafío, su tarea es simular un cierto tipo de juego de eliminación. En el juego, los participantes se paran en círculo y todos sostienen un número entero. En cada ronda del juego, cada participante señala a la persona nque se aleja, si nes el número que tiene. Si nes positivo, cuentan a su derecha, si nes negativo, cuentan a su izquierda, y si nes cero, se señalan a sí mismos. Cada participante que tiene a alguien que los señala se elimina y abandona el círculo; Esto termina la ronda. Las rondas continúan hasta que no quedan participantes.

Entrada

Su entrada es una lista no entera de enteros, en cualquier formato razonable. Representa los números que tienen los participantes del juego.

Salida

Su salida es la cantidad de rondas que se necesitan hasta que finaliza el juego.

Ejemplo

Considere la lista de entrada [3,1,-2,0,8]. En la primera ronda, sucede lo siguiente:

  • La persona que tiene 3puntos justo en la persona que tiene 0.
  • La persona que tiene 1puntos justo en la persona que tiene -2.
  • La persona que tiene -2puntos dejó en la persona que tiene 3.
  • La persona que tiene 0puntos en sí misma.
  • La persona que tiene 8puntos justo en la persona que tiene -2(la lista representa un círculo, por lo que se envuelve en los extremos).

Esto significa que 0, -2y 3se eliminan, por lo que la segunda ronda se realiza con la lista [1,8]. Aquí, 1apunta 8y 8apunta a sí mismo, por lo que 8se elimina. La tercera ronda se realiza con la lista [1], donde 1simplemente se señala a sí misma y se elimina. Se necesitaron tres rondas para eliminar a todos los participantes, por lo que el resultado correcto es 3.

Reglas y puntaje

Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.

Casos de prueba

[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
fuente
¿Estás seguro sobre el último caso de prueba, obtengo 5?
flawr
@flawr Puedo verificar mi implementación de referencia en aproximadamente una hora (tuve que dejar mi computadora), pero debería ser correcta.
Zgarb
Para ser claros: ¿ nes el número que tiene la persona?
Peter Taylor
@PeterTaylor Sí, lo es. Lo aclararé más adelante en el desafío.
Zgarb

Respuestas:

4

Pyth, 15 bytes

f!=.DQ.e%+bklQQ

Test suite gracias a Kirby

Utiliza el mismo mecanismo de iteración que @orlp, pero detecta el número de iteraciones usando fla función "Repetir hasta falsa", para detectar []una vez que hayamos terminado.

isaacg
fuente
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

Versión antigua:

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

Este es un desafío donde matlab brilla, el corazón de este código es la eliminación de las entradas de la matriz: a(mod((1:l)+a-1,l)+1)=[]que es bastante elegante, creo.

falla
fuente
4

CJam, 21 bytes

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

Banco de pruebas.

Toma datos como una lista de estilos de CJam, pero el conjunto de pruebas se encarga de la conversión del formato en el desafío.

Explicación

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
fuente
Gracias: eees casi exactamente lo que estaba buscando ayer para una pregunta diferente.
Peter Taylor
3

C #, 251 219 211 197 193 bytes

El lenguaje no esotérico más irrefrenable ataca de nuevo.

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

Este programa espera la secuencia de entrada como argumentos de línea de comandos. Por ejemplo, para ingresar la lista [5,5,5,6,6,6], llámela con argumentos de línea de comandos 5 5 5 6 6 6.

Gracias a Martin Büttner por algunos consejos.

Llegó a 197 al darme cuenta de que puedo reutilizar la argsmatriz a pesar de que es una serie de cadenas. Solo necesito analizarlos en un número entero en un solo lugar.

Golfó a 193 al darse cuenta de que .Where(...==x).Any()es más corto que .Select(...).Contains(x).

Sin golf

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
fuente
55
C # es el más irrefrenable? Seguramente debes estar equivocado; Todos saben que eso es Java. : P
Alex A.
@AlexA. Pfft, estoy con Timwi en este caso. He derrotado a C # con Java muchas veces: P
Geobits
3
Estás equivocado, Pyth o CJam son los más irrefrenables, ¡C # es el lenguaje más imposible de ganar!
Beta Decay
2

R, 105 bytes

código

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)

sin golf

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

Pyth, 17 bytes

tl.u.DN.e%+kblNNQ

Casualmente muy similar a la respuesta de Kirbyfan.

orlp
fuente
2

Mathematica, 71 bytes

Length@FixedPointList[#~Delete~Mod[Plus~MapIndexed~#,Length@#,1]&,#]-2&
alephalpha
fuente
1
67:(i=0;#//.l:{__}:>l~Delete~Mod[++i;Plus~MapIndexed~l,Length@l,1];i)&
Martin Ender
1
El Plus~MapIndexed~#es realmente inteligente, pero me pregunto si no hay una forma más corta de usar 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

Utiliza la versión paga de STATA. Asume que la entrada está en un archivo separado de nueva línea llamado a.. Limitado a situaciones en las que no se requieren más de 1023 rondas debido a un número máximo de variables permitidas (se puede arreglar al costo de 10 bytes). Lee los datos y ejecuta un bucle hasta que no haya más observaciones. En cada iteración, haga una variable con el valor del índice al que apunta. Para cada observación, si otra observación apunta a ella, establezca un indicador para descartar la variable. Luego suelte todas las observaciones con ese indicador e incremente el contador. Después del bucle, imprima el contador.

comentarios
fuente
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
fuente
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

Simplemente se usa mod length arraypara mantenerlo dentro de la matriz. En la entrada, los números deben estar separados por espacios.

Ejemplo de uso

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'

Aquí están todos los ejemplos de entrada en el formato apropiado

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
fuente
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
fuente