To wyzwanie sprawia, że ​​centy

29

Wiem, że tytuł cię kręci


Biorąc pod uwagę wielkość produkcji pieniężnej, najmniejsza liczba monet stanowi tę kwotę

Przykłady

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 centów za dolara.
  • Wartości każdego rodzaju monety to:
    • penny 1 cent
    • nickel 5 centów
    • dime 10 centów
    • quarter 25 centów

Wbudowane, które trywializują to zadanie, nie są dozwolone.

I / O

Dane wejściowe to liczba dziesiętna reprezentująca wartość dolara sumy

  • Nie ma potrzeby mnożenia
  • Zamówienie: quarter->penny
  • Wyjście powinno być <#_of_coins> <coin type>
  • Separatory: ,lub ,lub

Jedyne dozwolone białe znaki końcowe to pojedyncza nowa linia / spacja.


Jeśli jest zero typu monety, tego typu monety nie powinny być wyświetlane . Np. 0.25-> 1 quarter nie 1 quarter 0 dime 0 nickel 0 penny

Downgoat
źródło
@VoteToClose nie, ale zezwalam na przecinki jako separator
Downgoat
Ostatnim przykładem jest 1.43, który jest większy niż1
Luis Mendo
@LuisMendo och, ups, (less than 1)część nie powinna tam być. Zapomniałem wyjąć że w piaskownicy Myślę
Downgoat
Czy to w porządku, jeśli dane wyjściowe są 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien
1
@DigitalTrauma 13.00może być możliwym wejściem, ale wejście nigdy nie będzie 13. Zawsze będę miał po przecinku
Downgoat

Odpowiedzi:

5

CJam, 60

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

Wydaje się, że w tym skrypcie jest dużo miejsca na ulepszenia, ale jest on krótszy niż jak dotąd. Wykorzystuje to wbudowaną komendę „md”, która zwraca zarówno liczbę całkowitą wyniku dzielenia, jak i resztę. Wykonuje następujące czynności:

  • odczytuje dane wejściowe (gdyby była to funkcja, można usunąć q ~ dla dwóch mniej znaków)
  • mnoży wejście przez 100 i konwertuje je na liczbę całkowitą
  • wykonuje „md” za pomocą [25 10 5], co skutkuje resztą na stosie
  • łączy liczby i nazwy monet
  • usuwa numer i nazwę monety, jeśli pierwsza to 0
  • dodaje zera przed liczbą

Wypróbuj tutaj

wcześniejsze wersje:

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/.+.*
Kaine
źródło
11

JavaScript ES6, 107 bajtów

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

Proste matematyki.

ETHprodukcje
źródło
Dobra robota! Myślałem, że istnieje rozwiązanie w zamkniętej formule
Conor O'Brien
? Czy to nie generuje typu monety, jeśli jest zero tego typu monet?
Frentos
@Frentos nie, na końcu jest regex, który usuwa typy monet, które mają zero monet
Downgoat
@ Doᴡɴɢᴏᴀᴛ: przepraszam, nie zdawałem sobie sprawy, że obszar tekstowy przewinął w prawo przy braku wizualnych wskazówek :-)
Frentos
Czy potrzebujesz |0po n%5?
Neil,
11

Python 2, 120 bajtów

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

Na wszelki wypadek zmieniono na coś, co zdecydowanie poprawia komentarz @ Ogadaya, przynajmniej na razie. Nie jestem pewien, czy ja też tego potrzebuję int(), ale mam trudności z przekonaniem siebie, że nie.

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

jest dodatkowym bajtem wyłączonym, ale drukuje dodatkowy Ldla dużych danych wejściowych (chociaż ten kod i tak nie działa dla bardzo dużych danych wejściowych, ze względu na precyzję zmiennoprzecinkową).

Sp3000
źródło
1
Właśnie poświęciłeś cały czas, który spędziłem na ulepszaniu mojego rozwiązania, aby zmiażdżyć Mego. Dobra robota!
Alexander Revo,
1
+1 - Chciałbym wiedzieć, jaką magię wymyśliłeśa=40/a+5^12
Digital Trauma
@DigitalTrauma Próbowałem wielu operatorów arytmetycznych, np. [x^k for x in [10, 5, 1]]I [k/y for y in [25, 10, 5]]dla różnych k, a potem zobaczyłem, że dwie listy zostały przesunięte o 5. Prawdopodobnie nieoptymalne, ale nie miałem czasu na brutalną siłę.
Sp3000,
To faktycznie zawodzi (przynajmniej dla mnie) na wejściach 10.03i 10.04. Ma to związek z reprezentacją liczb zmiennoprzecinkowych w Pythonie i sposobem, w jaki zaokrągla je do liczb całkowitych. Spróbować "print %d"%(10.03*100).
Ogaday
n=int(''.join(raw_input().split(".")))może działać, ale jest dość gadatliwy.
Sherlock9
7

