ความท้าทายนี้ทำให้เซ็นต์


29

ฉันรู้ว่าชื่อแตกคุณ


เมื่อกำหนดจำนวนเงินออกจำนวนเหรียญที่น้อยที่สุดจะเป็นจำนวนเงินนั้น

ตัวอย่าง

0.1
1 dime

0.01
1 penny

0.28
1 quarter 3 penny

0.56
2 quarter 1 nickel 1 penny

1.43
5 quarter 1 dime 1 nickel 3 penny

สเป็ค

  • 100 เซนต์ต่อดอลลาร์
  • ค่าของเหรียญแต่ละประเภทคือ:
    • penny ร้อยละ 1
    • nickel 5 เซนต์
    • dime 10 เซ็นต์
    • quarter 25 เซนต์

บิวด์อินที่ไม่อนุญาตให้ทำภารกิจนี้เล็กน้อย

I / O

อินพุตเป็นทศนิยมที่แสดงถึงค่าเงินดอลลาร์ของผลรวม

  • ไม่จำเป็นต้องมีหลายฝ่าย
  • คำสั่งซื้อ: quarter->penny
  • ผลลัพธ์ควรเป็น <#_of_coins> <coin type>
  • Seperators: ,หรือ,หรือ

ช่องว่างที่ต่อท้ายเท่านั้นที่อนุญาตคือ newline / space ที่ต่อท้ายเดียว


หากมีประเภทศูนย์เป็นศูนย์ไม่ควรแสดงประเภทเหรียญดังกล่าว เช่น0.25-> 1 quarter ไม่ 1 quarter 0 dime 0 nickel 0 penny


@VoteTo ปิดไม่ แต่ฉันจะอนุญาตให้จุลภาคเป็น seperaor
Downgoat

ตัวอย่างสุดท้ายคือ1.43ซึ่งมากกว่า1
หลุยส์เมนโด

@ LuisMendo โอ้โห(less than 1)ส่วนที่ไม่ควรอยู่ที่นั่น ลืมที่จะลบมันในกล่องทรายฉันเดา
Downgoat

มันไม่เป็นไรถ้าเอาท์พุทคือ2 quarter(2 spaces)1 nickel 1 pennyอะไร?
Conor O'Brien

1
@DigitalTrauma 13.00สามารถใส่ไปได้ 13แต่การป้อนข้อมูลที่ไม่เคยจะเป็น ฉันจะมีทศนิยมเสมอ
Downgoat

คำตอบ:


5

CJam, 60

q~e2i[25A5]{md}/]" quarterx dimex nickelx penny"'x/.+{0#},S*

ดูเหมือนว่าสคริปต์นี้จะมีพื้นที่เหลือเฟือสำหรับการปรับปรุง แต่สั้นกว่าตอนนี้มาก สิ่งนี้ใช้ประโยชน์จากคำสั่งในตัว "md" ซึ่งจะส่งคืนทั้งผลจำนวนเต็มของการหารและส่วนที่เหลือ มันทำต่อไปนี้:

  • อ่านอินพุต (ถ้ามันเป็นฟังก์ชั่นฉันคิดว่าคุณสามารถลบ q ~ สำหรับตัวละครน้อยสองตัว)
  • คูณอินพุตด้วย 100 และแปลงเป็นจำนวนเต็ม
  • ดำเนินการ "md" โดยใช้ [25 10 5] ซึ่งส่งผลให้ส่วนที่เหลือของสแต็ค
  • รวมตัวเลขและชื่อเหรียญ
  • ลบหมายเลขและชื่อเหรียญหากอดีตคือ 0
  • เพิ่มเลขศูนย์ล่วงหน้า

ลองที่นี่

รุ่นก่อนหน้า:

q~e2i[25A5]{md}/]_:!:!" quarter x dime x nickel x penny"'x/.*.+e_0-
q~e2i[25A5]{md}/]_:!:!\" quarter x dime x nickel x penny"'x/.+.*

11

JavaScript ES6, 107 ไบต์

n=>((n*=100)/25|0)+` quarter ${(n%=25)/10|0} dime ${n%10/5|0} nickel ${n%5|0} penny`.replace(/ ?0 \S+/g,"")

