Noel Baba'nın hediyelerini teslim etmesi ne kadar sürer?


12

Bu meydan okumayı bir süre önce yayınladım , bu da Santa'nın kaç tane elf hediye vermesi gerektiğiyle ilgili.

Nüfus artışı nedeniyle, Santa bu yıl biraz daha baskı altında. Geçmişte çok asenkron olarak çalışmamıza rağmen, gittikçe daha senkronize olmayı denemeye başlıyoruz. Bu nedenle, Santa'nın belirli bir sayıda elf ile her bölgeye hediye vermesinin ne kadar süreceğini bilmesi gerekiyor.

Kömürün ağırlığı son iki yılda değişmedi - hala hediyelerden daha ağır, bu yüzden Noel Baba'nın evdeki yaramaz kişi başına üç elf ve evdeki hoş kişi başına iki elf ihtiyacı var.

Elfler Noel için tüm yıl eğitim harcıyorlar, bu yüzden teslimatlar arasında dinlenmeye ihtiyaçları yok. Her seferinde sadece bir eve hediye verebilirler ve Noel Baba'nın kızağına geri dönüp bir sonraki eve gitmeden önce bir sonraki hediyeyi toplamalıdırlar. Paylaşma özgürlüğünde olmadığım için, elfler Noel Baba'nın kızağı ve evleri arasında seyahat etmek için zaman harcamazlar (ancak sadece Noel Baba'nın kızağı çatıda olduğunda seyahat edebilirler) veya kızağı evden eve taşırken zaman harcamaz. (Noel Baba'nın kızağı yapan toplamak yakıt için evden eve hamlesine ihtiyaçlarını, ama ben zaten çok fazla söylüyorum).

Hediye teslim eden elflerin her biri hediye teslim etmek için dört saniye * harcamak ve kömür teslim eden Elflerin her birini teslim etmek için beş saniye harcamak * gerekir (Santa Havacılık İdaresi düzenlemelerine göre, üzerlerinde kömür tozu olan eldivenler derhal yakılmalıdır. biraz zaman alan kızağa binmek). Ayrıca, evler harita üzerinde oldukları sırada, soldan sağa doğru ziyaret edilmeli ve elfler bulundukları eve teslim edilene kadar diğer evlere hediye vermeye başlayamazlar.

Noel Baba'nın bu bölge için yeterli elflerden daha fazlasına sahip olduğunu varsayarsak, yaramaz listesindeki birine, her ev için 5 saniye ya da herkes iyi ise ev başına 4 saniye hediye vermesi uzun sürecektir.

Yine de, önceki mevsimlerin aksine, bu yaklaşan Noel Noel Baba'sı her bölge için fazlasıyla elf olmayabilir, bu nedenle 4 saniye, 0 olmadığı sürece herhangi bir eve hediye vermek için gereken minimum süre * 'dir . güzel insanlar ve 0 yaramaz insanlar, bu durumda 0 saniye sürecek.

Ayrıca, evlerden birinin bile yaramaz listesinde biri varsa, Noel Baba'nın en az üç elf'e ihtiyacı olacaktır. Evlerden en az birinin güzel listede birisi varsa ve hiçbirinin yaramaz listesinde insan yoksa, Noel Baba'nın en az iki elf'e ihtiyacı olacaktır. Evlerin hiçbiri Noel ruhunda değilse, herhangi bir sayıda elf (0 dahil) 0 saniye sürecektir.

Noel Baba'nın haritasında bir ev a ile temsil edilir *ve her ev bir ile bölünür +. Noel Baba hala diğer meydan okuma ile aynı haritaları kullanıyor , ancak ben onlar hakkında burada belgeleri dahil edeceğim.

Evin her iki tarafında bir sayı olacak - soldaki evdeki yaramaz insan sayısını ve sağdaki evdeki hoş insan sayısını temsil eden sayı olacak. Bir tarafta sayı yoksa 0 olarak yorumlanır.

Kulağa çılgınca gelebileceğini biliyorum, ama bazı insanlar "Noel'i sevmiyor", bu yüzden bazen bir evin iki tarafında da bir sayı olmayabilir.