dc, 104

Dodano nowe linie dla „czytelności” :

[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
Cyfrowa trauma
źródło
15
dc: Teraz z Readability ™
Alex A.
6

Retina , 97

Dzięki (jak zawsze) @randomra - zapisano 1 bajt.

Zakłada, że ​​dane wejściowe są w formie xxx.yylub xxx.y.

\..$
$&0
\.

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

Wypróbuj online.

Cyfrowa trauma
źródło
1
$&jest taki sam jak, $0więc możesz zapisać bajt $0.0przez $&0.
randomra
Wprowadzając coś w rodzaju 0.9999999, wyjście jest trochę szalone
Anthony Pham
@PythonMaster Dodam wsparcie, gdy Fed zacznie bić 10 sztuk mikropenny ;-)
Cyfrowa trauma
4

Vitsy, 110 100 97 bajtów

Tak, poczekaj, nadal to metodycznie.

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

Objaśnienie w trybie pełnym, który wkrótce będzie dostępny:

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;

Wypróbuj online!

Addison Crump
źródło
2
retrauqprawie wydaje się słowem ...
Conor O'Brien
Link bezpośredni
Naprawione, przepraszam. Stary link do kodu. : P
Addison Crump
3

Java 8 lambda, 165 bajtów

Oczekuje, że dane wejściowe będą ypodwójne lub zmiennoprzecinkowe.

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

Tyle trójki. ; -;

Addison Crump
źródło
;-;Co to jest? Czy to wampa?
zlewka
@ beaker Crying.
Addison Crump
2

JavaScript ES6, 202 200 bajtów

Mam nadzieję, że można to zagrać w golfa ...

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

Nieskluczony 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," ");
}
Conor O'Brien
źródło
2

LabVIEW, 62 LabVIEW Prymitywy

Tworzyłem 2 tablice dla nazw i wartości i przeglądałem je od góry (tablica indeksu z i) za pomocą operatora modulo (rzecz R IQ). Pozostałe monety są przekazywane do rejestru przesuwnego.

Jeśli wartość jest większa niż 0, przekształcam liczbę na ciąg znaków i konkatenuję przekazany ciąg znaków numer i nazwę monety i umieszczam z powrotem w rejestrze przesuwnym.

Ijus zdał sobie sprawę, że mój gif nie pokazuje fałszywego przypadku, ale i tak nie ma nic do zobaczenia, po prostu przechodzi przez ciąg, który wszedł.

Eumel
źródło
Jak „prymitywne” porównać do bajtów? Czy „x prymitywów” bije „y bajtów”, gdy x <y? Tylko pytam
Luis Mendo
Możesz sprawdzić link, aby zobaczyć, jak liczone są prymitywy. Podanie wielkości kodu labview w bajtach byłoby trochę bezużyteczne, ponieważ puste vi ma już ~ 10 KB. Z doświadczenia wynika, że ​​jest kilka prymitywów więcej niż bajtów w języku golfowym, więc byłoby to około 50-60 bajtów w CJam lub podobnych.
Eumel
1
@LuisMendo Nie możemy ograniczyć zawartości informacyjnej powyższego pliku LabView do jednego bajtu na operację podstawową, więc niesprawiedliwe byłoby policzenie LabView przy jednym bajcie na operację podstawową.
lirtosiast
@ThomasKwa tbh z dobrze wykonanym językiem golfa, który prawdopodobnie mógłbyś, każda operacja 1 bajt 1 bajt na drut dla każdej pętli wejściowej to 2-4 bajty dla, a podczas gdy są 3 prymitywy i tak dalej
Eumel
2

Japt, 77 bajtów

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

Na szczęście wszystkie cztery nazwy monet można skompresować. ¿Powinny być dosłowne bajt 0x81. Przetestuj online!

