Diese Herausforderung bringt Cent

29

Ich weiß, der Titel macht dich fertig


Bei einer bestimmten Menge an ausgegebenem Geld macht die geringste Anzahl an Münzen diesen Betrag aus

Beispiele

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 in einem Dollar.
  • Die Werte für jeden Münztyp sind:
    • penny 1 Cent
    • nickel 5 Cent
    • dime 10 Cent
    • quarter 25 Cent

Built-Ins, die diese Aufgabe trivialisieren, sind nicht erlaubt.

I / O

Die Eingabe ist eine Dezimalstelle, die den Dollarwert der Gesamtsumme darstellt

  • Keine Notwendigkeit zu pluralisieren
  • Bestellung: quarter->penny
  • Ausgabe sollte sein <#_of_coins> <coin type>
  • Seperatoren: ,oder ,oder

Das einzige zulässige Leerzeichen ist ein einzelnes Leerzeichen.


Wenn es eine Null eines Münztyps gibt, sollte dieser Münztyp nicht angezeigt werden . ZB 0.25-> 1 quarter nicht 1 quarter 0 dime 0 nickel 0 penny

Downgoat
quelle
@VoteToClose nein, aber ich erlaube Kommas als Trennzeichen
Downgoat
Letztes Beispiel ist 1.43, das größer ist als1
Luis Mendo
@ LuisMendo oh whoops, der (less than 1)Teil sollte nicht da gewesen sein. Ich habe vergessen, das im Sandkasten zu entfernen
Downgoat
Ist es in Ordnung, wenn die Ausgabe ist 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien
1
@DigitalTrauma 13.00kann eine mögliche Eingabe sein, aber die Eingabe wird es niemals sein 13. Ich werde immer eine Dezimalzahl haben
Downgoat

Antworten:

5

CJam, 60

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

Dieses Skript scheint viel Raum für Verbesserungen zu haben, aber es ist kürzer als jedes andere. Dies nutzt den eingebauten "md" -Befehl, der sowohl das ganzzahlige Ergebnis einer Division als auch den Rest zurückgibt. Es macht Folgendes:

  • Liest Eingaben (wenn es eine Funktion wäre, könnte man q ~ für zwei weniger Zeichen entfernen)
  • multipliziert die Eingabe mit 100 und konvertiert sie in eine Ganzzahl
  • führt "md" mit [25 10 5] aus, was zu den Resten auf dem Stapel führt
  • kombiniert die Zahlen und Münznamen
  • Entfernt die Nummer und den Münznamen, wenn ersterer 0 ist
  • Fügt Nullen vor der Nummer hinzu

Probieren Sie es hier aus

frühere Versionen:

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
quelle
11

JavaScript ES6, 107 Bytes

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

Einfache mathematik

ETHproductions
quelle
Gute Arbeit! Ich dachte, es gäbe eine geschlossene Formel
Conor O'Brien
? Gibt dies nicht den Münztyp aus, wenn Nullen dieses Münztyps vorhanden sind?
Frentos
@Frentos nein, am Ende befindet sich ein Regex, der Münztypen mit null Münzen entfernt
Downgoat
@ Doᴡɴɢᴏᴀᴛ: Entschuldigung, habe nicht bemerkt, dass der Textbereich ohne visuelle Hinweise nach rechts
gescrollt ist
Benötigen Sie das |0nach dem n%5?
Neil
11

Python 2, 120 Bytes

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

Nur um sicher zu gehen, zu etwas geändert, das definitiv funktioniert, um den Kommentar von @ Ogaday zu korrigieren, zumindest für den Moment. Ich bin mir nicht sicher, ob ich das auch brauche oder nicht int(), aber ich habe Probleme, mich davon zu überzeugen, dass ich es nicht brauche.

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

ist ein zusätzliches Byte deaktiviert, gibt jedoch ein zusätzliches Byte Lfür große Eingaben aus (obwohl dieser Code aufgrund der Float-Genauigkeit ohnehin nicht für extrem große Eingaben funktioniert).

