それほど多くない数の除算


15

正の整数を取り込みプログラムや関数を書いてabそしてc、およびプリントやリターンa/bcあなたはそのすべてを使用することができます。正の整数に* /%[追加、減算、乗算、除算、モジュレート] - +演算を使用して、小数点以下の桁数ご使用の言語では許可されていますが、浮動小数点数では許可されていません。a、b、cの範囲は、言語の符号なし整数に許可される範囲です。数値の結果は、印刷する最後の桁に切り捨てられます(そのためno round)。

これは、言語に整数型(フロートのみ)がない場合、これらの浮動小数点数を正の整数としてのみ使用して参加できることを意味します。この演習の手掛かりは、[符号なし]整数の演算+-* /%のみを使用して、浮動小数点除算の桁を見つける関数を作成することです。

  • print(1,2,1) 印刷します 0.5
  • print(1,2,2) 印刷します 0.50
  • print(13,7,27) 印刷します 1.857142857142857142857142857
  • print(2,3,1) 印刷します 0.6
  • print(4,5,7) 印刷します 0.8000000
  • print(4,5,1) 印刷します 0.8
  • print(9999,23,1) 印刷します 434.7
  • print(12345613,2321,89) 言語に32ビットの符号なしが含まれている場合に印刷されます 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

バイト単位の最短コードが優先されます。これがはっきりしないように見える場合は申し訳ありません...私も言語を知らない、言葉をよく覚えていません... Ideone.comまたは他の場所へのリンクを1つ用意して、特に提案とは異なる入力をテストします。


1
整数a、b、cの範囲は?
トンホスペル

@Ton Hospel a、b、cの範囲は、言語の符号なし整数を許可する範囲です。たとえば、32ビットの符号なしの場合、0..0xFFFFFFFFになりますが、c> = 0xFFFFFFFの場合、出力は大きくなります。少し遅くなります
...-RosLuP

2
これは丸め関数です。または、より正確には、適切に指定するには丸め関数である必要があります。現時点では、正解がどうなるかは不明(1,2,0)です。参照してくださいmeta.codegolf.stackexchange.com/a/5608/194
ピーター・テイラー

1
この質問を再開して申し訳ありません。ピーター・テイラーが指摘した問題を除いて、再開の準備はほぼ整っていると思います。出力foは何(1,2,0)ですか?
ETHproductions

2
は正の整数ではない(1,2,0)ため、実際には無関係0です。そのようなCの遺骨は、私が追加について考える必要がないことを好むと思いますので、場合、私はそれを好む.かどうか
トンHospel

回答:


5

05AB1E17 13 11 19 14バイト

フォームに入力しb, a, cます。Grimyの
おかげで5バイト節約されました

‰`¹+I°*¹÷¦'.sJ

オンラインでお試しください!


私はちょうど入力13,7,27とオンラインでそれを試してみましたが、答えは正しくない
マチュー・J.

@shigazaru:テストケースと同じ結果を返します。入力の順序がわかりましたb,a,cか?
エミグナ

私はこの区分がある「オンラインで試す」ボタンを試してみます:123桁の12345613/2321ですが、結果は5319.0922の代わりに5319.922 ...になります
...-RosLuP

1
15:‰`I°*¹÷I°+¦'.sJ
グリムミー

