Spiega i decimali


12

Dato un decimale sotto forma di <float>, <precision>, si disegna la rappresentazione grafica della parte decimale (cioè la frazione) del float. Esempi:

  1. Ingresso:, 6.75, 4uscita:

    6||| 7
     ---- 
    

    6.75(primo numero dall'input) è il numero da spiegare, 4(il secondo numero dall'input) è il numero di trattini sotto i tubi. 6è il 6.75 pavimentato, 7è il soffitto 6.75. Il numero di pipe è il decimal part of first input number * second input number.

  2. Ingresso:, 10.5, 6uscita:

    10|||   11
      ------
    
  3. Ingresso:, 20.16, 12uscita

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

    .16 prende effettivamente 1,92 tubi, ma poiché non riesco a disegnare 1,92 tubi, lo installo a 2.

  4. Ingresso:, 1.1, 12uscita:

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

    .1 è 1,2 tubi in questo caso, quindi è pavimentato a 1 tubo.

  5. Inoltre, un caso limite. Input: 5, 4(ovvero il numero è un numero intero), output:

    5    6
     ----
    

  • Il numero da spiegare è il galleggiante positivo, limitato solo dalle tue abilità linguistiche.
  • Il numero di precisione è un numero intero pari, maggiore di 2 (ovvero la precisione minima richiesta è 4). Può anche essere arbitrariamente grande.
  • > = n. 5 tubi sono arrotondati per eccesso, a n + 1 (ovvero 1,5 è arrotondato a 2 e 2,5 è arrotondato a 3). <n.5 tubi arrotondati a n (ovvero 1,4 è arrotondato a 1 e 2.4 è arrotondato a 2).
  • Se sarebbe più conveniente per la tua lingua, puoi prendere l'input come un array, ad es [6.75, 4]. Se si prende l'input nell'ordine inverso, cioè si [4, 6.75]prega di specificarlo nella risposta.

Puoi essere più preciso su quale sia esattamente il formato di output desiderato?
Isaacg,

@isaacg Ho mostrato quattro output di esempio. Cosa non è chiaro?
nicael

Sembra che ci siano alcuni casi d'angolo scoperti. Ingresso es 5.0 4: ne trae 5a 6o da 4a 5, o è o accettabile? Input 1.25 2: ha 0 o 1 |s, e perché (ovvero qual è la regola di arrotondamento)? Il primo numero nell'input deve essere positivo? Qual è la sua massima precisione e grandezza? Il secondo numero nell'input deve essere positivo? Se è negativo, disegniamo all'indietro?
Peter Taylor,

@Peter Chiarito.
nicael

Non penso che tu abbia coperto la regola di arrotondamento.
Peter Taylor,

Risposte:


6

CJam, 32 byte

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

Prende prima la precisione e il secondo decimale, separati da uno spazio.

Esegui tutti i casi di test.

Spiegazione

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.

Sì, sembra funzionare bene.
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}&

Ho provato ... 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
         ----

Potresti forse fornire una demo funzionante o non è possibile?
nicael


3

Java, 253 206 181 byte

Risparmiato 47 byte grazie a @Kenney incorporando condizioni e variabili utilizzate una volta e risolvendo variabili ridondanti.

Salvati di nuovo 25 byte grazie a @Kenney incorporando 2 loop con operatori ternari.

Manipolazione di stringhe pure:

Versione loop incorporati (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;}

Versione a 4 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;}

Versione non golfata:

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.

Esempio di lavoro qui su ideone.com . Il programma completo accetta input STDIN come <float>,<precision>.

NOTA: i Math.round(float)round di Java utilizzano RoundingMode.HALF_UPcome impostazione predefinita, ovvero il comportamento richiesto dall'OP.

L'output dei casi di test forniti è stato diff-matched a ciò che l'OP ha fornito.


