Thử thách này tạo ra các loại thuốc


29

Tôi biết, tiêu đề làm bạn khó chịu


Cho một lượng tiền đầu ra, số lượng xu ít nhất tạo nên số tiền đó

Ví dụ

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

Thông số kỹ thuật

  • 100 xu bằng một đô la.
  • Giá trị của từng loại coin là:
    • penny 1 xu
    • nickel 5 xu
    • dime 10 đồng CEN
    • quarter 25 xu

Xây dựng mà tầm thường hóa nhiệm vụ này không được phép.

Tôi / O

Đầu vào là số thập phân biểu thị giá trị đô la của tổng số

  • Không cần số nhiều
  • Đặt hàng: quarter->penny
  • Đầu ra nên <#_of_coins> <coin type>
  • Máy hút bụi: ,hoặc ,hoặc

Khoảng trắng duy nhất được phép là một dòng mới / dấu cách duy nhất.


Nếu không có loại tiền nào, loại tiền đó sẽ không được hiển thị . Ví dụ: 0.25> 1 quarter không 1 quarter 0 dime 0 nickel 0 penny


@VoteToĐóng không, nhưng tôi sẽ cho phép dấu phẩy dưới dạng dấu phẩy
Downgoat

Ví dụ cuối cùng là 1.43, lớn hơn1
Luis Mendo

@LuisMendo oh whoops, (less than 1)phần không nên có ở đó. Quên loại bỏ cái đó trong hộp cát tôi đoán
Downgoat

Có ổn không nếu đầu ra là 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien

1
@ Kỹ thuật số 13.00 có thể là một đầu vào có thể nhưng đầu vào sẽ không bao giờ 13. Tôi sẽ luôn có số thập phân
Hạ xuống

Câu trả lời:


5

Camam, 60

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

Kịch bản này dường như có rất nhiều chỗ để cải thiện nhưng nó ngắn hơn bất kỳ kịch bản nào cho đến nay. Điều này làm cho việc sử dụng lệnh "md" tích hợp trả về cả kết quả số nguyên của một phép chia và phần còn lại. Nó làm như sau:

  • đọc đầu vào (nếu đó là một chức năng tôi đoán bạn có thể xóa q ~ cho hai ký tự ít hơn)
  • nhân số đầu vào với 100 và chuyển đổi nó thành một số nguyên
  • thực hiện "md" bằng cách sử dụng [25 10 5] dẫn đến phần còn lại trên ngăn xếp
  • kết hợp số và tên đồng tiền
  • xóa số và tên coin nếu trước đây là 0
  • thêm số không trước

Hãy thử nó ở đây

phiên bản trước:

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 byte

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

Toán đơn giản.


Công việc tốt! Tôi nghĩ rằng có một giải pháp ish công thức khép kín
Conor O'Brien

? Điều này không tạo ra loại tiền nếu không có loại tiền đó?
Frentos 4/2/2016

@Frentos không, có một Regex ở cuối loại bỏ các loại tiền xu không có tiền
Downgoat

@ Doᴡɴɢᴏᴀᴛ: xin lỗi, đã không nhận ra vùng văn bản được cuộn ngay khi không có manh mối trực quan :-)
Frentos

Bạn có cần |0sau n%5?
Neil

11

Python 2, 120 byte

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

Để an toàn, hãy thay đổi thành một cái gì đó chắc chắn hoạt động để sửa bình luận của @ Ogaday, ít nhất là bây giờ. Tôi không chắc mình có cần hay không int(), nhưng tôi gặp khó khăn khi tự thuyết phục mình rằng tôi không.

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

là một byte bổ sung, nhưng in thêm Lcho các đầu vào lớn (mặc dù mã này không hoạt động cho các đầu vào cực lớn, do độ chính xác nổi).


1
Bạn vừa làm tất cả thời gian tôi dành để cải thiện giải pháp của mình để vượt qua sự lãng phí của Mego. Làm tốt lắm!
Alexander Revo

1
+1 - Tôi ước tôi biết ma thuật nào bạn đã sử dụng để tạo raa=40/a+5^12
Chấn thương kỹ thuật số

@DigitalTrauma Đã thử một loạt các toán tử số học, ví dụ [x^k for x in [10, 5, 1]][k/y for y in [25, 10, 5]]khác nhau k, sau đó thấy rằng hai danh sách được bù trừ bằng 5. Có thể là tối ưu, nhưng tôi không có thời gian để vũ trang.
Sp3000

