Лінива сумка хліба


11

Я працюю в хлібозаводі, де подають пшеничний, жито, ячмінь, зерновий і французький хліб, але пекар трохи дивний - він укладає буханки у довільному порядку, а іноді просто залишає деякі полиці в кінці порожніми.

Кожного дня заходить один і той же клієнт і просить по одному короваю хліба, але хитрість полягає в тому, що він гермофоб, тому коли я наповнюю його сумку, я не можу брати хліби з двох сусідніх полиць послідовно.

Пройти між сусідніми полицями потрібно одна секунда. Це зайнятий магазин; для будь-якої випадкової конфігурації хлібів, я хотів би мінімізувати час, необхідний для отримання одного з кожного унікального батона. Я можу починати і закінчувати на будь-якій полиці.

Якщо сьогодні впорядковано W B W G F R W, можливий шлях становить 0, 3, 5, 1, 4загалом 12 секунд:abs(3-0) + abs(5-3) + abs(1-5) + abs(4-1) = 12

( 1, 2, 3, 4, 5не працює, оскільки хліб збирають послідовно з сусідніх полиць.)

Якщо це так B W B G B F B R B W B F, можливий шлях триває 1, 3, 5, 7, 10загалом 9 секунд.

Менеджер завжди переконується, що є можливе рішення, тому мені не потрібно турбуватися про те, щоб потрапити на погані дані. Зазвичай він надсилає мені замовлення у файл, але якщо я хочу, я можу набрати його на STDIN або прочитати його по-іншому. Я хотів би, щоб програма роздрукувала індекси найкращого шляху, а також його час, відповідно до правил вводу / виводу за замовчуванням .

Коротко:

  1. 5 видів хліба.
  2. Замовлення на батони відображаються у вигляді рядків випадкового порядку та довжини.
  3. Потрібно вибрати один з кожного унікального батона.
  4. Неможливо зробити сусідні послідовні вибірки.
  5. Мінімізуйте відстань між індексами вибору.
  6. Не потрібно турбуватися про недійсні введення.
  7. Застосовуються правила вводу / виводу за замовчуванням .

Це , виграє найкоротший байт.


0+3+5+1+4=13але 1+3+5+7+10=26, ні 9.
Shaggy

2
@LuisfelipeDejesusMunoz Не зовсім, декілька таких послідовних індексів суміжні.
Нік Рід

4
Ласкаво просимо до PPCG та приємного першого виклику!
користувач202729

2
Це не важливо для реальної задачі, але мені цікаво: чому він, який є гермофобом, означає, що ти не можеш брати хліби з двох сусідніх полиць послідовно?
sundar

1
Чи можуть бути порожні полички, яких немає на кінцях? (напр., також є 'WBWG FRW'коректним введенням?
Джонатан Аллан

Відповіді:


3

JavaScript (ES6), 114 байт

Збережено 1 байт завдяки @Oliver

Вводить дані як масив символів. Виводить рядок, розділений комами, де перше значення - загальний час, а наступне - описує шлях.

a=>(b=g=(r,s=o='',c,p)=>s[c>b|4]?o=(b=c)+r:a.map((v,i)=>s.match(v)||(d=p<i?i-p:p-i)<2||g([r,i],s+v,~~c+d,i))&&o)``

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

Прокоментував

a => (                          // a[] = input array
  b =                           // b = best score so far (initially a non-numeric value)
  g = (                         // g = recursive function taking:
    r,                          //   r = path
    s =                         //   s = string of collected loaves of bread
    o = '',                     //   o = final output
    c,                          //   c = current cost
    p                           //   p = index of the last visited shelf 
  ) =>                          //
    s[c > b                     // if the final cost is not greater than our best score
            | 4] ?              // and we've successfully collected 5 loaves of bread:
      o = (b = c) + r           //   update the current output and the best score
    :                           // else:
      a.map((v, i) =>           //   for each loaf of bread v at shelf i in a[]:
        s.match(v) ||           //     if we've already collected this kind of bread
        (d =                    //     or the distance d
          p < i ? i - p : p - i //     defined as the absolute value of p - i
        ) < 2 ||                //     is less than 2: stop recursion
        g(                      //     otherwise, do a recursive call to g() with:
          [r, i],               //       r updated with the index of the current shelf
          s + v,                //       s updated with the current loaf of bread
          ~~c + d,              //       c updated with the last distance
          i                     //       i as the index of the last shelf
        )                       //     end of recursive call
      )                         //   end of map()
      && o                      //   return the current output
  )``                           // initial call to g() with r = [""]

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