Noel Baba'nın haritalarından biri böyle görünebilir.

1*3+2*+*5+*+4*7

Diyelim ki Noel Baba'nın kızağında dokuz elf var.

  1. (0s) İlk evde 1 yaramaz ve 3 güzel insan var. Elflerin üçü beş saniye süren kömür, altısı da dört saniye süren hediye gönderiyor. Beş saniye sonra Noel Baba'nın kızağı bir sonraki eve taşınır

  2. (5s) İkinci evde 2 yaramaz ve 0 güzel insan var. Elflerin altısı beş saniye süren kömür üretiyor. Beş saniye sonra Noel Baba'nın kızağı bir sonraki eve taşınır

  3. (10s) Üçüncü evde 0 yaramaz ve 5 hoş insan var. Elflerin sekizi dört hediye vermeye gidiyor (geride kalan bir hediye teslim edemez). Dört saniye sonra, tüm elfler geri döndü ve ikisi diğer hediyeyi teslim etmeye gider (kızak, bir sonraki eve gitmeden önce elflerin geri dönmesini beklemelidir), dört saniye daha

  4. (18s) Dördüncü ev Noel ruhunda değil, bu yüzden 0 yaramaz ve 0 güzel insan var ve atlandı

  5. (18s) Beşinci evde 4 yaramaz ve 7 güzel insan var. Bu biraz karmaşıklaşıyor ...

    I. Elflerin dokuzu da üç kömür armağanı vermeye gidiyor (t + 0'lar bırak, t + 5'ler dön) II. 5 yaşından sonra, hepsi kızağa geri döndüler ve üçü son kömürü (t + 5s bırakın, t + 10'ları iade edin) teslim ederken, diğer altı tanesi üç güzel hediye (t + bırakın) 5s, dönüş t + 9s).

    III. Dört saniye sonra, elflerin altısı geri döndü ve üç daha güzel hediye vermeye gitti (t + 9s bırakın, t + 13s dönün).

    IV. Ayrıldıktan bir saniye sonra, mevcut kömürü teslim eden üç elf geri dönüyor ve iki tanesi son güzel hediyeyi teslim etmek için ayrılıyor (+ 10'lar bırak, t + 14'ler dön)

  6. (18 + 14 = 32 saniye ) Noel Baba o bölgeye hediye teslimini bitirdi.

Gördüğümüz gibi, bu bölgeye hediye vermek Noel Baba'ya toplam 32 saniye sürüyor . Bu, Santa'nın haritalarından birinin aşırı basitleştirilmiş bir versiyonuydu. Normalde, Noel Baba'nın haritalarının birden fazla çizgisi vardır ve listesine daha iyi uyacak şekilde kare şeklindedir. Normal bir harita şöyle görünebilir \n(her satırın sonunda a )

1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*

İle 26 elfler (veya herhangi bir yüksek miktarda), Santa alacağını 71 saniye . 20 elf
ile Santa 76 saniye sürecekti . 15 elf ile Santa 80 saniye sürecekti . 3 elf ile Santa 288 saniye sürecekti . İle 2 elf (ya da herhangi bir alt değeri), olurdu imkansız.


Oh, ve bir şey daha - elflerin teslim sırası meseleleri sunar ( hediyeler teslim zaman farkı nedeniyle) yaramaz / güzel insanlar), bu nedenle kodunuz her zaman elflerin hediye verebileceği en az süreyi vermelidir .

Meydan okuma

Noel Baba'nın belirli sayıda elfin hediye vermesinin ne kadar süreceğini belirlemesine yardımcı olun.

Evler

  • Bir ev bir *
  • Evler bölündü +
  • Evin solundaki sayı yaramaz insanların sayısını sembolize eder (sayı 0 değildir)
  • Sağdaki sayı iyi insan sayısını sembolize eder (hiçbir sayı 0 anlamına gelmez)
  • \nGirişte, bölünmüş olarak da ele alınması gereken yeni satırlar ( ) olabilir

