Kanat siparişimi optimize et


17

Bu tweet bir Çin restoranı Wings 1 için olası emirleri listeler :

Wings menu

Pizza siparişi verirken genellikle hangi büyüklükte bana basit bir hesaplama olan en iyi Pizza-fiyat oranını veririm. Ancak bu restoranda bir siparişin fiyatını en aza indirmek o kadar basit bir görev değil, bu yüzden bir sonraki siparişim için hazırlıklı olmak istiyorum.

Meydan okuma

4 eşit veya daha büyük bir tamsayı verildiğinde , göreviniz fiyatı (genel olarak en ucuz) ve fırsat sayısını en aza indiren olası bir siparişi geri vermektir.

Misal

100 Wings sipariş edersem , en iyi pazarlığın 111.20 $111.20 mal olacağı ortaya çıktı . Ancak, bu tutara mal olacak birden fazla sipariş vardır:

[50,50],[25,25,50],[25,25,25,25]

İlk sipariş en az miktarda anlaşma kullanacağından ( 2 ) sonuç olacaktır [50,50].

kurallar

  • Giriş bir tamsayı olacak n4
  • Çıktı, n kadar olan ve siparişin fiyatını en aza indiren sipariş boyutlarının bir listesi / dizisi / ... olacaktır.
    • olası tüm siparişleri iade etmeyi seçebilirsiniz

testcases

4 -> [4]  (4.55)
23 -> [23]  (26.10)
24 -> [6,18],[9,15],[12,12]  (27.20)
31 -> [6,25]  (34.60)
32 -> [4,28],[6,26],[7,25]  (35.75)
33 -> [4,29],[5,28],[6,27],[7,26],[8,25]  (36.90)
34 -> [6,28],[9,25]  (38.00)
35 -> [35]  (39.15)
125 -> [125]  (139.00)
200 -> [25,50,125]  (222.40)
201 -> [26,50,125]  (223.55)
250 -> [125,125]  (278.00)
251 -> [26,50,50,125]  (279.15)
418 -> [15,28,125,125,125],[18,25,125,125,125]  (465.20)
1001 -> [26,50,50,125,125,125,125,125,125,125]  (1113.15)
12345 -> [15,80,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125],[25,70,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125],[45,50,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125]  (13728.10)

Not: Bu test senaryoları , fiyat dahil olmak üzere tüm olası çıktıları listeler , yalnızca çıktı almanız gerekir biri ve konum değil fiyat çıkışına gerekli!


1: Verileri CSV olarak bulabilirsiniz burada bulabilirsiniz .


3
Asıl soru, kim 200, hatta 100 kanat sipariş ediyor? ...
Outgolfer Erik

2
@Quintec: Neden daha fazla test senaryosuna ihtiyacınız var?
ბიმო

1
İki cevap, sadece fiyatı en aza indirmeye ihtiyaç duyduğu için gereksinimleri yanlış yorumladı. Fiyat ve fırsat sayısını en aza indirmek belirsiz olduğundan (en düşük fırsat sayısına sahip yollardan elde edilen en düşük fiyat veya en düşük fiyatla yollardan elde edilen en düşük fırsat sayısı) daha açık olma gereksinimini düzenlemeye değer
trichoplax


1
için fiyatın 1 tarafından verildiğini fark ettim.n23120(68n3)25<n<=5025n25n<297080125

Yanıtlar:


7

JavaScript (ES6), 123 bayt

Sırayı boşlukla ayrılmış dize olarak döndürür.

f=n=>n?(x=n>128|n==125?125:n>50?n<54?25:n-70?302256705>>n-80&n>79&n<109?80:50:n:n-24&&n-49?n<31|n%5<1?n:25:9)+' '+f(n-x):''

Çevrimiçi deneyin!

Nasıl?

n

n>128n=125

125n129n125

125<n<1294 satın almak için kanatla bırakılırdık, bu mümkün değil.

n<31

n<31n=242×1218+615+99

31n50

25

  • n5
  • n=4940+928+219

51n53

504252×26n=5225+27 sadece iyi gibidir.)

54n128n125

50

  • n=70
  • Eğer n içinde {80,86,89,92,98,105,108}, satın almalıyız 80kanatları. Bu değerler, en az anlamlı bitin eşleştirildiği aşağıdaki bitmask ile kodlanır80 ve en önemlisi 108:

    10010000001000001001001000001(2)=302256705(10)


4

JavaScript (node.js) , 112 108 106 105 bayt

f=n=>n?(x=n>128|n==125?125:n>53&n!=70?1629>>n/3+6&n<99==n%3/2?80:50:~n%25?n>30&&n%5?25:n:9)+' '+f(n-x):''

Çevrimiçi deneyin!

Arnauld'un cevabından optimize edildi

farklılıklar

  • 51≤n≤53 31≤n≤50 ile birleştirilir (8 bayt tasarruf)
  • Bitmap'i yeniden yazın (3 bayt kaydetme)
  • Bazı mantığı yeniden düzenleyin ( 4 6 7 bayt kaydedildi)

2

Retina 0.8.2 , 160 155 bayt

.+
$*
{`\b(1{80}(?=((111){2,6}|1{25}|1{28})?$)|1{70}$|1{9}(?=.{15}$|.{40}$)|(1{5}){6,9}$|1{26,29}$|1{4,23}$|1{125}|1{50}|1{25})+$
$1,$&
(1+),\1(1*)$
$.1,$2

Çevrimiçi deneyin! Bağlantı, içindeki tüm değerleri test eden başlık içeriyorn 1'e kadar, yalnızca test etmek istiyorsanız kaldırın nkendisi. @ Arnauld'un algoritmasını kullanır. Düzenleme: 95 kanat 50 + 45 yerine 80 + 15 olarak satın alınarak 5 bayt kaydedildi.

.+
$*

Tekli'ye dönüştür.

{`

Başka teklif alınamayana kadar bu işlemi tekrarlayın.

{`\b(1{80}(?=((111){2,6}|1{25}|1{28})?$)|1{70}$|1{9}(?=.{15}$|.{40}$)|(1{5}){6,9}$|1{26,29}$|1{4,23}$|1{125}|1{50}|1{25})+$
$1,$&

Fırsat satın almanın bir yolunu bulun ve fırsatlardan birini yakalayın ve çoğaltın.

(1+),\1(1*)$
$.1,$2

Yakalanan fırsatı ondalık sayıya dönüştürün ve n.

Fırsatlar aşağıdaki koşullar altında satın alınır:

1{80}(?=((111){2,6}|1{25}|1{28})?$)

0, 6, 9, 12, 15, 18, 25 veya 28 kanat bırakırsa 80 kanat satın alın.

1{70}$

İhtiyacımız olan tek şey 70 kanat satın alın.

1{9}(?=.{15}$|.{40}$)

15 veya 40 kanat bırakırsa 9 kanat satın alın.

(1{5}){6,9}$

İhtiyacımız olan tek şey 30, 35, 40 veya 45 kanat satın alın.

1{26,29}$

İhtiyacımız olan tek şey 26, 27, 28 veya 29 kanat satın alın.

1{4,23}$

İhtiyacımız olan her şey 4 ila 23 kanat satın alın.

1{125}|1{50}|1{25}

Mümkünse 125, 50 veya 25 kanat satın alabilir ve yine de tam olarak daha fazla kanat satın alabilirsek. Dönüşümün sonunda bu seçeneklere sahip olduğumuzu unutmayın, böylece ilk olarak tam satın alma işlemleri test edilir.

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.