Bu meydan okuma kuruş yapar


29

Biliyorum, unvan seni mahvediyor


Bir miktar para çıkışı verildiğinde, en az sayıda jeton bu miktarı oluşturur.

Örnekler

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

  • Bir dolar 100 kuruş.
  • Her madalyonun değeri:
    • penny 1 kuruş
    • nickel 5 kuruş
    • dime 10 sent
    • quarter 25 kuruş

Bu görevi önemsiz hale getiren yerleşik yapılara izin verilmez.

I / O

Girdi, toplamın dolar değerini temsil eden bir ondalıktır.

  • Çoğullaştırmaya gerek yok
  • Sipariş: quarter->penny
  • Çıktı olmalıdır <#_of_coins> <coin type>
  • Seperatörler: ,ya ,ya

İzin verilen tek boşluk beyaz, tek bir izleyen yeni satır / boşluktur.


Bozuk para türünde sıfır varsa, o bozuk para türü gösterilmemelidir . Örneğin 0.25-> 1 quarter değil 1 quarter 0 dime 0 nickel 0 penny


@VoteToClose no'yu seçin, ancak ayırıcı olarak virgüllere izin vereceğim
Downgoat

Son örnek, 1.43daha büyüktür1
Luis Mendo,

@ LouisMendo oh boğmaca, (less than 1)parça orada olmamalıydı. Sanal alanda sanırım oradan kaldıracak Unuttum
Downgoat

Çıktı ise sorun olur 2 quarter(2 spaces)1 nickel 1 pennymu?
Conor O'Brien,

1
@ DigitalTrauma 13.00olası bir giriş olabilir, ancak giriş asla olmayacak 13. Her zaman bir ondalık basamağa sahip olacağım
Downgoat

Yanıtlar:


5

CJam, 60

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

Bu senaryo, iyileştirme için çok fazla alan var gibi görünüyor, ancak bu, şu ana kadar olduğundan daha kısa. Bu, bölmenin hem tamsayı sonucunu hem de geri kalanını döndüren yerleşik "md" komutunu kullanır. Aşağıdakileri yapar:

  • girişi okur (eğer bir işlev olsaydı, iki daha az karakter için q ~ 'u kaldırabilirsin)
  • girişi 100'e katlar ve tam sayıya dönüştürür
  • istifte kalanlarla sonuçlanan [25 10 5] kullanarak "md" gerçekleştirir
  • sayıları ve madeni para adlarını birleştirir
  • eski 0 ise sayı ve madeni para adını kaldırır
  • ön numara sıfırlar ekler

Burada dene

önceki sürümler:

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 bayt

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

Basit matematik


İyi iş! Bir kapalı formül ish çözümü olduğunu düşündüm
Conor O'Brien,

? Bu jeton tipinde sıfır varsa, bu jeton tipini çıkarmıyor mu?
Frentos

@Frentos hayır, sonunda sıfır jetonlu jeton tiplerini kaldıran bir Regex var
Downgoat

@ Doᴡɴɢᴏᴀᴛ: Üzgünüm, görsel ipucu yokluğunda yazı alanının tam olarak kaydırılmadığını fark etmedi :-)
Frentos

İhtiyacınız mı |0sonra n%5?
Neil

11

Python 2, 120 bayt

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

Sadece güvende olmak için, kesinlikle en azından şu anda @ Ogaday'ın yorumunu düzeltmeye çalışan bir şeyle değiştirildi. Ben de ihtiyacım olup olmadığına emin değilim int(), ama kendimi ihtiyacım olmadığına ikna etmekte zorlanıyorum.

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

fazladan bir bayt kapalıdır, ancak Lbüyük girişler için fazladan bir baskı (her ne kadar bu kod yüzer hassasiyet nedeniyle zaten çok büyük girişler için çalışmaz)


1
Az önce Mego'nun boşa gitmesi için ... ... çözümümü geliştirmek için harcadım. Yine de iyi iş!
Alexander Revo,