ETHprodukcje
źródło
Po prostu próbowałem go z niektórych przypadkowych wejść, to jeden cent off na 18.33: 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18,32 zamiast 18,33.
D. Strout
2

C, 147 144 142 140 140 bajtów

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

Niepoddane testom:

#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");
    }
}
Alexander Revo
źródło
1
Może spróbuj wymienić char*[]z char**, int a[]z int*a, i umieścić m%=a[i++]w ostatniej części pętli for. Powinny zaoszczędzić 4 bajty. Jeszcze go nie testowałem, więc po prostu spróbuj każdego z nich.
takra
@ minerguy31 Nie byłbym w stanie używać inicjatorów listy, jeśli używałbym wskaźników zamiast tablic. Poruszyłem m%=a[i++]trochę, dzięki.
Alexander Revo
1
Ponadto, może być w stanie zastąpić if(m/a[i])w m/a[i]&&celu oszczędzania 2 więcej bajtów.
takra
Spróbuj także użyć "quarter\0dime\0nickel\0penny"w printf. Każdy \ 0 kończy ciąg, oszczędzając po 1 znaku
takra
@ minerguy31 użycie ciągu znaków \0powoduje awarię programu. W każdym razie nie jestem pewien, jak iteracja powinna działać na takim łańcuchu.
Alexander Revo
2

MATL , 82 106 107

'%i quarter %i dime %i nickel %i penny'i[.25 .1 .05]"@2#\w]100*Yo5$YD'0 \S+ ?'[]YX

Wypróbuj w MATL Online!

Luis Mendo
źródło
Naprawdę muszę włączyć kompresję strun w MATL
Luis Mendo
1

JavaScript, 156 145 144 bajtów

Nie pasuje do odpowiedzi na formułę ETHproduction, ale w każdym razie ...

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}

To jedna z moich pierwszych rund golfa, więc wszelkie ulepszenia są bardzo mile widziane! Już ukradłem „Xor trunc” ETH - przepraszam, to było po prostu zbyt mądre :-)

Bardziej czytelny:

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
}

Uwaga: podczas testów zdałem sobie sprawę, że JavaScript (przynajmniej na moim komputerze?) Dzieli się 1.13 / 0.01na 1.12999..., powodując, że moje (i prawdopodobnie wszystkie inne zgłoszenia JS) nie działają w 100% poprawnie ...

Christallkeks
źródło
Nie sądzę, żebyś potrzebował ostatniego średnika.
Downgoat
0

Perl 5 - 128 124 bajtów

Wydaje mi się, że można to napisać ponownie, aby było o wiele krótsze, ale naprawdę tego nie widzę.

$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

EDYCJA: Tylko sztuczka matematyczna, aby zapisać 4 znaki.

ChatterOne
źródło
0

Perl 6 , 96 bajtów

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

Stosowanie:

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
Brad Gilbert b2gills
źródło
0

Python 2, 167 161 bajtów

Aktualizacja 1: Pomysł Stole Sp3000 na użycie input () i uczynienie mojego kodu skryptem zamiast funkcji.

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]])
Alexander Revo
źródło
0

C, 162 bajty

Niestety nie działa bez #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;}

Nie golfił

#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;
    }
}
Cole Cameron
źródło
0

Lua 5.3, 141 139 132 131 bajtów

Coś w oparciu o odpowiedź Python na Sp3000, ale z moją własną magiczną formułą.

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

Edytuj - poprawiono aformułę. Wcześniej było a=a*3%13~#s%4.

Edycja 2 - poprzednio używałem math.ceildo zaokrąglania i konwersji na liczbę całkowitą. Teraz ponownie używam //do zaokrąglania i dodawania ~~do konwersji na liczbę całkowitą.

Edycja 3 - ogolił postać, zmieniając wzór z "%w+ "na ".- ".

tehtmi
źródło
0

K (oK) , 95 78 bajtów

Rozwiązanie:

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

Wypróbuj online!

Przykład:

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

Wyjaśnienie:

Zmoduluj dane wejściowe według każdej monety, a następnie podziel monety według wyniku.

Wprowadź każdy wynik wraz z nazwą monety do funkcji, zwracając wartość ciągu obu, jeśli liczba monet jest różna od zera.

Spłaszcz wszystko w dół i połącz razem z białymi znakami.

Streetster
źródło
0

Kotlin , 147 bajtów

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

Upiększony

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

Test

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

jrtapsell
źródło