소수를 설명하십시오


12

의 형태로 소수가 주어지면 <float>, <precision>, 부동 소수점 (즉, 분수)의 그래픽 표현을 그립니다. 예 :

  1. 입력 : 6.75, 4출력 :

    6||| 7
     ---- 
    

    6.75(입력의 첫 번째 숫자)는 설명 할 숫자이고, 입력 4의 두 번째 숫자는 파이프 아래의 대시 수입니다. 6바닥이 6.75이고 7, 은폐되어 6.75있습니다. 파이프 수는 decimal part of first input number * second input number입니다.

  2. 입력 : 10.5, 6출력 :

    10|||   11
      ------
    
  3. 입력 : 20.16, 12출력

    20||          21
      ------------
    

    .16 실제로는 1.92 개의 파이프가 필요하지만 1.92 개의 파이프를 그릴 수 없기 때문에 2 개로 멈 춥니 다.

  4. 입력 : 1.1, 12출력 :

    1|           2
     ------------
    

    .1 이 경우 1.2 파이프이므로 1 파이프로 바닥이됩니다.

  5. 또한 가장자리 케이스. 입력 : 5, 4(즉, 숫자는 정수임), 출력 :

    5    6
     ----
    

  • 설명 할 숫자는 사용자의 언어 능력에 의해서만 제한되는 긍정적 인 실수입니다.
  • 정밀도 숫자는 2보다 큰 짝수 (즉, 최소 요구 정밀도는 4)입니다. 임의적 일 수도 있습니다.
  • > = n.5 파이프는 n + 1 로 반올림됩니다 (즉, 1.5는 2로 반올림되고 2.5는 3으로 반올림 됨). <n.5 파이프는 n 으로 반올림됩니다 (즉, 1.4는 1로 반올림되고 2.4는 2로 반올림 됨).
  • 귀하의 언어에보다 편리하다면 입력을 배열로 가져갈 수 있습니다 (예 :) [6.75, 4]. 입력을 역순으로 입력하는 경우, [4, 6.75]답변에 입력하십시오.

원하는 출력 형식이 무엇인지 정확하게 지정할 수 있습니까?
isaacg

@isaacg 나는 네 가지 예제 출력을 보여 주었다. 불분명합니까?
nicael

발견 된 몇 가지 코너 사례가있는 것 같습니다. 예를 들면 입력 5.0 4: 그것은에서 그리 않는 56또는 행 45, 또는 하나가 허용? 입력 1.25 2: 0 또는 1이 |있고 왜 (반올림 규칙이 무엇입니까)? 입력의 첫 번째 숫자는 양수 여야합니까? 최대 정밀도와 크기는 얼마입니까? 입력의 두 번째 숫자는 양수 여야합니까? 음수이면 거꾸로 그리는가?
피터 테일러

@Peter Clarified.
nicael

나는 당신이 반올림 규칙을 다루지 않았다고 생각합니다.
피터 테일러

답변:


6

CJam, 32 바이트

l~1md@:X*mo'|*XSe]1$)NW$s,S*'-X*

공백으로 구분하여 정밀도를 먼저 사용하고 소수점을 사용합니다.

모든 테스트 사례를 실행하십시오.

설명

l~   e# Read input and evaluate, pushing precision and decimal on the stack.
1md  e# Divmod 1, separating the decimal into integer and fractional part.
@:X  e# Pull up precision, store in X.
*mo  e# Multiply precision by fractional part and round.
'|*  e# Push that many vertical bars.
XSe] e# Pad with length X with spaces.
1$)  e# Copy integer part and increment.
N    e# Push linefeed.
W$   e# Copy integer part.
s,   e# Get number of digits as length of string representation.
S*   e# Push that many spaces, to indent the hyphens correctly.
'-X* e# Push X hyphens.

네, 잘 작동하는 것 같습니다.
nicael

4

Mathematica, 119 바이트