Sp3000
quelle
1
Du hast gerade die ganze Zeit dafür aufgewendet, meine Lösung zu verbessern, um Megos Verschwendung zu übertreffen. Gute Arbeit!
Alexander Revo
1
+1 - Ich wünschte, ich wüsste, was für eine Magie Sie sich einfallen ließena=40/a+5^12
Digitales Trauma
@DigitalTrauma Versuchte eine Reihe von arithmetischen Operatoren, z. B. [x^k for x in [10, 5, 1]]und [k/y for y in [25, 10, 5]]für verschiedene k, und sah dann, dass zwei Listen um 5 versetzt waren. Wahrscheinlich suboptimal, aber ich hatte keine Zeit für rohe Gewalt.
Sp3000
Dies scheitert tatsächlich (zumindest für mich) an Eingaben von 10.03und 10.04. Es hängt mit Pythons Darstellung von Floats zusammen und wie sie zu Ints gerundet werden. Versuchen Sie es "print %d"%(10.03*100).
Ogaday
n=int(''.join(raw_input().split(".")))kann funktionieren, aber es ist ziemlich ausführlich.
Sherlock9
7

dc, 104

Zeilenumbrüche für "Lesbarkeit" hinzugefügt :

[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
Digitales Trauma
quelle
15
dc: Jetzt mit Readability ™
Alex A.
6

Retina , 97

Vielen Dank (wie immer) an @randomra - 1 Byte gespeichert.

Angenommen, die Eingabe erfolgt entweder in der Form xxx.yyoder xxx.y.

\..$
$&0
\.

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

Probieren Sie es online aus.

Digitales Trauma
quelle
1
$&ist das gleiche wie $0so dass Sie ein Byte in sparen $0.0durch $&0.
Randomra
Wenn Sie so etwas wie 0.9999999 eingeben, ist die Ausgabe etwas verrückt
Anthony Pham
@PythonMaster Ich füge Unterstützung hinzu, wenn die Fed beginnt, 10 Mikropenny-Stücke zu prägen ;-)
Digital Trauma
4

Vitsy, 110 100 97 Bytes

Ja, Moment mal, ich methodisiere das immer noch.

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

Erklärung im bald erscheinenden ausführlichen Modus:

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;

Probieren Sie es online!

Addison Crump
quelle
2
retrauqscheint fast wie ein Wort ...
Conor O'Brien
Der Permalink funktioniert nicht
Downgoat
Behoben, sorry. Alter Code-Link. : P
Addison Crump
3

Java 8 Lambda, 165 Bytes

Erwartet die Eingabe yentweder als double oder 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":"");}

So viel Dreistoff. ; -;

Addison Crump
quelle
;-;Was ist das? Ist das eine Wampa?
Becher
@ Becher Weinen.
Addison Crump
2

JavaScript ES6, 202 200 Bytes

Ich hoffe, das kann golfen werden ...

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-Code:

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
quelle
2

LabVIEW, 62 LabVIEW-Grundelemente

Icreated 2 Arrays für die Namen und Werte und durchlaufen sie von oben (Index-Array mit i) mit einem Modulo-Operator (das R IQ-Ding). Die restlichen Münzen werden in das Schieberegister geleitet.

Wenn der Wert größer als 0 ist, konvertiere ich die Zahl in eine Zeichenfolge und verkette die übergebene Zeichenfolge mit der Zahl und dem Namen der Münze und lege sie zurück in das Schieberegister.

Ijus wurde klar, dass mein GIF den falschen Fall nicht zeigt, aber es ist trotzdem nichts zu sehen, es geht einfach durch den eingegangenen String.

Eumel
quelle
Wie vergleichen sich "Primitive" mit Bytes? Schlagen "x-Primitive" "y-Bytes", wenn x <y ist? Ich frage nur
Luis Mendo
Sie können den Link überprüfen, um zu sehen, wie Grundelemente gezählt werden. Die Angabe der Größe des Labview-Codes in Byte wäre nutzlos, da ein leerer vi bereits ~ 10 KB groß ist. Erfahrungsgemäß gibt es in einer Golf-Sprache ein paar Primitive mehr als Bytes, so dass dies in CJam oder dergleichen etwa 50-60 Bytes sind.
Eumel
1
@LuisMendo Wir können den Informationsgehalt einer LabView-Datei oben nicht an ein Byte pro Grundelement binden, daher wäre es unfair, LabView mit einem Byte pro Grundelement zu zählen.
Lirtosiast
@ ThomasKwa tbh mit einer gut gemachten Golf-Sprache, die Sie wahrscheinlich könnten, jede Operation 1 Byte 1 Byte pro Draht für jede Eingabeschleife sind 2-4 Bytes für und während 3 Primitive sind und so weiter
Eumel
2