1
+1 - Keşke hangi sihirbazı kullandığınızı bilseydima=40/a+5^12
Digital Trauma

@DigitalTrauma Bir grup aritmetik işleci denedi, örneğin [x^k for x in [10, 5, 1]]ve [k/y for y in [25, 10, 5]]farklı olarak k, sonra iki listenin 5 ile dengelendiğini gördü. Muhtemelen suboptimal, ama kaba kuvvet için zamanım olmadı.
Sp3000

Bu aslında girdilerine (en azından benim için) başarısız 10.03ve 10.04. Python'un kayan noktalarla temsili ve bunları nasıl bir araya getirdiği ile ilgilidir. Dene "print %d"%(10.03*100).
Ogaday

n=int(''.join(raw_input().split(".")))işe yarayabilir, ancak oldukça ayrıntılı.
Sherlock9

7

dc, 104

"Okunabilirlik" için eklenen yeni satırlar :

[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: Şimdi Okunabilirlik ™ ile
Alex A.

6

Retina , 97

Teşekkürler (her zamanki gibi) @randomra - 1 bayt kaydetti.

Giriş şeklinde ya olduğunu varsayar xxx.yyveya xxx.y.

\..$
$&0
\.

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

Çevrimiçi deneyin.


1
$&aynı şekilde $0byte $0.0by byta kaydedebilirsiniz $&0.
randomra

0.9999999 gibi bir şey girerek, çıkış biraz çılgınca
Anthony Pham

@PythonMaster Fed 10 mikropenny parça basmaya başladığında bunun için destek katacağım ;-)
Digital Trauma

4

Vitsy, 110 100 97 bayt

Evet, bekle, hala bunu metot yapıyorum.

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

Yakında ayrıntılı modda açıklama:

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;

Çevrimiçi deneyin!


2
retrauqneredeyse bir kelime gibi görünüyor ...
Conor O'Brien

Permalink çalışmıyor
Downgoat 07.07.2016

Sabit, üzgünüm. Eski kod bağlantısı. : P
Addison Crump

3

Java 8 lambda, 165 bayt

Girdiyi yçift ​​veya kayan nokta olarak bekler .

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

Çok fazla üçlü. , -;


;-;O nedir? Bu bir wampa mı?
beher

@beaker ağlıyor.
Addison Crump, 19

2

JavaScript ES6, 202 200 bayt

Umarım bu golf olabilir ...

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

Ungolfed kod:

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 İlkelleri

Icure 2 İsimler ve değerler için diziler ve üstlerinden (i ile indeks dizisi) geçerek bir modulo operatörü (R IQ şeyi) kullanın. Kalan paralar vardiya kaydına geçirilir.

Değer 0'dan büyükse, sayıyı dizeye dönüştürürüm ve aşağıya aktarılan dizgiyi sayıyı ve dizgenin adını birleştirir ve tekrar kaydırma yazmacına koyarım.

Ijus, benim gif'in sahte olayı göstermediğini fark etti, ancak yine de görecek bir şey yok, gelen dizgiden geçer.


"İlkel" ler baytlarla nasıl karşılaştırılır? "X primitives", x <y olduğunda "y baytları" yener mi? Sadece soruyorum
Luis Mendo

İlkellerin nasıl sayıldığını görmek için bağlantıyı kontrol edebilirsiniz. Boş bir vi zaten ~ 10kb büyük olduğundan, labview kodunun byte cinsinden boyutlandırılması çok işe yaramaz. Tecrübeye göre, bir golf dilinde baytlardan daha fazla ilkel var, bu yüzden CJam'da veya benzerida yaklaşık 50-60 bayt olacaktır.
Eumel

1
@LuisMendo Bir LabView dosyasının bilgi içeriğini, ilkel başına bir bayt ile sınırlayamayız, bu nedenle LabView'in ilkel başına bir bayta sayılması haksızlık olur.
lirtosiast 6'16