Elfler

  • Noel Baba'nın yaramaz insanlar için üç elften yardıma ihtiyacı var (kömür hediyelerden çok daha ağır) ve bu elflerin hediyeleri teslim etmesi beş saniye * alacak
  • Noel Baba'nın güzel insanlar için iki elften yardıma ihtiyacı var ve bu elflerin hediyeleri teslim etmesi dört saniye sürecek *
  • Evin her iki tarafında sayı yoksa, Santa o evi ziyaret etmeyecek ve bu nedenle zaman almayacaktır (Noel ruhunda olmayan insanlar kömürü bile hak etmiyor)

Santa

  • Noel Baba evlere birer birer hediye teslim etmeli
  • Tüm elfler kızağa dönene ve tüm hediyeler o eve teslim edilene kadar Noel Baba bir sonraki eve geçemez (elfleri geride bırakmak istemiyoruz, şimdi mi?)
  • Noel Baba'nın kızağı evden eve seyahat için hiç zaman harcamaz (Yine, paylaşma özgürlüğünde olmadığım için)

Ne yapalım

Bir ev haritası ve bir dizi elf göz önüne alındığında, Noel Baba'yı haritadaki evlere hediye etmenin ne kadar süreceğini yazdırın.

* (Elflerin hediye vermesi için geçen süreyi paylaşamayabilirim. Bu mücadeleye dahil olan zamanların doğru olduğunu ne onaylayabilir ne de reddedebilirim)

kurallar

  • İki giriş vardır - harita ve elflerin sayısı. Girişler bir işleve bağımsız değişken olarak veya STDIN veya eşdeğerinden alınabilir . Dilinizde iki giriş almak imkansızsa, ancak o zaman ve ancak o zaman iki girişi tek bir giriş dizesi olarak kabul edebilirsiniz, normalde bir girişte olmayan bir karakterle sınırlandırılır ( +*\nveya 0-9- giriş dizesi belirsiz olamaz) örn ,.
  • Elflerin sayısı her zaman negatif olmayan bir tamsayı olacaktır (0 geçerlidir)
  • Çıktı bir işlevin dönüş değeri olabilir veya STDOUT veya eşdeğeri olarak yazdırılabilir . Noel Baba'nın verilen bölgeye belirli sayıda elf ile hediye vermesi imkansızsa, herhangi bir sayı olmadan tutarlı bir negatif sayı veya tutarlı bir mesaj çıkarmalısınız.
  • STDERR'a yazdırılan her şey yok sayılır, bu nedenle sonucu veya hata mesajını STDERR'a yazdıramazsınız
  • Bir bölge için geçersiz sayıda elf verildiğinde programınız çökemiyor
  • Çıktı, yalnızca verilen elflerle hediyeleri teslim etmek için Noel Baba'nın alacağı toplam süre olmalıdır.
  • Çıktı her zaman elflerin hediye vermesi için gereken en az zaman olmalı
  • Giriş sadece sayılar, içerecektir +, *ve yeni satır \n(giriş içerecektir hangi başka bir karakteri belirtmek sürece Dil iki giriş alamayacaksan ilk kural olarak (göz) )
  • Standart boşluklar geçerlidir

Test Durumları

"1*1", 5 elves => 5
"1*1", 3 elves => 9
"1*2", 7 elves => 5
"1*2", 5 elves => 10
"1*2", 3 elves => 13
"2*1", 8 elves => 5
"2*1", 5 elves => 9
"2*1", 3 elves => 14
"1*" , 3 elves => 5
"1*" , 2 elves => (error message)
"*1" , 2 elves => 4
"*1" , 0 elves => (error message)
"*"  , 0 elves => 0

"1*1+1*1",   5 elves => 10
"1*1+1*1",   3 elves => 18
"1*1+*+1*1", 3 elves => 18
"1*2+2*1",   8 elves => 10
"1*2+2*1",   7 elves => 14
"1*2+2*1",   6 elves => 18
"1*2+2*1",   3 elves => 27
"1*2+2*1",   2 elves => (error message)
"*+*+*+*",   2 elves => 0
"*+*+*+*",   0 elves => 0

"1*3+2*+*5+*+4*7", 9 elves => 32

(umarım bütün bunları doğru bir şekilde anladım)

puanlama

