Очередь с друзьями

16

Ты с твоим лучшим другом, Джим, в парке развлечений, и когда твоя любимая поездка становится очевидной, ты и Джим обмениваешься взглядами. Естественно, вы мчитесь, чтобы встать в очередь. К сожалению, он выигрывает, потому что вы гольфист, и он играет в настоящий спорт (извините, друзья). На самом деле, вы так далеко позади, что вы и Джим разделены xлюдьми. Предполагая, что длина строки nи вы находитесь сзади, а линия зигзагирует и загоняет всех jлюдей, на каких позициях в линии вы и Джим будете находиться в одном столбце, позволяющем общаться в чате (только в одной строке)?

вход

3 целых числа

  • n- длина линии. Это число всегда будет больше или равно jи будет иметь видy * j где yположительное целое число (количество строк в очереди).
  • j- Количество человек в одном ряду строки (количество столбцов в одном ряду). Это число всегда будет больше 0.
  • x- Количество людей между вами и Джимом такое, что 0 <= x < 2j - 1. Подсказка: если это число нечетное, то ваш вывод должен быть пустым.

Выход

Список целочисленных позиций в строке, в которой Джим находится в том же столбце, что и вы.
1 Эти целые числа могут быть проиндексированы 0 или 1, если вы указали в своем ответе.
2 Эти целые числа могут предполагать, что вы начинаете с позиции 0 или позиции n-1, если вы указали в своем ответе.

пример

Пример очереди маленький
В этом примере вход будет n = 9, j = 3, x = 0. Вывод должен быть, 2, 5потому что ваша позиция 2 или 5, когда вы находитесь в том же столбце, что и Джим

Тестовые случаи

[9, 3, 0] -> [2, 5]
[12, 3, 0] -> [2, 5, 8]
[9, 3, 1] -> []
[9, 3, 2] -> [1, 4]
[14, 7, 10] -> [1]
[24, 4, 6] -> [0, 4, 8, 12, 16]

счет

Это , поэтому выигрывает самый короткий ответ (в байтах).

совать
источник
4
Я в очереди, чтобы увидеть некоторые интересные решения для этого! (извините за плохой каламбур, а также за неправильное использование этого слова, но как бы то ни было, не судите меня: P)
HyperNeutrino
1
Можем ли мы вернуть ложное значение вместо пустого массива?
Rɪᴋᴇʀ
@ Райкер Я не вижу причин, чтобы это запретить. Перейти на это
Poke

Ответы:

9

Python 2 , 45 41 40 37 байт

lambda n,j,x:range(j-x/2,x%2or n-x,j)

Довольно тривиальное решение. Я просто быстро просмотрел шаблоны и нашел шаблон. 1 индексируется, 1 находится в конце очереди.

-4 байта, избегая троих и используя массив для значений вместо
-1 байта, благодаря некоторому вдохновению от @DeadPossum, используя andвместо тернаров или селекторов массива
-3 байта, переключаясь orв обратном порядке. Работает только из-за 1-индексации

Кроме того, вычеркнуто 4 все еще 4 на всех 4s :(

Попробуйте онлайн!

HyperNeutrino
источник
Лол, ты отправил всего за 14 минут, до меня :) Моя версия короче на 3 байта:lambda n,j,x:x%2-1and range(j-x/2,n-j+1,j)
Мертвый Опоссум
@DeadPossum Хорошо. У меня есть другое решение, которое на один байт короче этого, лол
HyperNeutrino
У меня была ошибка во втором аргументе диапазона. Так быть не должно n-j+1, так lambda n,j,x:x%2-1and range(j-x/2,n-x,j)что короче еще на 40 байтов
Dead Possum
@DeadPossum Подождите, нам разрешили вернуть ложное значение вместо пустого массива?
HyperNeutrino
3
@FelipeNardiBatista это то, что означает «1-индексированный», кстати.
Rɪᴋᴇʀ
2

Пип , 22 21 байт

20 байтов кода, +1 за -pфлаг.

c%2?lv-c/2+b*\,a/b-1

Принимает n, jи xкак аргументы командной строки. 0 индексируется, начиная с позиции 0. Попробуйте онлайн!

объяснение

Это моя оригинальная 22-байтовая версия, потому что она более понятна.

                       a, b, c are cmdline args; l is [] (implicit)
c%2?                   Test c mod 2
    l                  If it's 1 (truthy), return empty list; else:
                a/b-1  Number of rows in the queue minus 1
               ,       Range(^)
             b*        Multiply each element by b
     b-1-c/2+          Add (b-1)-c/2 to each element
                       Output in [1;2;3] format (implicit, -p flag)

Формула была получена путем наблюдения за образец для n=9, j=3:

x Output
0 [2;5]
2 [1;4]
4 [0;3]

Если мы возьмем x/2( 0, 1, 2), вычесть его из j-1( 2, 1, 0), а также добавить , что [0;3]мы получаем правильный результат во всех случаях.

DLosc
источник
1

Java 8 лямбда, 101 байт

(n,j,x)->{int[]i=new int[n/j-1];int c=0,k=j-x/2;for(;k<n-x;k+=j)i[c++]=k;return x/2==0?i:new int[0];}

Почти прямой порт моего Python ответа. Диапазон не существует в Java, хотя.

HyperNeutrino
источник
0

Haskell, 43 байта

(n#j)x|odd$round x=[]|m<-j-x/2=[m,m+j..n-x]

Практически напрямую перенесен из Python-ответа от HyperNeutrino

Более хорошо отформатированный код:

f n j x |odd$round x = []
        |otherwise   = let m=j-x/2 in [m,m+j..n-x]

РЕДАКТИРОВАТЬ: забыл упомянуть, что это был один индекс

Общее отображаемое имя
источник
0

C # - 91 байт

int[]r=new int[n/j-1];for(int i=1;i<n/j;i++){r[i-1]=i*j-x/2-1;}return(x%2==0)?r:new int[0];
ЧЭНЛЬЯН Ю.Е.
источник