Tantangan Ini Menghasilkan Sen


29

Saya tahu, judulnya membuat Anda bingung


Dengan jumlah uang yang dikeluarkan, jumlah koin paling sedikit adalah jumlah itu

Contohnya

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

Spec

  • 100 sen dalam satu dolar.
  • Nilai dari setiap jenis koin adalah:
    • penny 1 sen
    • nickel 5 sen
    • dime 10 sen
    • quarter 25 sen

Built-in yang meremehkan tugas ini tidak diizinkan.

I / O

Input adalah desimal yang mewakili nilai dolar total

  • Tidak perlu jamak
  • Pesan: quarter->penny
  • Output seharusnya <#_of_coins> <coin type>
  • Seperator: ,atau ,atau

Satu-satunya trailing whitespace yang diperbolehkan adalah single trailing newline / space.


Jika ada nol dari jenis koin, jenis koin itu tidak boleh ditampilkan . Misal 0.25-> 1 quarter tidak 1 quarter 0 dime 0 nickel 0 penny


@VoteToTutup tidak, tapi saya akan mengizinkan koma sebagai pemisah
Downgoat

Contoh terakhir adalah 1.43, yang lebih besar dari1
Luis Mendo

@LuisMendo oh ups, (less than 1)bagian itu seharusnya tidak ada di sana. Lupa menghapusnya di kotak pasir, kurasa
Downgoat

Apakah tidak apa-apa jika outputnya 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien

1
@DigitalTrauma 13.00 dapat menjadi input yang mungkin tetapi input tidak akan pernah 13. Saya akan selalu memiliki desimal
Downgoat

Jawaban:


5

CJam, 60

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

Script ini tampaknya memiliki banyak ruang untuk perbaikan tetapi ini lebih pendek daripada yang sejauh ini. Ini menggunakan perintah built in "md" yang mengembalikan hasil integer dari divisi dan sisanya. Ini melakukan hal berikut:

  • membaca input (jika itu fungsi saya kira Anda dapat menghapus q ~ untuk dua karakter yang kurang)
  • mengalikan input dengan 100 dan mengubahnya menjadi integer
  • melakukan "md" menggunakan [25 10 5] yang menghasilkan sisa pada tumpukan
  • menggabungkan angka dan nama koin
  • menghapus nomor dan nama koin jika yang pertama adalah 0
  • menambahkan angka nol di awal

Coba di sini

versi sebelumnya:

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

Matematika sederhana.


Pekerjaan yang baik! Saya pikir ada solusi ish formula-tertutup
Conor O'Brien

? Tidakkah ini menghasilkan jenis koin jika ada nol dari jenis koin itu?
Frentos

@Frentos tidak, ada Regex di bagian akhir yang menghilangkan jenis koin yang memiliki koin nol
Downgoat

@ Doᴡɴɢᴏᴀᴛ: maaf, tidak menyadari area teks digulir tepat tanpa adanya petunjuk visual :-)
Frentos

Apakah Anda memerlukan |0setelah 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

Untuk amannya, ubah menjadi sesuatu yang pasti berfungsi untuk memperbaiki komentar @ Ogaday, setidaknya untuk saat ini. Saya tidak yakin apakah saya membutuhkannya atau tidak int(), tetapi saya kesulitan meyakinkan diri saya bahwa saya tidak membutuhkannya.

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

adalah byte tambahan mati, tetapi mencetak tambahan Luntuk input besar (walaupun kode ini tidak bekerja untuk input yang sangat besar, karena presisi float).


1
Anda hanya membuat semua waktu saya habiskan memperbaiki solusi saya untuk mengalahkan Mego pergi sia-sia. Kerja bagus!
Alexander Revo

1
+1 - Saya berharap saya tahu sihir apa yang Anda gunakana=40/a+5^12
Digital Trauma

@ DigitalTrauma Mencoba sekelompok operator aritmatika, misalnya [x^k for x in [10, 5, 1]]dan [k/y for y in [25, 10, 5]]untuk berbeda k, kemudian melihat bahwa dua daftar diimbangi oleh 5. Mungkin suboptimal, tapi saya belum punya waktu untuk brute force.
Sp3000

Ini sebenarnya gagal (setidaknya untuk saya) pada input 10.03dan 10.04. Ini berhubungan dengan representasi Python tentang pelampung dan bagaimana ia membulatkannya menjadi int. Coba "print %d"%(10.03*100).
Ogaday

n=int(''.join(raw_input().split(".")))mungkin bekerja, tapi cukup bertele-tele.
Sherlock9

7

dc, 104

Baris baru ditambahkan untuk "keterbacaan" :

[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: Sekarang dengan Readability ™
Alex A.

6

Retina , 97

Terima kasih (seperti biasa) ke @randomra - menyelamatkan 1 byte.

Mengasumsikan input baik dalam bentuk xxx.yyatau xxx.y.

\..$
$&0
\.

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

Cobalah online.


1
$&adalah sama $0sehingga Anda dapat menyimpan byte dalam $0.0oleh $&0.
randomra

Dengan memasukkan sesuatu seperti 0,9999999, outputnya sedikit gila
Anthony Pham

@PythonMaster Saya akan menambahkan dukungan untuk itu ketika The Fed mulai mencetak 10 buah micropenny ;-)
Digital Trauma

4

Vitsy, 110 100 97 byte

Ya, tunggu dulu, saya masih memodernisasi ini.

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

Penjelasan dalam mode verbose segera-datang:

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;

Cobalah online!


2
retrauqhampir seperti sebuah kata ...
Conor O'Brien

Permalink tidak berfungsi
Downgoat

Diperbaiki, maaf. Tautan kode lama. : P
Addison Crump

