小数を取得します!


23

仕事:

あなたの仕事は、3つの入力が与えられたときです:

  • 分子 n
  • 分母 d
  • 別の整数、 x

x小数点以下の数値のth桁を見つけるプログラム/関数を作成します。

仕様:

  • nand の範囲は、dとの間に1あり2^31 - 1ます。
  • 範囲は、x間にある110,000,000、包括的。
    • に1ベースのインデックス付けを使用するか、0ベースのインデックス付けを使用するかを選択できますx。どちらを使用しているのか答えてください。
  • nはより大きい場合がありdます。
  • ndおよびx正の整数であることが保証されている(の1ベースのインデックスのバージョンのxためにあなたが使用することを選択した場合は、インデックスを0ベースx、その後x可能0)。
  • 合理的な方法で入力を行うことができます(つまり、標準的な抜け穴ではない任意の方法)。

ルール:

  • x丸められたときではなく、正確なth桁を返す必要があります。たとえば、の15th桁は1/6ではなく7、です6
  • あなたのx言語が1000万桁までの小数をサポートしていない場合を除き、プログラムは1000万未満すべてで動作する必要があります。

I / Oの例:

入力例では0から始まるインデックスを使用x0てい9,999,999ます。つまり、からになります。それに加えて、「入力」は、数字を区切るスペースを含む文字列として書き込まれます。

