Цей виклик робить центи


29

Я знаю, заголовок тріщить тебе


З огляду на кількість грошових коштів, найменша кількість монет становить цю суму

Приклади

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

Спец

  • 100 центів у доларі.
  • Значення кожного виду монети:
    • penny 1 цент
    • nickel 5 центів
    • dime 10 центів
    • quarter 25 центів

Вбудовані модулі, які реалізують це завдання, заборонені.

I / O

Вхід - це десяткова частина, що представляє значення долара від загальної суми

  • Не потрібно плюралізувати
  • Порядок: quarter->penny
  • Вихід повинен бути <#_of_coins> <coin type>
  • Сепаратори: ,або ,або

Єдине дозволене пробіли, що пропускається, - це єдиний кінцевий рядок / пробіл.


Якщо тип монети є нульовим, цей тип монети не повинен відображатися . Наприклад 0.25-> 1 quarter ні 1 quarter 0 dime 0 nickel 0 penny


@VoteToClose немає, але я дозволю комами як сеператор
Downgoat

Останній приклад - 1.43це більше, ніж1
Луїс Мендо

@LuisMendo о, ой, (less than 1)частина не повинна була бути там. Забув прибрати це в пісочниці, мабуть
Пуховик

Чи добре, якщо вихід 2 quarter(2 spaces)1 nickel 1 penny?
Conor O'Brien

1
@DigitalTrauma 13.00може бути можливим входом, але вхід ніколи не буде 13. У мене завжди буде десятковий
знак

Відповіді:


5

CJam, 60

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

Цей сценарій, здається, має багато можливостей для вдосконалення, але це коротше, ніж будь-який до цих пір. Для цього використовується вбудована команда "md", яка повертає як цілий результат ділення, так і залишок. Він робить наступне:

  • читає вхідні дані (якщо б це була функція, я думаю, ви можете видалити q ~ на два менших символи)
  • помножує вхід на 100 і перетворює його на ціле число
  • виконує "md", використовуючи [25 10 5], що призводить до залишків на стеку
  • поєднує цифри та назви монет
  • видаляє номер і ім’я монети, якщо перша - 0
  • додає нульові позначення попереднього числа

Спробуйте тут

попередні версії:

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 байт

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

Проста математика.


Хороша робота! Я подумав, що існує рішення закритої формули
Conor O'Brien

? Чи не виводить цей тип монети, якщо у неї є нуль цього типу монети?
Френтос

@Frentos ні, в кінці є Regex, який видаляє типи монет, які мають нульові монети
Downgoat

@ Doᴡɴɢᴏᴀᴛ: вибачте, не зрозумів, що область тексту прокручується право за відсутності візуальних підказок :-)
Frentos

Вам потрібно |0після n%5?
Ніл

11

Python 2, 120 байт

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

Просто для того, щоб бути безпечним, змінилося на щось, що безумовно працює, щоб виправити коментар @ Огадея, принаймні поки що. Я не впевнений, чи потрібно мені це чи ні int(), але у мене виникають труднощі переконати себе, що я цього не роблю.

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

є додатковим байтом, але друкує додатковий Lдля великих входів (хоча цей код все одно не працює для надзвичайно великих входів через точність плавання).


1
Ви просто зробили весь час, коли я витрачав на вдосконалення свого рішення, щоб перевершити Мего на відмову. Хороша робота, хоча!
Олександр Рево

1
+1 - Я хотів би, щоб я знав, яку магію ви придумалиa=40/a+5^12
Digital Trauma

@DigitalTrauma Пробував купу арифметичних операторів, наприклад , [x^k for x in [10, 5, 1]]і [k/y for y in [25, 10, 5]]для різних k, то побачив , що два списки були компенсовані 5. Ймовірно Субоптимальне, але у мене не було часу для грубої сили.
Sp3000

Це насправді не вдається (для мене щонайменше) на входах 10.03та 10.04. Це пов'язано з поданням плавців Python та способом їх округлення до ints. Спробуйте "print %d"%(10.03*100).
Огадай

n=int(''.join(raw_input().split(".")))може спрацювати, але це досить багатослівно.
Шерлок9,

7

постійний струм, 104

Нові рядки додано для "читабельності" :

[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: Тепер із Readadability ™
Алекс А.

6

Сітківка , 97

Дякуємо (як завжди) @randomra - збережено 1 байт.

Припускає, що введення або у формі, xxx.yyабо xxx.y.

\..$
$&0
\.

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

Спробуйте в Інтернеті.


1
$&це те ж саме, $0так що ви можете зберегти байти в $0.0шляху $&0.
randomra

Вводячи щось на зразок 0,9999999, вихід трохи шалений
Ентоні Фам

@PythonMaster Я додам підтримку для цього, коли ФРС почне викарбувати 10 мікроелектронних штук ;-)
Digital Trauma

4

Віци, 110 100 97 байт

Так, тримай, я все ще це методикую.

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

Пояснення у скоромовному багатослівному режимі:

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;

Спробуйте в Інтернеті!


2
retrauqмайже здається словом ...
Conor O'Brien

Постійне посилання не працює
Downgoat

Виправлено, вибачте. Старе посилання на код. : P
Addison Crump

3