Điều này thực sự thất bại (đối với tôi ít nhất) đối với đầu vào của 10.0310.04. Nó liên quan đến việc đại diện cho phao của Python và cách nó làm tròn chúng thành số nguyên. Hãy thử "print %d"%(10.03*100).
Ogaday

n=int(''.join(raw_input().split(".")))có thể làm việc, nhưng nó khá dài dòng.
Sherlock9

7

đc, 104

Dòng mới được thêm vào cho "khả năng đọc" :

[dn[ quarter ]n]sq
[dn[ dime ]n]sd
[dn[ nickel ]n]sn
[d1/n[ penny ]n]sp
?A0*
25~rd0<qst
A~rd0<dst
5~rd0<nst
d0<p

15
dc: Bây giờ với Readability ™
Alex A.

6

Võng mạc , 97

Cảm ơn (như mọi khi) đến @randomra - đã lưu 1 byte.

Giả sử đầu vào là ở dạng xxx.yyhoặc xxx.y.

\..$
$&0
\.

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

Hãy thử trực tuyến.


1
$&là giống như $0vậy để bạn có thể lưu một byte $0.0bằng $&0.
Randomra

Bằng cách nhập một cái gì đó như 0.9999999, đầu ra hơi điên rồ
Anthony Phạm

@PythonMaster Tôi sẽ thêm hỗ trợ cho điều đó khi Fed bắt đầu đúc 10 mẩu micropenny ;-)
Chấn thương kỹ thuật số

4

Vitsy, 110 100 97 byte

Vâng, chờ đã, tôi vẫn đang phương pháp hóa này.

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

Giải thích trong chế độ dài dòng sắp tới:

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;

Hãy thử trực tuyến!


2
retrauqgần như là một từ ...
Conor O'Brien

Permalink không hoạt động
Downgoat 7/2/2016

Đã sửa, xin lỗi. Liên kết mã cũ. : P
Addison Crump

3

Lambda Java 8, 165 byte

Dự kiến ​​đầu vào ylà gấp đôi hoặc nổi.

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

Rất nhiều chim nhạn. ; -;


;-;Đó là gì? Đó có phải là một wampa?
cốc

@ khóc Khóc.
Addison Crump

2

JavaScript ES6, 202 200 byte

Tôi hy vọng điều này có thể được đánh gôn ...

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," ")')

Mã bị đánh cắp:

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 Nguyên thủy

Đã tạo 2 Mảng cho các tên và giá trị và đi qua chúng từ đầu (mảng chỉ mục với i) bằng toán tử modulo (điều R IQ). Các đồng tiền còn lại được chuyển vào sổ đăng ký thay đổi.

Nếu giá trị lớn hơn 0, tôi chuyển đổi số thành chuỗi và nối chuỗi được truyền xuống, số và tên của đồng tiền và đưa nó trở lại vào thanh ghi thay đổi.

Ijus nhận ra gif của tôi không hiển thị trường hợp sai nhưng dù sao cũng không có gì để xem, nó chỉ đi qua chuỗi đi vào.


Làm thế nào để "nguyên thủy" so với byte? "X nguyên thủy" có đánh bại "y byte" khi x <y không? Chỉ cần hỏi
Luis Mendo

Bạn có thể kiểm tra liên kết để xem cách tính nguyên thủy. Cho kích thước mã labview theo byte sẽ là vô ích, vì một vi trống đã lớn ~ 10kb. Theo kinh nghiệm, có một vài nguyên thủy hơn byte trong ngôn ngữ chơi gôn, vì vậy, đây sẽ là khoảng 50-60 byte trong CJam hoặc tương tự.
Eumel

1
@LuisMendo Chúng tôi không thể ràng buộc nội dung thông tin của tệp LabView ở trên một byte cho mỗi nguyên thủy, do đó, sẽ không công bằng khi đếm LabView ở mức một byte cho mỗi nguyên thủy.
lirtosiast

@ThomasKwa tbh với một ngôn ngữ chơi golf cũng được thực hiện có lẽ bạn có thể, mỗi hoạt động 1 byte 1 byte cho mỗi dây cho mỗi đầu vào vòng 2-4 byte cho cho và tuy rằng được 3 nguyên thủy và vân vân
Eumel