1 2 3: 0
5 6 0: 8
5 6 1: 3
1 6 15: 6 (not 7, as it's not rounded)
1 11 2: 0
1 10000 9999999: 0
11 7 1: 7

2
この課題は、のサブセットで、この1
Bassdrop Cumberwubwubwub

8
私はまた、すべての合理的な数については、この1つの会談として、その1つの会談1についての具体的な無理数として、パイ1のサブセットであるとは思わない
フェリペ・ナルディバティスタ


1
@FelipeNardiBatistaうーん...これは反対の方法であると私は主張するかもしれません。このチャレンジは範囲やものでより詳細に指定されているからです(これは以前のチャレンジが新しいチャレンジのだましとしてマークされている場所で発生しました)。しかし、よくわかりません。
-clismique

2
bignumを持たない言語でも簡単に演習を行うことができます
...-RosLuP

回答:


12

Python 2、25バイト

Pythonはデフォルトでbignumもサポートしているため、Haskellの回答のポート。そこにxあるように、1-indexedです。

lambda n,d,x:n*10**x/d%10

オンラインでお試しください!(Kererthana Prabhakaranのラッパーを借りています。)


とても素敵で、「本当に簡単だったのだろうか」と思って数分費やしました。Rubyへのポートはわずか21バイトです。
GB

6

Mathematica 33バイト

RealDigits[#/#2,10,1,-#3][[1,1]]&

1ベースのインデックス。

例えば、小数点の右側のPiの1000万桁:

%[Pi,1,10^7]
7

古いマシンでは約2秒かかります。

WolframAlphaでオンラインで試すことができ ます(等号をクリックします)



5

PHP> = 7.1、40バイト

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

bcdiv

オンライン版


コードを実行すると、このエラーが発生します<br /> <b>Notice</b>: Uninitialized string offset: -1 in <b>[...][...]</b> on line <b>6</b><br />
。– clismique

Qwerp-DERP @申し訳ありませんが、あなたは、PHPバージョン7.1 GTEを必要とするサイトは、それが最初の訪問であるhiggestバージョンに変更されません
イェルクHülsermann

4

ゼリー、7バイト

⁵*×:ƓDṪ

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

関数の送信(ただし、完全なプログラムとしても機能します)。Jelly関数は、2つの引数のみを直接使用できます。したがって、左引数として返される数字、右引数として分子、および標準入力からの分母を取得します(3番目の引数を使用する代わりに)。

Jellyに慣れている人は、完全なプログラムが3つ以上の引数を取ることができることに気づいているかもしれませんが、そうすると、定数整数10を書き込む最も簡単な方法にアクセスできなくなります。そのため、この種の混合入力は、実際の有用なゴルフではなく、悪用のように感じられます。個人的には同意しませんが、これを許可するルールは現在+40 / -12になっています。ルールにある限り、それを悪用することもできます(そして競争力が必要です)。

左引数1は小数点の直後の数字(「.1s数字」)、2の引数は.01s数字などを参照します。

説明

⁵*×:ƓDṪ
⁵*        10 to the power of {the left argument}
  ×       multiplied by {the right argument}
   :      divided by
    Ɠ                standard input
      Ṫ   take the last
     D                  decimal digit

Jellyは整数に対して任意精度の演算を行うため、10の累乗を事前に乗算することにより、必要な桁を効果的に移動して、抽出しやすい単位の位置に配置します。


4

sedは -r、93 131 136のバイト

s/$/,/
:d
s/,.+/,/
:
s/(1+)(1*;\1;1*,)1{10}?/\21/
t
s/1*/&&&&&&&&&&/
ta
:a
s/1,/,/
td
s/.+,//

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

10進数の出力を参照

入力を単項で受け取り、出力を単項で受け取り、プログラムは1インデックス付きです。ありがたいことに、この挑戦はすでに私にこのための準備をしました。

概念は似ており、どちらも長い除算を実装しています。ここでは、長い除算x時間を実行します。ここでx、小数点以下の桁を見つけなければなりません。各反復の後、以前の小数点以下の桁は不要になったため、破棄します。

除算を行う間、プログラムの形式はになりますdividend;divisor;x,result

s/$/,/ このコンマを追加します。コンマは他のすべてから結果を分離するために必要です

その後、メインプログラムループに従います

:d ラベルd

  • s/,.+/,/ コンマの後のすべてを削除します

  • : 空のラベル

    • s/(1+)(1*;\1;1*,)1{10}?/\21/ 除算を実行し、繰り返しごとに結果に1を加算し、同時に結果の10個の連続した1のブロックを削除します
  • t 空のラベルに分岐します。つまり、配当が使い果たされるまでループします

  • s/1*/&&&&&&&&&&/ 次の反復に備えるために、配当に10を掛けます

  • ta ラベルaへの分岐

  • :aラベル、この行と行は、上記のmakeに必要とされるtd仕事

  • s/1,/,/ xから1を引く

tddへの条件分岐、最後の条件分岐s/1*/&&&&&&&&&&/が常に成功するため常に置換が成功したtd場合にトリガーされますが、分岐aを導入することにより、前の置換のみに依存するように修正します。

s/.+,// 最後に、結果以外のすべてを削除します



3

REXX、76バイト

(それほど短くはありませんが、REXXで変更すると変更されると考えられていました)Rexxは定義により1ベースです。

arg n d x
numeric digits x+10
y=n/d
parse var y "." +(x) z
say left(z,1,"0")

説明:

  1. 数字への入力を読む
  2. 十分な有効数字を保証する(デフォルトは9)
  3. 計算する
  4. スプリット。小数点を見つけ、「x」文字をカウントし、次の文字を取り、「z」に入れます
  5. 最初の桁を印刷します。必ず0で埋めてください。

3と4をマージすると、構文が変更されるため、実際には長くなります。

parse value n/d with "." +x z +1

REXX以外の場合:REXXでは文字列と数字は完全に交換可能です。それらはあなたがどのように行動するかによって決まります。したがって、変換せずにスティング関数を使用して数値を解析できます。例えば

"27" + "28"

2728ではなく55を返します!


通訳者にリンクを追加できますか?多くのユーザーがこの言語に不慣れであることを想像します。
Mego

tutorialspoint.com/execute_rexx_online.php唯一の問題は、インタープリターに値を入力する方法を理解できなかったことです。そのため、テストの目的で、割り当てを使用して開始時に値を設定しました。
-theblitz

1
のようなCLI入力を与えると、インタープリターが機能するように見えますrexx main.rexx 1 2 3。入力は1インデックスであると答えてください。
MEGO

入力の可能性に気付かなかったのは、最上部の実行ボタンをクリックしただけです。ああ。
-theblitz

2

バッチ、70バイト

@set n=%1
@for /l %%x in (0,1,%3)do @set/an=n%%%2*10
@cmd/cset/an/%2

@FelipeNardiBatista試したときに私のために働いた。
ニール

2

アセンブリIntel x86 CPU言語、50バイト

00000940  53                push ebx
00000941  8B5C240C          mov ebx,[esp+0xc]
00000945  8B4C2410          mov ecx,[esp+0x10]
00000949  31C0              xor eax,eax
0000094B  48                dec eax
0000094C  81C102000000      add ecx,0x2
00000952  721A              jc 0x96e
00000954  81FB00000000      cmp ebx,0x0
0000095A  7412              jz 0x96e
0000095C  8B442408          mov eax,[esp+0x8]
00000960  31D2              xor edx,edx
00000962  F7F3              div ebx
00000964  49                dec ecx
00000965  7407              jz 0x96e
00000967  8D0492            lea eax,[edx+edx*4]
0000096A  01C0              add eax,eax
0000096C  EBF2              jmp short 0x960
0000096E  5B                pop ebx
0000096F  C20C00            ret 0xc

nasmでの翻訳

; u32 __stdcall rdiv(u32 a, u32  b, u32 c)
; 8a, 12b, 16c
      align   4
rdiv:                   ; c<0xFFFFFFFE and b!=0
      push    ebx       ; something as for(;a=10*(a%b),c--;);return a/b
      mov     ebx,  dword[esp+  12]
      mov     ecx,  dword[esp+  16]
      xor     eax,  eax
      dec     eax
      add     ecx,  2
      jc      .z
      cmp     ebx,  0
      je      .z            
      mov     eax,  dword[esp+  8]
.1:   xor     edx,  edx
      div     ebx
      dec     ecx
      jz      .z
      lea     eax,  [edx+edx*4]
      add     eax,  eax
      jmp     short  .1     ; a=5*a;a+=a=>a=10*a
.z:       
      pop     ebx
      ret     12

パラメーター 'c'の場合、範囲は0から始まります。0..0xfffffffdになります。パラメータb = 0またはcが0..0xfffffffdの範囲外の場合、-1を返します



1

C、49 43バイト

f(a,b,i){for(;a=10*(a%b),i--;);return a/b;}

'i'引数は0インデックスです。テストコードと結果

main()
{int i;
 for(i=0;i<20;++i)
     printf("%u", f(12,11,i));

 printf("\nf(1,2,3)=%d\n",f(1,2,3));
 printf("f(5,6,0)=%d\n",f(5,6,0));
 printf("f(5,6,1)=%d\n",f(5,6,1));
 printf("f(1,6,15)=%d\n",f(1,6,15));
 printf("f(1,11,2)=%d\n",f(1,11,2));
 printf("f(1,10000,9999999)=%d\n",f(1,10000,9999999));
 printf("f(11,7,1)=%d\n",f(11,7,1));
}

f(1,2,3)=0
f(5,6,0)=8
f(5,6,1)=3
f(1,6,15)=6
f(1,11,2)=0
f(1,10000,9999999)=0
f(11,7,1)=7 

1

ジャワ7、146 139 137 133 128 122バイト

Erik the Outgolferのおかげで-3バイト、インポートを独自の行にする必要がないことを忘れていました

n%dをコンストラクターに移動したQwerp-Derpのおかげで-4バイト

-6バイト、toString()を削除してくれたKevin Cruijssenに感謝

私はこれがインポートを使用してJava関数のバイトカウントが行われる方法であることを願っています

import java.math.*;char a(int n,int d,int x){return (new BigDecimal(n%d).divide(new BigDecimal(d),x+1,1)+"").charAt(x+2);}

JavaのBigDecimalクラスを使用して、10進数展開の正確な表現を取得します。これは最速のコードではありませんが、すべてのテストケースで最終的に正しい出力が生成されることに注意してください。未ゴルフコード:

import java.math.*;
char a(int n, int d, int x){
    BigDecimal num = new BigDecimal(n%d); // reduce improper fractions
    BigDecimal div = new BigDecimal(d);
    BigDecimal dec = num.divide(div, x+1, 1); // precision of x + 1, round down
    return (dec+"").charAt(x+2); //xth char after decimal
}

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


コンマの後のスペースとセミコロンの後の改行は削除できると思います。
エリックアウトゴルファー

私は、137のバイトカウント
KritixiのLithosを

おかげで誤カウントしている必要があります
PunPun1000

に置き換えBigDecimal(n)BigDecimal(n%d)、取り除くことはできませんn=n%dか?
clismique

を削除して代わりに.toString()使用することができます+""(2つの追加の括弧付き)。
ケビンCruijssen



1

Groovy、30バイト

{n,d,x->(n*10**x/d as int)%10}

xは1ベースのインデックスを使用します。

説明:

{n,d,x->    // closure with three arguments, n, d, x
 n*10**x    // multiply n with 10 to the power of x
 /d         // divide by d
 as int     // convert from BigDecimal to int
 )%10       // modulo 10 to get the answer
}



0

JavaScript(ES6)、34バイト

(n,d,x)=>`${n/d}`.split`.`[1][x]|0

xは0から始まります

f=
(n,d,x)=>`${n/d}`.split`.`[1][x]|0

console.log(f(1,2,3))
console.log(f(5,6,0))
console.log(f(5,6,1))
console.log(f(1,6,15))
console.log(f(1,11,2))
console.log(f(1,10000,10000000))
console.log(f(11,7,1))
console.log(f(2000,7,0))


残念ながら、私のソリューションのように、これは長い小数で失敗します。f(1,7,10000000)たとえば、試してみてください。
シャギー

0

Python 2バイト

0インデックスを使用します

lambda n,d,x:int(10**-~x*n/d)%10

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

編集:

ØrjanJohansenの答えに見られるように、元のソリューションに戻りましたが、それ以上はゴルフをしません


2
有効でない場合は削除する必要があります。
エリックアウトゴルファー

これまでのほとんどの答えとして
フェリペナルディバティスタ

@EriktheOutgolferはそれを修正しました...
フェリペナルディバティスタ

1インデックスを使用しますか?
エリックアウトゴルファー


0

Groovy、55バイト

{n,d,x->z='0'*x;Eval.me("$n.$z/$d.$z").toString()[x-1]}

を使用して説明1,11,2

{
    n,d,x->          // I've already lost to Jelly by the end of this line.
    z='0'*x;         // Set z equal to 2 0's.
    Eval.me          // Evaluate as groovy code...
    ("$n.$z/$d.$z")  // 1.00g/11.00g (Automatically set precision using # 0s).
   .toString()[x-1]  // Get 2nd digit of division.
}

0

公理、71 61 76バイト

f(a:NNI,b:PI,n:NNI):NNI==(repeat(a:=10*(a rem b);n=0=>break;n:=n-1);a quo b)

nは0インデックス[0..M]です。テストコードと結果

(19) ->    f(1,2,3)=0
   (19)  0= 0
(20) ->     f(5,6,0)=8
   (20)  8= 8
(21) ->     f(5,6,1)=3
   (21)  3= 3
(22) ->     f(1,6,15)=6
   (22)  6= 6
(23) ->     f(1,11,2)=0
   (23)  0= 0
(24) ->     f(1,10000,9999999)=0
   (24)  0= 0
(25) ->     f(11,7,1)=7
   (25)  7= 7

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