Ondalık sayıları açıklar


12

Şeklinde bir ondalık sayı verildiğinde <float>, <precision>, şamandıranın ondalık bölümünün (yani kesirin) grafik temsilini çizersiniz. Örnekler:

  1. Giriş:, 6.75, 4çıkış:

    6||| 7
     ---- 
    

    6.75(girişteki ilk sayı) açıklanacak sayıdır, 4(girişteki ikinci sayı) boruların altındaki tire sayısıdır. katlanmış 66.75, 7tavanlı 6.75. Boru sayısı decimal part of first input number * second input number.

  2. Giriş:, 10.5, 6çıkış:

    10|||   11
      ------
    
  3. Giriş:, 20.16, 12çıkış

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

    .16 aslında 1,92 boru alır, ancak 1,92 boru çizemediğim için 2'ye tavan yaparım.

  4. Giriş:, 1.1, 12çıkış:

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

    .1 bu durumda 1.2 boru, bu yüzden 1 boruya döşenmiştir.

  5. Ayrıca, bir kenar kasa. Girdi: 5, 4(yani sayı bir tamsayıdır), çıktı:

    5    6
     ----
    

  • Açıklanacak sayı, sadece dil yeteneklerinizle sınırlı olan pozitif şamandıradır.
  • Hassasiyet sayısı 2'den büyük, eşit bir tamsayıdır (yani gerekli minimum hassasiyet 4'tür). O da keyfi büyük olabilir.
  • > = n.5 boru n + 1'e yuvarlanır (yani 1.5 2'ye yuvarlanır ve 2.5 3'e yuvarlanır). <n.5 boru n'ye yuvarlanır (yani 1.4 1'e yuvarlanır ve 2.4 2'ye yuvarlanır).
  • Diliniz için daha uygunsa, girdiyi bir dizi olarak alabilirsiniz, örn [6.75, 4]. Girişi ters sırada alırsanız, yani [4, 6.75]lütfen cevabınızda belirtin.

İstenen çıktı biçiminin tam olarak ne olduğu konusunda daha açık olabilir misiniz?
isaacg

@isaacg Dört örnek çıktı gösterdim. Belirsiz olan nedir?
nicael

Ortaya çıkan birkaç köşe vakası var gibi görünüyor. Örneğin, giriş 5.0 4: bu çizmek etmez 5için 6ya da gelen 4için 5ya da her iki açıdan kabul gören bir? Girdi 1.25 2: 0 veya 1 |sn var mı ve neden (yani yuvarlama kuralı nedir)? Girişteki ilk sayının pozitif olması gerekir mi? Maksimum hassasiyeti ve büyüklüğü nedir? Girişteki ikinci sayının pozitif olması gerekir mi? Olumsuz ise, geriye doğru çekilir miyiz?
Peter Taylor

@Peter Açıklandı.
nicael

Yuvarlama kuralını kapsadığını sanmıyorum.
Peter Taylor

Yanıtlar:


6

CJam, 32 bayt

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

Bir boşlukla ayrılmış olarak önce kesinlik ve ondalık ikinciyi alır.

Tüm test senaryolarını çalıştırın.

açıklama

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.

Evet, iyi çalışıyor gibi görünüyor.
nicael

4

Mathematica, 119 bayt

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

Denedim ... Test:

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

Çalışan bir demo sunabilir misiniz, yoksa mümkün değil mi?
nicael


3

Java, 253 206 181 bayt

@Kenney sayesinde bir kez kullanılan koşul ve değişkenler ve gereksiz değişkenleri sıralayarak 47 bayt tasarruf etti.

Üçlü operatörlerle 2 döngüyü satır içine alarak @Kenney sayesinde tekrar 25 bayt tasarruf etti.

Saf Tel İşleme:

Satır içi döngüler sürümü (181 bayt):

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 döngü sürümü (206 bayt):

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

Ungolfed sürümü:

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.

Burada ideone.com'da çalışan örnek . Tam program STDIN girişini kabul eder <float>,<precision>.

NOT: Java'nın , OP'nin gerekli davranışı olan varsayılan olarak Math.round(float)kullanarak yuvarlar RoundingMode.HALF_UP.

Sağlanan test vakalarının çıktısı OP'nin sağladığı ile farklıydı.


Umarım umursamazsın! Sen kaldır unuttum aSen 210 bayt almak için başka bir 23 kurtarabilecek 233 puan alırken sizi ayarlayarak, (hiç kullanılmamış): değiştirirken q.length()ile b13 kaydeder: int g=(int)f, b=(""+g).length(), c=b, i=0;. Yineleyiciyi forkaydetme 6 durumunda arttırmak ve satır içi d(bir kez kullanılır) 4: tasarruf sağlar 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

