Optimieren Sie meine Flügelreihenfolge


17

Dieser Tweet listet die möglichen Bestellungen für Wings eines chinesischen Restaurants 1 auf :

Wings-Menü

Wenn ich Pizza bestelle, berechne ich normalerweise, welche Größe mir das beste Pizza-Preis-Verhältnis gibt, was eine einfache Berechnung ist. Allerdings ist es nicht so einfach, den Preis für eine Bestellung in diesem Restaurant zu minimieren. Deshalb möchte ich gerne auf meine nächste Bestellung dort vorbereitet sein.

Herausforderung

Wenn eine ganze Zahl größer oder gleich 4 , müssen Sie eine mögliche Bestellung zurückgeben, die den Preis (den insgesamt günstigsten Preis) und die Anzahl der Deals minimiert.

Beispiel

Wenn ich Wings bestellen würde , würde das beste Schnäppchen . Es gibt jedoch mehrere Bestellungen, die diesen Betrag kosten, nämlich:100$111.20

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

Da die erste Bestellung die geringste Anzahl von Deals ( ) verwendet, ist das Ergebnis .2[50,50]

Regeln

  • Die Eingabe wird eine Ganzzahln4
  • Die Ausgabe ist eine Liste / ein Array / ... von Auftragsgrößen, die sich zu summieren und den Auftragspreis minimieren n
    • Sie können alle möglichen Bestellungen zurückschicken

Testfälle

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)

Hinweis: Diese Testfälle Liste alle möglichen Ausgänge einschließlich des Preises, sind Sie nur zur Ausgabe benötigt ein und Sie sind nicht zur Ausgabe benötigt der Preis!


1: Sie können die Daten als CSV finden hier .


3
Die eigentliche Frage ist, wer bestellt 200 oder sogar 100 Flügel? ...
Erik der Outgolfer

2
@Quintec: Warum brauchen Sie mehr Testfälle?
26.

1
Zwei Antworten haben die Anforderungen falsch interpretiert, da nur der Preis minimiert werden muss. Da das Minimieren des Preises und der Anzahl der Deals nicht eindeutig ist (niedrigster Preis auf den Wegen mit der niedrigsten Anzahl von Deals oder niedrigste Anzahl von Deals auf den Wegen mit dem niedrigsten Preis), ist es sinnvoll, die Anforderung genauer zu definieren
Trichoplax


1
Ich bemerke, dass für der Preis durch 1 gegeben istn23120(68n3)25<n<=5025n25n<297080125

Antworten:


7

JavaScript (ES6), 123 Byte

Gibt die Bestellung als durch Leerzeichen getrennte Zeichenfolge zurück.

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):''

Probieren Sie es online!

Wie?

n

n>128n=125

125n129n125

125<n<1294

n<31

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

31n50

25

  • n5
  • n=4940+928+219

51n53

504252×26n=5225+27

54n128n125

50

  • n=70
  • n{80,86,89,92,98,105,108}8080108

    10010000001000001001001000001(2)=302256705(10)


4

JavaScript (Node.js) , 112 108 106 105 Bytes

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):''

Probieren Sie es online!

Optimiert aus Arnauld's Antwort

Unterschiede

  • 51≤n≤53 wird zu 31≤n≤50 zusammengeführt (8 Byte speichern)
  • Schreiben Sie die Bitmap neu (3 Bytes speichern)
  • Logik neu anordnen ( 4 6 7 Bytes gespeichert)

2

Retina 0,8,2 , 160, 155 Bytes

.+
$*
{`\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

nn

.+
$*

In Unary konvertieren.

{`

Wiederholen, bis keine Deals mehr gekauft werden können.

{`\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,$&

Finden Sie eine Möglichkeit zum Kauf von Deals und erfassen und duplizieren Sie einen der Deals.

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

n

Deals werden zu folgenden Konditionen gekauft:

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

Kaufen Sie 80 Flügel, wenn Sie 0, 6, 9, 12, 15, 18, 25 oder 28 Flügel haben.

1{70}$

Kaufen Sie 70 Flügel, wenn das alles ist, was wir brauchen.

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

Kauf 9 Flügel, wenn das 15 oder 40 Flügel lässt.

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

Kaufen Sie 30, 35, 40 oder 45 Flügel, wenn das alles ist, was wir brauchen.

1{26,29}$

Kaufen Sie 26, 27, 28 oder 29 Flügel, wenn das alles ist, was wir brauchen.

1{4,23}$

Kaufen Sie 4 bis 23 Flügel, wenn das alles ist, was wir brauchen.

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

Kaufen Sie 125, 50 oder 25 Flügel, wenn wir können und wenn wir noch genau mehr Flügel kaufen können. Beachten Sie, dass wir diese Optionen am Ende des Wechsels haben, damit die genauen Einkäufe zuerst getestet werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.