운동 변경 [폐쇄]


10

자동 금전 등록기를위한 프로그램을 작성 중입니다. 사용자는 사용 된 최소 코인 수로 변경해야합니다. 금액 ($ 1.53)을 받고 미국 교파의 변화를주는 프로그램을 작성하십시오.이 경우 1 x 1 달러 지폐, 1 x 50 센트 및 3 x 1 센트입니다. 가장 짧은 프로그램이 승자가됩니다. 다른 통화 (예 : 영국 명칭) 및 비정상적인 통화 (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

보너스 포인트는 어떻게 작동합니까? 가장 짧은 프로그램에 대한 넥타이가 있다면?
gnibbler

@gnibber, Stephen Fry 인용 : "[포인트는 인구 통계적으로 선택된 고객 서비스 포커스 컨설팅에 의해 공정하게 결정되며 나이와 성별, 즉 나로 분류됩니다."
토마스 오

나는 아직 50 센트 동전을 보지 못했기 때문에 50c를 요청할 것입니다. 그러나 분명히
Martin York

답변:


2

Windows PowerShell을 108 111 117

지금까지 ungolfed 첫 번째 시도 :

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

구현 노트 :

  1. 파이프 라인을 통해 반품 할 수량을 수락합니다.
  2. 명령 줄을 통해 통화 명칭 목록을 수락합니다.
  3. 수량은 통화 기호로 제공 될 수 있습니다. 그것은 제거 될 것입니다 (사실, 숫자가 아닌 것).
  4. 교단 목록을 정렬 할 필요는 없습니다.
  5. 프로그램은 주어진 명칭으로 달성 할 수있는 요청 수량보다 작은 가장 큰 변화를 출력합니다. 즉, 1 센트 동전이없는 경우 1.53에 대해 1.5입니다.

3과 4가 (즉, 만족 할 필요가없는 경우 I 입력 형식을 ;-) 제어), 다음 프로그램 접미사 (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

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

미국 통화 만 처리합니다. 명령 행에서 값을 부동 소수점 값으로 사용합니다 (1 달러 미만의 값은 앞에 0이 있어야 함). 값의 일부로 $를 허용하지 않습니다. 각 유형의 청구서 / 코인 수를 별도의 행에 출력합니다. 예를 들어 1.53의 입력 결과는 다음과 같습니다.

0 20
10 10
5
1
25 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.}


Mathematica, 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. 수정 및 일부 바이트 저장! 보너스에 관해서는 질문을 다시 읽어달라고 친절하게 요청합니다. 특히 부분 .. "다른 통화를 지원하기위한 보너스 포인트"
J42161217

혹시, 그때 보지 못한 것 같아요!
ericw31415

1

자바 스크립트, 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")

욕심 많은 알고리즘을 사용합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.