実数ベース変換


19

基本変換にはいくつかの課題がありましたが、それらはすべて整数値に適用されるようです。実数でやってみましょう!

チャレンジ

入力:

  • 10を底とする の実数x。これは、倍精度浮動小数点数または文字列として取得できます。精度の問題を回避するために、この数は10 -6より大きく10 15より小さいと仮定できます。
  • ターゲット基地 B。これは、2〜36の整数になります。
  • 数桁数 n。これは、1〜20の整数になります。

出力:基数bx表現で、nの小数桁。

出力式を計算するとき、n番目を超える数字は切り捨てる(丸めない)必要があります。たとえばx = 3.141592653589793、base b = 310.0102110122...ですのでn = 3、出力は10.010(切り捨て)ではなく10.011(切り捨て)になります。

以下のために、XB小数部の桁の有限数を生成する、等価な無限の表現(に切り捨てN桁)も許容されます。たとえば4.5、10進数ではとして表すこともできます4.49999...

浮動小数点エラーを心配しないでください。

入出力フォーマット

xは先行ゼロなしで与えられます。場合、xは整数であることを起こるあなたは(それがゼロ小数部分で与えられることになると仮定することができます3.0)、または小数部のありません(3)。

出力は柔軟です。たとえば、次のようになります。

  • 整数部と小数部の間に適切な区切り記号(小数点)を付けた数値を表す文字列。桁数は1112など(のためにB 10を超えた)の文字として表現することができABいつものように、または任意の他の個別の文字として(指定してください)。
  • 整数部の文字列と小数部の別の文字列。
  • 番号を含む二つの配列/リスト、各部分について1つ、035数字として。

唯一の制限は、整数部分と小数部分を区別し(適切な区切り記号)、同じ形式を使用できることです(たとえば、[5, 11]整数部分を['5', 'B']表すリストと小数部分を表すリストにはno )。

追加のルール

テストケース

出力は、数字と文字列として示されている0...、、 9A、...、Z使用して、.小数点区切りとして。

x, b, n                    ->  output(s)

4.5, 10, 5                 ->  4.50000 or 4.49999
42, 13, 1                  ->  33.0 or 32.C
3.141592653589793, 3, 8    ->  10.01021101
3.141592653589793, 5, 10   ->  3.0323221430
1.234, 16, 12              ->  1.3BE76C8B4395
10.5, 2, 8                 ->  1010.10000000 or 1010.01111111
10.5, 3, 8                 ->  101.11111111
6.5817645, 20, 10          ->  6.BCE2680000 or 6.BCE267JJJJ
0.367879441171442, 25, 10  ->  0.94N2MGH7G8
12944892982609, 29, 9      ->  PPCGROCKS.000000000


ため42, 13, 1、我々は持つことができる33の代わりに33.0
LiefdeWen

@LiefdeWenいいえ、課題の本質的な部分は、出力が持たなければならないということであるn小数点以下の桁を
ルイス・Mendo

回答:


1

ゼリー、16バイト

*×⁵b⁸ḞðṖḣ⁹,ṫø⁹N‘

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

出力に要素としてシングルトンが出力されることに注意してください。


ねえ、あなたの写真はどうなりましたか?
ルイスメンドー

それはFacebookのに接続されていたので、@LuisMendo一部の人々は、それをレンダリングすることはできません
漏れ尼僧

ここに写真をアップロードできますよね?これらのデフォルトは非常に非人格的です
ルイスメンドー

7

JavaScript(ES8)、81 74 71バイト

f=
(x,b,n,g=x=>x.toString(b))=>g(x-x%1)+'.'+g(x%1).substr(2,n).padEnd(n,0)
<div oninput=o.textContent=f(+x.value,b.value,n.value)><input id=x><input type=number min=2 max=36 value=10 id=b><input type=number min=1 max=20 value=10 id=n><pre id=o>

以下のための作品xの間1e-61e21bから236(正確に同じ必須)とnから1何までから1048ベースに応じて、浮動小数点の前にエラーがでクリープ編集:保存@Birjolaxewからの助けを借りて、7バイト。@tshの助けを借りてさらに3バイトを保存しました。以前の74バイトバージョンも負の数値で機能しました。

f=
(x,b,n,[i,d]=`${x.toString(b)}.`.split`.`)=>i+`.`+d.slice(0,n).padEnd(n,0)
<div oninput=o.textContent=f(+x.value,b.value,n.value)><input id=x><input type=number min=2 max=36 value=10 id=b><input type=number min=1 max=20 value=10 id=n><pre id=o>


1
正規表現を使用してベース変換を行う方法は?!?
エリックアウトゴルファー

@EriktheOutgolfer私はそうではありませんが、それnは文字列から「数字」までを抽出する単なるゴルファー(できれば)の方法です。
ニール

そして、何であるあなたの関数のコア・ロジックは?
エリックアウトゴルファー

@EriktheOutgolferなぜ、JavaScriptの組み込みベース変換機能はもちろんです。(ヒント:基本パラメーターを使用する場所を見てください。)
ニール