Spero non ti dispiaccia! Avete dimenticato di rimuovere a(mai utilizzato), è l'impostazione a 233. Si potrebbe risparmiare un altro 23 per arrivare a 210 byte: la sostituzione q.length()con bsalva 13: int g=(int)f, b=(""+g).length(), c=b, i=0;. Incrementando l'iteratore nella condizione del forsalva 6, e inlining d(usato una volta) salva 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,

Inoltre, qualcuno ha suggerito di utilizzare una nuova riga effettiva invece della sequenza di escape, ma poiché sono su Windows, è un CRLF, 2 byte comunque dato il\n
Tamoghna Chowdhury

Nizza - sì, bè diventato obsoleto partecipavano ;-) è ancora possibile risparmiare 1 byte nel 2 ° per: for(;i++<=c+p;). È possibile salvare il file con terminazioni di riga unix su Windows, ma sfortunatamente Java non consente stringhe multilinea ..
Kenney,

@Kenney, no. Ci ho provato. Porta a trattini disallineati. Java non è comunque l'uomo giusto per il lavoro.
Tamoghna Chowdhury,

Sono arrivato a 181 byte usando solo 2 per i 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)

Salvato 1 byte grazie a, um, come si digita ՊՓԼՃՐՊՃՈԲՍԼ comunque?


Spiacente, non mi ero reso conto che i trattini facessero parte dell'output, pensavo fossero lì solo per visualizzare gli spazi.
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 sì, sostituiscilo \ncon una nuova riga. E assicurati di avvolgerlo nelle stringhe del modello.
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

Esempio di utilizzo:

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

properFractiondivide il decimale nella sua parte intera e frazione. L'output è un elenco delle parti (numero iniziale, barre, spazi, ...) che è concatenato in una singola stringa (via >>=id).


È possibile vedere una demo online di questo?
nicael

@nicael: demo (con un mainwrapper per un programma completo).
nimi

Sembra che tutto sia a posto (a proposito: testato , pensa che sia un compilatore più conveniente).
nicael

2

MATL , 49 byte

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

Utilizza la versione 6.0.0 della lingua / compilatore. Funziona su Matlab o Octave.

Prende i numeri nello stesso ordine della sfida.

Esempi

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

Spiegazione

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

Hai un interprete online?
nicael

Non ancora :-( Funziona su Matlab o Octave
Luis Mendo il

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

Prevede input come argomenti della riga di comando. Salva in un file (diciamo 90.pl) ed esegui comeperl 90.pl 6.75 4

Con commenti

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

Simile alla maggior parte delle altre risposte. Vedrò se posso golf di più. L'input può essere separato da virgola, separato da spazio o quasi separato.

Non competere perché Stackgoat è stato realizzato dopo questa sfida

Spiegazione

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

Lungo, ma non riesco a trovare una soluzione più breve

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

Puoi provare lua online , i seguenti casi di test potrebbero essere utili :)

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

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

collegamento trinket.io

Grazie a Seeq per aver salvato alcuni personaggi.

Prima versione:

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)

Versione non golfata:

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)

Potresti fornire una demo funzionante?
nicael,

Questo link trinket.io dovrebbe funzionare: trinket.io/python/409b1488f8
Jack Brounstein

In realtà ci vogliono meno personaggi per usare lo spazio letterale piuttosto che memorizzarlo. Puoi anche unire tutte le linee con ;. Usi solo huna volta, quindi dovresti anche incorporarlo. Dovrebbe salvare alcuni caratteri.
Seequ,

@Seeq Buona cattura dello spazio letterale. All'inizio stavo stampando l'imbottitura di spazi bianchi alla fine della seconda riga; dopo aver realizzato che non era necessario, non ho ricontrollato il codice per il risparmio. Il hè più complicato. Perché la concatenazione e la lenfunzione nelle ultime due righe funzionino, ldeve essere una stringa, quindi hdovrebbe essere sostituita con str(int(l)+1). L'impostazione hprima della conversione lsalva alcuni caratteri.
Jack Brounstein,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.