Este desafío hace centavos

29

Lo sé, el título te hace reír


Dada una cantidad de salida de dinero, la menor cantidad de monedas constituye esa cantidad

Ejemplos

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

Especulación

  • 100 centavos en un dólar.
  • Los valores de cada tipo de moneda son:
    • penny 1 centavo
    • nickel 5 centavos
    • dime 10 centavos
    • quarter 25 centavos

No se permiten los elementos integrados que trivializan esta tarea.

I / O

La entrada es un decimal que representa el valor en dólares del total

  • No hay necesidad de pluralizar
  • Orden: quarter->penny
  • La salida debe ser <#_of_coins> <coin type>
  • Separadores: ,o ,o

El único espacio en blanco final permitido es una nueva línea / espacio final.


Si hay cero de un tipo de moneda, ese tipo de moneda no debe mostrarse . Ej. 0.25-> 1 quarter no 1 quarter 0 dime 0 nickel 0 penny

Downgoat
fuente
@VoteToClose no, pero permitiré comas como separador
Downgoat
El último ejemplo es 1.43, que es mayor que1
Luis Mendo
@LuisMendo oh, vaya, la (less than 1)parte no debería haber estado allí. Olvidé eliminar eso en el sandbox, supongo
Downgoat
¿Está bien si la salida es 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien
1
@DigitalTrauma 13.00puede ser una entrada posible, pero la entrada nunca lo será 13. Siempre tendré un decimal
Downgoat

Respuestas:

5

CJam, 60

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

Este script parece tener mucho margen de mejora, pero hasta ahora es más corto que ninguno. Esto hace uso del comando "md" integrado que devuelve el resultado entero de una división y el resto. Hace lo siguiente:

  • lee la entrada (si fuera una función, supongo que puede eliminar q ~ por dos caracteres menos)
  • multiplica la entrada por 100 y la convierte en un entero
  • realiza "md" usando [25 10 5] que da como resultado los restos en la pila
  • combina los números y los nombres de monedas
  • elimina el número y el nombre de la moneda si el primero es 0
  • agrega ceros de pre-número

Pruébalo aquí

versiones anteriores:

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

Matemáticas simples

ETHproducciones
fuente
¡Buen trabajo! Pensé que había una solución ish de fórmula cerrada
Conor O'Brien
? ¿No genera esto el tipo de moneda si hay cero de ese tipo de moneda?
Frentos
@Frentos no, hay una expresión regular al final que elimina los tipos de monedas que tienen cero monedas
Downgoat
@ Doᴡɴɢᴏᴀᴛ: lo siento, no me di cuenta de que el área de texto se desplazó hacia la derecha en ausencia de pistas visuales :-)
Frentos
¿Necesitas el |0después del 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

Solo para estar seguro, se cambió a algo que definitivamente funciona para arreglar el comentario de @ Ogaday, al menos por ahora. No estoy seguro de si necesito o no int()también, pero tengo problemas para convencerme de que no.

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

es un byte extra desactivado, pero imprime un extra Lpara entradas grandes (aunque este código no funciona para entradas extremadamente grandes de todos modos, debido a la precisión flotante).

Sp3000
fuente
1
Acabas de dedicar todo el tiempo que pasé a mejorar mi solución para superar el desperdicio de Mego. Buen trabajo sin embargo!
Alexander Revo
1
+1 - Desearía saber qué magia solías inventara=40/a+5^12
Trauma digital
@DigitalTrauma Probé un montón de operadores aritméticos, por ejemplo, [x^k for x in [10, 5, 1]]y [k/y for y in [25, 10, 5]]para diferentes k, luego vi que dos listas estaban compensadas por 5. Probablemente subóptima, pero no he tenido tiempo de fuerza bruta.
Sp3000
Esto realmente falla (al menos para mí) en las entradas de 10.03y 10.04. Tiene que ver con la representación de flotadores de Python y cómo los redondea a ints. Tratar "print %d"%(10.03*100).
Ogaday
n=int(''.join(raw_input().split(".")))puede funcionar, pero es bastante detallado.
Sherlock9
7

dc, 104

Nuevas líneas agregadas para "legibilidad" :

[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
Trauma digital
fuente
15
dc: Ahora con Readability ™
Alex A.
6

Retina , 97

Gracias (como siempre) a @randomra: guardado 1 byte.

Asume que la entrada está en forma xxx.yyo xxx.y.

\..$
$&0
\.

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

Pruébalo en línea.

Trauma digital
fuente
1
$&es lo mismo que $0lo que puede ahorrar un byte en $0.0por $&0.
randomra
Al ingresar algo como 0.9999999, la salida es un poco loca
Anthony Pham
@PythonMaster Agregaré soporte para eso cuando la Fed comience a acuñar 10 piezas de micropenny ;-)
Digital Trauma
4

Vitsy, 110 100 97 bytes

Sí, espera, todavía estoy procesando esto.

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

Explicación en el modo detallado que vendrá pronto:

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;

Pruébalo en línea!

Addison Crump
fuente
2
retrauqcasi parece una palabra ...
Conor O'Brien
El
enlace
Solucionado, lo siento. Viejo código de enlace. : P
Addison Crump
3

Java 8 lambda, 165 bytes

Espera entrada ycomo doble o flotante.

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

Demasiado ternario. ; -;

