Індексація слайдів Cha-Cha


12

Вступ:

Хоча спочатку у мене була голова голландської пісні, де тексти пісень: " Doe 'n stapje naar voren, en' n stapje terug " (що перекладається на " Зробіть трохи крок вперед і трохи зробіть крок назад "), коли Я шукав повні тексти пісень, зрозумів, що вони тільки повертаються туди і назад, і ніколи не збоку.

Отже, замість цього я зараз використовую тексти пісень містера C The Slide Man aka DJ Casper - Cha-Cha Slide для цього виклику.

Якщо ми проігноруємо все інше і подивимось лише на слова "ліворуч", "праворуч", "назад" та "хоп" (я порахував "хоп" вперед), включаючи згадані суми, повна пісня буде мати наступний список ( Я тут використовую абревіатури LRBH):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

Ось повна пісня пісні у прихованому фрагменті коду JavaScript (щоб заощадити місце), де ходи та суми оточені заблокованими дужками:

Виклик:

Тепер на сам виклик. Беремо один, два чи три входи . Один з них - це список індексованих чисел (тобто або негативних для 0-індексованих; або позитивних для 1-індексованих). (Інші входи необов’язкові та пояснені в правилах виклику.)

Кожен тестовий випадок розпочнеться з позиції {x=0, y=0}.
Тепер скористайтеся списком текстів рухів та видаліть усі рухи за заданими індексами вхідного списку. Потім перейдіть по ходах (до найбільшого індексу вхідного масиву) і виведіть позицію, в якій ви опинитеся.

Рухи змінять координати так:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

Правила виклику:

  • До списку рухів можна отримати доступ будь-яким способом. †: може бути додатковим входом; може бути у відокремленому файлі на диску, з якого ви будете читати; може бути в змінній рівня класу, до якої ви отримуєте доступ. Він повинен буде знаходитися в формі L, R, Bі Hхоча (може бути рядок або символ-лист / масив), так що ви не можете зберегти рухається-лист , як 1з і -1х або цілих чисел.
  • Список поданих вище рухів є жорстким кодом і завжди буде однаковим. (І тому також непогано розміщувати його як поле рівня класу, а не вважати його вхідним, якщо це допомагає підрахунку байтів вашої відповіді.)
  • Список вводу може бути як 0-індексованим, так і 1-індексованим (залежить від вас)
  • Ми лише "просуваємо" кроки до та виключаємо найбільший індекс списку.
    • †: Ви також можете приймати цей останній елемент як окремий цілий вхід, а не останній елемент вхідного масиву.
  • Виведення координат x і y, у яких ми закінчуємо, може бути у будь-якому розумному форматі (цілий масив, що містить два елементи, обмежений рядок, надрукований на STDOUT на двох відокремлених рядках тощо)
  • Ви можете припустити, що список вхідних даних сортується від найнижчого до найвищого (або найвищого до найнижчого, якщо це те, що ви віддаєте перевагу; у цьому випадку перший пункт - це початковий розмір списку переміщень - якщо він не приймається як окремий вхід). І він також не буде містити дублюваних індексів.
  • Якщо найбільший індекс вхідного списку більший, ніж перелік звернень вище (55 ходів - у списку переходів вище), ми знову завертаємося до початку списку (стільки разів, скільки потрібно, залежно від найбільшого індексу входу).
  • Вам дозволяється виводити y,xзамість цього x,y, але, будь ласка, вкажіть це у своїй відповіді.

Приклад:

Вхід: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]

Тут переміщення та (0-індекси) індекси один над одним:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
L, B, H, R, L, L, B, H, R, L, B, H, H, R, R, L, L, L, R, L, B, H, H, H, H, R, R, L, L, L, B, H, H, H, H, H, R, L, R, L, R, L, H, R, L, L, B, H, H, L, R, L, B, H, H, L, B, H, R, L, L, B, H, R, L

