Черга з друзями


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ɪᴋᴇʀ

@Riker Я не бачу причин це заборонити. Ідіть на це
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 на всіх 4-х :(

Спробуйте в Інтернеті!


Лол, ти розмістив лише 14 хвилин до мене :) Моя версія коротша на 3 байти:lambda n,j,x:x%2-1and range(j-x/2,n-j+1,j)
Dead Possum

@DeadPossum Nice. У мене є ще одне рішення, яке на один байт коротше,
хаха

У другому аргументі діапазону помилка. Цього не повинно бути 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-індексований", btw.
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]ми отримуємо правильний результат у всіх випадках.


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 не існує.


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]

EDIT: Забув згадати, що він був індексованим


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];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.