ああ、それは言う.toString(b)...馬鹿私> _ <
エリックOutgolfer

5

パイソン2153の 149 144 137 135 109バイト

def f(x,b,m):
 i=int(x);s=[];t=[]
 while i:s=[i%b]+s;i/=b
 while m:m-=1;x=x%1*b;t+=[int(x)]
 return s or[0],t

数字を数字として返すことができることに気づかなかったので、それはずっと簡単になります。2つの数字のリストを返します。1つ目は整数部、2つ目は小数部です。

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


それが役立つ場合:をサポートする必要があるというメモを追加しました1e-61e15以前のように、未満)
ルイスメンドー

5

Perl 6、25バイト

->\x,\b,\n{+x .base(b,n)}

それを試してみてください

拡張:

-> \x, \b, \n {
  +x            # make sure it is a Numeric
  .base( b, n ) # do the base conversion
}

スペースはそうでは(+x).base(b,n)
ないとして解析されることに注意してください+( x.base(b,n) )


それが役立つ場合:私はあなたがサポートする必要があるというメモを追加しました1e-61e15以前のように、より小さい)
ルイスメンドー

3

Mathematica、158バイト

この挑戦はすでに@KellyLowderによって数学で非常に良い答えを得たので、テストケースに示されているとおりの正確な結果を(異なるアプローチで)生成しようとしました