Видаляючи індекси списку вхідних даних, у нас залишиться такий список переходів:

1, 2, 3, 5, 6, 7, 9,11,12,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,35,36,37,38,39,40,41,45,46,47,48,49,51,52,54,55,57,58,61,62,63
B, H, R, L, B, H, L, H, H, L, L, L, R, L, B, H, H, H, H, R, R, L, L, B, H, H, H, H, R, L, R, L, R, L, L, B, H, H, L, L, B, H, L, H, R, B, H, R

Тепер, якщо ми підемо з позиції {0, 0}на інші рухи, у нас з’являться такі нові координати після кожного руху:

{0,0};B,{0,-1};H,{0,0};R,{1,0};L,{0,0};B,{0,-1};H,{0,0};L,{-1,0};H,{-1,1};H,{-1,2};L,{-2,2};L,{-3,2};L,{-4,2};R,{-3,2};L,{-4,2};B,{-4,1};H,{-4,2};H,{-4,3};H,{-4,3};H,{-4,5};R,{-3,5};R,{-2,5};L,{-3,5};L,{-4,5};B,{-4,4};H,{-4,5};H,{-4,6};H,{-4,7};H,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};L,{-5,8};B,{-5,7};H,{-5,8};H,{-5,9};L,{-6,9};L,{-7,9};B,{-7,8};H,{-7,9};L,{-8,9};H,{-8,10};R,{-7,10};B,{-7,9};H,{-7,10};R,{-6,10}

Таким чином, кінцевий результат буде: {-6, 10}

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу return. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

0-indexed input: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]
1-indexed input: [1,5,9,11,14,15,28,35,43,44,45,51,54,57,60,61,65]
Output: {-6, 10}

0-indexed input: [55]    (Note: There are 55 moves in the unmodified list)
1-indexed input: [56]    (Note: There are 55 moves in the unmodified list)
Output: {-6, 11}

0-indexed input: [0,1,4,5,6,9,10,15,16,17,19,20,27,29,30,37,38,39,41,44,45,46,49,51,52]
1-indexed input: [1,2,5,6,7,10,11,16,17,18,20,21,28,30,31,38,39,40,42,45,46,47,50,52,53]
Output: {10, 16}

0-indexed input: [2,3,7,8,11,12,13,14,18,21,22,23,24,25,26,31,32,33,34,35,36,38,40,42,43,47,48,50,53]
1-indexed input: [3,4,8,9,12,13,14,15,19,22,23,24,25,26,27,32,33,34,35,36,37,39,41,43,44,48,49,51,54]
Output: {-18, -7}

0-indexed input: [0]
1-indexed input: [1]
Output: {0, 0}

0-indexed input: [4,6,7,11,12,13,15,17,20,28,31,36,40,51,59,66,73,74,80,89,92,112,113,114,116,120,122,125,129,134,136,140,145,156,161,162,165,169,171,175,176,178,187,191,200]
1-indexed input: [5,7,8,12,13,14,16,18,21,29,32,37,41,52,60,67,74,75,81,90,93,113,114,115,117,121,123,126,130,135,137,141,146,157,162,163,166,170,172,176,177,179,188,192,201]
Output: {-17, 37}

0-indexed input: [25,50,75,100,125,150,175,200,225,250]
1-indexed input: [26,51,76,101,126,151,176,201,226,251]
Output: {-28, 49}

Чи можемо ми вивести координати у зворотному порядку?
Кудлатий

3
@Shaggy Umm, звичайно, чому б ні. Поки ви чітко вказуєте це у своїй відповіді.
Kevin Cruijssen

