Пограйте в елімінаційну гру


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

Піт, 15 байт

f!=.DQ.e%+bklQQ

Тестовий набір завдяки кірбі

Використовує той же механізм ітерації, що і @orlp, але виявляє кількість ітерацій, використовуючи fфункцію "Повторити до помилки", щоб виявити, як []тільки ми закінчили.


5

Матлаб, 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).

Безумовно

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. Pfft, я з Тімві на цьому. Я багато разів бив 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)

неозорий

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

Математика, 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.