Giải thích về số thập phân


12

Đưa ra một số thập phân ở dạng <float>, <precision>, bạn vẽ biểu diễn đồ họa của phần thập phân (tức là phần) của phần nổi. Ví dụ:

  1. Đầu vào : 6.75, 4, đầu ra:

    6||| 7
     ---- 
    

    6.75(số đầu tiên từ đầu vào) là số cần giải thích, 4(số thứ hai từ đầu vào) là số dấu gạch ngang bên dưới các đường ống. 6là 6,75 nổi, 7là trần 6.75. Số lượng ống là decimal part of first input number * second input number.

  2. Đầu vào : 10.5, 6, đầu ra:

    10|||   11
      ------
    
  3. Đầu vào : 20.16, 12, đầu ra

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

    .16 thực sự mất 1,92 ống, nhưng vì tôi không thể vẽ 1,92 ống, tôi trần nó thành 2.

  4. Đầu vào : 1.1, 12, đầu ra:

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

    .1 là 1,2 ống trong trường hợp này, vì vậy nó nổi lên 1 ống.

  5. Ngoài ra, một trường hợp cạnh. Đầu vào: 5, 4(tức là số là một số nguyên), đầu ra:

    5    6
     ----
    

  • Con số để giải thích là sự nổi tích cực, chỉ bị giới hạn bởi khả năng ngôn ngữ của bạn.
  • Số chính xác là số nguyên chẵn, lớn hơn 2 (tức là độ chính xác yêu cầu tối thiểu là 4). Nó có thể lớn tùy ý quá.
  • > = n.5 ống được làm tròn lên, đến n + 1 (tức là 1,5 được làm tròn thành 2 và 2,5 được làm tròn thành 3). <n.5 ống được làm tròn thành n (tức là 1,4 được làm tròn thành 1 và 2,4 được làm tròn thành 2).
  • Nếu nó thuận tiện hơn cho ngôn ngữ của bạn, bạn có thể lấy đầu vào dưới dạng một mảng, vd [6.75, 4]. Nếu bạn lấy đầu vào theo thứ tự đảo ngược, nghĩa là [4, 6.75], vui lòng chỉ định nó trong câu trả lời của bạn.

Bạn có thể cụ thể hơn về chính xác định dạng đầu ra mong muốn là gì không?
isaacg

@isaacg Tôi đã hiển thị bốn kết quả đầu ra. Có gì không rõ ràng?
nicael

Dường như có một vài trường hợp góc được phát hiện. Ví dụ như đầu vào 5.0 4: nó rút ra từ 5để 6hoặc từ 4để 5, hoặc là một trong hai có thể chấp nhận? Đầu vào 1.25 2: nó có 0 hoặc 1 |giây không, và tại sao (tức là quy tắc làm tròn)? Liệu số đầu tiên trong đầu vào có phải là tích cực? Độ chính xác và độ lớn tối đa của nó là bao nhiêu? Số thứ hai trong đầu vào có phải là dương không? Nếu nó âm tính, chúng ta có vẽ ngược không?
Peter Taylor

@Peter làm rõ.
nicael

Tôi không nghĩ bạn đã bao quát quy tắc làm tròn.
Peter Taylor

Câu trả lời:


6

CJam, 32 byte

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

Lấy độ chính xác đầu tiên và giây thứ hai, cách nhau bởi một khoảng trắng.

Chạy tất cả các trường hợp thử nghiệm.

Giải trình

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.

Đúng, dường như làm việc tốt.
nicael

4

Toán học, 119 byte

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

Tôi đã thử ... Kiểm tra:

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
         ----

Bạn có thể cung cấp một bản demo hoạt động, hoặc nó không thể?
nicael


3

Java, 253 206 181 byte

Đã lưu 47 byte nhờ @Kenney bằng cách nội tuyến các điều kiện và biến được sử dụng một lần và sắp xếp các biến dư thừa.

Đã lưu 25 byte một lần nữa nhờ @Kenney bằng cách đặt 2 vòng lặp với các toán tử ternary.

Thao tác chuỗi thuần túy:

Phiên bản vòng lặp nội tuyến (181 byte):

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;}

Phiên bản 4 vòng (206 byte):

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;}

Phiên bản bị đánh cắp:

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.

Ví dụ làm việc ở đây tại ideone.com . Chương trình đầy đủ chấp nhận đầu vào STDIN là <float>,<precision>.

LƯU Ý: Các Math.round(float)vòng của Java sử dụng RoundingMode.HALF_UPlàm mặc định, đó là hành vi bắt buộc của OP.

Đầu ra của các trường hợp thử nghiệm được cung cấp khác với so với những gì OP cung cấp.


Tôi hy vọng bạn không phiền! Bạn đã quên xóa a(không bao giờ sử dụng), đặt bạn ở mức 233. Bạn có thể lưu thêm 23 để nhận 210 byte: thay thế q.length()bằng blưu 13 : int g=(int)f, b=(""+g).length(), c=b, i=0;. Tăng bộ lặp trong điều kiện forlưu 6 và nội tuyến d(được sử dụng một lần) tiết kiệm 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