2

Japt, 77 byte

` {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

Rất may, tất cả bốn tên coin đều có thể nén được. Các ¿nên là byte 0x81 chữ. Kiểm tra nó trực tuyến!


Chỉ cần thử nó với một số đầu vào ngẫu nhiên, nó giảm một xu vào ngày 18,33 : 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18.32 thay vì 18.33.
D. Strout 4/2/2016

2

C, 147 144 142 140 byte

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

Ung dung với các bài kiểm tra:

#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
Có thể thử thay thế char*[]bằng char**, int a[]bằng int*avà đặt m%=a[i++]phần cuối của vòng lặp for. Nên lưu 4 byte. Chưa thử nghiệm nó, vì vậy hãy thử từng cái một.
Luân xa

@ minerguy31 Tôi sẽ không thể sử dụng công cụ khởi tạo danh sách nếu tôi sử dụng con trỏ thay vì mảng. Đã chuyển m%=a[i++]bit mặc dù, cảm ơn.
Alexander Revo

1
Ngoài ra, bạn có thể thay thế if(m/a[i])bằng m/a[i]&&để lưu thêm 2 byte.
Luân xa

Cũng thử sử dụng "quarter\0dime\0nickel\0penny"trong printf. Mỗi \ 0 chấm dứt chuỗi, tiết kiệm 1 char mỗi
chuỗi

@ minerguy31 sử dụng chuỗi với \0nguyên nhân khiến chương trình bị sập. Tôi không chắc chắn cách lặp được cho là hoạt động trên chuỗi như vậy.
Alexander Revo


1

JavaScript, 156 145 144 byte

Không phù hợp với câu trả lời công thức của ETHproduction, nhưng dù sao ...

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}

Đây là một trong những vòng golf đầu tiên của tôi, vì vậy mọi cải tiến đều được đánh giá cao! Tôi đã đánh cắp "xor trunc" của ETH - xin lỗi người đàn ông, nó quá thông minh :-)

Dễ đọc hơn:

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
}

Lưu ý: Trong khi thử nghiệm, tôi nhận ra rằng JavaScript (ít nhất là trên máy của tôi?) Chia 1.13 / 0.01cho 1.12999..., làm cho (và có lẽ tất cả các lần gửi JS khác) của tôi không hoạt động đúng 100% ...


Tôi không nghĩ bạn cần dấu chấm phẩy cuối cùng.
Hạ cấp

0

Perl 5 - 128 124 byte

Tôi đoán điều này có thể được viết lại ngắn hơn nhiều nhưng tôi thực sự không thể nhìn thấy nó.

$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

EDIT: Chỉ là một mẹo toán học để tiết kiệm 4 ký tự.


0

Perl 6 , 96 byte

$/=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
>

Sử dụng:

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 byte

Cập nhật 1: Lấy ý tưởng của Spole Sp3000 để sử dụng input () và biến mã của tôi thành tập lệnh thay vì hàm.

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 byte

Thật không may, không làm việc mà không có #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;}

Bị đánh cắp

#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 byte

Sắp xếp dựa trên câu trả lời Python của Sp3000, nhưng với công thức ma thuật của riêng tôi.

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

Chỉnh sửa - cải tiến acông thức. Trước đây nó là a=a*3%13~#s%4.

Chỉnh sửa 2 - trước đây tôi đã sử dụng math.ceilđể làm tròn và chuyển đổi thành số nguyên. Bây giờ tôi đang tái sử dụng //để làm tròn và thêm ~~để chuyển đổi thành số nguyên.

Chỉnh sửa 3 - cạo một ký tự bằng cách thay đổi mẫu từ "%w+ "sang ".- ".


0

K (oK) , 95 78 byte

Dung dịch:

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

Hãy thử trực tuyến!

Thí dụ:

{" "/,/`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"

Giải trình:

Modulo đầu vào của mỗi đồng xu, sau đó chia tiền cho kết quả.

Đưa từng kết quả cùng với tên của đồng xu vào một hàm, trả về giá trị chuỗi của cả hai nếu số lượng đồng tiền khác không.

Làm phẳng mọi thứ xuống và tham gia cùng với khoảng trắng.


0

Kotlin , 147 byte

{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}}

Làm đẹp

{
    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
    }
}

Kiểm tra

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

Dùng thử

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.