Ottimizza il mio ordine di ali


17

Questo tweet elenca i possibili ordini per Wings of a Chinese restaurant 1 :

Menu Ali

Quando ordino la pizza di solito calcolo quale taglia mi dà il miglior rapporto prezzo-pizza che è un semplice calcolo. Tuttavia, ridurre al minimo il prezzo di un ordine in questo ristorante non è un compito così semplice, quindi mi piacerebbe essere preparato per il mio prossimo ordine lì.

Sfida

Dato un numero intero maggiore o uguale a 4 , il tuo compito è quello di restituire un possibile ordine che minimizzi il prezzo (nel complesso più economico) e il numero di offerte.

Esempio

Se dovessi ordinare 100 Ali, risulta che il miglior affare avrà un costo di $111.20 . Tuttavia ci sono più ordini che costeranno tale importo, vale a dire:

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

Poiché il primo ordine utilizzerà il minor numero di offerte ( ), il risultato sarà .2[50,50]

Regole

  • L'input sarà un numero intero n4
  • Output sarà un elenco / array / ... di ordine dimensioni tale somma fino a n e ridurre al minimo il prezzo del ordine
    • puoi scegliere di restituire tutti i possibili ordini

Casi test

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)

Nota: questi test elencano tutti i possibili output incluso il prezzo, devi solo produrne uno e non ti viene richiesto di produrre il prezzo!


1: Puoi trovare i dati come CSV qui .


3
La vera domanda è: chi ordina 200 o addirittura 100 ali? ...
Erik the Outgolfer,

2
@Quintec: Perché, hai bisogno di più testcase?
ბიმო

1
Due risposte hanno interpretato erroneamente i requisiti, in quanto devono solo minimizzare il prezzo. Poiché ridurre al minimo il prezzo e il numero di offerte è ambiguo (il prezzo più basso disponibile dalle modalità con il numero più basso di offerte o il numero più basso di offerte disponibile dalle modalità con il prezzo più basso) varrebbe la pena modificare il requisito per essere più esplicito
trichoplax,


1
Noto che per il prezzo è dato da 1n23, mentre i prezzi per25<n<=50possono essere suddivisi in25en-25(pern<29non è possibile acquistarli separatamente ma la formula fornisce comunque il valore appropriato). 70,80e125possono anche essere derivati ​​da valori precedenti, quindi se puoi usarli ridurranno il numero di offerte. Gli altri valori sono antieconomici. 120(68n3)25<n<=5025n25n<297080125
Neil,

Risposte:


7

JavaScript (ES6), 123 byte

Restituisce l'ordine come stringa separata da spazio.

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

Provalo online!

Come?

Dato un numero n di ali, applichiamo ricorsivamente la seguente strategia.

Valori alti: n>128 o n=125

Per valori elevati, la nostra migliore opzione è quella di acquistare 125 ali. Quindi è quello che stiamo facendo fintanto che n è maggiore o uguale a 129 o quando n è esattamente uguale a 125 .

Non possiamo farlo per 125<n<129 perché resteremmo con meno di 4 ali da comprare, il che non è possibile.

Valori bassi: n<31

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

31n50

25

  • n5
  • n=4940+928+219

51n53

504252×26n=5225+27 è altrettanto buono.)

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 byte

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

Provalo online!

Ottimizzato dalla risposta di Arnauld

differenze

  • 51≤n≤53 viene unito in 31≤n≤50 (8 byte di risparmio)
  • Riscrivi la bitmap (salvataggio di 3 byte)
  • Riorganizzare la logica ( 4 6 7 byte salvati)

2

Retina 0.8.2 , 160 155 byte

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

.+
$*

Converti in unario.

{`

Ripeti fino a quando non sarà più possibile acquistare altre offerte.

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

Trova un modo per acquistare offerte e acquisire e duplicare una delle offerte.

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

n

Le offerte vengono acquistate alle seguenti condizioni:

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

Acquista 80 ali se lascia 0, 6, 9, 12, 15, 18, 25 o 28 ali.

1{70}$

Acquista 70 ali se è tutto ciò di cui abbiamo bisogno.

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

Acquista 9 ali se lascia 15 o 40 ali.

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

Acquista 30, 35, 40 o 45 ali se è tutto ciò di cui abbiamo bisogno.

1{26,29}$

Acquista 26, 27, 28 o 29 ali se è tutto ciò di cui abbiamo bisogno.

1{4,23}$

Acquista da 4 a 23 ali se è tutto ciò di cui abbiamo bisogno.

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

Acquista 125, 50 o 25 ali se possiamo e se possiamo ancora acquistare più ali esattamente. Si noti che abbiamo queste opzioni alla fine dell'alternanza in modo che gli acquisti esatti vengano testati per primi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.