Ngoài ra, một người nào đó đã đề xuất sử dụng một dòng mới thực sự thay vì chuỗi thoát, nhưng vì tôi đang ở trên Windows, đó là CRLF, dù sao thì 2 byte đã được đưa ra\n
Tamoghna Chowdhury

Đẹp - vâng, bđã trở nên lỗi thời ;-) Bạn vẫn có thể lưu 1 byte trong lần 2 cho : for(;i++<=c+p;). Bạn có thể lưu tệp với các kết thúc dòng unix trên windows, nhưng thật không may, Java không cho phép các chuỗi đa dòng ..
Kenney

@Kenney, không. Tôi đã thử nó. Nó dẫn đến các dấu gạch nối sai. Dù sao thì Java cũng không phải là người phù hợp với công việc.
Tamoghna Chowdhury

Tôi đã giảm xuống còn 181 byte bằng cách chỉ sử dụng 2 cho các vòng lặp:for(;i<c+p;)h+=i++<c?" ":"-";for(i=c;i<p+c;)q+=i++<c+Math.round((f-g)*p)?"|":" ";
Kenney

3

Javascript ES6, 105 104 byte

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

Đã lưu 1 byte nhờ, ừm, làm thế nào để bạn gõ ՊՓԼՃՐՊՃՈԲՍԼ?


Xin lỗi, tôi đã không nhận ra dấu gạch ngang là một phần của đầu ra, tôi nghĩ rằng chúng chỉ ở đó để hình dung các không gian.
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

Oh yeah, thay thế \nbằng một dòng mới thực tế. Và hãy chắc chắn để bọc nó trong chuỗi mẫu.
Mama Fun Roll

2

Haskell, 113 byte

(%)=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

Ví dụ sử dụng:

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

properFractionchia phần thập phân thành phần nguyên và phần của nó. Đầu ra là một danh sách các phần (số ban đầu, thanh, dấu cách, ...) được nối thành một chuỗi (thông qua >>=id).


Có thể xem một bản demo trực tuyến này?
nicael

@nicael: demo (với maintrình bao bọc cho một chương trình đầy đủ).
nimi

Có vẻ như mọi thứ đều ổn (btw: đã thử nghiệm ở đó , nghĩ rằng đó là một trình biên dịch thuận tiện hơn).
nicael

2

MATL , 49 byte

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

Sử dụng phát hành 6.0.0 của ngôn ngữ / trình biên dịch. Chạy trên Matlab hoặc Octave.

Lấy số theo thứ tự giống như trong thử thách.

Ví dụ

>> 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
 ----

Giải trình

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

Bạn có một thông dịch viên trực tuyến?
nicael

Chưa :-( Chạy trên Matlab hoặc Octave
Luis Mendo

2

Perl, 90 byte

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

Dự kiến ​​đầu vào là đối số dòng lệnh. Lưu trong một tệp (nói 90.pl) và chạy nhưperl 90.pl 6.75 4

Với nhận xét

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 byte

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

Tương tự như hầu hết các câu trả lời khác. Tôi sẽ xem nếu tôi có thể chơi gôn nhiều hơn. Đầu vào có thể được phân tách bằng dấu phẩy, phân tách không gian hoặc hầu hết mọi thứ được phân tách.

Không cạnh tranh vì Stackgoat đã được thực hiện sau thử thách này

Giải trình

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

Lua, 157 byte

Lâu, nhưng không thể tìm ra giải pháp ngắn hơn

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

Ung dung

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

Bạn có thể kiểm tra lua trực tuyến , các trường hợp kiểm tra sau đây có thể hữu ích :)

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

C, 233 231 byte

#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);}

Ung dung:

#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

Python 3, 116 108 byte

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)

liên kết trinket.io

Cảm ơn Seeq vì đã lưu một vài ký tự.

Phiên bản đầu tiên:

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)

Phiên bản bị đánh cắ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)

Bạn có thể vui lòng cung cấp một bản demo làm việc?
nicael

Liên kết trinket.io này sẽ hoạt động: trinket.io/python/409b1488f8
Jack Brounstein

Nó thực sự cần ít ký tự hơn để chỉ sử dụng không gian theo nghĩa đen hơn là lưu trữ nó. Bạn cũng có thể chỉ cần tham gia tất cả các dòng với ;. Bạn chỉ sử dụng hmột lần, vì vậy bạn cũng nên nội tuyến nó. Phải để tiết kiệm một số ký tự.
xem

@Seeq Bắt tốt trên không gian theo nghĩa đen. Đầu tôi đã in phần đệm trắng ở cuối dòng thứ hai; sau khi tôi nhận ra rằng điều đó là không cần thiết, tôi đã không kiểm tra lại mã để tiết kiệm. Cái hnày khó hơn Để nối và lenhàm trong hai hàng cuối cùng hoạt động, lphải là một chuỗi, vì vậy hsẽ cần phải được thay thế bằng str(int(l)+1). Cài đặt htrước khi chuyển đổi sẽ llưu một vài ký tự.
Jack Brounstein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.