Este desafio faz centavos

29

Eu sei, o título racha você


Dada uma quantidade de dinheiro gerada, o menor número de moedas compõe essa quantidade

Exemplos

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 centavos em um dólar.
  • Os valores de cada tipo de moeda são:
    • penny 1 cêntimo
    • nickel 5 centavos
    • dime 10 centavos
    • quarter 25 centavos

Built-ins que trivializam essa tarefa não são permitidos.

I / O

Entrada é um decimal que representa o valor em dólar do total

  • Não há necessidade de pluralizar
  • Ordem: quarter->penny
  • A saída deve ser <#_of_coins> <coin type>
  • Operadores: ,ou ,ou

O único espaço em branco à direita permitido é uma nova linha / espaço à direita.


Se houver zero de um tipo de moeda, esse tipo de moeda não deve ser mostrado . Por exemplo 0.25-> 1 quarter não 1 quarter 0 dime 0 nickel 0 penny

Downgoat
fonte
@VoteToClose não, mas vou permitir vírgulas como um seperaor
Downgoat
O último exemplo é 1.43, que é maior que1
Luis Mendo
@LuisMendo oh opa, a (less than 1)parte não deveria estar lá. Esqueceu-se de remover o na caixa de areia eu acho
Downgoat
Tudo bem se a saída é 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien
11
@DigitalTrauma 13.00pode ser uma entrada possível, mas a entrada nunca será 13. Eu sempre terei um decimal
Downgoat 03/02/16

Respostas:

5

CJam, 60

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

Esse script parece ter muito espaço para melhorias, mas é mais curto do que qualquer outro até agora. Isso faz uso do comando "md" incorporado, que retorna o resultado inteiro de uma divisão e o restante. Faz o seguinte:

  • lê entrada (se fosse uma função, acho que você pode remover q ~ por dois caracteres a menos)
  • multiplica a entrada por 100 e a converte em um número inteiro
  • executa "md" usando [25 10 5], o que resulta nos restantes na pilha
  • combina os nomes dos números e das moedas
  • remove o número e o nome da moeda se o primeiro for 0
  • adiciona zeros antes do número

Experimente aqui

versões 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
fonte
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ática simples.

ETHproductions
fonte
Bom trabalho! I que havia uma solução de Is-fórmula fechada
Conor O'Brien
? Isso não gera o tipo de moeda se houver zero desse tipo de moeda?
Frentos
@Frentos nenhum, há uma Regex no final que remove os tipos de moeda que têm moedas de zero
Downgoat
@ Doᴡɴɢᴏᴀᴛ: Desculpe, não sabia que a área de texto deslocado para a direita, na ausência de pistas visuais :-)
Frentos
Você precisa do |0depois do n%5?
194 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

Apenas por segurança, mudou para algo que definitivamente funciona para corrigir o comentário de @ Ogaday, por enquanto, pelo menos por enquanto. Não tenho certeza se preciso ou não do int()mesmo, mas estou tendo problemas para me convencer de que não preciso .

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

é um byte extra desativado, mas imprime um extra Lpara entradas grandes (embora esse código não funcione para entradas extremamente grandes de qualquer maneira, devido à precisão de flutuação).

Sp3000
fonte
11
Você passou todo o tempo que passei aprimorando minha solução para superar o desperdício de Mego. Bom trabalho!
Alexander Revo
11
+1 - Eu gostaria de saber que mágica você costumava inventara=40/a+5^12
Digital Trauma
@DigitalTrauma Tentei um monte de operadores aritméticos, por exemplo, [x^k for x in [10, 5, 1]]e [k/y for y in [25, 10, 5]]para diferentes k, depois vi que duas listas foram deslocadas por 5. Provavelmente abaixo do ideal, mas não tive tempo para força bruta.
Sp3000 03/02
Na verdade, isso falha (pelo menos para mim) nas entradas de 10.03e 10.04. Tem a ver com a representação dos carros alegóricos do Python e como os arredonda para ints. Tente "print %d"%(10.03*100).
Ogaday
n=int(''.join(raw_input().split(".")))pode funcionar, mas é bem detalhado.
Sherlock9
7

dc, 104

Novas linhas adicionadas para "legibilidade" :

[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
fonte
15
dc: Agora com Readability ™
Alex A.
6

Retina , 97

Obrigado (como sempre) a @randomra - salvou 1 byte.

Assume que a entrada está no formato xxx.yyou xxx.y.

\..$
$&0
\.

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

Experimente online.

Trauma Digital
fonte
11
$&é o mesmo que $0para que você possa salvar um byte em $0.0pelo $&0.
randomra
Inputing algo como 0.9999999, a saída é um pouco louco
Anthony Pham
@PythonMaster eu vou adicionar suporte para que, quando o Fed começa a cunhagem de 10 peças micropenny ;-)
Trauma Digital
4

Vitsy, 110 100 97 bytes

Sim, espere, ainda estou metodizando isso.

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

Explicação no modo detalhado em breve:

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;

Experimente online!

Addison Crump
fonte
2
retrauqquase parece uma palavra ...
Conor O'Brien
O permalink não está funcionando
Downgoat
Corrigido, desculpe. Link de código antigo. : P
Addison Crump
3

Java 8 lambda, 165 bytes

Espera entrada ycomo dupla ou flutuante.

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

