Jelaskan desimal

12

Diberikan desimal dalam bentuk <float>, <precision>, Anda menggambar representasi grafis dari bagian desimal (yaitu fraksi) dari float. Contoh:

  1. Input:, 6.75, 4output:

    6||| 7
     ---- 
    

    6.75(angka pertama dari input) adalah angka untuk dijelaskan, 4(angka kedua dari input) adalah jumlah tanda hubung di bawah pipa. 6adalah lantai 6.75, 7adalah langit-langit 6.75. Jumlah pipa adalah decimal part of first input number * second input number.

  2. Input:, 10.5, 6output:

    10|||   11
      ------
    
  3. Input:, 20.16, 12output

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

    .16 sebenarnya membutuhkan 1,92 pipa, tetapi karena saya tidak bisa menggambar 1,92 pipa, saya hitung menjadi 2.

  4. Input:, 1.1, 12output:

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

    .1 adalah 1,2 pipa dalam hal ini, jadi lantai ke 1 pipa.

  5. Juga, kasing tepi. Input: 5, 4(yaitu angka bilangan bulat), output:

    5    6
     ----
    

  • Angka untuk dijelaskan adalah float positif, hanya dibatasi oleh kemampuan bahasa Anda.
  • Angka presisi adalah bilangan bulat genap, lebih besar dari 2 (yaitu presisi minimum yang diperlukan adalah 4). Ini bisa besar sembarang.
  • > = n.5 pipa dibulatkan, ke n + 1 (yaitu 1,5 dibulatkan menjadi 2 dan 2,5 dibulatkan menjadi 3). <n.5 pipa dibulatkan menjadi n (yaitu 1,4 dibulatkan menjadi 1 dan 2,4 dibulatkan menjadi 2).
  • Jika akan lebih nyaman untuk bahasa Anda, Anda dapat mengambil input sebagai array, mis [6.75, 4]. Jika Anda mengambil input dalam urutan terbalik, yaitu [4, 6.75], silakan tentukan dalam jawaban Anda.
nicael
sumber
Bisakah Anda lebih spesifik tentang apa format output yang diinginkan?
isaacg
@isaacg Saya telah menunjukkan empat contoh output. Apa yang tidak jelas?
nicael
Tampaknya ada beberapa kasus sudut terbuka. Misalnya masukan 5.0 4: apakah itu menarik dari 5ke 6atau dari 4ke 5, atau baik diterima? Input 1.25 2: apakah memiliki 0 atau 1 |, dan mengapa (yaitu apa aturan pembulatan)? Apakah angka pertama dalam input harus positif? Berapa presisi dan besarnya maksimum? Apakah angka kedua dalam input harus positif? Jika negatif, apakah kita mundur?
Peter Taylor
@ Peter Klarifikasi.
nicael
Saya tidak berpikir Anda sudah membahas aturan pembulatan.
Peter Taylor

Jawaban:

6

CJam, 32 byte

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

Mengambil ketelitian pertama dan desimal kedua, dipisahkan oleh spasi.

Jalankan semua test case.

Penjelasan

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.
Martin Ender
sumber
Yap, sepertinya bekerja dengan baik.
nicael
4

Mathematica, 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}&

Saya mencoba ... Menguji:

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
         ----
LegionMammal978
sumber
Bisakah Anda memberikan demo yang berfungsi, atau tidak mungkin?
nicael
3

Japt, 47 46 byte

Uf +'|pA=ºU-Uf)*V c)+SpV-A +Uc +R+SpUk l)+'-pV

Hanya sekelompok menambahkan dan mengulangi.

Cobalah online

Downgoat
sumber
(U-Uf)sama dengan U%1, menghemat dua byte.
ETHproduk
3

Java, 253 206 181 byte

Disimpan 47 byte berkat @ Kenney dengan menguraikan kondisi dan variabel yang digunakan sekali, dan memilah variabel yang berlebihan.

Disimpan 25 byte lagi berkat @ Kenney dengan inlining 2 loop dengan operator ternary.

Manipulasi String Murni:

Versi loop inlined (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;}

4 versi loop (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;}

Versi tidak disatukan:

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.

Contoh kerja di sini di ideone.com . Program lengkap menerima input STDIN sebagai <float>,<precision>.

CATATAN: Math.round(float)Putaran Java menggunakan RoundingMode.HALF_UPsebagai default, yang merupakan perilaku OP yang diperlukan.

Output dari kasus uji yang diberikan berbeda dengan apa yang diberikan OP.

