Oyuncak mağazası karları


15

Hikaye

"2016? Al .. sağ," homurdandı oyuncak satıcısı Hilbert. Gözlerini açtı, kulağından sarkan salata sosu sildi ve bir sabah tekme cremeschnitte yedi. Örnek tatiller. Yine de işe gitmesi ve yılın muhasebesini bitirmesi gerekiyor.

Noel, özellikle satışları için yılın çok verimli bir dönemidir. Hilbert tam olarak nasıl çalıştığını biliyor: Bir kişi bir dükkana giriyor ve ilk teklif edilen hediyeyi alıyor. Bunun bedelini ödüyorlar ve başka bir dükkana koşuyorlar. Uygulamada, hediyenin gerçekte ne olduğu gerçekten bir fark yaratmaz. Çok yüksek olmaması koşuluyla fiyat da önemsizdir. Her şey Noel'e kadar kalan süreye bağlıdır - zaman ne kadar kısa olursa, müşterilerin pişmanlığı o kadar yüksek olur, ödemek istedikleri fiyat o kadar büyük olur.

Hilbert için tek gereken saatine bakmak - ve müşterilerinin ne kadar harcayacağını hemen biliyor. Bu gerçeği kolayca kullanabilir: Sadece belirli bir müşteriye satabileceği en pahalı hediyeyi bulur ve onlara sunar. Ancak şimdi bu kurnaz stratejiyi geçen yıl kullanmayı unuttuğunu fark etti. Bu değişecek!

Yine de, Hilbert büyük planını kullansaydı, işinin ne kadar gelişeceğini bilmek isterdi. Mağazasına gelen insanların bir listesini oluşturmayı başardı, ancak onlara ne kadar para kazanabileceğinden emin değil.

Göreviniz (TL; DR)

Girdi , mevcut hediye fiyatlarının artan bir listesinden ve müşteri bütçelerinin bir listesinden oluşur. Bütçe listesi, müşteriler mağazaya vardıkları sırayla aynıdır - her müşterinin en az bir öncekinden daha fazla ödeme yapmaya istekli olması şartıyla, aynı zamanda artan da demektir.

Her müşteri için, ödemek istedikleri en pahalı hediyeyi bulun ve fiyatını alın. Bütçe dahilinde hediye yoksa, çıktı a 0.

Eğer -40%algoritmanızın asimptotik zaman karmaşıklığı O(n+m)(önemsiz değil O(n*m)) ise, bir karakter bonusu alırsınız . Giriş listelerinin uzunlukları nerede n, m.

Bu , en kısa bayt kazanır. Standart boşluklar yasaktır.

Misal

Giriş:

1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22

Çıktı:

1 0 2 2 5 2 10 20 7 0

Bu görev yerel bir programlama yarışmasından alındı ​​ve benim tarafımdan İngilizceye çevrildi. İşte orijinal ödev: https://www.ksp.sk/ulohy/zadania/1131/


9
Zorluklar yazarken bonuslardan kaçınılması gereken bir şey vardır . Ancak, burada iyi olabileceğini düşünüyorum. Eğer saklamak istiyorsanız, yüzdeye dayalı bir bonus olarak değiştirmenizi tavsiye ederim. 20 karakterlik bonus, Java gönderimi için bir şey ifade etmez, ancak golf dilinde çözümler için temel olarak zorunludur.
Denker

Yalnız backstory için OP'ye bir ödül verebilir miyim? Dürüst olmak gerekirse, bu beni güldürdü; her meydan okuma bunlardan birine ihtiyaç duyar.
kedi

@tac Teşekkürler, ancak alttaki küçük metinde belirtildiği gibi, aslında arka plana uymadım - sadece tercüme ettim.
sammko

@sammko evet, bunu gördüm, ama yukarıdaki yorumum hala geçerli :)
kedi

Yanıtlar:


5

Pyth, 17 16 bayt

Pietu1998 sayesinde 1 bayt

VE=.-Q]
e|fgNTQ0

gösteri

Açıklama:

VE=.-Q]<\n>e|fgNTQ0
                        Implicit: Q is the list of prices.
VE                      For N in the list of budgets
             f   Q      Filter the list of prices
              gNT       On the current person's budget being >= that price
            |     0     If there aren't any, use 0 instead.
          e             Take the last (most expensive) value.
      <\n>              Print it out.
  =.-Q                  Remove it from the list of prices.

Sanırım VE=.-Q]\ n ile 1 bayt kaydedebilirsiniz e|fgNTQ0. Temelde aynı şey ama bir döngü ile.
PurkkaKoodari

4

Haskell, 67 bayt

a#(b:c)|(h,t)<-span(<=b)a=last(0:h):(init(h++[0|h==[]])++t)#c
_#x=x

Kullanım örneği: [1,2,2,2,5,7,10,20] # [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0].

: İki parça halinde fiyatlar bölün tüm fiyatlar <= sonraki müşterinin bütçesi ve diğerleri bulunmaktadır. Son fiyatını alın ve artı sonuncusu hariç tümüyle tekrarlayın(h,t)hthht ve kalan bütçelerin . boş last(0:h)olup 0olmadığını değerlendirir h. Benzer: init (h++[0|h==[]]) ++ tbir kukla elemanı ekler 0için heğer hböylece boş initdüşmesi şey vardır ( initboş listede başarısız).


3

Java, 154 * 0.6 = 92.4 bayt

-13 bayt çünkü lambda aslında kullanabilir int[], değil Integer[](teşekkürler BunjiquoBianco )

Bu, O (n + m) zaman ve O (n + m) ek alan gerektirir (büyük O gösterimini anladığımı varsayarak) .