Japt, 77 Bytes

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

Zum Glück sind alle vier Münznamen komprimierbar. Das ¿sollte das Literalbyte 0x81 sein. Online testen!

ETHproductions
quelle
Gerade versucht es mit einigen zufälligen Inputs, es ist ein Cent aus auf 18.33: 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18,32 anstelle von 18,33.
D. Strout
2

C 147 144 142 140 Bytes

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 mit Tests:

#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
quelle
1
Versuchen Sie vielleicht, char*[]mit char**, int a[]zu ersetzen int*a, und setzen Sie das m%=a[i++]in den letzten Teil der for-Schleife. Sollte 4 Bytes sparen. Ich habe es noch nicht getestet, versuche es einfach.
Takra
@ minerguy31 Ich könnte keine Listeninitialisierer verwenden, wenn ich Zeiger anstelle von Arrays verwende. Verschoben das m%=a[i++]bisschen, danke.
Alexander Revo
1
Außerdem können Sie ersetzen können , if(m/a[i])mit m/a[i]&&zu speichern 2 weitere Bytes.
Takra
Versuchen Sie es auch "quarter\0dime\0nickel\0penny"im printf. Jede \ 0 beendet die Zeichenfolge und speichert jeweils 1
Zeichen
@ minerguy31 using string with \0führt zum Absturz des Programms. Ich bin mir nicht sicher, wie die Iteration über einen solchen String funktionieren soll.
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

Probieren Sie es bei MATL Online!

Luis Mendo
quelle
Ich muss wirklich die String-Komprimierung in MATL einbinden
Luis Mendo
1

JavaScript, 156 145 144 Bytes

Keine Übereinstimmung mit der Formelantwort von ETHproduction, aber trotzdem ...

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}

Dies ist eine meiner ersten Golfrunden, daher sind Verbesserungen sehr willkommen! Ich habe bereits den "xor trunc" der ETH gestohlen - sorry man, es war einfach zu schlau :-)

Besser lesbar:

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
}

Hinweis: Beim Testen habe ich festgestellt, dass JavaScript (zumindest auf meinem Computer?) Sich 1.13 / 0.01in teilt 1.12999..., sodass meine (und wahrscheinlich alle anderen JS-Einreichungen) nicht 100% richtig funktionieren ...

Christallkeks
quelle
Ich glaube nicht, dass Sie das allerletzte Semikolon brauchen.
Downgoat
0

Perl 5 - 128 124 Bytes

Ich denke, dies kann umgeschrieben werden, um viel kürzer zu sein, aber ich kann es wirklich nicht sehen.

$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: Nur ein mathematischer Trick, um 4 Zeichen zu sparen.

ChatterOne
quelle
0

Perl 6 , 96 Bytes

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

Verwendung:

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
quelle
0

Python 2, 167 161 Bytes

Update 1: Stola Sp3000 die Idee, input () zu verwenden und meinen Code ein Skript anstelle einer Funktion zu machen.

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
quelle
0

C 162 Bytes

Funktioniert leider nicht ohne die #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;
    }
}
Cole Cameron
quelle
0

Lua 5.3, 141 139 132 131 Bytes

Basiert irgendwie auf der Python-Antwort von Sp3000, aber mit meiner eigenen Zauberformel.

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

Bearbeiten - aFormel verbessert . Zuvor war es a=a*3%13~#s%4.

Edit 2 - früher habe ich math.ceilgerundet und in eine Ganzzahl konvertiert. Jetzt verwende ich wieder, um //zu runden und zu addieren ~~, um in Ganzzahl umzuwandeln.

Edit 3 - Rasiert ein Zeichen, indem das Muster von "%w+ "auf geändert wird ".- ".

tehtmi
quelle
0

K (oK) , 95 bis 78 Bytes

Lösung:

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

Probieren Sie es online!

Beispiel:

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

Erläuterung:

Modulieren Sie die Eingabe für jede Münze und dividieren Sie die Münzen durch das Ergebnis.

Tragen Sie jedes Ergebnis zusammen mit dem Namen der Münze in eine Funktion ein und geben Sie den String-Wert von beiden zurück, wenn die Anzahl der Münzen nicht Null ist.

Alles reduzieren und mit Leerzeichen verbinden.

Streetster
quelle
0

Kotlin , 147 Bytes

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

Verschönert

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

Prüfung

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
quelle