Tamoghna Chowdhury
sumber
Saya harap kamu tidak keberatan! Anda lupa untuk menghapus a(tidak pernah digunakan), pengaturan Anda di 233. Anda bisa menghemat 23 lain untuk mendapatkan 210 byte: mengganti q.length()dengan bmenghemat 13: int g=(int)f, b=(""+g).length(), c=b, i=0;. Incrementing iterator di kondisi formenghemat 6, dan inlining d(digunakan sekali) menghemat 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
Juga, seseorang menyarankan untuk menggunakan baris baru yang sebenarnya alih-alih urutan pelarian, tetapi karena saya menggunakan Windows, itu adalah CRLF, 2 byte tetap diberi\n
Tamoghna Chowdhury
Bagus - ya, bmenjadi aswell usang ;-) Anda masih dapat menyimpan 1 byte di 2 untuk: for(;i++<=c+p;). Anda dapat menyimpan file dengan ujung unix line di windows, tetapi sayangnya Java tidak mengizinkan string multiline ..
Kenney
@ Kenney, tidak. Saya mencobanya. Ini mengarah pada tanda hubung yang tidak selaras. Java bukan orang yang tepat untuk pekerjaan itu.
Tamoghna Chowdhury
Saya turun ke 181 byte dengan menggunakan hanya 2 untuk loop: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)

Disimpan 1 byte berkat, um, bagaimana Anda mengetik ՊՓԼՃՐՊՃՈԲՍԼ?

Neil
sumber
Maaf, saya tidak menyadari tanda hubung adalah bagian dari output, saya pikir mereka hanya ada untuk memvisualisasikan spasi.
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 ya, ganti \ndengan baris baru yang sebenarnya. Dan pastikan untuk membungkusnya dengan string template.
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

Contoh penggunaan:

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

properFractionmembelah desimal menjadi bagian bilangan bulat dan pecahannya. Outputnya adalah daftar bagian-bagian (angka awal, bar, spasi, ...) yang disatukan menjadi string tunggal (via >>=id).

nimi
sumber
Apakah mungkin melihat demo online ini?
nicael
@nicael: demo (dengan mainpembungkus untuk program penuh).
nimi
Sepertinya semuanya baik-baik saja (btw: diuji di sana , berpikir itu kompiler yang lebih nyaman).
nicael
2

MATL , 49 byte

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

Menggunakan rilis 6.0.0 dari bahasa / kompiler. Berjalan di Matlab atau Oktaf.

Mengambil angka dalam urutan yang sama seperti pada tantangan.

Contohnya

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

Penjelasan

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
Luis Mendo
sumber
Apakah Anda memiliki juru bahasa online?
nicael
Belum :-( Berjalan di Matlab atau Oktaf
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

Mengharapkan input sebagai argumen commandline. Simpan dalam file (katakanlah 90.pl) dan jalankan sebagaiperl 90.pl 6.75 4

Dengan komentar

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'
Kenney
sumber
1

Stackgoat , 31 27 byte

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

Mirip dengan sebagian besar jawaban lainnya. Saya akan melihat apakah saya bisa bermain golf lebih banyak. Input dapat dipisahkan dengan koma, dipisahkan oleh ruang, atau hampir apa saja yang dipisahkan.

Non bersaing karena Stackgoat dibuat setelah tantangan ini

Penjelasan

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
Downgoat
sumber
1

Lua, 157 byte

Panjang, tetapi tidak dapat menemukan solusi yang lebih pendek

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

Tidak disatukan

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

Anda dapat menguji lua online , test case berikut dapat bermanfaat :)

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))
Katenkyo
sumber
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);}

Tidak Disatukan:

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

tautan trinket.io

Terima kasih kepada Seeq karena menyimpan beberapa karakter.

Versi pertama:

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)

Versi tidak disatukan:

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)
Jack Brounstein
sumber
Bisakah Anda memberikan demo yang berfungsi?
nicael
Tautan trinket.io ini seharusnya berfungsi: trinket.io/python/409b1488f8
Jack Brounstein
Sebenarnya dibutuhkan lebih sedikit karakter untuk hanya menggunakan spasi literal daripada menyimpannya. Anda juga dapat bergabung dengan semua baris ;. Anda hanya menggunakan hsekali, jadi Anda harus inline juga. Seharusnya menyimpan beberapa karakter.
seequ
@Seeq Tangkapan bagus di luar angkasa literal. Awal saya mencetak padding ruang putih di akhir baris kedua; setelah saya menyadari bahwa itu tidak perlu, saya tidak memeriksa kode untuk penghematan. Ini hlebih sulit. Untuk penggabungan dan lenfungsi dalam dua baris terakhir untuk bekerja, lharus berupa string, jadi hperlu diganti str(int(l)+1). Pengaturan hsebelum konversi lmenyimpan beberapa karakter.
Jack Brounstein