g->b->{int l=g.length,L=b.length,G=0,B=0,A=0;int[]a=new int[l],s=new int[L];for(;B<L;){while(G<l&&g[G]<=b[B])a[A++]=g[G++];s[B++]=A>0?a[--A]:0;}return s;}

Girintili: ( Çevrimiçi deneyin! )

static int[] toyStore(int[]g,int[]b) {
    int gl=g.length,bl=b.length,gp=0,bp=0,ap=0;
    int[] a=new int[gl],s=new int[bl];
    for (;bp<bl;) {
        while(gp<gl&&g[gp]<=b[bp])a[ap++]=g[gp++];
        s[bp++]=ap>0?a[--ap]:0;
    }
    return s;
}

public static void main(String[] args)
{
    System.out.println(Arrays.toString(
        toyStore(new int[] {1,2,2,2,5,7,10,20},
                 new int[] {1,1,2,3,6,6,15,21,21,22})
        ));
}

Burada lambda olmayan genişlemeyi gösterdim çünkü tür bildirimi daha temiz ve aynı mantık. Lambda ideone bağlantısında bulunur.

Açıklama:

Kullanılan değişkenler:

  • g hediye fiyatlarının listesi, b listesi, bütçe listesidir.
  • gluzunluğu gvebl uzunluğu b.
  • a uygun fiyatlı hediyeler için bir yığın, s , satılan hediyeler çıkış dizisidir.
  • gp, bpVe apiçin noktalar şunlardır g, bve asırasıyla. bpaynı zamanda göstergesidir s.

Algoritma:

  • Bütçe uzunluğundaki her bütçe için
    • Bu bütçe hediyeyi şu adresten satın alırken: g[gp]
      • Bütçeyi Yığının üzerine itin ave artırıngp
    • Üst Pop aiçine s[bp]varsa, başka put 0.

Lambda'yı körükleyemez misin? (yani (g,b)->hiç g->b->?
ASCII sadece

Görünüşe göre, evet. Nedense daha önce benim için hiç işe yaramadı ama şimdi olacak. 0.o (Sen ikramiye sonra 0.6 bayt kaydedildi.)
CAD97

Girişin uzun olduğu varsayılırsa longs kullanarak bazı baytlar kaydedebilirsiniz [] (sizi 158byte'a götürür) - ideone.com/invHlc
BunjiquoBianco 29:16

1
@BunjiquoBianco Aslında sadece int [] kullanabilirsiniz. Nedense ben intbir tür referans türleri bir dizi kullanmak için gerekli tür argümanları referans türleri (böylece değer türü ilkel gibi değil ) almak izlenimi altındaydı . Ama int iyi bir dizi kullanabilirsiniz. Bir şansım olduğunda güncelleyeceğim.
CAD97

@ CAD97 Ha! Bu bağlantıyı
yapmadığımı düşünemiyorum

2

Haskell, 87 * 0.6 = 52.2 bayt

g s(p:q)d@(b:c)|p<=b=g(p:s)q d
g[]p(b:c)=0:g[]p c
g(s:t)p(b:c)=s:g t p c
g _ _ _=[]
g[]

Diğer cevabımdan tamamen farklı , çünkü bonusa gidiyorum.

Son satır (-> g[]) tanımın bir parçası değil, ek yükü çağırır. Kullanım örneği: g [] [1,2,2,2,5,7,10,20] [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0].

Temel olarak @ CAD97'nin cevabı ile aynı şekilde çalışır , yani satın alınabilir öğeleri takip etmek için (başlangıçta boş) bir yardımcı yığın kullanır. Ayrıntılı olarak: sırayla kontrol edin:

  • ilk fiyat ilk bütçeden daha az veya ona eşitse, fiyatı yığına taşıyın. Tekrar ara.
  • yığın boşsa, 0 döndürülür ve ardından bütçe düştüğünde özyinelemeli bir çağrı gelir.
  • hem yığın hem de bütçe listesi boş değilse, yığının en üstünü ve ardından yığın ve bütçe açılmış bir özyinelemeli çağrı döndürün.
  • yoksa boş listeyi döndürün.

Bu m+nzamanla çalışır , çünkü a) yardımcı yığın üzerindeki işlemler sabit zaman kullanır ve b) her bir özyinelemeli çağrıda listelerden biri bir öğe tarafından kısaltılır.


2

Jöle , 15 bayt

ṀṄ;©®œ^
Rf@€ç/Ṁ

Çevrimiçi deneyin!

Nasıl çalışır

ṀṄ;©®œ^  Helper link. Arguments: G, H (lists of affordable gifts)

Ṁ        Compute the maximum of G (0 if the list is empty).
 Ṅ       Print it.
  ; ®    Concatenate it with the register (initially 0).
   ©     Save the result in the register.
     œ^  Compute the multiset symmetric difference of the updated register and H.

Rf@€ç/Ṁ  Main link. Arguments: B (budgets), P (prices)

R        Range; replace each t in B with [1, ..., t].
 f@€     Intersect the list of prices with each budget range, obtaining, for each
         customer, the list of all gifts he's willing to pay for.
    ç/   Reduce the array of lists by the helper link.
         In each iteration, this computes and prints the most expensive gift for
         a customer, than removes the selected gift (and all previously
         selected gifts) from the next list.
      Ṁ  Compute the maximum of the resulting list, which corresponds to the last
         customer.

1

JavaScript, 85 * 0.6 = 51 bayt

f=(a,b,s=[],[t,...u]=a,[v,...w]=b)=>v?t<=v?f(u,b,[...s,t]):[s.pop()|0,...f(a),w,s)]:[]

@ CAD97'nin cevabının bir başka klonu.

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.