Играть в игру на выбывание


12

Вступление

В этом задании ваша задача - смоделировать игру определенного типа. В игре участники стоят в кругу, и все держат целое число. В каждом раунде игры каждый участник указывает на человека, nотступающего, если nэто число, которое он держит. Если nположительный, они считают справа, если nотрицательный, они считают слева, а если nноль, они указывают на себя. Каждый участник, на которого кто-то указывает, исключается и покидает круг; это заканчивается раунд. Раунды продолжаются до тех пор, пока не останется ни одного участника.

вход

Ваш ввод представляет собой непустой список целых чисел в любом приемлемом формате. Он представляет собой числа, которые держат участники игры.

Выход

Ваш результат - это количество раундов, которое требуется до окончания игры.

пример

Рассмотрим список ввода [3,1,-2,0,8]. В первом раунде происходит следующее:

  • Лицо, занимающее 3очки прямо на человека, держащего 0.
  • Лицо, занимающее 1очки прямо на человека, держащего -2.
  • Лицо, занимающее -2очки, осталось у человека, держащего 3.
  • Человек держит 0очки на себя.
  • Человек, держащий 8точки, прямо на человека, который держит -2(список представляет собой круг, поэтому он оборачивается на концах).

Это означает , что 0, -2и 3отпадают, так что второй раунд делается со списком [1,8]. Здесь, 1указывает на 8, и 8указывает на себя, поэтому 8устраняется. Третий раунд делается со списком [1], где 1просто указывает на себя и исключается. Потребовалось три раунда, чтобы устранить всех участников, поэтому правильный вывод 3.

Правила и оценки

Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Контрольные примеры

[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

Вы уверены в последнем тесте, я получаю 5?
Flawr

@flawr Я могу проверить свою эталонную реализацию примерно через час (пришлось покинуть компьютер), но это должно быть правильно.
Згарб

Просто чтобы прояснить: nномер ли человек держит?
Питер Тейлор

@PeterTaylor Да, это так. Я уточню это позже в вызове.
Згарб

Ответы:


4

Pyth, 15 байт

f!=.DQ.e%+bklQQ

Тестовый набор благодаря Кирби

Использует тот же механизм итераций, что и @orlp, но определяет количество итераций, используя fфункцию «Повторить до ложного», чтобы определить, []когда мы закончим.


5

Matlab, 91 77 байт

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

Старая версия:

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

Это проблема, когда светится Matlab, сердце этого кода - удаление записей массива, a(mod((1:l)+a-1,l)+1)=[]что, на мой взгляд, довольно элегантно.


4

CJam, 21 байт

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

Тестирование.

Принимает ввод как список стилей CJam, но набор тестов заботится о преобразовании из формата в задаче.

объяснение

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.

Спасибо: eeэто почти то, что я искал вчера для другого вопроса.
Питер Тейлор

3

C #, 251 219 211 197 193 байта

Самый неуловимый неэзотерический язык поражает снова.

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

Эта программа ожидает входную последовательность в качестве аргументов командной строки. Например, чтобы ввести список [5,5,5,6,6,6], вызовите его с аргументами командной строки 5 5 5 6 6 6.

Спасибо Мартину Бюттнеру за несколько советов.

Гольф до 197 , осознав, что я могу использовать argsмассив, хотя это массив строк. Мне нужно только разобрать их в целое число в одном месте.

Гольф до 193 года, понимая, что .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 # самый негольфимый? Конечно, вы должны ошибаться; все знают, что это Java. : P
Алекс А.

@AlexA. Пфф, я с Тимви в этом. Я побеждал C # с Java много раз: P
Geobits

3
Вы не правы, Pyth или CJam - самые непривлекательные, C # - самый непобедимый язык!
бета-распад


2

R, 105 байт

код

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 байт

tl.u.DN.e%+kblNNQ

По совпадению очень похож на ответ Кирбифана.


2

Mathematica, 71 байт

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)&
Мартин Эндер

1
Это Plus~MapIndexed~#действительно умно, но мне интересно, если нет более короткого пути использования l+Range@Length@l.
Мартин Эндер

1

STATA, 146 байт

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. Предполагается, что входные данные находятся в отдельном файле с именем новой строки a.. Ограничено ситуациями, когда требуется не более 1023 раундов из-за максимально допустимого количества переменных (может быть исправлено за счет 10 байтов). Он читает данные и запускает цикл, пока больше не будет наблюдений. На каждой итерации создавайте переменную со значением индекса, на который она указывает. Для каждого наблюдения, если на него указывает другое наблюдение, установите индикатор для удаления переменной. Затем отбросьте все наблюдения с помощью этого индикатора и увеличьте счетчик. После цикла распечатайте счетчик.



1

awk, 66 байт

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

Просто использует, mod length arrayчтобы держать его внутри массива. На входе числа должны быть разделены пробелами.

Пример использования

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'

Вот все примеры ввода в соответствующем формате

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

0

Python 2, 122 байта

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])
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.