Muhtemelen iyi bir golf dili ile @ThomasKwa tbh, muhtemelen her giriş döngüsü için tel başına 1 bayt, her işlem için 2-4 bayt ve bunun için 3 ilkel ve diğerleri
Eumel

2

Japt, 77 bayt

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

Neyse ki, dört jeton adının tümü sıkıştırılabilir. ¿Literal bayt 0x81 olmalıdır. Çevrimiçi test edin!


Sadece bazı rastgele girdilerle denedim, bir yüzde 18.33'te 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18.33 yerine 18.32.
D. Strout,

2

C, 147 144 142 140 bayt

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

Testlerle affetmemiş:

#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
Belki değiştirmeyi deneyin char*[]ile char**, int a[]birlikte int*ave koyun m%=a[i++]döngü için son kısmında. 4 bayt kurtarmalı. Henüz test etmedim, o yüzden hepsini dene.
takra,

@ minerguy31 Diziler yerine işaretçiler kullanırsam liste başlatıcıları kullanamazdım. m%=a[i++]Biraz da olsa taşındım , teşekkürler.
Alexander Revo

1
Ayrıca, değiştirmek mümkün olabilir if(m/a[i])ile m/a[i]&&2 daha byte tasarruf etmek.
takra,

Ayrıca "quarter\0dime\0nickel\0penny"printf içinde kullanmayı deneyin . Her \ 0 dizeyi sonlandırır ve her biri 1 char kaydeder
takra

@ minerguy31 ile string kullanmak \0programın çökmesine neden olur. Yinelemenin nasıl böyle bir ip üzerinde çalışması gerektiğinden emin değilim.
Alexander Revo


1

JavaScript, 156 145 144 bayt

ETHproduction'ın formül cevabına uyuşmuyor, ama yine de ...

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}

Bu benim ilk golf turlarımdan biriydi, bu yüzden herhangi bir iyileştirme takdir edilmektedir! Zaten ETH'nin "xor trunc" unu çaldım - üzgünüm, sadece çok zekiydi :-)

Daha okunabilir:

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
}

Not: Ben JavaScript ki (? Benim makinede en az) böler gerçekleşen test ederken 1.13 / 0.01etmek 1.12999...benim (ve muhtemelen diğer tüm JS gönderimleri) yapım düzgün% 100 çalışmıyor ...


En son noktalı virgüle ihtiyacın olduğunu sanmıyorum.
Downgoat

0

Perl 5 - 128 124 bayt

Sanırım bu daha kısa olması için yeniden yazılabilir ama gerçekten göremiyorum.

$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: Sadece 4 karakter kaydetmek için bir matematik hilesi.


0

Perl 6 , 96 bayt

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

Kullanımı:

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 bayt

Güncelleme 1: Sp3000'in input () kullanımı fikrini çaldı ve kodumu bir işlev yerine bir komut dosyası yap.

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 bayt

Ne yazık ki, olmadan çalışmaz #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 bayt

Sp3000'in Python cevabına göre sırala, ancak kendi sihirli formülümle.

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

Düzenle - aformülü iyileştirdi . Daha önce öyleydia=a*3%13~#s%4 .

Düzen 2 - daha önce math.ceilyuvarlamak ve tamsayıya dönüştürmek için kullanıyordum . Şimdi //yuvarlamak ve ~~tamsayıya dönüştürmek için ekleyerek yeniden kullanıyorum .

Düzenleme 3 - dan deseni değiştirerek bir karakter traş "%w+ "etmek ".- ".


0

K (oK) , 95 78 bayt

Çözüm:

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

Çevrimiçi deneyin!

Örnek:

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

Açıklama:

Her bir madeni parayla girişi modulo yapın, ardından parayı sonuçlara bölün.

Her bir sonuç, madalyonun adı ile birlikte bir fonksiyona beslenir ve eğer jeton sayısı sıfır değilse her ikisinin de string değerini döndürür.

Her şeyi düzleştirin ve boşlukla birlikte katılın.


0

Kotlin , 147 bayt

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

Beautified

{
    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çek

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.