Java 8 лямбда, 165 байт

Очікує введення yяк подвійного, так і плаваючого.

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

Стільки потрійних. ; -;


;-;Що це? Це вампа?
стаканчик

@beaker Плач.
Аддісон Кримп

2

JavaScript ES6, 202 200 байт

Я сподіваюся, що це може бути гольф ...

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

Невикористаний код:

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

Я створив 2 масиви для імен та значень та пройдіть їх зверху (масив індексу з i) за допомогою оператора модуля (річ R IQ). Решта монет передаються в регістр змін.

Якщо значення більше 0, я перетворять число в рядок і з'єднують передану рядок вниз числом і назвою монети і повертають її назад в регістр зсуву.

Ijus зрозумів, що мій gif не показує помилковий випадок, але все одно нічого дивитись, він просто проходить через рядок, який увійшов.


Як "примітиви" порівнюються з байтами? Чи "x примітиви" б'ють "y байтів", коли x <y? Просто запитую
Луїс Мендо

Ви можете перевірити посилання, щоб побачити, як рахуються примітиви. Надання розміру коду labview у байті було б якось марним, оскільки порожній vi вже становить ~ 10 кб. За досвідом є декілька примітивів, ніж байти мовою для гольфу, так що це буде приблизно 50-60 байт у CJam тощо.
Евмель

1
@LuisMendo Ми не можемо обмежувати інформаційний вміст файлу LabView вище одним байтом на примітив, тому було б несправедливо рахувати LabView в одному байті на примітив.
lirtosiast

@ThomasKwa tbh з добре зробленою мовою для гри в гольф ви, мабуть, могли б, кожна операція 1 байт 1 байт на провід для кожної вхідної петлі становить 2-4 байти для, а віли - 3 примітиви і так далі
Eumel

2

Japt, 77 байт

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

На щастя, всі чотири назви монет стисливі. ¿Повинен бути буквальним байт 0x81. Перевірте це в Інтернеті!


Просто спробував з деякими випадковими входами, це один цент геть на 18.33: 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18.32 замість 18.33.
D. Strout

2

C, 147 144 142 142 140 байт

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

Невикористані тестами:

#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
Можливо, спробуйте замінити char*[]на char**, int a[]з int*a, і поставити m%=a[i++]в останню частину циклу for. Слід зберегти 4 байти. Ще не тестували, тому просто спробуйте кожен із них.
такра

@ minerguy31 Я не зможу використовувати ініціалізатори списку, якщо я використовую покажчики замість масивів. m%=a[i++]Хоча трохи перемістили , спасибі.
Олександр Рево

1
Крім того , ви можете бути в змозі замінити if(m/a[i])з , m/a[i]&&щоб зберегти більше 2 байта.
такра

Також спробуйте використовувати "quarter\0dime\0nickel\0penny"в printf. Кожен \ 0 закінчує рядок, зберігаючи по 1
знаку

@ minerguy31, використовуючи рядок, \0викликає збій програми. Я не впевнений, як ітерація все-таки повинна працювати над такою стрічкою.
Олександр Рево


1

JavaScript, 156 145 144 байт

Не відповідає відповіді формули ETHproduction, але все одно ...

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}

Це один з моїх перших раундів гольфів, тому будь-які поліпшення високо оцінені! Я вже вкрав "Xor trunc" ETH - вибачте, це було занадто розумно :-)

Більше читати:

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
}

Примітка: Під час тестування я зрозумів , що JavaScript (? По крайней мере , на моїй машині) ділить 1.13 / 0.01на 1.12999..., що робить мої (і , ймовірно , всі інші JS подання) не працює на 100% правильно ...


Я не думаю, що тобі потрібен останній крапку з комою.
Пуховик

0

Perl 5 - 128 124 байт

Я думаю, що це може бути переписано набагато коротше, але я справді не можу його бачити.

$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: Просто математичний трюк, щоб зберегти 4 символи.


0

Perl 6 , 96 байт

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

Використання:

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

Пітон 2, 167 161 байт

Оновлення 1: Викрав ідею Sp3000 використовувати input () та зробити свій код сценарієм замість функції.

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 байти

На жаль, без цього не працює #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;}

Безумовно

#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

Луа 5,3, 141 139 132 131 байт

Сортований на основі відповіді Python Sp3000, але за моєю власною магічною формулою.

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

Редагувати - вдосконалено aформулу. Раніше це булоa=a*3%13~#s%4 .

Edit 2 - раніше я використовував math.ceilдля округлення та перетворення на ціле число. Тепер я відмовляюся //від округлення та додавання~~ для перетворення в ціле число.

Редагувати 3 - поголений персонаж, змінивши візерунок з "%w+ "на ".- ".


0

К (оК) , 95 78 байт

Рішення:

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

Спробуйте в Інтернеті!

Приклад:

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

Пояснення:

Модулюйте вхід кожною монетою, а потім поділіть монети за результатом.

Введіть кожен результат разом з назвою монети у функцію, повертаючи рядкове значення обох, якщо кількість монет не дорівнює нулю.

Згладьте все і з'єднайте разом з пробілом.


0

Котлін , 147 байт

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

Прикрасили

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

Тест

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

ТІО

TryItOnline

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.