懒惰的面包袋


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或以其他方式读取。我希望程序根据默认的I / O规则打印出最佳路径的索引及其时间。

简而言之:

  1. 5种面包。
  2. 面包顺序显示为随机顺序和长度的字符串。
  3. 必须从每个唯一的面包中选择一个。
  4. 无法进行相邻的连续选择。
  5. 最小化选择索引之间的距离。
  6. 无需担心输入无效。
  7. 默认的I / O规则适用。

这是,最短字节数获胜。


0+3+5+1+4=13但是1+3+5+7+10=26,不是9
毛茸茸的

2
@LuisfelipeDejesusMunoz不完全是,这些连续的指标中有几个是相邻的。
尼克·里德

4
欢迎来到PPCG,这是第一个挑战!
user202729

2
这对实际任务并不重要,但我很好奇:为什么他是个细菌发芽者,意味着您不能连续选择两个相邻架子上的面包?
sundar-恢复莫妮卡

1
可能有没有尽头的空架子?(例如,是否'WBWG FRW'也是有效的输入?
Jonathan Allan '18

Answers:


3

JavaScript(ES6),114个字节

@Oliver节省了1个字节

将输入作为字符数组。输出以逗号分隔的字符串,其中第一个值是总时间,下一个值描述路径。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.