Noel Baba her gün her zaman bir sürü şeye bakmaktadır - teslim edeceği tüm hediyeler, sahip olduğu tüm elfler, hediye ettiği tüm evler ... Noel Baba için en iyi Noel hediyesi bir şeyleri biraz görebiliyor. Bu nedenle, bayt cinsinden en kısa gönderim kazanır .

Liderler Sıralaması

Bu, hem liderlik tablosu hem de kazananları dile göre gözden geçiren bir Stack Snippet'tir.

Yanıtınızın görünmesini sağlamak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın.

## Language Name, N bytes

N, gönderiminizin bayt cinsinden boyutu

Başlığınıza birden fazla sayı dahil etmek istiyorsanız (örneğin, eski puanlara çarpma veya bayt sayısına bayraklar ekleme), gerçek puanın başlığınızdaki son sayı olduğundan emin olun.

## Language Name, <s>K</s> X + 2 = N bytes


Sanırım 288 281'i okumalı : (1+0+0+1+2+3+1+0+0+0+4+1+0+0+1+2+3+2+0+0)*5+(2+0+4+0+4+0+6+0+0+0+2+1+4+3+0+3+10+0+5+0)*4=21*5+44*4=105+176=281(bütün "denemeyi" okumadığımı söylemeliyim!)
Jonathan Allan

@JonathanAllan Yea ... Yanlışlıkla meydan okumayı yazmak için çok fazla zaman harcadım ... ayy ... Her neyse, eksik olan şey, Noel Baba'nın kızağının taşınmadan önce tüm elflerin gemiye geri dönmesini beklemesi gerektiğidir. Bu nedenle, tüm sayıları toplayıp çoğaltmak bazı durumlarda işe yarayabilir, ancak çoğu durumda işe yaramaz. Örneğin, 9 elf ile ev 4*714 saniye sürüyor (2D haritasının tanıtılmasından hemen önce "deneme" nin yarısına kadar kaplanmış) ama (4 * 5) + (7 * 4) = 48
Jojodmo

288 değeri 3 elfli örnek içindir, bu yüzden naughty*5+nice*4her evde her zaman tam bir vuruş yapmak zorunda kalacaklar , değil mi? ( 4*7bu örnekte hayır olmadığını unutmayın )
Jonathan Allan

Elfler her zaman önce kömürü önünüze çıkarıyor mu (örneğin örneğiniz gibi) mi yoksa verimli bir şekilde programlıyorlar mı? Örneğin, harita elfler olsaydı 5*15ve 9elfler olsaydı (minimum) 20 saniye mi yoksa 22 saniye mi? Bkz bu metinsel temsillerini bu örnek resmini görmek için.
Jonathan Allan

Yukarıdaki DÜZENLEME 5*15okunmalıdır 4*15.
Jonathan Allan

Yanıtlar:


4

Yakut , 433 400 bayt

Bu gerçekten zor, çünkü elf planlamasının NP zor olduğu ortaya çıkıyor.

Ayrıca, lütfen iyi olun, bu benim ilk başvurum, bu yüzden bazı belirgin optimizasyonları kaçırmış olabilirim:

->e,h{h.split(/\+|\n/).map{|h|n,g=h.split(?*).map(&:to_i)+[0,0];return-1if(g>0&&e<2)||(n>0&&e<3);([[3,5]]*n+[[2,4]]*g).permutation.map{|j|c=[0]*e;j.map{|q|w,y=q;k=l=0;r=c.map{|x|a=b=0;c[k..e].map{|r|r<=x ?a+=1:break};(t=k+=1).times{c[t-=1]<=x ?b+=1:break};[a,b]};d=r.inject([]){|v,x|v<<l if x[0]>=w;l+=1;v}.min{|a,b|c[a]<=>c[b]};b=d-r[d][1]+1;z=c[d]+y;(b..(b+w-1)).map{|x|c[x]=z}};c.max}.min||0}.sum}

Çevrimiçi deneyin!

Başlangıçta daha uzun test vakalarım vardı, ancak bazı durumlarda zamanlama için tüm olası permütasyonları yinelediğim için uzun sürdü, bu yüzden onları kaldırdım.


2
PPCG'ye Hoşgeldiniz! İlk cevabınız için kesinlikle zor bir mücadeleyi
Jo King