a=ToString;b=Array;a[c=Floor@#]<>{b["|"&,d=Round[#2#~Mod~1]],b[" "&,#2-d],a[c+1],"
"," "&~b~IntegerLength@c,"-"&~b~#2}&

나는 시도했다 ... 테스트 :

In[1]:= a=ToString;b=Array;f=a[c=Floor@#]<>{b["|"&,d=Round[#2#~Mod~1]],b[" "&,#2-d],a[c+1],"\n"," "&~b~IntegerLength@c,"-"&~b~#2}&;

In[2]:= f[6.75, 4]

Out[2]= 6||| 7
         ----

In[3]:= f[10.5, 6]

Out[3]= 10|||   11
          ------

In[4]:= f[20.16, 12]

Out[4]= 20||          21
          ------------

In[5]:= f[1.1, 12]

Out[5]= 1|           2
         ------------

In[6]:= f[5, 4]

Out[6]= 5    6
         ----

실제 데모를 제공 할 수 있습니까, 아니면 불가능합니까?
nicael


3

자바 253 206 181 바이트

@Kenney 덕분에 한 번 사용 된 조건 및 변수를 인라인하고 중복 변수를 정렬하여 47 바이트를 절약했습니다.

@Kenney 덕분에 삼항 연산자로 2 개의 루프를 인라인하여 25 바이트를 다시 절약했습니다.

순수한 문자열 조작 :

인라인 루프 버전 (181 바이트) :

String m(float f,int p){int g=(int)f,i=0;String h="",q=""+g;int c=q.length();for(;i<c+p;)h+=i++<c?" ":"-";for(i=c;i<p+c;)q+=i++<c+Math.round((f-g)*p)?"|":" ";return q+(g+1)+"\n"+h;}

4 루프 버전 (206 바이트) :

String m(float f,int p){int g=(int)f,i=0;String h="",q=""+g;int c=q.length();for(;i++<c;)h+=" ";for(;i<=c+p;i++)h+="-";for(i=c;i<c+Math.round((f-g)*p);i++)q+="|";for(;i++<p+c;)q+=" ";return q+(g+1)+"\n"+h;}

언 골프 버전 :

String m(float f,int p){
//initialize some useful values, d is the number of pipes needed
int g=(int)f,d=Math.round((f-g)*p),i=0;
String h="",q=""+g;//append the floored value to the pipe string first
int c=q.length();
for(;i<c;i++)h+=" ";//pad hyphen string with spaces for alignment
for(++i;i<=c+p;i++)h+="-";//append hyphens
for(i=c;i<c+d;i++)q+="|";//append pipes
for(;i<p+c;i++)q+=" ";//append spaces for padding
return q+(g+1)+"\n"+h;}//concatenate the strings in order, separating the strings with a UNIX newline, and return it.

여기 예를 들어 작업 ideone.com . 전체 프로그램은 STDIN 입력을로 받아들 <float>,<precision>입니다.

참고 : Java의 Math.round(float)반올림 RoundingMode.HALF_UP은 기본값으로 사용 되며 OP의 필수 동작입니다.

제공된 테스트 사례의 결과는 OP가 제공 한 것과 다릅니다.


나는 당신이 상관하지 않기를 바랍니다! 당신은 제거 할 잊었 a당신은 210 바이트에서 얻는 또 다른 (23)을 절약 할 수있다 (233)에 당신을 설정 (사용되지 않음) : 교체 q.length()와 함께하는 b13 저장합니다 int g=(int)f, b=(""+g).length(), c=b, i=0;. for세이브 6 의 상태에서 반복자를 증가 시키고 인라인 d(한 번 사용)은 4 :를 저장 int c = b; for(;i++<b;)h+=" "; for(;i++<=b+p;)h+="-"; for(i=c;i<c+Math.round((f-g)*p);i++)q+="|"; for(;i++<p+b;)q+=" ";합니다.
Kenney

또한 누군가가 이스케이프 시퀀스 대신 실제 줄 바꿈을 사용하도록 제안했지만 Windows에 있기 때문에 어쨌든 2 바이트 CRLF입니다.\n
Tamoghna Chowdhury

니스-예, b쓸모 없게되었습니다 ;-) 당신은 여전히 ​​2 번째에 1 바이트를 저장할 수 있습니다 : for(;i++<=c+p;). 윈도우에서 유닉스 줄 끝으로 파일을 저장할 수 있지만 불행히도 자바는 여러 줄 문자열을 허용하지 않습니다 .
Kenney

@ 케니, 아니 나는 그것을 시도했다. 하이픈이 잘못 정렬됩니다. 어쨌든 자바는 그 일에 적합한 사람이 아니다.
Tamoghna Chowdhury

2 개의 for 루프 만 사용하여 181 바이트로 줄였습니다.for(;i<c+p;)h+=i++<c?" ":"-";for(i=c;i<p+c;)q+=i++<c+Math.round((f-g)*p)?"|":" ";
Kenney

3

자바 스크립트 ES6, (105) 104 바이트

(f,p)=>(i=f|0)+("|".repeat(j=(f-i)*p+.5|0)+" ".repeat(p-j))+(i+1)+(`
`+i).replace(/\d/g," ")+"-".repeat(p)

어쨌든 ՊՓԼՃՐՊՃՈԲՍԼ를 어떻게 입력합니까? 덕분에 1 바이트를 절약했습니다.


죄송합니다, 대시가 출력의 일부라는 것을 몰랐습니다. 공간을 시각화하기 위해 거기에 있다고 생각했습니다.
Neil

(f,p)=>(i=f|0)+("|"[r="repeat"](j=(f-i)*p+.5|0)+" "[r](p-j))+(i+1)+("\n"+i).replace(/\d/g," ")+"-"[r](p)
Mama Fun Roll

예, \n실제 줄 바꿈으로 바꾸십시오 . 템플릿 문자열로 묶어야합니다.
Mama Fun Roll

2

하스켈, 113 바이트

(%)=replicate.round
s=show
x!y|(n,m)<-properFraction x=[s n,(y*m)%'|',(y-y*m)%' ',s$n+1,"\n",s n>>" ",y%'-']>>=id

사용 예 :

*Main> putStrLn $ 20.16 ! 12
20||          21
  ------------

properFraction소수를 정수와 분수 부분으로 나눕니다. 출력은 단일 문자열 (via >>=id) 로 연결된 부품 (초기 번호, 막대, 공백 등 )의 목록입니다.


이것의 온라인 데모를 볼 수 있습니까?
nicael

@nicael : 데모 ( main전체 프로그램 래퍼 포함).
nimi

것 같은데 괜찮 모든의 (BTW : 시험 , 그것은 더 편리 컴파일러 있다고 생각한다).
nicael

2

MATL , 49 바이트

2#1\tYUbiXK*Yo'|'1bX"tnKw-Z"hb1+YUhht4Y2m13*_45+c

언어 / 컴파일러 6.0.0 릴리스를 사용합니다 . Matlab 또는 Octave에서 실행됩니다.

챌린지에서와 같은 순서로 숫자를받습니다.

>> matl
 > 2#1\tYUbiXK*Yo'|'1bX"tnKw-Z"hb1+YUhht4Y2m13*_45+c
 >
> 20.16
> 12
20||          21
  ------------

>> matl
 > 2#1\tYUbiXK*Yo'|'1bX"tnKw-Z"hb1+YUhht4Y2m13*_45+c
 >
> 5
> 4
5    6
 ----

설명

2#1\       % implicit input 1st number. Separate decimal and integer part
tYU        % duplicate integer part and convert to string
biXK*Yo    % input 2nd number. Copy it. Multiply by decimal part of 1st number and round
'|'1bX"    % row vector of as many '|' as needed
tnKw-Z"    % row vector of as many spaces as needed
h          % concat horiontally
b1+YUhh    % integer part of 1st number plus 1. Convert to string. Concat twice
t4Y2m      % detect numbers in this string
13*_45+c   % transform numbers into spaces, and non-numbers into '|'
           % implicitly display both strings

온라인 통역사가 있습니까?
nicael

아직 :-( Matlab 또는 Octave에서 실행
Luis Mendo

2

펄, 90 바이트

print$f,"|"x($d=.5+($b=pop)*(($a=pop)-($f=0|$a))),$"x(1+$b-$d),$f+1,$/,$"x length$f,"-"x$b

명령 줄 인수로 입력을 예상합니다. 파일 (예를 들어 저장 위치 90.pl)로 실행perl 90.pl 6.75 4

의견

print $f,                        # floored input (initialized below due to expr nesting)
      "|" x ($d=.5+              # rounded pipe count (`x` operator casts to int)
             +($b=pop)           # second argument  (executed first)
             *( ($a=pop)         # first argument   (executed second)
               -($f=0|$a) )      # minus floored first argument = fractional part
            ),
      $"x(1+$b-$d),              # spaces
      $f+1,                      # floored + 1
      $/,                        # newline
      $"  x length $f,           # 2nd line alignment
      "-" x $b                   # the 'ruler'

1

Stackgoat , 31 27 바이트

CFv1%C*D'|^w1P-Y^vHXNY^w'-^

대부분의 다른 답변과 비슷합니다. 골프를 더 할 수 있는지 봅시다. 입력은 쉼표로 구분되거나 공백으로 구분되거나 거의 모든 것이 분리 될 수 있습니다.

이 도전 후에 Stackgoat가 만들어 졌기 때문에 비경쟁

설명

CF   // Input, floored, push to stack
v1%  // Decimal part
C*   // Times second part
D    // Duplicate that result
'|^  // Repeat | by previous number
w    // Second input
1P   // Move # of |'s to the top of stack
-    // Subtract
Y^   // Repeat " " by above number
vH   // Ceil first input
X    // Newline
Z+   // Add to 
N    // Get length of first #
Y^   // Repeat by spaces
w'-  // Repeat - second input times

1

루아, 157 바이트

길지만 더 짧은 해결책을 찾을 수 없습니다

function f(d,n)r=""a=math.floor(d)d,s=d-a,a..r for i=1,#s do r=r.." "end for i=1,n do s,r=s..(i-.5>n*d and" "or"|"),r.."-"end s=s..a+1 return s.."\n"..r end

언 골프

function g(d,n)
  r=""
  a=math.floor(d)
  d,s=d-a,a..r                         -- d now contains its decimal part
  for i=1,#s do r=r.." "end            -- padding the hyphens
  for i=1,n
  do
    s,r=s..(i-.5>n*d and" "or"|"),r.."-"
    -- s is concatenated with a "|" if i-.5>n*d, a space otherwise
  end
  s=s..a+1
  return s.."\n"..r
end

루아를 온라인으로 테스트 할 수 있습니다 . 다음 테스트 사례가 유용 할 수 있습니다. :)

function f(d,n)r=""a=math.floor(d)d,s=d-a,a..r for i=1,#s do r=r.." "end for i=1,n do s,r=s..(i-.5>n*d and" "or"|"),r.."-"end s=s..a+1 return s.."\n"..r end
print(f(16.75,4))
print(f(5,4))
print(f(20.16,12))

1

씨, 233 231 바이트

#include <stdlib.h>
#include <math.h>
i,n,l;main(c,v)char**v;{double m;l=atol(v[2]);n=(int)(modf(atof(v[1]),&m)*l+0.5);c=printf("%.f",m);for(;i++<l;)putchar(i>n?32:'|');printf("%.f\n",m+1);printf("%*s",c,"");for(;--i;)putchar(45);}

언 골프 드 :

#include <stdlib.h>
#include <math.h>
i,n,l;

main(c,v)
char**v;
{
    double m;
    l=atol(v[2]); /* Get length from command line */
    n=(int)(modf(atof(v[1]),&m)*l+0.5); /* Get number of pipes and lower limit */
    c=printf("%.f",m); /* print lower limit */

    /* print pipes and spaces */
    for(;i++<l;)
            putchar(i>n?32:'|');

    /* print upper limit */
    printf("%.f\n",m+1);

    /* print spaces before dashes */
    printf("%*s",c,"");

    /* print dashes */
    for(;--i;)
            putchar(45);
}

1

파이썬 3, 116108 바이트

def f(F,P):l=int(F);h,p=str(l+1),int((F-l)*P+.5);l=str(l);print(l+"|"*p+" "*(P-p)+h);print(" "*len(l)+"-"*P)

trinket.io 링크

문자 몇 개를 저장해 준 Seeq에게 감사합니다.

첫 번째 버전 :

def f(F,P):
 l=int(F)
 h,s,p=str(l+1)," ",int((F-l)*P+.5)
 l=str(l)
 print(l+"|"*p+s*(P-p)+h)
 print(s*len(l)+"-"*P)

언 골프 버전 :

def frac(F,P):
        low = int(F)
        high = low+1
        pipes = int((F-low)*P+.5)
        print(str(low)+"|"*pipes+" "*(P-pipes)+str(high))
        print(" "*len(str(low))+"-"*P)

실무 데모를 제공해 주시겠습니까?
nicael

이 trinket.io 링크가 작동해야합니다 trinket.io/python/409b1488f8
잭 Brounstein

실제로는 공간 리터럴을 저장하는 것보다 문자를 적게 사용합니다. 모든 줄을로 연결해도됩니다 ;. h한 번만 사용 하므로 인라인해야합니다. 약간의 문자를 저장해야합니다.
seequ

@Seeq 공간 리터럴을 잘 잡습니다. 초기에 두 번째 줄의 끝에 공백 패딩을 인쇄했습니다. 그것이 불필요하다는 것을 깨닫고 나서, 절약을 위해 코드를 다시 확인하지 않았습니다. 은 h까다 롭습니다. len마지막 두 행 의 연결 및 함수가 작동 l하려면 문자열이어야하므로 h로 바꿔야합니다 str(int(l)+1). h변환 하기 전에 설정 l하면 몇 문자가 저장됩니다.
잭 Brounstein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.