2
14:‰`¹+I°*¹÷¦'.sJ
グリムミー

4

Haskell、87バイト

(a#b)c|s<-show$div(a*10^c)b,l<-length s-c,(h,t)<-splitAt l s=['0'|l<1]++h++['.'|c>0]++t

使用例:(13#7)27-> "1.857142857142857142857142857"

c==0ケースを処理し、のようなものの代わりに先行ゼロを使用する23バイト.5

仕組み:乗算a10^c除算、b文字列、スプリットに変身.挿入しなければならない、との両方の部分に参加.中-間およびエッジケースを固定します。


4

Perl 6の 58の57 55  48バイト

{(($^a.FatRat/$^b*10**$^c).Int.FatRat/10**$c).base(10,$c)}
{(Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c).base(10,$c)}
{base Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c: 10,$c}
{base ($^a*10**$^c div$^b).FatRat/10**$c: 10,$c}

かなり厄介なのは{($^a.FatRat/$^b).base(10,$^c)}、最も近い値に丸めることが許可されている場合に短縮できることです。

説明:

# bare block lambda with 3 placeholder parameters 「$^a」, 「$^b」 and 「$^c」
{
  (
    (

      # create an Int containing all of the digits we care about
      $^a * 10 ** $^c div $^b

    ).FatRat / 10**$c  # turn it into a Rational

  ).base( 10, $c )     # force it to display 「$c」 digits after the decimal point
}

私はperl6に慣れていません(...).FatRat / 10**$xが、Rationalの部門ではありませんか?整数の除算のみが許可されています。
nimi


数学演算子は整数型でのみ許可され、他の数値型では許可されません。引用:「この演習の手がかり...関数を記述する... ... [符号なし]整数の演算+-* /%のみを使用して」
-nimi

@nimiだから、Rationalの再実装を書いて、追加しなかったdoes Real場合、またはdoes Numeric許可されますか?これらのロールを削除するために既存のクラスを拡張(モンキーパッチ)した場合、それは許可されますか?
ブラッドギルバートb2gills

わからない。前に述べたように、私は仕様を読みました:+-*/%単なる整数型でのみ。内部表現ではなく、機能の面で「プレーン整数」(まず整数の除算)。(名前にもかかわらず)内部表現に整数のみを使用するソフトウェア浮動小数点ライブラリを使用することは許可されていると思いますか?
nimi

3

Perl、55バイト

+3を含む -p

STDINの1行にaとbを、次の行にcを与える

division.pl
1 26
38
^D

division.pl

#!/usr/bin/perl -p
eval'$\.=($_/$&|0)."."x!$\;$_=$_%$&.0;'x(/ .*/+<>)}{

これ$_/$&は少し議論の余地があります。私は実際にそこに整数の除算が必要ですが、perlには特別なモジュールをロードしないとそれはありません。したがって、一時的に非整数である|0ため、すぐに切り捨てます(を使用して)ので、整数除算で得られる整数になります。($_-$_%$&)/$&一時的に整数以外の値を持たないように書き換えることもできます(ただし、内部的にはまだfloatです)


$-intのみに使用できますか?(ミックス/最大には厳密な制限があると思いますが、すでに検討しているはずですが、確認する価値はありますが!)
Dom Hastings

@DomHastings浮動小数点除算を行った後でも、切り捨てられます。Perlは、単純なし整数の除算を持っていないuse integer
トンHospel

ああ、それは単にでマスクされているだけ$-です。ありがとう!
ドムヘイスティングス

3

JavaScript(ES6)、55 50バイト

f=(a,b,c,d=".")=>~c?(a/b|0)+d+f(a%b*10,b,c-1,""):d

(a/b|0)フロート除算を実行しますが、すぐに整数にキャストします。これが許可されていない場合はお知らせください。


3

PHP、187バイト

分子の文字列を処理します。 PHP_INT_MAX

list(,$n,$d,$c)=$argv;$a=str_split($n);while($a){$n.=array_shift($a);if($n>=$d||$r)$n-=$d*$r[]=$n/$d^0;}if(!$r)$r[]=0;if($c)$r[]=".";while($c--){$n*=10;$n-=$d*$r[]=$n/$d^0;}echo join($r);

他にチャンスがないので、13/7は1.8571428571429に短縮され、小数点以下27桁のテストケースに到達しません。

このように、36バイトは許可されていません

<?=bcdiv(($z=$argv)[1],$z[2],$z[3]);

OPによるフロート除算は許可されていません
-Maltysen

@Maltysen申し訳ありませんが、ロールバックを行います。より短い解決策を見つけるのがとても怖かったので、仕様に反することを認識していません。
ヨルクヒュルサーマン

2

Pyth- 21 19 18 16 14バイト

入力フォーマットに目を通すことで、束を節約できます。

j\.c`/*E^TQE]_

テストスイート。(PS 27はオンラインで終了しないため、代わりに10を実行しました)。


@Emignaもそれがためにあるのか0正の整数(OPが有する追加の例を続けるにもかかわらずではないc=0
トンHospel

@TonHospel:ああ、確かに。例を見ていました。その後、回答を短くできます:)
エミグナ

2/21から10の小数など、小数点の後に先頭に0がある数字では機能しません。
エミグナ

10桁の2/21は、ポイントの後に9桁のみを印刷します
-RosLuP

Emignaが言うように、10桁で2/21 ... 0.09の代わりに... 0.9 ...を印刷
...-RosLuP

2

JavaScript(ES6)、 64  62 59バイト

ETHproductionsのおかげで2バイト節約されました。

含まれる除算は常に整数になります。

f=(a,b,n,s)=>~n?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):s

console.log(f(13,7,27))


m完全にスキップしても動作しますか?f=(a,b,n,s)=>n+1?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):s60バイトです。
ETHproductions

@ETHproductions-確かに。ありがとう!
アーナルド

2

Java 7、105バイト

import java.math.*;String c(int...a){return new BigDecimal(a[0]).divide(new BigDecimal(a[1]),a[2],3)+"";}

未ゴルフ&テストコード:

ここで試してみてください。

import java.math.*;
class M{
  static String c(int... a){
    return new BigDecimal(a[0]).divide(new BigDecimal(a[1]), a[2], 3)+"";
  }

  public static void main(String[] a){
    System.out.println(c(1, 2, 1));
    System.out.println(c(1, 2, 2));
    System.out.println(c(13, 7, 27));
    System.out.println(c(2, 3, 1));
    System.out.println(c(4, 5, 7));
    System.out.println(c(4, 5, 0));
    System.out.println(c(9999, 23, 0));
    System.out.println(c(12345613, 2321, 89));
  }
}

出力:

0.5
0.50
1.857142857142857142857142857
0.6
0.8000000
0
434
5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

これは有効ではないと思います。なぜなら、呼び出されdivideていないのに、本質的に浮動小数点除算だから/です。
corvus_192

@ corvus_192後で投稿された別の削除されたJavaの答えには理由がありました。ここにコピーアンドペーストします(この説明のクレジットは@SocraticPhoenixに行きます。これは技術的には浮動小数点ですが、BigIntegerおよびBigDecimalオブジェクトはint数値を格納するために型のみを使用します(これはクールではありませんか?BigIntegerはint[]数字です。たとえば、10の{1,2,5}は125です。 'BigIntegerの数字の実際の
基数はわかりませんが

2

ルビー、67バイト

->(a,b,c){('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/,'\1.\2')}

上記のテストケースを実行する機能にした場合

def print(a,b,c); ('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2'); end
 => :print 
print(1,2,1)   # would print 0.5
 => "0.5" 
print(1,2,2)   # would print 0.50
 => "0.50" 
print(13,7,27) # would print 1.857142857142857142857142857
 => "1.857142857142857142857142857" 
print(2,3,1)   # would print 0.6
 => "0.6" 
print(4,5,7)   # would print 0.8000000
 => "0.8000000" 
print(4,5,1)   # would print 0.8
 => "0.8" 
print(9999,23,1) # would print 434.7
 => "434.7" 
print(12345613,2321,89) # would print if your Language has 32 bit unsigned 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
 => "5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466" 
"('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2')".length
 => 52 

コードゴルフへようこそ!ほとんどの言語では、関数を定義するとき、それをすべて定義する必要があり、そのような事前定義された変数があると仮定することはできません。Rubyでは、ラムダを定義する最も簡単な方法は->a,b,c{...}、楕円をコードで置き換えることです。(変数の実際の割り当てはコンセンサスによって不要です。)
値インク

おかげで、私は他の人がその部分を省いたという間違った印象を受けていました...しかしあなたは正しいです。ちょうど追加しました。
マチューJ.

2

ラケット203バイト

(let*((s(~r(/ a b)#:precision c))(sl(string-split s "."))(s2(list-ref sl 1))(n(string-length s2)))
(if(< n c)(begin(for((i(- c n)))(set! s2(string-append s2 "0")))(string-append(list-ref sl 0)"."s2))s))

ゴルフをしていない:

(define (f a b c)
  (let* ((s (~r(/ a b)#:precision c))
         (sl (string-split s "."))
         (s2 (list-ref sl 1))
         (n (string-length s2)))
    (if (< n c)
        (begin 
          (for ((i (- c n)))
            (set! s2 (string-append s2 "0")))
          (string-append (list-ref sl 0) "." s2))
        s )))

使用法:

(f 7 5 3)
(f 1 2 1) 
(f 1 2 2) 
(f 13 7 27)

出力:

"1.400"
"0.5"
"0.50"
"1.857142857142857142857142857"

その他の方法(ここでは無効な答え):

(real->decimal-string(/ a b)c)

最初の引数として値をreal->decimal-string期待するので、これは無効であるとreal思うので/、浮動小数点除算もこのタスクでは許可されていません。また 、切り捨ての代わりにreal->decimal-stringラウンド((f 1 6 7)-> 0.1666667)。
nimi

観察していただきありがとうございます。コードをすぐに修正します。
rnso

1

q、196バイト

w:{((x 0)div 10;1+x 1)}/[{0<x 0};(a;0)]1;{s:x 0;m:x 2;r:(10*x 1)+$[m<0;{x*10}/[-1*m;a];{x div 10}/[m;a]]mod 10;d:1#.Q.s r div b;($[m=-1;s,".",d;$[s~,:'["0"];d;s,d]];r mod b;m-1)}/[c+w;("";0;w-1)]0

実行するには、最初にa、b、cを設定します。


1

さび、114バイト

fn print(mut a:u32,b:u32,c:u32){let mut p=||{print!("{}",a/b);a=a%b*10};p();if c>0{print!(".")}for _ in 0..c{p()}}

テストコード:

fn main() {
    print(1, 2, 1);    println!(""); // should print 0.5
    print(1, 2, 2);    println!(""); // should print 0.50
    print(13, 7, 27);  println!(""); // should print 1.857142857142857142857142857
    print(2, 3, 1);    println!(""); // should print 0.6
    print(4, 5, 7);    println!(""); // should print 0.8000000
    print(4, 5, 0);    println!(""); // should print 0
    print(9999, 23, 0);println!(""); // should print 434
    print(12345613,2321,89); println!("\n");  // 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
}

1

PHP、89バイト

list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;

intdiv()はphp 7で導入されているため、それが必要です。php 7.1では、list()を[]に変更できるため、4バイト節約できます。

次のように使用します:

php -r "list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;" 1 2 1

replace $o.=intdiv($a=10*($a%$b),$b);with $o.=($a=10*($a%$b))/$b^0;は4バイトを節約します。
ヨルクヒュルサーマン

最初に私はそのアドバイスを取るつもりでした(答えとすべてを編集しました)が、それは浮動小数点除算であり、intへのキャストであると再考したので、長さを10%未満にするために、質問。
user59178

1

C#、126バイト

(a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

テストケースを含む完全なプログラム:

using System;
using System.Numerics;

namespace DivisionOfNotSoLittleNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<BigInteger,BigInteger,int,string>f= (a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

            //test cases:
            Console.WriteLine(f(1,2,1));    //0.5
            Console.WriteLine(f(1,2,2));    //0.50
            Console.WriteLine(f(13,7,27));  //1.857142857142857142857142857
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,7));    //0.8000000
            Console.WriteLine(f(4,5,1));    //0.8
            Console.WriteLine(f(9999,23,1));    //434.7
            Console.WriteLine(f(12345613,2321,89)); //5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,2));    //0.80
        }
    }
}

整数除算が実装されています。BigIntegerデータ型にSystem.Numerics応じて、任意のサイズの数値を使用できます(インポートが必要です)。digit-countパラメータcは2 ^ 31-1に制限されていますが、十分な桁数を超える必要があります。


1

Groovy(78 77 42バイト)

{a,b,n->Eval.me(a+'.0g').divide(b, n, 1)}​

説明

Eval.me(a+'.0g');-整数入力からBigDecimal入力に変換します。groovyでは、BigDecimal表記はGまたはgが付加された二重表記です。コンストラクターを使用することもできましたnew BigDecimal(it)が、これによりバイトが節約されました。
.divide(b, n, 1)-n精度でbで除算し、丸めモードを半分にします。

ここで試してください:https : //groovyconsole.appspot.com/script/5177545091710976


しかし、BigDecimalは浮動小数点演算をサポートしています。これは、誤解しない限り、この演習では禁止されていると思われます。
マチューJ.

1

バッチ、122バイト

@set/as=%1/%2,r=%1%%%2
@set s=%s%.
@for /l %%a in (1,1,%3)do @set/ad=r*10/%2,r=r*10%%%2&call set s=%%s%%%%d%%
@echo %s%

1

Mathematica、50バイト

StringInsert[ToString@Floor[10^# #2/#3],".",-#-1]&

(注文されている3つの引数の名前の関数cab文字列を返し、バイトのどこかに保存すること)。で乗算a/b10^c、最大の整数関数を取り、文字列に変換して適切な位置に小数点を挿入します。残念なことに、関数名は短くありません。


1

Python 3、62バイト

a,b,c=map(int,input().split());print("{:.{1}f}".format(a/b,c))

ここで試してみてください

*注意repl.itは古いバージョンのPython 3を使用します。これは、すべてのフィールドインデックスを指定する必要"{:.{1}f}"があり、"{0:.{1}f}"代わりに意味があり、repl.it63バイトなります

使い方

間にスペースを入れて3つの値をすべて入力します。すなわち、の入力は次1 2 1の結果を与えます0.5

説明

input().split():ユーザー入力を取得し、(スペース)の区切り文字でリストに分割します

a,b,c = map(int,XX):変数をint型のユーザーが指定した値にマップします

"{:.{1}f}".format(a/b,c):文字列をフォーマットして除算結果を表示し、置換{1}cて表示文字列の小数点以下の桁を設定します

print(XX):指定された文字列を出力します


1

Python 3、58バイト

lambda a,b,c:(lambda s:s[:-c]+"."+s[-c:])(str(a*10**c//b))

オンラインでお試しください!

これは、指定された小数点以下の桁数まで正確です a * 10 ** c大きすぎないです。

Python 2を試してtoを短くしstr(...)ました`...`が、Python 2がL大きすぎる場合は末尾に挿入するため、チェックするのに必要以上のバイトが必要になります。


1

スタックス、13 バイト

ä·oαì█↕▬AS¥é▼

実行してデバッグする

引数はc a b順番に受け入れられます。


代わりに9.092201etcの5319.092201etc:問題は、あなたの結果が最後の場合、「4.7」と同じと思われる一方で、「印刷(9999,23,1)が」ポスト内の結果の印刷は「434.7」である場合である
RosLuP

私は同意しない...私は「プリント(9999,23,1)」の場合のために、今朝あなたのリンクと結果をたどっあなたの関数の順序は4.7としませ434.7だった
RosLuP

@RosLuP:アプローチを変更しました。結果は正しく `434.7`になりました。また、プロセスで1バイトずつサイズを縮小しました。
再帰的

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