Ayrıca, birisi kaçış dizisi yerine gerçek bir satırsonu kullanılmasını önerdi, ancak Windows'dayken, bu bir CRLF, yine de verilen 2 bayt\n
Tamoghna Chowdhury

Güzel - evet, beskimiş lutfen oldu ;-) etmeye devam edebilirsiniz için 2. 1 byte kaydet: for(;i++<=c+p;). Sen olabilir pencerelerde unix satır sonları ile dosyayı kaydetmek, ama ne yazık Java izin vermez satırlı dizeleri ..
Kenney

@Kenney, hayır. Bunu denedim. Yanlış hizalanmış tirelere yol açar. Java zaten iş için doğru adam değil.
Tamoghna Chowdhury

Ben döngüler için sadece 2 kullanarak 181 bayt aşağı var: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 bayt

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

1 bayt kaydedildi, um, ՊՓԼՃՐՊՃՈԲՍԼ nasıl yazıyorsun?


Maalesef, çizgilerin çıktının bir parçası olduğunu fark etmedim, boşlukları görselleştirmek için orada olduklarını düşündüm.
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

Ah evet, \ngerçek bir satırsonu ile değiştir . Ve şablon dizelerine sardığınızdan emin olun.
Mama Fun Roll

2

Haskell, 113 bayt

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

Kullanım örneği:

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

properFractionondalık sayıyı tamsayı ve kesir bölümüne böler. Çıktı, tek bir dizeye (yoluyla >>=id) birleştirilen parçaların (başlangıç ​​numarası, çubuklar, boşluklar, ...) bir listesidir .


Bunun çevrimiçi bir demosunu görmek mümkün mü?
nicael

@nicael: demo ( maintam bir program için bir sargı ile ).
nimi

Her şeyin yolunda olduğu anlaşılıyor (btw: orada test edildi , daha uygun bir derleyici olduğunu düşünün).
nicael

2

MATL , 49 bayt

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

Dilin / derleyicinin 6.0.0 sürümünü kullanır . Matlab veya Octave üzerinde çalışır.

Sayıları meydan okumadakiyle aynı sırada alır.

Örnekler

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

açıklama

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

Çevrimiçi çevirmeniniz var mı?
nicael

Henüz değil :-( Matlab veya Octave üzerinde çalışır
Luis Mendo

2

Perl, 90 bayt

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

Komut satırı bağımsız değişkenleri olarak girdi bekliyor. Bir dosyaya kaydedin (deyin 90.pl) ve farklı çalıştırınperl 90.pl 6.75 4

Yorumlarla

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 bayt

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

Diğer cevapların çoğuna benzer. Daha fazla golf oynayabileceğimi göreceğim. Giriş virgülle ayrılmış, boşlukla ayrılmış veya neredeyse ayrılmış herhangi bir şey olabilir.

Bu zorluktan sonra Stackgoat yapıldığı için rekabet etmiyor

açıklama

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 bayt

Uzun, ancak daha kısa bir çözüm bulamıyorum

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

Ungolfed

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

Lua'yı çevrimiçi test edebilirsiniz , aşağıdaki test senaryoları yararlı olabilir :)

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 bayt

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

Ungolfed:

#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, 116108 bayt

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 bağlantı

Seeq'e birkaç karakter kaydettiğiniz için teşekkür ederiz.

İlk versiyon:

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)

Ungolfed sürümü:

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)

Lütfen çalışan bir demo sunabilir misiniz?
nicael

Bu trinket.io bağlantısı çalışmalıdır: trinket.io/python/409b1488f8
Jack Brounstein

Boş alanı kullanmak yalnızca depolamaktan daha az karakter gerektirir. Ayrıca tüm satırlara da katılabilirsiniz ;. Sadece bir hkez kullanıyorsunuz, bu yüzden de satır içi yapmalısınız. Bazı karakterleri kaydetmeliyim.
seequ

@Seeq Alan değişmezinde iyi yakalama. İlk başlarda ikinci satırın sonunda beyaz boşluk dolgusu basıyordum; bunun gereksiz olduğunu fark ettikten sonra, tasarruf için kodu iki kez kontrol etmedim. Daha hhileli. Birleştirme ve lenson iki satırdaki fonksiyonun çalışması liçin bir dize holması gerekir , bu yüzden değiştirilmesi gerekir str(int(l)+1). hDönüştürmeden önce ayar yapmak lbirkaç karakter kaydeder.
Jack Brounstein
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.