Розробка змін [закрито]


10

Ви пишете програму для автоматичного касового апарату. Користувачеві потрібні зміни з найменшою кількістю використовуваних монет. Напишіть програму, яка займає суму (скажімо, 1,53 долара) і вносить зміни в номіналах США - в цьому випадку: 1 х банкнота в один долар, 1 х п'ятдесят центів і 3 х один цент. Найкоротша програма - переможець. Бонусні бали за підтримку інших валют (тобто номіналів Великобританії) та незвичних валют (1, 2, 3 цента?)

У вас є номінали США: 1 цент, 5 центів, 10 центів, 25 центів, 50 центів, 1 долар (банкнота або монета), 2 долари, 5 доларів, 10 доларів.

У вас є номінали Великобританії: 1 пенс, 2 пенси, 5 пенсів, 10 пенсів, 20 пенсів, 50 пенсів, 1 фунт, £ 2, 5 фунтів стерлінгів (банкнота або монета), 10 фунтів стерлінгів.


3
Для цього, мабуть, потрібно трохи уточнити. По-перше, вам, мабуть, слід вказати, що ми хочемо найменшої кількості монет (що робить бонусне питання трохи цікавішим, наприклад {1c, 49c, 50c} і 98c порушує наївний алгоритм). По-друге, корисний формат вводу / виводу. Особливості поводження з недосяжними значеннями (для складених валют) допоможуть. Нарешті - ви можете перелічити тут номінали, щоб людям не потрібно було їх шукати, якщо вони не знайомі з ним.
Nabb

Як працюють бонусні бали? Просто якщо є краватка для найкоротшої програми?
гніблер

@gnibber, цитуючи Стівена Фрі: "[бали] неупереджено визначаються демографічно вибраним консалтинговим центром обслуговування клієнтів, розбитим за віком та статтю - тобто я".
Томас О

Я збираюся просити 50с, оскільки я ще не бачив монети за 50 центів. Але, мабуть, вони існують: usmint.gov/kids/coinnews/circulating/50centCoin.cfm
Мартін Йорк

Відповіді:


2

Windows PowerShell, 108 111 117

Найперша спроба, поки що невольф:

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

Примітки щодо реалізації:

  1. Приймає кількість, яку потрібно повернути по трубопроводу
  2. Приймає список номіналів валюти за допомогою командного рядка
  3. Кількість може бути вказана знаком валюти; що буде позбавлене (насправді, нічого нечислового).
  4. Список номіналів не потрібно сортувати.
  5. Програма видасть найбільшу зміну, меншу від необхідної кількості, яку можна досягти за вказаними номіналами, тобто 1,5 за 1,53, якщо 1-цент монета відсутня.

Якщо 3 та 4 не потрібно задовольняти (тобто я контролюю вхідний формат ;-)), достатньо наступної програми (71):

$i=+"$input"
$args|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}

2

Математика: 110 символів

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

Використання

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

Або

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 символів більше) дає

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

Для інших конфесій просто змініть таблицю раціональних показників {10, ...., 5 / 100,1 / 100}


2

Д: 225 персонажів

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");}

Більш розбірливо:

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");
}

Обробляє лише американську валюту. Приймає значення як значення з плаваючою комою в командному рядку (повинно мати провідне значення 0 для значень менше 1 долара). Не приймає $ як частину вартості. Виводить номер кожного виду купюри / монети в окремий рядок. Наприклад, введення 1,53 призводить до:

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


1

Математика, 51 байт

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

вхід

[1.53]

вихід

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


Математика, 82 байти - З БОНУСЮ--

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

Вхідні дані

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

вихід

15 +15 +7 +0.2 +0.2 +0.2 +


Гм, це питання використовує різні позначення від дубліката.
ericw31415

OP не визначає формат вводу / виводу.
J42161217

У цьому питанні не використовуються 100-доларові купюри і немає бонусу.
ericw31415

ok.fixed і збережено кілька байтів! Щодо бонусу, я прошу вас ще раз прочитати питання. Особливо частина .. "Бонусні бали за підтримку інших валют"
J42161217

Ну, я думаю, я цього тоді не бачив!
ericw31415

1

Javascript, 84 83 байт

(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")

Використовує жадібний алгоритм.


0

APL (Dyalog) , 19 байт

Підказки на бажану суму, а потім на номінали, виражені в найменшій одиниці (копійки / копійки).

CY'dfns'
 stamps

Спробуйте в Інтернеті!

⎕CY'dfns'З про р у робочий простірdfns

⎕ stamps⎕ попросити входи і використовувати в якості аргументів в stampsфункцію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.