2

Java (OpenJDK 8) , 344 bayt

Elf planlaması düşündüğümden daha zor, bu yüzden bu biraz zaman aldı ve oldukça uzun.

Buna rağmen, bu kesinlikle golf kodlamak için en sevdiğim zorluk oldu!

(e,d)->{int r=0,x,y,c,p,b,g,m;for(String h:d[0].split("\\+")){d=h.split("\\*",-1);b=new Byte("0"+d[0]);g=new Byte("0"+d[1]);m=-1>>>1;for(y=1;y<=e/3&(x=(e-y*3)/2)>0;c=b/y+(b%y++<1?0:1),p=g/x+(g%x<1?0:1),x=c*5>p*4?c*5:p*4,m=x<m?x:m);for(y=0;b+g>0;b-=c,g-=p){c=e/3<b?e/3:b;x=(e-c*3)/2;p=x<g?x:g;if(c+p<1)return-1;y+=c>0?5:4;}r+=m<y?m:y;}return r;}

Çevrimiçi deneyin (tüm testlerle)!

Açıklama;

Kendinizi destekleyin: Uzun bir tane

    int r=0,x,y,c,p,b,g,m;               // Define all the variables I need

    for(String h:d[0].split("\\+")){     // Split houses on '+' and loop through them

        d=h.split("\\*",-1);             // Split the current house on '*' using the limit
                                         // to preserve empty strings.

        b=new Byte("0"+d[0]);            // Parse the naughty (b) and nice (g) people
        g=new Byte("0"+d[1]);

        m=-1>>>1;                        // Initialise minimum time as max integer using
                                         // overflow

        for(y=1;y<=e/3&(x=(e-y*3)/2)>0;  // For each number of elves that can concurrently
                                         // deliver coal, and still leave enough elves to
                                         // deliver presents

            c=b/y+(b%y++<1?0:1),         // Determine the number of runs needed to deliver
                                         // all coal using this number of elves

            p=g/x+(g%x<1?0:1),           // Determine the number of runs needed to deliver
                                         // all presents using this number of elves

            x=c*5>p*4?c*5:p*4,           // Get the maximum time required for the
                                         // delivery of coal or presents

            m=x<m?x:m);                  // If this is less than the current minimum time,
                                         // set it as the minimum time


        for(y=0;b+g>0;b-=c,g-=p){        // While there are still people to deliver to;

            c=e/3<b?e/3:b;               // Determine the max amount of coal to deliver

            x=(e-c*3)/2;                 // Determine how many presents can be
                                         // delivered with the remaining elves.

            p=x<g?x:g;                   // If this number is more than nice people
                                         // remaining, just use the nice people remaining

            if(c+p<1)return-1;           // If no presents can be delivered, return the
                                         // error code (-1)

            y+=c>0?5:4;                  // Increase the time by 5 if coal was
                                         // delivered, and 4 if only presents

        }                                // At the end of each loop (see above)
                                         // remove the presents and coal delivered
                                         // from the number of naughty and nice houses

        r+=m<y?m:y;                      // Increment the total time by which ever
                                         // is smaller of the calculated times
    }
    return r;                            // Return the total time

Not: Bu cevap, test senaryolarına yönelik düzeltmelerimin doğru olmasına bağlıdır


Bence (e-y*3)/2-> e-y*3>>1bir bayt kaydeder. (Büyük olasılıkla aynı zamanda geçerlidir (e-c*3)/2.)
Jonathan Frech

runTest("1*4",5,12);başarısız olur (alırsınız "1*4", 5 elves => 13 FAILED. Algoritmanızın bu kadar az baytta nasıl zamanlanacağı konusunda çok şaşırdım, bu yüzden 0 ila 7 arasındaki tüm olası kombinasyonlara (elfler, yaramaz ve güzel) karşı koydum ve başarısız olduğu birkaç tane buldum En iyi zamanı verin Bu başarısız olursa en küçük kombinasyon. BTW, planlamak için inanılmaz mantık, uzun zamandır nasıl yaptığınız hakkında hiçbir fikrim yoktu.
elyalvarado
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.