Questa sfida fa centesimi


29

Lo so, il titolo ti spezza


Data la quantità di denaro prodotta, il minor numero di monete costituisce tale importo

Esempi

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 centesimi in un dollaro.
  • I valori di ogni tipo di moneta sono:
    • penny 1 centesimo
    • nickel 5 centesimi
    • dime 10 centesimi
    • quarter 25 centesimi

Non sono consentiti incorporati che banalizzano questo compito.

I / O

L'input è un decimale che rappresenta il valore in dollari del totale

  • Non è necessario pluralizzare
  • Ordine: quarter->penny
  • L'output dovrebbe essere <#_of_coins> <coin type>
  • Separatori: ,o ,o

L'unico spazio bianco finale consentito è una nuova riga / spazio finale finale.


Se esiste uno zero di un tipo di moneta, quel tipo di moneta non dovrebbe essere mostrato . Ad esempio 0.25-> 1 quarter no 1 quarter 0 dime 0 nickel 0 penny


@VotoToChiudi no, ma permetterò le virgole come seperaor
Downgoat

L'ultimo esempio è 1.43, che è maggiore di1
Luis Mendo,

@LuisMendo oh whoops, la (less than 1)parte non dovrebbe essere stata lì. Ho dimenticato di rimuoverlo nella sandbox immagino
Downgoat

Va bene se l'uscita è 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien,

1
@DigitalTrauma 13.00può essere un possibile input ma l'input non lo sarà mai 13. Avrò sempre un decimale
Downgoat

Risposte:


5

CJam, 60

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

Questo script sembra avere molti margini di miglioramento, ma questo è più breve di qualsiasi altro finora. Questo utilizza il comando "md" incorporato che restituisce sia il risultato intero di una divisione che il resto. Fa quanto segue:

  • legge l'input (se fosse una funzione suppongo che tu possa rimuovere q ~ per due caratteri in meno)
  • moltiplica l'input per 100 e lo converte in un numero intero
  • esegue "md" usando [25 10 5] che risulta nei resti dello stack
  • combina i numeri e i nomi delle monete
  • rimuove il numero e il nome della moneta se il primo è 0
  • aggiunge zeri pre-numerici

Provalo qui

versioni precedenti:

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

Matematica semplice.


Bel lavoro! Pensavo che ci fosse una soluzione ish a formula chiusa
Conor O'Brien,

? Questo non genera il tipo di moneta se ci sono zero di quel tipo di moneta?
Frentos,

@Frentos no, alla fine c'è un Regex che rimuove i tipi di moneta che hanno zero monete
Downgoat

@ Doᴡɴɢᴏᴀᴛ: scusa, non ho capito che l'area di testo scorreva a destra in assenza di indizi visivi :-)
Frentos,

Hai bisogno del |0dopo il 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

Giusto per sicurezza, cambiato in qualcosa che sicuramente funziona per risolvere il commento di @ Ogaday, almeno per ora. Non sono sicuro se ne avrò bisogno o meno int(), ma ho problemi a convincermi che non lo faccio.

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

è un byte extra off, ma stampa un extra Lper input di grandi dimensioni (anche se questo codice non funziona comunque per input estremamente grandi, a causa della precisione float).


1
Hai appena dedicato tutto il tempo che ho trascorso a migliorare la mia soluzione per superare gli sprechi di Mego. Ottimo lavoro però!
Alexander Revo,

1
+1 - Vorrei sapere quale magia hai usato per inventartia=40/a+5^12
Digital Trauma,

@DigitalTrauma Ho provato un sacco di operatori aritmetici, ad es. [x^k for x in [10, 5, 1]]E [k/y for y in [25, 10, 5]]per diversi k, poi ho visto che due liste erano compensate da 5. Probabilmente non ottimale, ma non ho avuto il tempo di forzare la forza.
Sp3000,

Questo in realtà fallisce (almeno per me) sugli input di 10.03e 10.04. Ha a che fare con la rappresentazione dei float di Python e il modo in cui li arrotonda in interi. Prova "print %d"%(10.03*100).
Ogaday,

n=int(''.join(raw_input().split(".")))può funzionare, ma è piuttosto prolisso.
Sherlock9,

7

dc, 104

Newline aggiunte per "leggibilità" :

[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: ora con Readability ™
Alex A.

6

Retina , 97

Grazie (come sempre) a @randomra - salvato 1 byte.

Presuppone che l'input sia nella forma xxx.yyo xxx.y.

\..$
$&0
\.

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

Provalo online.


1
$&è lo stesso che $0così è possibile salvare un byte in $0.0da $&0.
randomra,

Inserendo qualcosa come 0.9999999, l'output è un po 'folle
Anthony Pham,

@PythonMaster Aggiungerò il supporto per questo quando la Fed inizierà a coniare 10 pezzi di micropenny ;-)
Digital Trauma

4

Vitsy, 110 100 97 byte

Sì, aspetta, sto ancora metodologando questo.

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

Spiegazione in modalità verbosa a venire:

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;

Provalo online!


2
retrauqsembra quasi una parola ...
Conor O'Brien,

Il permalink non funziona
Downgoat

