Tembel Bir Ekmek Çantası


11

Buğday, Çavdar, Arpa, Tahıl ve Fransız ekmeği sunan bir fırında çalışıyorum, ancak fırıncı biraz garip - somunları rastgele sırada istifliyor ve bazen sonunda bazı rafları boş bırakıyor.

Her gün, aynı müşteri gelir ve her somun ekmeğinden birini ister, ancak zor olan şey, bir germophobe, bu yüzden çantasını doldurduğumda, ardışık seçimlerde iki bitişik raftan somun alamıyorum.

Bitişik raflar arasında yürümek bir saniye sürer. Yoğun bir mağaza; somunların herhangi bir rastgele yapılandırması için, her benzersiz somundan birini almak için gereken süreyi en aza indirmek istiyorum. Herhangi bir rafta başlayıp bitirebilirim.

Bugünün sıralaması ise W B W G F R W, 0, 3, 5, 1, 4toplam 12 saniye boyunca olası bir yol :abs(3-0) + abs(5-3) + abs(1-5) + abs(4-1) = 12

( 1, 2, 3, 4, 5işe yaramaz, çünkü ekmek bitişik raflardan arka arkaya alınır.)

Eğer öyleyse B W B G B F B R B W B F, olası bir yol, 1, 3, 5, 7, 10toplam 9 saniyedir.

Yönetici her zaman olası bir çözüm olduğundan emin olur, bu yüzden kötü girdileri yakalamak konusunda endişelenmenize gerek yok. Genellikle siparişi bir dosyaya gönderir, ancak istersem STDIN'e yazabilir veya farklı bir şekilde okuyabilirim. Programın varsayılan G / Ç kurallarına göre en iyi yolun indekslerini ve zamanını yazdırmasını istiyorum .

Kısacası:

  1. 5 çeşit ekmek.
  2. Somun siparişleri, rastgele düzen ve uzunluk dizeleri olarak görünür.
  3. Her benzersiz somundan birini seçmelisiniz.
  4. Bitişik ardışık seçimler yapılamaz.
  5. Seçim endeksleri arasındaki mesafeyi en aza indirin.
  6. Geçersiz girdiler için endişelenmenize gerek yok.
  7. Varsayılan I / O kuralları geçerlidir.

Bu , en kısa bayt sayısı kazanır.


0+3+5+1+4=13ama 1+3+5+7+10=26değil 9.
Shaggy

2
@LuisfelipeDejesusMunoz Pek de değil, bu ardışık girintilerin bazıları bitişik.
Nick Reed

4
PPCG'ye hoş geldiniz ve güzel bir ilk meydan okuma!
user202729

2
Asıl görev için önemli değil, ama merak ediyorum: neden bir germophobe olduğu, ardışık seçimlerde iki bitişik raftan somun alamayacağınız anlamına geliyor?
sundar - Monica'yı eski haline

1
Sonunda olmayan boş raflar olabilir mi? (örn. 'WBWG FRW'geçerli bir girdi mi?
Jonathan Allan

Yanıtlar:


3

JavaScript (ES6), 114 bayt

@Oliver sayesinde 1 bayt kaydedildi

Girişi bir karakter dizisi olarak alır. İlk değerin toplam süre ve sonraki değerlerin yolu tanımladığı virgülle ayrılmış bir dize çıktılar.

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)``

Çevrimiçi deneyin!

Yorumlananlar

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.