Giocami un po 'di soldi dal bancomat


26

Il compito è semplice. Get me alcuni 1000, 500e 100le note.

Come ? potresti chiedere. Non preoccuparti, non è necessario rapinare una banca in quanto nelle vicinanze c'è un bancomat che accetta la tua carta di credito. Ma il tuo limite di credito è appena sufficiente per l'attività, quindi devi stare attento con i prelievi.

Sfida

Dato il numero di 1000, 500e 100le note richieste, il calcolo dei prelievi specifici necessari per ottenere almeno quelle molte note. In ogni prelievo, l'ATM può sputare ciascuna nota in base alle seguenti regole:

  • L'importo ritirato ( A) è inferiore a5000
    • Se A%1000 == 0, allora ATM sputa 1 500nota, 5 100note e 1000note di riposo
    • Altrimenti se A%500 == 0, l'ATM sputa 5 100note, 1000note di riposo
    • In caso contrario A%1000 < 500, l'ATM sputa le floor(A/1000) 1000note e le 100note di riposo
    • In caso contrario A%1000 > 500, l'ATM sputa le floor(A/1000) 1000note, 1 500e le 100note di riposo
  • L'importo prelevato è maggiore di uguale a 5000
    • Se A%1000 == 0, l'ATM sputa 2 500note e le 1000note di riposo
    • In caso contrario A%500 == 0, l'ATM sputa 1 500nota e le 1000note di riposo
    • In caso contrario A%1000 < 500, l'ATM sputa le floor(A/1000) 1000note e le 100note di riposo
    • In caso contrario A%1000 > 500, l'ATM sputa le floor(A/1000) 1000note, 1 500e le 100note di riposo

Per chiarimenti, ecco una tabella completa di note ritirate per tutti gli importi possibili fino a 7000(è possibile prelevare di più, ma il modello non cambia successivamente). L'ordine è <1000> <500> <100>:

 100 => 0 0 1                  2500 => 2 0 5                   4800 => 4 1 3
 200 => 0 0 2                  2600 => 2 1 1                   4900 => 4 1 4
 300 => 0 0 3                  2700 => 2 1 2                   5000 => 4 2 0
 400 => 0 0 4                  2800 => 2 1 3                   5100 => 5 0 1
 500 => 0 0 5                  2900 => 2 1 4                   5200 => 5 0 2
 600 => 0 1 1                  3000 => 2 1 5                   5300 => 5 0 3
 700 => 0 1 2                  3100 => 3 0 1                   5400 => 5 0 4
 800 => 0 1 3                  3200 => 3 0 2                   5500 => 5 1 0
 900 => 0 1 4                  3300 => 3 0 3                   5600 => 5 1 1
1000 => 0 1 5                  3400 => 3 0 4                   5700 => 5 1 2
1100 => 1 0 1                  3500 => 3 0 5                   5800 => 5 1 3
1200 => 1 0 2                  3600 => 3 1 1                   5900 => 5 1 4
1300 => 1 0 3                  3700 => 3 1 2                   6000 => 5 2 0
1400 => 1 0 4                  3800 => 3 1 3                   6100 => 6 0 1
1500 => 1 0 5                  3900 => 3 1 4                   6200 => 6 0 2
1600 => 1 1 1                  4000 => 3 1 5                   6300 => 6 0 3
1700 => 1 1 2                  4100 => 4 0 1                   6400 => 6 0 4
1800 => 1 1 3                  4200 => 4 0 2                   6500 => 6 1 0
1900 => 1 1 4                  4300 => 4 0 3                   6600 => 6 1 1
2000 => 1 1 5                  4400 => 4 0 4                   6700 => 6 1 2
2100 => 2 0 1                  4500 => 4 0 5                   6800 => 6 1 3
2200 => 2 0 2                  4600 => 4 1 1                   6900 => 6 1 4
2300 => 2 0 3                  4700 => 4 1 2                   7000 => 6 2 0
2400 => 2 0 4

Elenco fornito da Martin

La presa

Poiché il limite di credito nella tua carta di credito è appena sufficiente, devi assicurarti che l' importo totale prelevato attraverso i prelievi sia il minimo possibile per l'input / requisito dato delle note.

Ingresso

L'input può essere in qualsiasi formato favorevole per tre numeri corrispondenti al numero di note richieste di valore 1000, 500e 100. Non necessariamente in questo ordine.

Produzione

L'output è l'importo da prelevare in ogni transazione separata da una nuova riga.

