Ленивый Хлеб


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.
Лохматый

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

4
Добро пожаловать в PPCG и приятного первого испытания!
user202729

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 = [""]

0

Python 2 , 212 210 байт

lambda s:min((sum(h(p)),p)for b in combinations(range(len(s)),5)for p in permutations(b)if(len(set(s[i]for i in p))==5)&all(d>1for d in h(p)))
h=lambda p:[abs(y-x)for x,y in zip(p,p[1:])]
from itertools import*

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

2 байта спасибо Джонатану Фреху .


if len(...)==5and all(...)можно if(len(...)==5)&all(...)сохранить два байта.
Джонатан Фрех
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.