คณิตศาสตร์ง่าย ๆ


งานที่ดี! ฉันคิดว่ามีโซลูชัน ish สูตรปิด
Conor O'Brien

? สิ่งนี้ไม่ส่งออกประเภทเหรียญหรือไม่ถ้าไม่มีประเภทเหรียญ?
Frentos

@Frentos no, มี Regex อยู่ที่ท้ายซึ่งจะลบประเภทเหรียญที่มีศูนย์เป็นเหรียญ
Downgoat

@ Doᴡɴɢᴏᴀᴛ: ขอโทษไม่ได้ตระหนักถึงพื้นที่ข้อความที่เลื่อนไปทางขวาในกรณีที่ไม่มีร่องรอยของภาพ :-)
Frentos

คุณต้องการ|0หลังจากn%5หรือไม่
Neil

11

Python 2, 120 ไบต์

n=int(round(input()*100))
a=25
for b in"quarter","dime","nickel","penny":
 if n>=a:print"%d "%(n/a)+b,
 n%=a;a=40/a+5^12

เพื่อความปลอดภัยเปลี่ยนเป็นสิ่งที่ใช้เพื่อแก้ไขความคิดเห็นของ @ Ogaday อย่างน้อยตอนนี้ ฉันไม่แน่ใจว่าฉันต้องการหรือไม่int()แต่ฉันมีปัญหาในการโน้มน้าวใจตัวเองว่าฉันไม่ได้

print`n/a`+" "+b,

เป็นไบต์พิเศษปิด แต่พิมพ์พิเศษLสำหรับอินพุตขนาดใหญ่ (แม้ว่ารหัสนี้จะไม่ทำงานสำหรับอินพุตที่มีขนาดใหญ่มากอยู่ดีเนื่องจากความแม่นยำในการลอย)


1
คุณทำทุกครั้งที่ฉันใช้เวลาปรับปรุงวิธีแก้ปัญหาของฉันให้ดีกว่าเมโกไปเสีย ทำได้ดีมาก!
Alexander Revo

1
+1 - ฉันหวังว่าฉันจะรู้ว่าคุณเคยใช้เวทมนตร์อะไรa=40/a+5^12
Digital Trauma

@DigitalTrauma พยายามผู้ประกอบการทางคณิตศาสตร์จำนวนมากเช่น[x^k for x in [10, 5, 1]]และ[k/y for y in [25, 10, 5]]แตกต่างกันkแล้วเห็นว่ามีสองรายการที่ถูกชดเชยด้วย 5 อาจจะไม่น่าสนใจ แต่ฉันไม่มีเวลาที่จะดุร้าย
Sp3000

นี้จริงล้มเหลว (สำหรับฉันอย่างน้อย) ในปัจจัยการผลิตของและ10.03 10.04มันเกี่ยวกับการเป็นตัวแทนของ Python เกี่ยวกับการลอยตัว ลอง"print %d"%(10.03*100)ดู
Ogaday

n=int(''.join(raw_input().split(".")))อาจใช้งานได้ แต่มันค่อนข้างละเอียด
Sherlock9


6

เรติน่า 97

ขอบคุณ (เช่นเคย) ถึง @randomra - บันทึกไว้ 1 ไบต์

ถือว่าการป้อนข้อมูลเป็นทั้งในรูปแบบหรือxxx.yyxxx.y

\..$
$&0
\.

.+
$0$*:
(:{25})+
$#1 quarter 
(:{10})+
$#1 dime 
(:{5})+
$#1 nickel 
(:)+
$#1 penny

ลองออนไลน์


1
$&เป็นเช่นเดียวกับ$0เพื่อให้คุณสามารถบันทึกไบต์ในโดย$0.0 $&0
randomra

โดยการป้อนข้อมูลบางอย่างเช่น 0.9999999 ผลลัพธ์จะค่อนข้างบ้าคลั่ง
Anthony Pham

@PythonMaster ฉันจะเพิ่มการสนับสนุนสำหรับเมื่อเฟดเริ่มต้นการผลิตเหรียญเงิน 10 micropenny ;-)
Digital Trauma

