パンの怠zyな袋


11

私は小麦、ライ麦、大麦、穀物、フランスパンを提供するパン屋で働いていますが、パン屋は少し奇妙です-彼はパンをランダムに積み重ね、時には棚の最後を空にします。

毎日、同じ顧客がやって来て、それぞれのパンを1つずつ求めますが、難しいのは、彼が生殖嫌悪者なので、彼のバッグをいっぱいにすると、連続した選択で隣接する2つの棚からパンを取ることができないことです。

隣接する棚の間を歩くには1秒かかります。忙しい店です。パンをランダムに構成する場合は、一意のパンを1つずつ取得するのにかかる時間を最小限に抑えたいと思います。任意の棚で開始および終了できます。

今日の注文がの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. 一意のパンを1つずつ選択する必要があります。
  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
実際のタスクには重要ではありませんが、好奇心が強いです:なぜ彼が生殖嫌悪者であるのは、連続した選択で隣接する2つの棚からパンを取ることができないのですか?
スンダ

1
端にない空の棚がありますか?(たとえば'WBWG FRW'、有効な入力も?
ジョナサンアラン

回答:


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

0

パイソン2212の 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*

オンラインでお試しください!

Jonathan Frechへの2バイトthx 。


if len(...)==5and all(...)if(len(...)==5)&all(...)2バイトを節約することができます。
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.