Esempi

Input (formato <1000> <500> <100>):

3 4 1

Produzione:

600
600
600
3600

qualcuno di più:

7 2 5
5000
3500

1 2 3
600
1700

21 14 2
600
600
600
1600
5000
5000
5000
5000
5000

ipotesi

  • Si può presumere che il bancomat abbia un numero infinito di note per ciascun importo.
  • Puoi anche presumere di poter effettuare un numero qualsiasi di transazioni.
  • Inoltre, la soluzione per alcuni valori di input potrebbe non essere univoca, quindi è possibile produrre 1 qualsiasi della soluzione che soddisfi la quantità minima possibile e le condizioni minime richieste.

Come al solito, è possibile scrivere un programma completo che legge l'input tramite STDIN / ARGV e stampa l'output su STDOUT o una funzione che accetta input tramite argomenti e restituisce un elenco di numeri interi corrispondenti agli importi o una stringa con importi separati da una nuova riga.

Questo è code-golf, quindi vince il codice più breve in byte.


@nutki davvero. Modificato.
Ottimizzatore

Ci sono limiti di velocità? L'ultimo caso di test dovrebbe 21 14 2finire in un tempo ragionevole?
Jakube

1
@Jakube In un tempo ragionevole - sì (diciamo meno di 5-6 ore). Ma come tale, nessun limite in quanto questo è code-golf.
Ottimizzatore

Quindi, se prelevo 0, mi daranno cinque 100 note?
AJMansfield,

@AJMansfield ovviamente no. Non puoi prelevare un importo pari a 0
Ottimizzatore

Risposte:


7

JavaScript, 184 148

function g(a,b,c){x=[];while(a>0||b>0||c>0){i=b<3||a<4?a:4;a-=i;if(i>3&&b>1){b-=2;i++}else{i+=(c--<b&&i>4?0:.1)+(b-->0?.5:0)}x.push(i*1e3)}return x}

http://jsfiddle.net/vuyv4r0p/2/

restituisce un elenco di numeri interi corrispondenti agli importi di prelievo


Prova g(5,1,1). Una soluzione migliore: 5600.
jimmy23013,

dovrebbe essere risolto ora
hoffmale

g(5,1,0)Soluzione: 5500.
jimmy23013,

che ora dovrebbe anche essere risolto ^^ grazie per
averlo

g(5,2,0)Soluzione: 6000.
jimmy23013,

1

Perl 5: 223

modificare

Questa soluzione è stata fatta supponendo erroneamente che 7K è il limite ATM. Ciò ha reso l'attività più interessante in quanto richiedeva una programmazione dinamica (il modello di spostamento era abbastanza regolare, ma la codifica effettiva sarebbe probabilmente più lunga del calcolo dal vivo come ho fatto io). Con qualsiasi quantità possibile il modello di spostamento è così regolare che è banale codificarlo. Non so se la soluzione di @hoffmale ora sia corretta, ma sarà tra queste righe. Così tristemente sarà un altro compito in cui prima qualcuno arriva con una soluzione e poi viene portato in una lingua da golf per una vittoria.

Un po 'più lento della soluzione originale (ma ancora sub-secondo per i parametri inferiori a 100).

#!perl -pa
$c{0,0}=$f=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/.(?=.$)/>($n=$c{$i-$`,$j-$'})||${$r=\$c{$i,$j}}<($x=$n+$&)&&$$r
or$f=$$r="$x $n".($'.$&+5*$`)."00
"for 204..206,105,106,11..15,110..114}}$_=$f."100
"x($c-$f+3);s/.*\b3//

Soluzione più rapida 259.

#!perl -pa
$c{0,0}=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/\B./<($%=$c{$i-$&,$j-$'}+$`)&&(!${$r=\$c{$i,$j}}||$$r>$%)and$d{$i,$j}=$_,$$r=$%for
qw/024 025 026 015 016/,101..105,110..114}}
$d{$b,$a}=~/\B./,$c-=$`,$b-=$&,$a-=$',print$'.$`+5*$&,"00
"while$a+$b;$_="100
"x$c

Usa STDIN:

$perl atm.pl <<<"21 14 2"
5000
5000
5000
5000
5000
600
600
600
1600

Prova 10 0 0. Soluzione migliore: 10100.
jimmy23013,

@ user23013 oops, ho frainteso la domanda. Presumo che 7k sia l'importo massimo :( spero di riuscire a risolverlo.
Nutki,
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.