ผลงานออกมาเปลี่ยนแปลง [ปิด]


10

คุณกำลังเขียนโปรแกรมสำหรับการลงทะเบียนเงินสดอัตโนมัติ ผู้ใช้ต้องการการเปลี่ยนแปลงโดยใช้จำนวนเหรียญน้อยที่สุด เขียนโปรแกรมที่ใช้จำนวนเงิน (พูด $ 1.53) และให้การเปลี่ยนแปลงในสกุลเงินสหรัฐฯ - ในกรณีนี้: 1 x หนึ่งดอลลาร์ดอลลาร์ธนบัตร 1 x ห้าสิบเซ็นต์และ 3 x หนึ่งเซ็นต์ โปรแกรมที่สั้นที่สุดจะเป็นผู้ชนะ คะแนนโบนัสสำหรับการสนับสนุนสกุลเงินอื่น ๆ (เช่นสกุลเงินสหราชอาณาจักร) และสกุลเงินที่ผิดปกติ (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: "[คะแนนถูกกำหนดอย่างเป็นกลางโดยการให้คำปรึกษาที่มุ่งเน้นด้านการบริการลูกค้าที่ได้รับการคัดเลือกตามหลักประชากรโดยแยกตามอายุและเพศ - เช่นฉัน"
โทมัส O

ฉันจะขอ 50c เพราะฉันยังไม่เห็นเหรียญ 50 cent แต่พวกเขาอยู่อย่างชัดเจน
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.5 สำหรับ 1.53 หากเหรียญ 1 เซนต์หายไป

หาก 3 และ 4 ไม่จำเป็นต้องพอใจ (เช่นฉันควบคุมรูปแบบอินพุต ;-)) ดังนั้นโปรแกรมต่อไปนี้ก็เพียงพอ (71):

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

2

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

จัดการสกุลเงินสหรัฐเท่านั้น รับค่าเป็นค่าทศนิยมในบรรทัดคำสั่ง (ต้องมีค่า 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

Mathematica, 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

ตกลงแก้ไขแล้วและบันทึกบางไบต์! สำหรับโบนัสฉันขอให้คุณอ่านคำถามอีกครั้ง โดยเฉพาะอย่างยิ่งส่วน .. "คะแนนโบนัสสำหรับการสนับสนุนสกุลเงินอื่น ๆ "
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 ไบต์

พร้อมต์สำหรับจำนวนที่ต้องการจากนั้นสำหรับหน่วยที่เล็กที่สุด (pennies / cents)

CY'dfns'
 stamps

ลองออนไลน์!

⎕CY'dfns'C o P Y พื้นที่ทำงานdfns

⎕ stamps⎕ ขออินพุตและใช้เป็นอาร์กิวเมนต์ของstampsฟังก์ชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.