この挑戦はセントを作る


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

スペック

  • 1ドル100セント。
  • 各タイプのコインの値は次のとおりです。
    • penny 1セント
    • nickel 5セント
    • dime 10セント
    • quarter 25セント

このタスクを単純化するビルトインは許可されていません。

I / O

入力は、合計のドル値を表す小数です

  • 複数化する必要はありません
  • 注文:quarter->penny
  • 出力は <#_of_coins> <coin type>
  • Seperators:,または,または

許可される唯一の末尾の空白は、末尾の改行/スペースです。


コインタイプがゼロの場合、そのコインタイプは表示されません。例0.25-> 1 quarter なし 1 quarter 0 dime 0 nickel 0 penny


ノー@VoteToClose、私はseperaorとしてコンマを許可します
Downgoat

最後の例は1.43、より大きい1
ルイスメンドー

@LuisMendoおっと、(less than 1)そこにいるべきではない 私が推測するサンドボックス内のそれを削除するのを忘れた
-Downgoat

出力が大丈夫2 quarter(2 spaces)1 nickel 1 pennyですか?
コナーオブライエン

1
@DigitalTrauma 13.00は入力可能な場合がありますが、入力は決してありません13。私は常に小数を持ちます
-Downgoat

回答:


5

CJam、60

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

このスクリプトには多くの改善の余地があるようですが、これはこれまでよりも短いです。これは、組み込みの「md」コマンドを使用して、除算の整数結果と剰余の両方を返します。次のことを行います。

  • 入力を読み取ります(関数の場合、2文字少ないためq〜を削除できると思います)
  • 入力を100倍し、整数に変換します
  • [25 10 5]を使用して「md」を実行し、スタック上の残りを生成
  • 数字とコイン名を組み合わせます
  • 前者が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,"")

簡単な数学。


良くやった!閉式のような解決策があると思った
コナーオブライエン

?そのコインタイプがゼロの場合、これはコインタイプを出力しませんか?
-Frentos

@Frentosいいえ、最後に正規表現があり、ゼロのコインを持つコインタイプを削除します
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

安全のために、少なくとも今のところ、@ Ogadayのコメントを修正するために確実に機能するものに変更しました。私もそれが必要かどうかはわかりませんが、int()私はそうしないと納得するのに苦労しています。

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

余分なバイトがありますが、L大きな入力に対しては余分に出力します(ただし、このコードは、浮動小数点の精度のため、とにかく極端に大きな入力に対しては機能しません)。


1
Megoの無駄遣いを解決するために私のソリューションを改善するために費やしたすべての時間をあなたはたった今しました。いい仕事だ!
アレクサンドル・レボ

1
+1-あなたがどんな魔法を思いついたのか知​​っていたらよかったa=40/a+5^12
デジタルトラウマ

@DigitalTraumaさまざまな算術演算子を試してみました。たとえば[x^k for x in [10, 5, 1]][k/y for y in [25, 10, 5]]異なるkに対して、2つのリストが5で相殺されていることがわかりました。
Sp3000

これは実際の入力に(少なくとも私にとっては)失敗した10.0310.04。Pythonのfloatの表現と、それらをintに丸める方法に関係しています。試してみてください"print %d"%(10.03*100)
-Ogaday

n=int(''.join(raw_input().split(".")))動作するかもしれませんが、かなり冗長です。
Sherlock9

7

dc、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:Readability™が追加されました
アレックスA.

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マイクロペニーのピースの鋳造を開始するときに、そのサポートを追加します;-)
デジタルトラウマ

4

Vitsy、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ほとんど言葉のように思えます...
コナーオブライエン

パーマリンクが機能しない
-Downgoat

修正、申し訳ありません。古いコードリンク。:P
アディソンクランプ

3

Java 8ラムダ、165バイト

入力yをdoubleまたは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":"");}

そんなに三元。;-;


;-;それは何ですか?それはワンパですか?
ビーカー

@beaker Crying。
アディソンクランプ

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つの配列を作成し、モジュロ演算子(R IQのこと)を使用して上から(iのインデックス配列)を調べます。残りのコインはシフトレジスタに渡されます。

値が0より大きい場合、数値を文字列に変換し、渡された文字列に数値とコインの名前を連結し、シフトレジスタに戻します。

Ijusは、私のgifが誤ったケースを示していないことを理解しましたが、とにかく見るものは何もなく、入ってくる文字列を通過するだけです。


「プリミティブ」とバイトの比較 x <yの場合、「xプリミティブ」は「yバイト」に勝ちますか?ちょうど質問
ルイスメンドー

リンクをチェックして、プリミティブのカウント方法を確認できます。labviewコードのサイズをバイト単位で指定しても、空のviはすでに最大で10 kbなので、まったく役に立たないでしょう。経験上、ゴルフ言語のバイトよりもいくつかのプリミティブが多いため、CJamなどでは約50〜60バイトになります。
ユーメル

1
@LuisMendo上記のLabViewファイルの情報コンテンツをプリミティブごとに1バイトでバインドすることはできないため、LabViewをプリミティブごとに1バイトでカウントするのは不公平です。
リルトシアスト

@ThomasKwa tbhおそらくできたよくできたゴルフ言語で、各入力ループのワイヤごとに1バイト1バイトの各操作はforとwhileは3プリミティブなどの2〜4バイトです
-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

ありがたいことに、4つのコイン名はすべて圧縮可能です。¿リテラルバイト0x81とする必要があります。オンラインでテストしてください!


いくつかのランダムな入力で試してみました。18.33で1セント割引です:73 quarter 1 nickel 2 penny。73 * .25 + 1 * .05 + 2 * .01 = 18.33ではなく18.32。
D.ストラウト

2

C、147の 144 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*[]てみて、forループの最後の部分に入れてください。4バイトを節約する必要があります。まだテストしていないので、それぞれを試してください。char**int a[]int*am%=a[i++]
タクラ

@ minerguy31配列の代わりにポインターを使用すると、リスト初期化子を使用できません。m%=a[i++]しかし、少し移動しました、ありがとう。
アレクサンダー・レボ

1
また、で置換if(m/a[i])m/a[i]&&て、さらに2バイトを節約できる場合があります。
タクラ

また"quarter\0dime\0nickel\0penny"、printfで使用してみてください。各\ 0は文字列を終了し、各1文字を節約します
-takra

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

これは私の最初のゴルフラウンドの1つであるため、改善があれば大歓迎です!私はすでにETHの「xor trunc」を盗みました-申し訳ありませんが、それはあまりにもスマートでした:-)

より読みやすい:

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


最後のセミコロンは必要ないと思います。
ダウンゴート

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

編集: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

Python 2、167 161バイト

更新1: input()を使用して、コードを関数ではなくスクリプトにするというSp3000のアイデアを盗みました。

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

LUA 5.3、141の 139 132 131バイト

Sp3000のPythonの答えに基づいた並べ替えですが、独自の魔法の式を使用しています。

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

編集2-以前はmath.ceil丸めて整数に変換するために使用していました。今、私は整数に変換するため//に丸めて追加~~するために再利用しています。

編集3-パターンをから"%w+ "に変更してキャラクターを剃った".- "


0

K(oK)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

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

TIO

TryItOnline

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.