@Arnauld Так, рухи відображаються і ніколи не змінюватимуться. Я, можливо, я поясню це більш чітко, якщо це ще не було зрозуміло. (Отож, чому ви можете мати його як поле
жорсткого коду на

Чи може на виході бути пара поплавків?
Якоб

1
Дуже пізно до виклику, але, здається, два ваші тестові випадки мають неправильний вклад для 1-індексованого випадку: додатковий 82 у шостому та 29 замість 39 у третьому тестовому шаблоні (сортування вказує, що ви, можливо, передбачали, що насправді буде 28/29, але очікуваний вихід відображається від використання 38/39 там).
sundar

Відповіді:


4

05AB1E , 15 12 байт

Збережено 3 байти завдяки Еріку Переверхувача

ÝsKèIêRS¢2ôÆ

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

Ý                 # push range [0 ... input_int]
 sK               # remove all elements in input_list from this range
   è              # cyclically index into the moves-list with the remaining elements
    Iê            # push the unique chars of the move-list, sorted
      R           # reverse
       S¢         # count the occurrences of each char in "RLHB"
         2ô       # split into 2 parts
           Æ      # reduce each part by subtraction

1
Гарна відповідь! Навіть не знав про це Æ. Розумний спосіб просто підрахувати всі рухи і використовувати Æдля обчислення різниці для пар RLі BHпар.
Кевін Кройсейсен

Æіснує вічно, чи не так? Я би припустив це, бачачи, як я про це не знав. Схоже, команди, які я думаю, що "нові", існували з моменту створення, але я ніколи не знав, як їх використовувати, хай. О, +1
Чарівний восьминога Урна

@MagicOctopusUrn: Це дійсно існувало вічно;)
Emigna

7

Рубі , 98 ... 58 55 байт

->a{([*0..a[-1]]-a).sum{|c|-1i**(m[c%55].ord%19)}.rect}

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

Пояснення:

Основна хитрість полягає у використанні складних чисел для відображення рухів: 'B' - -i, 'H' - + i, 'L' - -1 і 'R' - +1. Якщо ми перетворимо всі рухи в складні числа, то з однієї суми отримаємо правильний результат.

Я спробував різні способи, але потім знайшов магічне число 19: нам не потрібно возитися з збігом регулярних виразів, оскільки:

B  is ASCII 66; 66%19=9  and i^9  = i
H  is ASCII 72; 72%19=15 and i^15 =-i
L  is ASCII 76; 72%19=0  and i^0  = 1
R  is ASCII 82; 82%19=6  and i^6  =-1

Отже, складіть, що всі разом, підсумуйте, переверніть знак, і ми закінчили.

Дякую Якобу за -3 байти


Розумне використання складних чисел! Оскільки рядок переміщення зафіксовано, його можна замінити (m*c+m)[c]на m[c%55].
Якоб

4

JavaScript (ES6), 85 байт

Відповідно до правил виклику, цей код очікує, що глобальний рядок m буде містити список кроків. (Збереження 3 байтів, як запропонував @KevinCruijssen.)

Вводиться як список списку 0-індексів, упорядкованих від найнижчих до найвищих.

a=>a.map(g=i=>j++<i&&g(i,p=m.search(m[~-j%55])*3%5,x+=--p%2,y-=--p%2),j=x=y=0)&&[x,y]

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

Як?

Кожен символ переміщення перетворюється на його положення в рядку переміщення "LBHR...". Помножимо результат на 3 і застосуємо модуль 5 , який дає p . Потім у нас є:

  • dx = ((p-1) mod 2)
  • dy = - ((p-2) mod 2)

Де ознакою моди b є знак a .

 character | position | * 3 | mod 5 | dx | dy
-----------+----------+-----+-------+----+----
    'L'    |     0    |  0  |   0   | -1 |  0
    'B'    |     1    |  3  |   3   |  0 | -1
    'H'    |     2    |  6  |   1   |  0 | +1
    'R'    |     3    |  9  |   4   | +1 |  0

3

Желе , 14 байт

Rḟị⁵ċⱮ⁵QṢṚ¤_2/

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

