실제 기본 변환


19

우리는 기본 변환에 몇 가지 문제가 있었지만 모두 정수 값에 적용되는 것 같습니다. 실수로 해보자!

도전

입력 :

  • 밑이 10으로 표현 된 실수 양수 x . 배정 밀도 부동 소수점 또는 문자열로 사용할 수 있습니다. 정밀 문제를 방지하려면 수는 10보다 큰 것으로 가정 할 수있다 -6 미만 10 (15) .
  • 타겟 기지국 B . 이것은 2에서 36 사이의 정수입니다.
  • 소수점 이하의 수 N . 이것은 1에서 20 사이의 정수입니다.

출력 : 표현X 베이스에 BN 자리수.

출력 식을 계산하면, 이후의 숫자 N 개 번째가되어야 절단 (둥근 생략). 예를 들어, x = 3.141592653589793base b = 3is 10.0102110122...이므로 n = 3출력은 (반올림)이 10.010아닌 10.011( 잘림 )입니다.

들면 XB 소수부 자리에서 한정된 수의 생성은 등가 무한 표현 (잘린 N 자리수)도 허용된다. 예를 들어, 4.5십진수는로 표현 될 수도 있습니다 4.49999....

부동 소수점 오류 에 대해 걱정하지 마십시오 .

입력 및 출력 형식

x 는 선행 0없이 제공됩니다. 경우 x는 정수 될 일이 당신은이 소수점 아래 부분 (함께 제공 될 것이라고 가정 할 수있다 3.0), 또는 소수 부분이없는 ( 3).

출력이 유연합니다. 예를 들어 다음과 같습니다.

  • 정수와 소수 부분 사이에 적절한 구분 기호 (소수점)가있는 숫자를 나타내는 문자열입니다. 숫자는 11, 12등 (위해 10 이상) 문자로 표현 될 수있다 A, B평소와 같이, 또는 어떤 다른 별개의 문자로 (구체적으로).
  • 정수 부분의 문자열과 분수 부분의 다른 문자열
  • 에서 숫자를 포함하는 두 배열 / 목록, 각 파트의 하나 035숫자로.

정수 및 분수 부분 은 구별 될 수 있고 (적절한 구분 기호) 동일한 형식을 사용할 수 있다는 것이 유일한 제한 입니다 (예 : [5, 11]정수 부분을 ['5', 'B']나타내는 목록과 분수 부분을 나타내는 목록에 대해서는 아니오 ).

추가 규칙

테스트 사례

출력 자리수의 문자열로 도시되고 0, ..., 9, A, ..., 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소수점이 있어야한다는 것입니다.
Luis Mendo

답변:



7

자바 스크립트 (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-61e21, b236(정확히 같은 필수)과 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
정규식으로 어떻게 기본 변환을 수행합니까?!?
아웃 골퍼 Erik 14

@EriktheOutgolfer 저는 아닙니다 n. 문자열에서 "숫자"까지 추출하는 골퍼 입니다.
Neil

그리고 무엇 이며 함수의 핵심 로직은?
아웃 골퍼 Erik 14

@EriktheOutgolfer 왜 JavaScript가 내장 된 기본 변환 기능입니까? (힌트 : 기본 매개 변수를 사용하는 곳을보십시오.)
Neil

오, 그것은 .toString(b)... 바보 같은 말> _ <
Outgolfer Erik

5

파이썬 (2) , 153 (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

숫자를 숫자로 반환 할 수 있다는 것을 알지 못했기 때문에 훨씬 간단합니다. 첫 번째는 정수 부분, 두 번째는 분수의 두 자릿수 목록을 리턴합니다.

온라인으로 사용해보십시오!


경우가 있습니다 : 당신은보다 큰 지원 번호에 필요 메모 추가했습니다 1e-6(이하 및 1e15이전과)
루이스 Mendo

5

펄 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-6(이하 및 1e15이전과)
루이스 Mendo

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

루비 , 45 바이트

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

왜?

밑변 b의 b ^ n은 10 ^ n이므로, x에 그 수를 곱한 다음 그 소수점 자리를 더합니다.

온라인으로 사용해보십시오!


; 로 교체 .round하여 -1 바이트 + 버그 수정 .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;}}

온라인으로 사용해보십시오!

편집 : 줄 바꿈으로 구분 된 두 개의 문자열을 출력 할 수 있으면 몇 바이트를 면도 할 수 있습니다.

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("")두 번째 버전에서 저장 ).
Peter Cordes

감사! 나는 패턴으로 * 직접 문자를 제공 잊었다이 실제로 꽤 많은 바이트를 저장 :-) 즉 각 소수가 줄 바꿈에 인쇄됩니다 의미 이후 두 번째 버전에서 풋 (Z + R)를 사용할 수 없습니다
scottinet

아, 마지막 부분은 주석이 달린 ungolfed 버전이 없으면 분명하지 않았습니다.
Peter Cordes

float보다 짧지 만 double질문에 double또는 문자열 입력 이 필요한 것 같습니다 .
Peter Cordes

1
그럴 필요가 없습니다. 일반적인 C 구현에는 64 비트 long가 있으며 코드 골프 규칙에 따르면 대답이 유효해야합니다. 또한 C 및 C ++ 코드 골프 응답이 64 비트로 가정 long하는 것이 일반적입니다. Try It Online에서 사용하기 때문입니다. 편집 내용을 롤백하고 "노트 long는 64 비트 여야합니다. 더 큰 테스트 사례를 지원합니다. "
Peter Cordes

2

매스 매 티카 47 바이트

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

RealDigits소수점 왼쪽의 자릿수를 먼저 알아 내기 위해 두 번 호출 합니다.


경우가 있습니다 : 당신은보다 큰 지원 번호에 필요 메모 추가했습니다 1e-6(이하 및 1e15이전과)
루이스 Mendo

1
나는 질문이 단지 요구하고 있다고 생각 TakeDrop@@RealDigits[##]했지만 잘못 읽은 것을 깨달았습니다-귀하의 솔루션은 최적의 것으로 보입니다.
Mark S.


1

하스켈 , 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);"")

이 질문은 특히 어려웠습니다. 무언가를 쓰는 데 어느 정도 시간이 걸리면 올바른 결과는 숫자를 유지하기 위해 하나의 매크로를 사용하여 생성 된 것처럼 보입니다 () ... 너무 많이 골프되지 않습니다 ... 결과 :

(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

실제 목표는 k. = digits ()가있는 각 Float 또는 % pi 또는 % e로 계산 된 각 숫자 또는 1./3에서와 같이 두 float / int의 나누기 기준으로 2..36 기준으로 변환하는 하나의 함수입니다. . [ '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

마지막 0 예제에는 약간의 문제가 있습니다.

 f(4.5,10,5)

'4.50000'이 아닌 '4.5'를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.