Addison Crump
fuente
;-;¿Que es eso? ¿Es eso un wampa?
vaso de precipitados
@beaker llorando.
Addison Crump
2

JavaScript ES6, 202 200 bytes

Espero que esto se pueda jugar al 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," ")')

Código sin golf:

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

LabVIEW, 62 primitivas de LabVIEW

Creé 2 matrices para los nombres y valores y los revisé desde la parte superior (matriz de índice con i) usando un operador de módulo (lo de R IQ). Las monedas restantes se pasan al registro de desplazamiento.

Si el valor es mayor que 0, convierto el número en cadena y concatena la cadena transmitida con el número y el nombre de la moneda y lo vuelvo a colocar en el registro de desplazamiento.

Ijus se dio cuenta de que mi gif no muestra el caso falso, pero de todos modos no hay nada que ver, solo pasa a través de la cadena que entró.

Eumel
fuente
¿Cómo se comparan las "primitivas" con los bytes? ¿Las "primitivas x" superan a "y bytes" cuando x <y? Solo preguntaba
Luis Mendo
Puede consultar el enlace para ver cómo se cuentan las primitivas. Dar el tamaño del código de vista de laboratorio en byte sería un poco inútil, ya que un vi vacío ya es ~ 10kb grande. Según la experiencia, hay algunas primitivas más que bytes en un lenguaje de golf, por lo que serían alrededor de 50-60 bytes en CJam o similares.
Eumel
1
@LuisMendo No podemos vincular el contenido de información de un archivo LabView anterior por un byte por primitivo, por lo que sería injusto contar LabView en un byte por primitivo.
lirtosiast
@ThomasKwa tbh con un lenguaje de golf bien hecho que probablemente podría, cada operación 1 byte 1 byte por cable para cada bucle de entrada son 2-4 bytes para y mientras 3 primitivas y así sucesivamente
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

Afortunadamente, los cuatro nombres de monedas son compresibles. El ¿debería ser el byte literal 0x81. ¡Pruébelo en línea!

ETHproducciones
fuente
Sólo probamos con algunas entradas al azar, es un centavo fuera de 18.33: 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18.32 en lugar de 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]);}

Sin golfista con las pruebas:

#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
fuente
1
Tal vez intente reemplazar char*[]con char**, int a[]con int*ay ponga el m%=a[i++]en la última parte del ciclo for. Debería guardar 4 bytes. Todavía no lo he probado, así que prueba con cada uno de ellos.
takra
@ minerguy31 No podría usar inicializadores de lista si uso punteros en lugar de matrices. m%=a[i++]Aunque se movió un poco, gracias.
Alexander Revo
1
Además, puede reemplazar if(m/a[i])con m/a[i]&&para guardar 2 bytes más.
takra
También intente usar "quarter\0dime\0nickel\0penny"en el printf. Cada \ 0 termina la cadena, ahorrando 1 char cada uno
takra
@ minerguy31 usando una cadena con \0hace que el programa se bloquee. No estoy seguro de cómo se supone que la iteración funcione sobre dicha cadena de todos modos.
Alexander Revo
2

MAT , 82 106 107

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

¡Pruébalo en MATL Online!

Luis Mendo
fuente
Realmente necesito incluir compresión de cadena en MATL
Luis Mendo
1

JavaScript, 156 145 144 bytes

No coincide con la respuesta de fórmula de ETHproduction, pero de todos modos ...

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}

Esta es una de mis primeras rondas de golf, por lo que cualquier mejora es muy apreciada. Ya robé el "xor trunc" de ETH, lo siento, era demasiado inteligente :-)

Más legible:

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: Mientras se probaba me di cuenta de que las divisiones JavaScript (? Al menos en mi máquina) 1.13 / 0.01a 1.12999..., haciendo que mis (y probablemente todas las otras presentaciones JS) no funcionen correctamente 100% ...

Christallkeks
fuente
No creo que necesites el último punto y coma.
Downgoat
0

Perl 5 - 128 124 bytes

Supongo que esto puede reescribirse para ser mucho más corto, pero realmente no puedo verlo.

$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

EDITAR: solo un truco matemático para guardar 4 caracteres.

ChatterOne
fuente
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
>

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
Brad Gilbert b2gills
fuente
0

Python 2, 167161 bytes

Actualización 1: Robé la idea de Sp3000 de usar input () y convertir mi código en un script en lugar de una función.

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

C, 162 bytes

Lamentablemente, no funciona sin el #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;}

Sin golf

#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
fuente
0

Lua 5.3, 141 139 132 131 bytes

Más o menos basado en la respuesta Python de Sp3000, pero con mi propia fórmula mágica.

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

Editar: mejoró la afórmula. Anteriormente lo era a=a*3%13~#s%4.

Edición 2: anteriormente estaba usando math.ceilpara redondear y convertir a entero. Ahora estoy reutilizando //para redondear y agregando~~ para convertir a entero.

Editar 3: afeita un personaje cambiando el patrón de "%w+ "a ".- ".

tehtmi
fuente
0

K (oK) , 95 78 bytes

Solución:

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

Pruébalo en línea!

Ejemplo:

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

Explicación:

Module la entrada por cada moneda, luego divida las monedas por el resultado.

Alimente cada resultado junto con el nombre de la moneda en una función, devolviendo el valor de cadena de ambos si el número de monedas no es cero.

Aplane todo y únase con espacios en blanco.

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

Embellecido

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

Prueba

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
fuente