Аргумент 1 / Лівий аргумент: Максимальний індекс на основі 1.
Аргумент 2 / Правильний аргумент: індекси на основі 1.
Аргумент 3: Переміщення списку у вигляді рядка. Функція все ще може бути повторно використана, якщо для цієї мети використовується третій аргумент командного рядка.


3

Java 10, 129 119 112 107 100 86 байт

a->m->{var r=new int[2];for(;m-->0;)r[s[m%55]/73]-=a.add(m)?s[m%55]*3%5-2:0;return r;}

Приймає максимум як додатковий вхід; list-list - це масив символів на рівні класу.

Натхненний відповіддю @Emigna 05AB1E .
-7 байт завдяки @Jakob .
-14 байт завдяки @Geobits .

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

Пояснення:

a->m->{              // Method with Integer-Set & int parameters and int-array return
  var c=new int[2];  //  [x,y] result-array, starting at {0,0}
  for(;m-->0;)       //  Use the `m` input as index, and loop in the range (`m`, 0]
    r[s[m%55]/73]-=  //   Subtract from either x or y based on the character:
     a.add(m)?       //    If the input-set doesn't contain the current index `m`:
      s[m%55]*3%5-2  //     Modify the x or y coordinate based on the character
     :               //    Else:
      0;             //     Leave the x or y coordinate unchanged
  return r;}         //  Return count(R)-count(L) and count(H)-count(B) as result

s[m%55]/73відображає координати x або y залежно від символу ( спробуйте в режимі он-лайн ):

Letter    Unicode value    /73

B         66               0
H         72               0
L         76               1
R         82               1

s[m%55]*3%5-2карти правильного +1або -1залежного від персонажа ( спробуйте в Інтернеті ):

Letter    Unicode value    *3     %5    -2

B         66               198    3     1
H         72               216    1     -1
L         76               228    3     1
R         82               246    1     -1

1
Якщо ви приймаєте список індексів як змінний набір, ви можете використовувати його a.add(m)як ifумову.
Якоб

А int c[]може бути int[]c.
Якоб

1
@Jakob Ах, int c[]був із попередньої версії, де я все ще використовував індекс, iа не використовував m. І розумно використовувати набір addзамість !contains, дякую!
Кевін Кройсейсен

1
Ви можете уникнути віднімання байтового віднімання в кінці, використовуючи c[2]для осі (з s[m%55]/73) і прогулюючи його з чимось на кшталт 3*s[m%55]%5-2(я б хотів, щоб я бачив спосіб скоротити це, але ...). Разом з потрійним, це a->m->{var c=new int[2];for(;m-->0;)c[s[m%55]/73]-=a.add(m)?3*s[m%55]%5-2:0;return c[1]+","+c[0];}за 98.
Геобіт

@Geobits Дякую! І -12 байт більше, просто повернувшиint[] замість рядка. :)
Кевін Кройсейсен

2

Python 3, 85 байт

bє індексним списком (а set) і lє кінцевим індексом. Список переміщення (рядок або список символів) видається вільним як s. Це відповідь Ruby на відповідь GB , і пояснення підходу можна знайти там.

def f(b,l):r=sum(-1j**(ord(s[i%55])%19)for i in set(range(l))-b);print(r.real,r.imag)

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

Безумовно

def f(b, l):
    r = sum(
        -1j ** (ord(s[i % 55]) % 19)
        for i in set(range(l)) - b
    );
    print(r.real, r.imag)


1

Чистота , 148 ... 130 байт

import StdEnv
$i=foldr(\a(x,y)|any((==)a)i=(x,y)=case m.[a rem 55]of'H'=(x,y+1);'B'=(x,y-1);'L'=(x-1,y);_=(x+1,y))(0,0)[0..last i]

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

Визначає функцію $ :: [Int] -> (Int, Int), приймаючи список (відсортований від найменших до найбільших) індексів, які слід вилучити з ходів, перед тим, як foldrвиконувати відповідні операції (0,0).

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