Muito ternário. ; -;

Addison Crump
fonte
;-;O que é isso? Isso é um wampa?
21316 copo
@beaker Chorando.
Addison Crump #
2

JavaScript ES6, 202 200 bytes

Espero que isso possa ser jogado golfe ...

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 não destruído:

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

LabVIEW, 62 Primitivas do LabVIEW

Criei 2 matrizes para os nomes e valores e passe por eles de cima (matriz de índice com i) usando um operador de módulo (a coisa R IQ). As moedas restantes são passadas para o registro de turno.

Se o valor for maior que 0, converto o número em string e concatenar a string transmitida, o número e o nome da moeda e colocá-lo novamente no registrador de deslocamento.

Eu percebi que meu gif não mostra o caso falso, mas não há nada para ver, apenas passa pela string que entrou.

Eumel
fonte
Como os "primitivos" se comparam aos bytes? "X primitivos" superam "y bytes" quando x <y? Apenas perguntando
Luis Mendo
Você pode verificar o link para ver como as primitivas são contadas. Dar tamanho do código do labview em byte seria meio inútil, pois um vi vazio já tem ~ 10kb de tamanho. Por experiência, existem alguns mais primitivos que bytes em uma linguagem de golfe, portanto, isso seria de cerca de 50 a 60 bytes no CJam ou similar.
Eumel
11
@LuisMendo Não podemos limitar o conteúdo de informações de um arquivo do LabView acima em um byte por primitivo; portanto, seria injusto contar o LabView em um byte por primitivo.
lirtosiast
@ThomasKwa TBH com uma linguagem de golfe bem feita provavelmente poderiam, cada operação de um byte um byte por fio para cada entrada loops são 2-4 bytes para por e passa o tempo são primitivas 3 e assim por diante
Eumel
2

Japonês, 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

Felizmente, todos os quatro nomes de moedas são compactáveis. O ¿deve ser o byte literal 0x81. Teste online!

ETHproductions
fonte
Apenas tentei com algumas entradas aleatórias, é um centavo fora em 18.33: 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18,32 em vez de 18,33.
Strout 4/16/16
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]);}

Sem jogar com testes:

#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
fonte
11
Talvez tente substituir char*[]por char**, int a[]por int*ae colocar m%=a[i++]a última parte do loop for. Deve salvar 4 bytes. Ainda não testei, então tente cada um deles.
takra
@ minerguy31 Eu não seria capaz de usar inicializadores de lista se eu usar ponteiros em vez de matrizes. Movido o m%=a[i++]pouco, porém, obrigado.
Alexander Revo
11
Além disso, você poderá substituir if(m/a[i])por m/a[i]&&para salvar mais 2 bytes.
takra
Tente também usar "quarter\0dime\0nickel\0penny"no printf. Cada \ 0 termina a string, economizando 1 caractere cada
takra
@ minerguy31 usando string com \0causa falha no programa. Eu não tenho certeza de como a iteração deve funcionar sobre essa string de qualquer maneira.
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

Experimente no MATL Online!

Luis Mendo
fonte
Eu realmente preciso para incluir compre corda em MATL
Luis Mendo
1

JavaScript, 156 145 144 bytes

Não corresponde à resposta da fórmula da ETHproduction, mas de qualquer maneira ...

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 é uma das minhas primeiras partidas de golfe, então qualquer melhoria é muito apreciada! Eu já roubei o "xor trunc" da ETH - desculpe cara, foi muito inteligente :-)

Mais legível:

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 o teste, percebi que o JavaScript (pelo menos na minha máquina?) Se divide 1.13 / 0.01em 1.12999..., fazendo com que meus (e provavelmente todos os outros envios de JS) não funcionem 100% corretamente ...

Christallkeks
fonte
Eu não acho que você precise do último ponto e vírgula.
Downgoat 3/02/16
0

Perl 5 - 128 124 bytes

Eu acho que isso pode ser reescrito para ser muito mais curto, mas eu realmente não consigo vê-lo.

$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

Edição: Apenas um truque de matemática para salvar 4 caracteres.

ChatterOne
fonte
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
fonte
0

Python 2, 167 161 bytes

Atualização 1: Roubei a ideia do Sp3000 de usar input () e tornar meu código um script em vez de uma função.

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

C, 162 bytes

Infelizmente, não funciona sem o #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
fonte
0

Lua 5.3, 141 139 132 131 131 bytes

Mais ou menos com base na resposta Python do Sp3000, mas com minha própria 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 - melhorou a afórmula. Anteriormente era a=a*3%13~#s%4.

Editar 2 - anteriormente eu estava usando math.ceilpara arredondar e converter para número inteiro. Agora estou reutilizando //para arredondar e adicionando ~~para converter em número inteiro.

Editar 3 - raspou um personagem alterando o padrão de "%w+ "para ".- ".

tehtmi
fonte
0

K (oK) , 95 78 bytes

Solução:

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

Experimente online!

Exemplo:

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

Explicação:

Module a entrada por cada moeda e divida as moedas pelo resultado.

Alimente cada resultado, juntamente com o nome da moeda, em uma função, retornando o valor da sequência de ambos se o número de moedas for diferente de zero.

Achate tudo e junte-se ao espaço em branco.

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

Embelezado

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

Teste

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
fonte