ToUpperCase[""<>Insert[StringReplace[ToString@BaseForm[#,p]&/@PadRight[#&@@(d=RealDigits[#,p=#2]),w=(#3+d[[2]])][[;;w]],"\n "<>ToString@p->""],".",d[[2]]+1]]&


入力

[12944892982609、29、9]

出力

PPCGROCKS.000000000


3

Ruby、45バイト

->x,b,n{(x*b**n).round.to_s(b).insert(~n,?.)}

どうして?

基数bのb ^ nは10 ^ nであるため、xにその数値を乗算し、それが属する小数点を追加します。

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


-1バイト+バグ修正置換によって.round.to_i、これにより、テスト出力と一致しない出力の最後の桁が修正されます。を使用して.insert ~n,?.、括弧なしで-1バイト増やす。
-Nnnes

3

C(gcc)157 152バイト

long intより大きなテストケースで動作するには、64ビットが必要です。

Peter Cordesのおかげで-5バイト

#define P r=99;i=l=x;do{z[--r]=48+7*(l%b>9)+l%b;}while(l/=b);printf(z+r)
long i,r,l;char z[99];f(x,b,n)double x;{P;putchar(46);while(n--){x=(x-i)*b;P;}}

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

編集:改行セパレータで区切られた2つの文字列を出力できる場合、数バイトを削ることができます。

149バイト:

#define P r=99;i=l=x;do{z[--r]=48+7*(l%b>9)+l%b;}while(l/=b);printf(z+r)
long i,r,l;char z[99];f(x,b,n)double x;{P;puts("");while(n--){x=(x-i)*b;P;}}

編集:この提出は最長のものではない、イェーイ!


2
文字printf(z+r)が含まれていない場合に使用できます%。(これはコードゴルフです。セキュリティと優れた実践は窓から消えます:P)。またputs(z+r)、改行を無料で取得するために使用することもできます(puts("")2番目のバージョンで保存します)。
ピーターコーデス

ありがとう!私は、これが実際にかなりの数のバイトを保存し、*直接パターンとしてチャーを提供忘れ:-)それは各小数改行に印刷する意味するので、私は第二のバージョンを入れを(Z + R)を使用することはできません
scottinet

ああ、その最後の部分は、コメントのないバージョンが無ければ明らかではありませんでした。
ピーターコーデス

float短くなっているdoubleが、質問が必要です思えるdoubleまたは文字列の入力を。
ピーターコーデス

1
その必要はありません。Cのいくつかの一般的な実装には64ビットがありlong、コードゴルフ規則に従って答えを有効にするために必要なものはすべてです。(また、CおよびC ++コードゴルフの答えのためのそれの一般的な64ビットを想定するlongオンライン用途それを試してみてどのようなことのために、。)私はあなたの編集をロールバックし、同じようにノートを追加することをお勧めしたい」long用の64ビットでなければなりませんこれにより、より大きなテストケースをサポートできます。」
ピーターコーデス

2

Mathematica 47バイト

TakeDrop@@r[#,#2,#3+Last@(r=RealDigits)[#,#2]]&

RealDigits2回呼び出して、最初に小数点の左側の桁数を計算します。


それが役立つ場合:をサポートする必要があるというメモを追加しました1e-61e15以前のように、未満)
ルイスメンドー

1
質問はTakeDrop@@RealDigits[##]&を求めているだけだと思いましたが、それから私は物事を読み間違えていることに気付きました-あなたの解決策は最適のようです。
マークS。17年


1

Haskell、188バイト

f=fromIntegral
g 0 _=[]
g n p=g(div n p)p++[mod n p]
z=(!!)(['0'..'9']++['A'..'Z']++['.'])
h x p l|(i,d)<-properFraction x=z<$>(g i p++[36]++(last$g(floor$d*(f p**f l))p:[0<$[1..l]|d==0]))

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

g 数値を、指定された基数でその数値を表すリストに変換します

z整数を文字にマップします(36 = .

h 前の関数を数値の整数部と小数部に適用します。


1

公理、566バイト

c:=alphanumeric()::List Character
f(a:INT,b:PI):List Character==(r:=[];repeat(y:=a rem b;r:=cons(c.(y+1),r);a:=a quo b;a=0=>break);r)
g(x)==floor(x)::INT
F(x)==>for i in 1..#x repeat z:=concat(z,x.i)
w(a:Float,b:PI,n:NNI):String==
  z:="";b<2 or b>36 or a<0=>z
  ip:=g(a);    fp:=g((a-ip)*b^n)
  ipb:=f(ip,b);fpb:=f(fp,b);cnt:=n-#fpb
  for i in 1..cnt repeat fpb:=cons(c.1,fpb)
  F(ipb);z:=concat(z,".");F(fpb)
  z

h(a,b,n)==>(n>=0 and b>0=>(nd123:=10+g(n*log_2(b)/log_2(10));mxv123456:=digits(nd123::PI);res78484:=w(a,b,n);digits(mxv123456);res78484);"")

この質問は特に困難でした。何かを書いてからしばらくすると、数字を保持するために1つのマクロを使用して正しい結果が生成されるようです...それはあまりゴルフされていません...結果:

(7) -> h(4.5,10,5)
   (7)  "4.50000"
                                                             Type: String
(8) -> h(42,13,1)
   (8)  "33.0"
                                                             Type: String
(9) -> h(%pi,3,8)
   (9)  "10.01021101"
                                                             Type: String
(10) -> h(%pi,5,10)
   (10)  "3.0323221430"
                                                             Type: String
(11) -> h(1.234,16,12)
   (11)  "1.3BE76C8B4395"
                                                             Type: String
(12) -> h(0.367879441171442,25,10)
   (12)  "0.94N2MGH7G8"
                                                             Type: String
(13) -> h(12944892982609,29,9)
   (13)  "PPCGROCKS.000000000"
                                                             Type: String
(14) -> h(6.5817645,20,10)
   (14)  "6.BCE267JJJJ"
                                                             Type: String

実際のターゲットは、各フロートをベース2..36に変換する1つの関数です(k:= digits()を持つ)、または%piまたは%eとして計算された各数値、または1./3のように2つのfloat / intの除算。[「oo」の数字]

(15) -> h(%pi,13,800)
   (15)
  "3.1AC1049052A2C77369C0BB89CC9883278298358B370160306133CA5ACBA57614B65B410020
  C22B4C71457A955A5155B04A6CB6CC2C494843A8BBBBA9A039B77B34CB0C036CAC761129B3168
  B8BAB860134C419787C911812985646C7AAA3025BAA118B3AB8265CB347852065667291482145
  6C533447BC53A5262177C9985455C395626091A2CC3126B395C91B65B654A1804226197528410
  29A8A4A55CC7937B347B77B5A914127B11C6A57A84510775A9A467819A468B6B74339CC1290B2
  24921C6A771BC2AB6AB41735119C2231545A86399483119AAA5AC34B46B7B5C9089946A364860
  9B26CB0BAC0ABCBA182C12881933AA93C3942C71AA664753989A3C82166BA2109796C4A134607
  59725A72C9117AC980556A147557C319438287226C94725B125753B009387A48AA45CB1960A04
  A064052C00A6069371949872B14590895C555CB01A39B7589824B8621618A8B1971841201A2AB
  B04B80C7534CC1CB079581491995B46C679555316288C82665645A1A600C1A669B865651B6B842470C018B03C1115B3C4306C015C0B45C"
                                                             Type: String

1

公理、127バイト

g(a)==floor(a)::INT;f(a:Float,b:PI,n:NNI):Any==(b<2 or n>28=>%i;x:=g(a);radix(x,b)+radix(g((a-x)*b^n),b)::RadixExpansion b/b^n)

結果

(4) -> f(%e,2,10)
   (4)  10.1011011111
                                                   Type: RadixExpansion 2
(5) -> f(%e,3,10)
   (5)  2.2011011212
                                                   Type: RadixExpansion 3
(6) -> f(%e,35,10)
   (6)  2.P4VBNEB51S
                                                  Type: RadixExpansion 35
(7) -> f(1.4,35,10)
   (7)  1.DYYYYYYYYY
                                                  Type: RadixExpansion 35
(8) -> f(%pi,3,8)
   (8)  10.01021101
                                                   Type: RadixExpansion 3
(9) -> f(%pi,5,10)
   (9)  3.032322143
                                                   Type: RadixExpansion 5
(10) -> f(1.234,16,12)
   (10)  1.3BE76C8B4395
                                                  Type: RadixExpansion 16

最後のゼロの例には少し問題があります

 f(4.5,10,5)

「4.50000」ではなく「4.5」を返します

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