Risolto, scusa. Link al vecchio codice. : P
Addison Crump,

3

Java 8 lambda, 165 byte

Prevede input ycome double o 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":"");}

Così tanto ternario. ; -;


;-;Cos'è quello? È una Wampa?
bicchiere

@beaker Crying.
Addison Crump,

2

JavaScript ES6, 202 200 byte

Spero che questo possa essere giocato a 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," ")')

Codice non golfato:

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 Primitives

Crea 2 array per i nomi e i valori e attraversali dall'alto (array di indici con i) usando un operatore modulo (l'elemento R IQ). Le monete rimanenti vengono passate nel registro a turni.

Se il valore è maggiore di 0, converto il numero in stringa e concateno la stringa tramandata il numero e il nome della moneta e lo rimetto nel registro a scorrimento.

Ijus ha realizzato che la mia gif non mostra il caso falso, ma non c'è comunque niente da vedere, passa solo attraverso la stringa che è entrata.


Come si confrontano i "primitivi" con i byte? "X primitive" batte "y byte" quando x <y? Sto solo chiedendo
Luis Mendo,

Puoi controllare il link per vedere come vengono contati i primitivi. Dare dimensione del codice labview in byte sarebbe un po 'inutile, dal momento che un vi vuoto è già ~ 10kb grande. Per esperienza, ci sono alcuni primitivi in ​​più rispetto ai byte in un linguaggio golfistico, quindi questo sarebbe di circa 50-60 byte in CJam o simili.
Eumel,

1
@LuisMendo Non possiamo limitare il contenuto informativo di un file LabView sopra di un byte per primitiva, quindi sarebbe ingiusto contare LabView a un byte per primitiva.
lirtosiast,

@ThomasKwa tbh con un linguaggio da golf ben fatto che probabilmente potresti, ogni operazione 1 byte 1 byte per filo per ogni loop di input sono 2-4 byte per e mentre sono 3 primitive e così via
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

Per fortuna, tutti e quattro i nomi delle monete sono comprimibili. Il ¿dovrebbe essere il 0x81 Byte letterale. Provalo online!


Appena provato con alcuni input casuali, è un centesimo off 18.33: 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18.32 invece di 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]);}

Non rigato con prove:

#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
Forse prova a sostituire char*[]con char**, int a[]con int*ae inserisci m%=a[i++]l'ultima parte del ciclo for. Dovrebbe salvare 4 byte. Non l'ho ancora testato, quindi prova ciascuno di essi.
Takra

@ minerguy31 Non sarei in grado di utilizzare gli inizializzatori di elenco se utilizzo i puntatori anziché gli array. Mosso m%=a[i++]però, grazie.
Alexander Revo,

1
Inoltre, potresti essere in grado di sostituire if(m/a[i])con m/a[i]&&per salvare altri 2 byte.
Takra,

Prova anche a utilizzare "quarter\0dime\0nickel\0penny"in printf. Ogni \ 0 termina la stringa, salvando 1 carattere ciascuno
takra

@ minerguy31 usando string con \0provoca l'arresto anomalo del programma. Non sono sicuro di come dovrebbe funzionare l'iterazione su tale stringa.
Alexander Revo,


1

JavaScript, 156 145 144 byte

Nessuna corrispondenza con la risposta della formula di ETHproduction, ma comunque ...

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}

Questo è uno dei miei primi giri di golf, quindi ogni miglioramento è molto apprezzato! Ho già rubato il "xor trunc" dell'ETH - scusa amico, era troppo intelligente :-)

Più leggibile:

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
}

Nota: Durante il test ho capito che Javascript (? Almeno sulla mia macchina) si divide 1.13 / 0.01a 1.12999..., fare i miei (e probabilmente tutti gli altri mezzi JS) non funzionare al 100% correttamente ...


Non penso che tu abbia bisogno dell'ultimo punto e virgola.
Downgoat,

0

Perl 5 - 128 124 byte

Immagino che questo possa essere riscritto per essere molto più breve ma non riesco davvero a vederlo.

$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: solo un trucco matematico per salvare 4 caratteri.


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
>

Uso:

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

Aggiornamento 1: rubato l'idea di Sp3000 di utilizzare input () e rendere il mio codice uno script anziché una funzione.

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

Sfortunatamente, non funziona senza il #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 byte

Un po 'basato sulla risposta Python di Sp3000, ma con la mia formula magica.

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

Modifica: migliorata la aformula. In precedenza lo eraa=a*3%13~#s%4 .

Modifica 2: in precedenza utilizzavo math.ceilper arrotondare e convertire in numero intero. Ora sto riutilizzando //per arrotondare e aggiungendo ~~per convertire in numero intero.

Modifica 3: radere un personaggio modificando il motivo da "%w+ "a ".- ".


0

K (oK) , 95 78 byte

Soluzione:

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

Provalo online!

Esempio:

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

Spiegazione:

Modulo l'input per ogni moneta, quindi dividi le monete per il risultato.

Alimenta ogni risultato insieme al nome della moneta in una funzione, restituendo il valore di stringa di entrambi se il numero di monete è diverso da zero.

Appiattire tutto e unire con gli spazi bianchi.


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

Abbellire

{
    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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.