Opracuj zmianę [zamknięte]

10

Piszesz program automatycznej kasy fiskalnej. Użytkownik potrzebuje zmiany przy najmniejszej liczbie użytych monet. Napisz program, który pobiera kwotę (powiedzmy 1,53 USD) i daje zmianę nominałów w USA - w tym przypadku: 1 x banknot jednodolarowy, 1 x pięćdziesiąt centów i 3 x jeden cent. Zwycięzcą będzie najkrótszy program. Punkty bonusowe za obsługę innych walut (tj. Denominacji w Wielkiej Brytanii) i walut nietypowych (1, 2, 3 centy?)

Masz następujące nominały w USA: 1 cent, 5 centów, 10 centów, 25 centów, 50 centów, 1 dolar (banknot lub moneta), 2 dolary, 5 dolarów, 10 dolarów.

Masz następujące nominały w Wielkiej Brytanii: 1 pens, 2 pensy, 5 pensów, 10 pensów, 20 pensów, 50 pensów, 1 GBP, 2 GBP, 5 GBP (banknoty lub monety), 10 GBP.

Thomas O
źródło
3
To prawdopodobnie wymaga trochę wyjaśnienia. Po pierwsze, prawdopodobnie powinieneś sprecyzować, że chcemy najmniejszej liczby monet (co sprawia, że ​​pytanie bonusowe jest nieco bardziej interesujące, np. {1c, 49c, 50c} i 98c łamie naiwny algorytm). Po drugie, użyteczny jest format wejściowy / wyjściowy. Pomocna byłaby specyfika postępowania z nieosiągalnymi wartościami (dla gotowych walut). Na koniec - możesz wymienić tutaj nominały, aby ludzie nie musieli ich sprawdzać, jeśli nie są z tym zaznajomieni.
Nabb,
Jak działają punkty bonusowe? Tylko jeśli jest remis dla najkrótszego programu?
gnibbler
@gnibber, cytując Stephena Fry'ego: „[punkty] są bezstronnie określone przez wybraną demograficznie firmę doradczą zorientowaną na obsługę klienta, w podziale na wiek i płeć - tzn. mnie”.
Thomas O
Poproszę o 50 centów, ponieważ nie widziałem jeszcze 50 centów. Ale najwyraźniej
Martin York

Odpowiedzi:

2

Windows PowerShell, 108 111 117

Pierwsza próba, jak dotąd niefundowana:

$i=+("$input"-replace'[^\d.]')
$args|%{0d+$_}|sort -des|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}

Uwagi dotyczące wdrożenia:

  1. Akceptuje ilość do zwrotu rurociągiem
  2. Akceptuje listę nominałów walutowych za pomocą wiersza polecenia
  3. Ilość można podać ze znakiem waluty; które zostaną usunięte (w rzeczywistości wszystko, co nie jest numeryczne).
  4. Lista nominałów nie musi być sortowana.
  5. Program wyświetli największą zmianę mniejszą niż wymagana ilość możliwa do uzyskania przy podanych nominałach, tj. 1,5 za 1,53, jeśli brakuje monety 1-centowej.

Jeśli 3 i 4 nie muszą być spełnione (czyli ja kontrolować format wejściowy ;-)), to następujące jest wystarczająca programowe (71):

$i=+"$input"
$args|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}
Joey
źródło
2

Mathematica: 110 znaków

Sort[IntegerPartitions[Rationalize@#,Infinity,{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
    Length@#1<Length@#2&][[1]]&  

Stosowanie

%[0.98]  
{1/100, 1/100, 1/100, 1/10, 1/10, 1/4, 1/2}  

Lub

Tally@Sort[IntegerPartitions[Rationalize@#,Infinity,
                             {10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
     Length@#1<Length@#2&][[1]]&  

(6 znaków więcej) daje

{{1/100, 3}, {1/10, 2}, {1/4, 1}, {1/2, 1}}

W przypadku innych nominałów wystarczy zmienić tabelę racjonalną {10, ...., 5 / 100,1 / 100}

Dr Belizariusz
źródło
2

D: 225 znaków

import std.algorithm,std.conv,std.stdio;void main(string[]args){auto m=args[1].findSplit(".");void p(T,S)(T t,T u,S s){foreach(v;[u,10,5,1]){writefln("%s %s%s",t/v,v,s);t-=(t/v)*v;}}p(to!int(m[0]),20,"");p(to!int(m[2]),25,"/100");}

Bardziej czytelnie:

import std.algorithm,std.conv,std.stdio;

void main(string[] a)
{
    auto m = a[1].findSplit(".");

    void p(T, S)(T t, T u, S s)
    {
        foreach(v; [u, 10, 5, 1])
        {
            writefln("%s %s%s", t / v, v, s);
            t -= (t / v) * v;
        }
    }

    p(to!int(m[0]), 20, "");
    p(to!int(m[2]), 25, "/100");
}

Obsługuje tylko waluty amerykańskie. Przyjmuje wartość jako wartość zmiennoprzecinkową w wierszu poleceń (musi mieć początkowe 0 dla wartości poniżej 1 dolara). Nie przyjmuje $ jako części wartości. Wyświetla liczbę każdego rodzaju banknotu / monety w osobnej linii. Np. Wkład 1,53 powoduje:

0 20
0 10
0 5
1 1
2 25/100
0 10/100
0 5/100
3 1/100

Jonathan M. Davis
źródło
1

Mathematica, 51 bajtów

#~NumberDecompose~{10,5,2,1,.5,.25,.1,.05,.01}&

Wejście

[1.53]

wynik

{0, 0, 0, 1, 1, 0, 0, 0, 3.}


Mathematica, 82 bajty - BONUS WITH--

(s=#~NumberDecompose~#2;Row@Flatten@Table[Table[#2[[i]]"+",s[[i]]],{i,Length@s}])&

Wejście

[37,6, {15, 7, 2,5, 1, 0,88, 0,2, 0,01}]

wynik

15 +15 +7 +0,2 +0,2 +0,2 +

J42161217
źródło
Umm, to pytanie używa innych nominałów niż duplikat.
ericw31415
OP nie określa formatu wejścia / wyjścia.
J42161217,
To pytanie nie wykorzystuje 100 dolarów i nie ma bonusu.
ericw31415
ok. naprawiono i zapisano kilka bajtów! Jeśli chodzi o premię, uprzejmie proszę o ponowne przeczytanie pytania. Zwłaszcza część .. „Punkty bonusowe za wspieranie innych walut”
J42161217,
Ups, chyba wtedy tego nie widziałem!
ericw31415
1

JavaScript, 84 83 bajty

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>{for(i in v)l[i]=n/v[i]|0,n%=v[i];return l}

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>eval("for(i in v)l[i]=n/v[i]|0,n%=v[i];l")

Używa chciwego algorytmu.

ericw31415
źródło
0

APL (Dyalog) , 19 bajtów

Monituje o żądaną kwotę, a następnie o nominały wyrażone w najmniejszej jednostce (grosze / centy).

CY'dfns'
 stamps

Wypróbuj online!

⎕CY'dfns'C O p r roboczydfns

⎕ stamps⎕ poprosić o wejściach i używać jako argumentów do tej stampsfunkcji

Adám
źródło