4

Vitsy, 110 100 97 ไบต์

ใช่เดี๋ยวก่อนฉันยังคงควบคุมวิธีนี้อยู่

aa**Dv52^1m([N' retrauq 'Z]v52^MDva1m([N' emid 'Z]vDvaM51m([N' lekcin 'Z]v5MD([N'ynnep 'Z]
/D1M-D

คำอธิบายในโหมด verbose ที่กำลังจะมาถึง:

push a;
push a;
multiply top two;
multiply top two;
duplicate top item;
save top as temporary variable;
push 5;
push 2;
push second to top to the power of top;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " quarter ";
output stack as chars;
end recursive area;
save top as temporary variable;
push 5;
push 2;
push second to top to the power of top;
modulo top two;
duplicate top item;
save top as temporary variable;
push a;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " dime ";
output stack as chars;
end recursive area;
save top as temporary variable;
duplicate top item;
save top as temporary variable;
push a;
modulo top two;
push 5;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " nickel ";
output stack as chars;
end recursive area;
save top as temporary variable;
push 5;
modulo top two;
duplicate top item;
if (int) top is 0;
begin recursive area;
output top as number;
push " penny";
output stack as chars;
end recursive area;
:
divide top two;
duplicate top item;
push 1;
modulo top two;
subtract top two;
duplicate top item;

ลองออนไลน์!


2
retrauqเกือบจะดูเหมือนว่าคำ ...
Conor โอไบรอัน

Permalink ใช้งานไม่ได้
Downgoat

แก้ไขแล้วขออภัย ลิงค์รหัสเก่า : P
Addison Crump

3

Java 8 แลมบ์ดา, 165 ไบต์

คาดว่าอินพุตyเป็นแบบ double หรือ float

y->{int c,d=(int)(y*100);return(((c=d/25)>0)?c+" quarter ":"")+(((c=(d=d%25)/10)>0)?c+" dime ":"")+(((c=(d=d%10)/5)>0)?c+" nickel ":"")+(((d=d%5)>0)?d+" penny":"");}

ประกอบไปด้วยมาก ; -;


;-;นั่นคืออะไร? นั่นเป็น wampa หรือไม่?
บีกเกอร์

@ คนทำขนมปังร้องไห้
Addison Crump

2

JavaScript ES6, 202 200 ไบต์

ฉันหวังว่ามันจะสามารถเล่นกอล์ฟได้ ...

r=>eval('i=[.25,.1,.05,.01];v=[0,0,0,0];for(k=0;k<4;k++)for(;r>=i[k];v[k]++,r-=i[k],r=((r*100+.01)|0)/100);v.map((x,i)=>x?x+" "+"quarter0dime0nickel0penny".split(0)[i]:"").join` `.replace(/ +/g," ")')

รหัสไม่ได้รับการตอบกลับ:

function m(r){
    i=[.25,.1,.05,.01]
    v=[0,0,0,0]
    for(k=0;k<4;k++)for(;r>=i[k];v[k]++,r-=i[k],r=((r*100+.01)|0)/100);
    return v.map((x,i)=>x?x+" "+"quarter0dime0nickel0penny".split(0)[i]:"").join(" ").replace(/ +/g," ");
}

2

LabVIEW, 62 LabVIEW Primitives

Icreated 2 Array สำหรับชื่อและค่าและทำตามลำดับจากด้านบน (ดัชนีอาร์เรย์ด้วย i) โดยใช้ตัวดำเนินการแบบโมดูโล (สิ่ง R IQ) เหรียญที่เหลือจะถูกส่งเข้าไปในกะการเปลี่ยนแปลง

หากค่ามากกว่า 0 ฉันจะแปลงตัวเลขให้เป็นสตริงและเชื่อมโยงสตริงที่ส่งผ่านหมายเลขและชื่อของเหรียญแล้วนำกลับมาใส่ลงใน shift register

Ijus รู้ว่า gif ของฉันไม่แสดงกรณีเท็จ แต่ไม่มีอะไรให้ดูมันก็แค่ผ่านสายที่เข้ามา


"ดั้งเดิม" เปรียบเทียบกับไบต์อย่างไร "x primitives" ชนะ "y bytes" เมื่อ x <y หรือไม่ เพิ่งถาม
Luis Mendo

คุณสามารถตรวจสอบลิงค์เพื่อดูว่ามีการนับจำนวนแบบดั้งเดิมอย่างไร การให้ขนาดของโค้ด labview เป็นไบต์จะไม่มีประโยชน์อะไรเนื่องจาก vi ที่ว่างเปล่ามีขนาดใหญ่ ~ 10kb จากประสบการณ์มีพื้นฐานมากกว่าสองสามไบต์ในภาษากอล์ฟดังนั้นนี่จะเป็นประมาณ 50-60 ไบต์ใน CJam หรือคล้ายกัน
Eumel

1
@LuisMendo เราไม่สามารถผูกเนื้อหาข้อมูลของไฟล์ LabView ด้านบนด้วยหนึ่งไบต์ต่อหนึ่งรายการดั้งเดิมดังนั้นจึงไม่ยุติธรรมที่จะนับ LabView ที่หนึ่งไบต์ต่อหนึ่งรายการดั้งเดิม
lirtosiast

@ThomasKwa TBH ด้วยภาษากอล์ฟทำดีคุณอาจจะดำเนินการละ 1 ไบต์ 1 ไบต์ต่อลวดสำหรับการป้อนข้อมูลแต่ละลูปเป็น 2-4 ไบต์และ whiles กำลัง 3 วิทยาการและอื่น ๆ
Eumel

2

Japt, 77 ไบต์

` {U*=L /25|0} quÂòr {U%=25 /A|0} ÜX {U%A/5|0} Íõel {U%5|0} p¿ny` r" 0 %S+" x

โชคดีที่ชื่อเหรียญทั้งสี่สามารถบีบอัดได้ ¿ควรจะเป็น 0x81 ไบต์ตัวอักษร ทดสอบออนไลน์!


เพียงแค่พยายามกับปัจจัยสุ่มบางส่วนก็เป็นหนึ่งร้อยปิดที่ 73 quarter 1 nickel 2 penny18.33: 73 * .25 + 1 * .05 + 2 * .01 = 18.32 แทน 18.33
D. Strout

2

C, 147 144 142 140 ไบต์

a[]={25,10,5,1},m,i=0;f(float n){for(m=n*100;i<4;m%=a[i++])m/a[i]&&printf("%d %s ",m/a[i],(char*[]){"quarter","dime","nickel","penny"}[i]);}

Ungolfed ด้วยการทดสอบ:

#include <stdio.h>

a[]={25,10,5,1},m,i=0;

f(float n)
{
    for(m=n*100;i<4;m%=a[i++])
        if(m/a[i])
            printf("%d %s ",m/a[i],(char*[]){"quarter","dime","nickel","penny"}[i]);
}

int main()
{
    float test[] = {.1, .01, .28, .56, 1.43};
    for(int j = 0; j < 5; i = 0)
    {
        f(test[j++]);
        printf("\n");
    }
}

1
อาจจะลองเปลี่ยนchar*[]ด้วยchar**, int a[]มีint*aและใส่m%=a[i++]ในส่วนสุดท้ายของห่วง ควรบันทึก 4 ไบต์ ยังไม่ได้ทดสอบดังนั้นให้ลองใช้แต่ละวิธี
takra

@ minerguy31 ฉันจะไม่สามารถใช้รายการตัวเริ่มต้นได้หากฉันใช้ตัวชี้แทนที่จะเป็นอาร์เรย์ ย้ายไปm%=a[i++]เล็กน้อยขอบคุณ
Alexander Revo

1
นอกจากนี้คุณอาจสามารถแทนที่if(m/a[i])ด้วยm/a[i]&&เพื่อบันทึก 2 ไบต์ได้อีก
takra

ลองใช้"quarter\0dime\0nickel\0penny"ใน printf แต่ละ \ 0 ยุติสตริงโดยบันทึก 1 อักขระแต่ละตัว
takra

@ minerguy31 โดยใช้สตริงที่\0ทำให้โปรแกรมขัดข้อง ฉันไม่แน่ใจว่าวิธีการทำซ้ำที่ควรจะทำงานกับสายดังกล่าวอยู่แล้ว
Alexander Revo


1

JavaScript, 156 145 144 ไบต์

ไม่ตรงกับคำตอบสูตรของ ETH การผลิต แต่อย่างไรก็ตาม ...

function c(t){n=['quarter','dime','nickel','penny'];v=[.25,.1,.05,.01];s='';for(i in v){c=t/v[i]|0;if(c>0)s+=c+' '+n[i]+' ';t-=c*v[i];}return s}

นี่เป็นหนึ่งในสนามกอล์ฟรอบแรกของฉันดังนั้นการปรับปรุงใด ๆ ที่ชื่นชมอย่างมาก! ฉันขโมย "xor trunc" ของ ETH ไปแล้ว - ขอโทษด้วยคนมันฉลาดเกินไป :-)

อ่านเพิ่มเติมได้:

function c(t)
{
  n = ['quarter', 'dime', 'nickel', 'penny'];
  v = [.25, .1, .05, .01];
  s = '';
  for(i in v)
  {
    c = t/v[i]|0;
    if(c>0) s += c+' '+n[i]+' ';
    t -= c*v[i];
  }
  return s
}

หมายเหตุ: ในขณะที่การทดสอบฉันตระหนักว่า JavaScript (อย่างน้อยในเครื่องของฉัน) แบ่ง1.13 / 0.01ที่จะ1.12999...ทำให้ (และอาจจะทั้งหมด JS ส่งอื่น ๆ ) ฉันไม่ทำงานอย่างถูกต้อง 100% ...


ฉันไม่คิดว่าคุณต้องการเซมิโคลอนสุดท้าย
Downgoat

0

Perl 5 - 128 124 ไบต์

ฉันคิดว่านี่สามารถเขียนใหม่ให้สั้นกว่านี้มาก แต่ฉันไม่เห็นจริง ๆ

$s=<>*100;@v=($s/25,$s%2.5,$s%25%10/5,$s%250%5);map{$l=int($_);print$l.$".qw(quarter dime nickel penny)[$i].$"if$l>0;$i++}@v

แก้ไข: เป็นเพียงเคล็ดลับทางคณิตศาสตร์เพื่อบันทึก 4 ตัวอักษร


0

Perl 6 , 96 ไบต์

$/=get;put map {$_=Int($//$^a);$/%=$a;"$_ $^b" if $_},<.25 quarter .1 dime .05 nickel .01 penny>
$/ = get; # set $/ to the input

# print the following list with spaces between
# and a newline at the end
put map {
  # the parameters to this block are $a, and $b
  # which are declared as placeholder parameters $^a, and $^b

  $_ = Int( $/ / $^a ); # set $_ to the count of the current coin

  $/ %= $a;             # set $/ to the modulus of itself and the current coin

  "$_ $^b" if $_        # return a string if $_, otherwise return Empty
},
<
  .25 quarter
  .1  dime
  .05 nickel
  .01 penny
>

การใช้งาน:

for amount in  0.1  0.01  0.28  0.56  1.43; do
  echo $amount | perl6 -e'…';
done
1 dime
1 penny
1 quarter 3 penny
2 quarter 1 nickel 1 penny
5 quarter 1 dime 1 nickel 3 penny

0

Python 2, 167 161 ไบต์

อัปเดต 1:ความคิดของ Stole Sp3000 เพื่อใช้อินพุต () และทำให้โค้ดของฉันเป็นสคริปต์แทนที่จะเป็นฟังก์ชั่น

a=input()*100;k={25:0,10:0,5:0,1:0}
for i in k:k[i]=a//i;a%=i
print' '.join(['%d %s'%(k[x],{25:'quarter',10:'dime',5:'nickel',1:'penny'}[x]) for x in k if k[x]])

0

C, 162 ไบต์

#includeแต่น่าเสียดายที่ไม่สามารถทำงานได้โดยไม่ต้อง

#include <stdlib.h>
i,a[]={25,10,5,1};main(c,v)char**v;{for(c=atof(v[1])/.01;c;c%=a[i++])c/a[i]?printf("%d %s ",c/a[i],"quarter\0dime\0   nickel\0 penny"+8*i):0;}

Ungolfed

#include <stdlib.h>

i,a[]={25,10,5,1}; /* loop index, coin values */

main(c,v) char**v;
{
    /* Get dollar amount from command line, convert to pennies */
    for (c=atof(v[1])/.01;c;c%=a[i++]) /* loop while still change... */
    {
        c/a[i] /* if there are coins at this index... */
            ? printf("%d %s ", c/a[i], "quarter\0dime\0   nickel\0 penny"+8*i) /* print out how many */
            : 0;
    }
}

0

Lua 5.3, 141 139 132 131 ไบต์

เรียงลำดับตามคำตอบ Python ของ Sp3000 แต่ด้วยสูตรเวทย์มนตร์ของฉันเอง

n=.5+100*io.read'n'a=25
for s in("quarter dime nickle penny "):gmatch".- "do
_=n<a or io.write(s,~~(n//a)," ")n=n%a
a=35%a|#s%2
end

แก้ไข - ปรับปรุงaสูตร a=a*3%13~#s%4ก่อนหน้านี้มันเป็น

แก้ไข 2 - ก่อนหน้านี้ฉันใช้math.ceilเพื่อปัดเศษและแปลงเป็นจำนวนเต็ม ตอนนี้ฉันกลับ//ไปใช้รอบและเพิ่ม~~การแปลงเป็นจำนวนเต็ม

แก้ไข 3 - โกนตัวละครโดยการเปลี่ยนรูปแบบจากการ"%w+ "".- "


0

K (oK) , 95 78 ไบต์

วิธีการแก้:

{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*

ลองออนไลน์!

ตัวอย่าง:

{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*0.92
"3 quarter 1 dime 1 nickel 2 penny"
{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*0.95
"3 quarter 2 dime"

คำอธิบาย:

Modulo อินพุตโดยแต่ละเหรียญจากนั้นแบ่งเหรียญด้วยผลลัพธ์

ป้อนผลลัพธ์แต่ละรายการพร้อมกับชื่อของเหรียญลงในฟังก์ชันแล้วส่งคืนค่าสตริงของทั้งคู่หากจำนวนเหรียญไม่ใช่ศูนย์

แผ่ทุกอย่างลงและเข้าด้วยกันด้วยช่องว่าง


0

Kotlin , 147 ไบต์

{listOf("quarter" to 25,"dime" to 10,"nickel" to 5,"penny" to 1).fold((it*100).toInt()){d,(n,a)->val z=d/a
if(z>0){print("$z $n ")
d-(z*a)}else d}}

เชิดชู

{
    listOf(
            "quarter" to 25,
            "dime" to 10,
            "nickel" to 5,
            "penny" to 1).fold((it * 100).toInt()) { d, (n, a) ->
        val z = d / a
        if (z > 0) {
            print("$z $n ")
            d - (z * a)
        } else d
    }
}

ทดสอบ

import java.io.ByteArrayOutputStream
import java.io.PrintStream

var f:(Double)->Unit =
{listOf("quarter" to 25,"dime" to 10,"nickel" to 5,"penny" to 1).fold((it*100).toInt()){d,(n,a)->val z=d/a
if(z>0){print("$z $n ")
d-(z*a)}else d}}

val TEST = listOf(
        0.1 to "1 dime",
        0.01 to "1 penny",
        0.28 to "1 quarter 3 penny",
        0.56 to "2 quarter 1 nickel 1 penny",
        1.43 to "5 quarter 1 dime 1 nickel 3 penny"
)

fun main(args: Array<String>) {
    val temp = ByteArrayOutputStream()
    System.setOut(PrintStream(temp))
    for ((input, output) in TEST) {
        temp.reset()
        f(input)
        println()
        val text = temp.toString().trim()
        if (text != output) {
            throw AssertionError("$input '$output' != '$text'")
        }
    }
}

TIO

TryItOnline

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