3

Java 8 lambda, 165 byte

Diharapkan input yberupa double atau 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":"");}

Begitu banyak ternary. ; -;


;-;Apa itu? Apakah itu wampa?
Gelas kimia

@beaker Menangis.
Addison Crump

2

JavaScript ES6, 202 200 byte

Saya harap ini bisa bermain golf ...

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

Kode tidak dikunci:

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 Primitif

Icreated 2 Array untuk nama-nama dan nilai-nilai dan pergi melalui mereka dari atas (array indeks dengan i) menggunakan operator modulo (hal R IQ). Koin yang tersisa dilewatkan ke register geser.

Jika nilainya lebih besar dari 0, saya mengubah angka menjadi string dan merangkai string yang diturunkan ke bawah angka dan nama koin dan memasukkannya kembali ke dalam register geser.

Ijus menyadari gif saya tidak menunjukkan kasus yang salah tetapi tidak ada yang bisa dilihat, itu hanya melewati string yang masuk.


Bagaimana "primitif" dibandingkan dengan byte? Apakah "x primitif" mengalahkan "y byte" saat x <y? Bertanya saja
Luis Mendo

Anda dapat memeriksa tautan untuk melihat bagaimana penghitungan primitif. Memberikan ukuran kode labview dalam byte akan menjadi agak tidak berguna, karena vi kosong sudah ~ 10kb besar. Berdasarkan pengalaman ada beberapa primitif lebih banyak daripada byte dalam bahasa golf sehingga ini akan menjadi sekitar 50-60 byte di CJam atau sejenisnya.
Eumel

1
@LuisMendo Kami tidak dapat mengikat konten informasi dari file LabView di atas dengan satu byte per primitif, jadi tidak adil untuk menghitung LabView pada satu byte per primitif.
lirtosiast

@ThomasKwa tbh dengan bahasa golf yang dibuat dengan baik mungkin Anda bisa, setiap operasi 1 byte 1 byte per kawat untuk setiap loop input adalah 2-4 byte untuk dan sementara 3 primitif dan sebagainya
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

Untungnya, keempat nama koin dapat dikompres. The ¿harus menjadi literal byte 0x81. Uji secara online!


Hanya mencoba dengan beberapa masukan acak, itu satu sen dari pada 18,33: 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18.32 bukannya 18.33.
D. Strout

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

Tidak disatukan dengan tes:

#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
Mungkin coba ganti char*[]dengan char**, int a[]dengan int*a, dan letakkan m%=a[i++]di bagian terakhir dari for loop. Harus menyimpan 4 byte. Belum mengujinya, jadi coba saja masing-masing.
takra

@ minerguy31 Saya tidak akan bisa menggunakan inisialisasi daftar jika saya menggunakan pointer bukan array. Pindah m%=a[i++]sedikit, terima kasih.
Alexander Revo

1
Juga, Anda mungkin bisa mengganti if(m/a[i])dengan m/a[i]&&untuk menyimpan 2 byte lebih banyak.
takra

Coba juga gunakan "quarter\0dime\0nickel\0penny"di printf. Setiap \ 0 mengakhiri string, menyimpan 1 char masing
takra

@ minerguy31 menggunakan string dengan \0menyebabkan program macet. Saya tidak yakin bagaimana iterasi seharusnya bekerja pada string semacam itu.
Alexander Revo


1

JavaScript, 156 145 144 byte

Tidak cocok dengan jawaban formula ETHproduksi, tetapi tetap ...

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}

Ini adalah salah satu pertandingan golf putaran pertama saya, jadi setiap peningkatan sangat dihargai! Saya sudah mencuri "xor trunc" ETH - maaf, itu terlalu pintar :-)

Lebih mudah dibaca:

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
}

Catatan: Saat pengujian saya menyadari bahwa JavaScript (setidaknya pada mesin saya?) Membaginya 1.13 / 0.01menjadi 1.12999..., membuat (dan mungkin semua kiriman JS lainnya) tidak berfungsi 100% dengan benar ...


Saya tidak berpikir Anda membutuhkan titik koma yang terakhir.
Downgoat

0

Perl 5 - 128 124 byte

Saya kira ini bisa ditulis ulang menjadi jauh lebih pendek tetapi saya benar-benar tidak bisa melihatnya.

$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: Hanya trik matematika untuk menyimpan 4 karakter.


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
>

Pemakaian:

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

Pembaruan 1: Mencuri ide Sp3000 untuk menggunakan input () dan menjadikan kode saya sebagai skrip alih-alih fungsi.

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

Sayangnya, tidak berfungsi tanpa #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;}

Tidak disatukan

#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

Semacam berdasarkan pada jawaban Python Sp3000, tetapi dengan formula ajaib saya sendiri.

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

Edit - meningkatkan aformula. Sebelumnya itu a=a*3%13~#s%4.

Sunting 2 - sebelumnya saya gunakan math.ceiluntuk membulatkan dan mengkonversi ke integer. Sekarang saya menggunakan kembali //untuk membulatkan dan menambahkan~~ untuk mengkonversi ke integer.

Sunting 3 - mencukur karakter dengan mengubah pola dari "%w+ "menjadi ".- ".


0

K (oK) , 95 78 byte

Larutan:

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

Cobalah online!

Contoh:

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

Penjelasan:

Modulo input dengan masing-masing koin, kemudian bagi koin dengan hasilnya.

Beri makan setiap hasil bersama dengan nama koin ke dalam fungsi, mengembalikan nilai string keduanya jika jumlah koin tidak nol.

Ratakan semuanya dan gabungkan bersama dengan spasi putih.


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

Yg diperindahkan

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

Uji

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.