분수를 반복 소수로 변환


17

도전에 대해 거의 정반대 이며, 조금 더 쉬울 것으로 생각됩니다.

당신의 임무는 a/b(이성수를 형성하는) 형식으로 2 개의 정수를 취한 다음 숫자를 정확히 10 진수로 출력하는 것입니다.

예를 들어 input을 입력하면 다음과 같이 1/3출력됩니다.

0.33333333333333333

그리고 선택적인 선행 0을 사용하여 시간이 끝날 때까지 3 초를 계속 인쇄 합니다. 언어에서 동일한 줄에 인쇄 할 수없는 경우에만 한 줄에 문자 씩 인쇄 할 수 있습니다 .

의 동작 x/0은 정의되지 않습니다. 반복되지 않는 것처럼 보이는 숫자 (예 :처럼 5/4)는 실제로 반복됩니다. 다음 두 가지 형식 중 하나를 사용할 수 있습니다 5/4.

1.25000000000000000
1.24999999999999999

(정수 1.9999999또는 동일 2.000000)

분수는 가장 간단한 형태로되지 않을 수 있으며, a또는 b음수가 될 수있다 (참고 -a/b = -(a/b), -a/-b = a/b, a/-b = -a/b, 및 -.6249999입니다 유효하지만, -0.6249999허용,하지만 당신은 여전히 사용할 수 있습니다.


유닉스를 사용할 수 있습니까 bc, 아니면 부정 행위입니까?
David R Tribble

나는 내 대답을 골프를 계속하기 전에 캔 a및 / 또는 b수 음?
Dennis

@Dennis 예, 그러나 하나 a또는 b둘 다 음수

@DavidRTribble 나는 그것이 표준 허점이라고 생각합니다.

최근 편집 내용에 따르면 선행 0은 양수로는 괜찮지 만 음수로는 그렇지 않습니까? 그렇다면 그 이유는 무엇입니까?
Geobits

답변:


2

CJam, 38 37 바이트

l'/%:i2*~*0<'-*o:Dmd\zo'.{oA*Dmd\z1}g

작동 원리

l     e# Read line from STDIN.            STACK '17/-13'
'/%   e# Split at '/'.                    STACK ['17' '-13']
:i    e# Cast each element to int.        STACK [17 -13]
2*~   e# Duplicate and dump the array.    STACK 17 -13 17 -13
*     e# Multiply.                        STACK 17 -13 -221
0<    e# Compare with zero.               STACK 17 -13 1
'-*o  e# Print '-' that many times.       STACK 17 -13
:D    e# Save the topmost integer in D.   STACK 17 -13
md    e# Perform modular division.        STACK -1 4
\z    e# Swap and take absolute value.    STACK 4 1
o'.   e# Print and push '.'.              STACK 4 '.'
{     e# do:
  o   e#   Print.                         STACK 4
  A*  e#   Multiply by 10.                STACK 40
  Dmd e#   Divide modulo D.               STACK -3 1
  \z  e#   Swap and take absolute value.  STACK 1 3
  o   e#   Print.                         STACK 1
1}g   e# while(1)

이중 나누기를 사용하기 때문에 큰 숫자로 인해 완전히 깨지지 않습니까?
orlp 1

@orlp : 완전합니다. 이제 수정되었습니다.
데니스

6

C, 108 79

음수로 작업하려면 수정을 편집하십시오 .

stdin에서 입력 오래된 K & R 스타일.

main(a,b){char*s="-%d.";scanf("%d/%d",&a,&b);for(a*b<0?(a<0?a=-a:(b=-b)):++s;printf(s,a/b);s="%d")a=a%b*10;}

4

루비, 83 (69) 102 91 89 바이트

->s{a,b=s.scan(/\d+/).map &:to_i
eval(s+?r)<0&&$><<?-
$><<a/b<<?.
loop{a=a%b*10
$><<a/b}}

컴퓨터의 정수 나누기를 기반으로 한 수동 정수 나누기의 간단한 구현.

골프에 도움을 주신 @blutorange에게 감사드립니다.

편집 : 음수를 포함하도록 솔루션을 수정했습니다.


2
루비에서 일부 단축키를 사용하면 이것을 66 바이트로 줄일 수 있습니다. ->s{a,b=s.split(?/).map &:to_i;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}나는 루비에 대해 이것을 좋아합니다.
blutorange

와우, 나는 방금 많은 것을 배웠습니다, 감사합니다! 나는 ?/문자를 나타내는 것을 기억 하지 않았고 $><<인쇄하거나 loop키워드에 대해 알지 못했습니다 . 고마워요 !!
rorlork

1
천만에요, 누군가 지적하기 전까지는이 많은 기술에 대해 몰랐습니다. $>약어로 $stdout, 그리고 <<오퍼레이터이다. 다음으로 변경하여 두 번째 줄에 하나 이상의 바이트를 저장할 수 있습니다 c*d<0&&$><<?-. 3/4/4 줄을에 결합하여 몇 바이트를 $><<a/b<<?., <<마지막 줄에서 공백을 제거하여 1 바이트를 더 하십시오. 그리고 이것을 91 바이트로 낮추는 아이디어가 있습니다 : ->s{a,b=s.scan(/\d+/).map &:to_i;1==s.count(?-)&&$><<?-;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}(ruby 2.2.0)
blutorange

에 대한 구문 $><<a/b이 제대로 작동하지 않아 공간을 확보했습니다. 나머지는 좋아 보인다, 대단히 감사합니다!
rorlork

1
여전히 관심이 있다면, 루비 2.1 이후 (약 10 분 전에 배운) 이후 의 합리적 리터럴 ( Rational(2,3) == 2/3r)도있다. 두 번째 줄을 줄이는 데 사용할 수있다.eval(s+?r)<0&&$><<?-
blutorange

2

자바 177 176 170

s->{try{int x=new Integer(s.split("/")[0]),y=new Integer(s.split("/")[1]),z=1;for(;;x=x%y*10,Thread.sleep(999))System.out.print(x/y+(z-->0?".":""));}catch(Exception e){}}

알고리즘은 간단합니다. 까다로운 부분은 인쇄 작업을하는 것이 었습니다. 결국, 나는 인쇄 할 수 있도록 각 단계 사이에 1 초 동안 컴퓨터를 잠들게했다.

확장 가능하고 실행 가능한 버전

public class RepeatedDecimal {
    public static void main(String[] args) {
        java.util.function.Consumer<String> f = s -> {
                try {
                    int x = new Integer(s.split("/")[0]),
                        y = new Integer(s.split("/")[1]),
                        z = 1;
                    for (;; x = x % y * 10, Thread.sleep(999)) {
                        System.out.print(x / y + (z-- > 0 ? "." : ""));
                    }
                } catch (Exception e) { }
                };

        f.accept("5/7");
    }
}

출력에 플러싱 문제가 있지만 9 바이트 동안 절전 모드로 전환하여 2 바이트를 면도하여 출력을 표시 할 수있었습니다.

@Snowman 하드웨어 또는 OS에 따라 다를 수 있습니다. 내 컴퓨터는 250ms 이하에서 작동하지 않습니다.
Ypnypn

2

R, 103 (137) 109 103

이것으로 조금 더 행복해졌습니다. 구분 기호로 스캔을 사용하면 많은 바이트를 절약 할 수 있습니다. 여전히 개선의 여지가있을 수 있습니다. 로 대체 <-되었습니다 =. 항상 이것으로 행운을 빕니다는 아니지만 이번에는 효과가있었습니다.

cat(if(prod(i=scan(sep='/'))<0)'-',(n=(i=abs(i))[1])%/%(d=i[2]),'.',sep='');repeat cat((n=n%%d*10)%/%d)

시운전

> cat(if(prod(i=scan(sep='/'))<0)'-',(n=(i=abs(i))[1])%/%(d=i[2]),'.',sep='');repeat cat((n=n%%d*10)%/%d)
1: -1/3
3: 
Read 2 items
-0.33333333333333333333...
> cat(if(prod(i=scan(sep='/'))<0)'-',(n=(i=abs(i))[1])%/%(d=i[2]),'.',sep='');repeat cat((n=n%%d*10)%/%d)
1: -5/-4
3: 
Read 2 items
1.250000000000000000000...

1

파이썬 3 107 115 바이트

a,b=map(int,input().split("/"))
print(("%.1f"%(a/b))[:-1],end="")
b=abs(b)
while 1:a=abs(a)%b*10;print(a//b,end="")

꽤 직설적 인:

  • 분자와 분모를 입력하십시오
  • 소수점 뒤에 1 자리의 몫을 출력 한 다음 마지막 자리를 벗어납니다 (예 : -1/3-> -0.)
  • 절대 값 가져 오기 *
  • 고리:
    • 분모를 나눈 후 분자가 남습니다.
    • 분자에 10을 곱하십시오
    • 다음 자리수로 출력되는 정수 몫

* (에 대한 계산 a은 루프 내에서 이동되어 몇 바이트를 절약했습니다.)

편집 : 음수 분수가 -1 인 버그가 수정되었습니다.


0

파이썬 2.7, 209 바이트

from sys import*;m,o=1,lambda x:stdout.write(str(x));a,b=[int(x)for x in argv[1].split('/')]
o(str(a*b)[0]);a,b=abs(a),abs(b);o('0'*(b>a))
while 1:
 while not((m*a)/b):o('0.'[m==1]);m*=10
 o((m*a)/b);a=(m*a)%b

편집하다:

이제 요청한대로 모든 문자를 같은 줄에 출력합니다.

edit2 :

이제 요청대로 명령 줄 인수에서 분수를 읽습니다. :)


1
몇 가지 팁 : 1) map목록 이해 대신 사용 하면 상당히 절약됩니다. 2) 주위에 괄호가 필요하지 않습니다 m*a, 그 위치의 어느 하나에 *, %그리고 /모두 같은 우선 순위와 왼쪽 연관된다; 3) 3 행의 0 또는 점 논리는 "0."[m==1]어쨌든 인쇄하기 때문에 로 단순화 될 수 있습니다 . 4) 아마도 필요에 따라 숫자 인수를 백틱이있는 문자열로 설정 o=stdout.write하고 변환 하기 위해 문자를 저장 합니다.
DLosc

1
또한 코드가 음수로 작동하지 않는 것 같습니다 . 대신 1/-3제공 -1.666666666합니다 -0.333333333.
DLosc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.