Aggiungere frazioni


14

Scrivi un programma o una funzione che accetta due elenchi non vuoti della stessa lunghezza dell'input e procede come segue:

  • utilizza elementi del primo elenco per ottenere numeratori,
  • utilizza elementi del secondo elenco per ottenere denominatori,
  • visualizza le frazioni risultanti dopo la semplificazione (2/4=>1/2), separate da "+" s,
  • visualizza "=" e il risultato dell'aggiunta dopo l'ultima frazione.

Esempio:

Ingresso

[1, 2, 3, 3, 6]
[2, 9, 3, 2, 4]

Produzione

1/2+2/9+1+3/2+3/2=85/18

Informazioni sulle regole

  • gli elementi delle liste saranno numeri interi positivi,
  • gli elementi possono essere separati da spazi, ad es .: 1/2 + 2/9 + 1 + 3/2 + 3/2 = 85/18va bene,
  • è consentito il trascinamento di newline,
  • le liste possono essere prese in formati diversi da quelli sopra indicati, ad es .: (1 2 3 3 6)oppure {1;2;3;3;6}, ecc.,
  • 1può essere espressa come 1/1,
  • invece di stampare puoi restituire la stringa appropriata,
  • non è necessario gestire input errati,
  • vince il codice più breve .

Quale intervallo di valori deve supportare?
Brad Gilbert b2gills

@ BradGilbertb2gills Direi almeno da -30.000 a 30.000, ma poi non so se sarebbe un problema in più per alcune lingue. Quindi forse solo l'intervallo intero standard della tua lingua preferita.

@ PrzemysławP dicendo "intervallo intero standard della tua lingua preferita" non è una buona idea, alcune lingue hanno un intero standard come booleani
Felipe Nardi Batista

Grazie! @ BradGilbertb2gills Quindi almeno da -30 000 a 30 000.

Possiamo ottenere frazioni come [1, 2] [2, 9] [3, 3] ...invece?
Olivier Grégoire,

Risposte:


1

M , 12 11 byte

÷µFj”+;”=;S

Questo è un collegamento diadico. A causa di un bug, non funziona come un programma completo. Fè inoltre richiesto a causa di un bug.

Provalo online!

Come funziona

÷µFj”+;”=;S  Dyadic link. Left argument: N. Right argument: D

÷            Perform vectorized division, yielding an array of fractions (R).
 µ           Begin a new, monadic chain. Argument: R
  F          Flatten R. R is already flat, but j is buggy and has side effects.
   j”+       Join R, separating by '+'.
      ;”=    Append '='.
         ;S  Append the sum of R.

Mi piace quanto più di un quarto del programma debba aggiungere '='. :)
Computronio

7

Ruby 2.4, 54 53 caratteri

->n,d{a=n.zip(d).map{|n,d|n.to_r/d};a*?++"=#{a.sum}"}

Grazie a:

  • Value Ink per la versione specifica di Ruby 2.4 (-3 caratteri)
  • Value Ink per l'ottimizzazione Rationaldell'inizializzazione (-1 carattere)

Rubino, 58 57 56 caratteri

->n,d{t=0;n.zip(d).map{|n,d|t+=r=n.to_r/d;r}*?++"=#{t}"}

Esecuzione di esempio:

irb(main):001:0> puts ->n,d{t=0;n.zip(d).map{|n,d|t+=r=n.to_r/d;r}*?++"=#{t}"}[[1, 2, 3, 3, 6], [2, 9, 3, 2, 4]]
1/2+2/9+1/1+3/2+3/2=85/18

Provalo online!


1
a=n.zip(d).map{|f|(f*?/).to_r};a*?++"=#{a.sum}"in Ruby 2.4 ti fa risparmiare 3 byte.
Value Ink,

Grazie @ValueInk. Sospettavo che fosse possibile, semplicemente non avevo 2.4 né localmente né su TIO.
arte

1
Sì, ho installato la 2.4 appositamente per poter testare soluzioni con sumhaha. Inoltre mi sono appena ricordato che .map{|i,j|i.to_r/j}è più corto di 1 byte
Value Ink

Doh. Ho provato vari approcci attraverso .to_fe divisione, ma non ho pensato a dividere Rationalcon Fixnum. Grazie ancora, @ValueInk.
arte

6

Mathematica, 33 byte

Row@{Row[#/#2,"+"],"=",Tr[#/#2]}&

ingresso

[{1, 2, 3, 3, 6}, {2, 9, 3, 2, 4}]


Non è Row@@{#/#2,"+"}lo stesso di Row[#/#2,"+"]?
feersum

sì! hai ragione!
J42161217

1
Fantastico! Non mi rendevo conto che Rowfosse così conveniente per cose come questa :)
Greg Martin,

3

Python 3 , 104 byte

9 byte grazie a Felipe Nardi Batista.

from fractions import*
def f(*t):c=[Fraction(*t)for t in zip(*t)];print('+'.join(map(str,c)),'=',sum(c))

Provalo online!



@FelipeNardiBatista muito.
Leaky Nun,

cambia +'='+str(sum(c))in,'=',sum(c)
Felipe Nardi Batista

@FelipeNardiBatista Grazie, ho usato anche Python 3 qui (in base alle preferenze personali).
Leaky Nun,


3

Perl 6 ,  77  73 byte

{join('+',($/=[@^a Z/ @^b]).map:{.nude.join('/')})~"="~$/.sum.nude.join('/')}

Provalo

{($/=[@^a Z/@^b])».nude».join('/').join('+')~'='~$/.sum.nude.join('/')}

Provalo

Allargato:

{  # bare block lambda with two placeholder params 「@a」 and 「@b」

  (
    $/ = [              # store as an array in 「$/」 for later use

      @^a Z/ @^b        # zip divide the two inputs (declares them)

    ]

  )».nude\              # get list of NUmerators and DEnominators
  ».join('/')           # join the numerators and denominators with 「/」

  .join('+')            # join that list with 「+」

  ~
  '='                   # concat with 「=」
  ~

  $/.sum.nude.join('/') # get the result and represent as fraction
}

3

Clojure, 71 byte

#(let[S(map / % %2)](apply str(concat(interpose '+ S)['=(apply + S)])))

Yay per le frazioni integrate!


2

Mathematica, 61 byte

t=#~ToString~InputForm&;Riffle[t/@#,"+"]<>"="<>t@Tr@#&[#/#2]&

2

JavaScript (ES6), 111 byte

Prende gli elenchi nella sintassi del curry (a)(b).

let f =

a=>b=>a.map((v,i)=>F(A=v,B=b[i],N=N*B+v*D,D*=B),N=0,D=1,F=(a,b)=>b?F(b,a%b):A/a+'/'+B/a).join`+`+'='+F(A=N,B=D)

console.log(f([1, 2, 3, 3, 6])([2, 9, 3, 2, 4]))



2

Julia v0.4 +, 66 53 byte

-13 byte grazie a Dennis

a^b=replace(join(a.//b,"+")"=$(sum(a.//b))","//","/")

Provalo online!

In alternativa, se le frazioni possono essere visualizzate utilizzando //anziché anziché /, il seguente funziona per 35 byte :

a^b=join(a.//b,'+')"=$(sum(a.//b))"

2

setlX , 103 byte

f:=procedure(a,b){i:=1;l:=[];while(i<=#a){l:=l+[a[i]/b[i]];i+=1;}s:=join(l,"+");return s+"="+eval(s);};

Crea una funzione chiamata in fcui inserire due elenchi.

ungolfed:

f := procedure (a,b) {
    i:=1;
    l:=[];
    while(i<=#a){
        l:=l+[a[i]/b[i]];
        i+=1;
    }
    s:=join(l,"+");
    return s+"="+eval(s);
};

con variabili e annotazioni denominate :
setlX non fornisce una funzione di commento, quindi facciamo solo finta di poter commentare%

f := procedure(firstList,secondList) {
    count := 1;
    list := []; 
    while(count <= #firstList) {
        % calculate every fraction and save it as a list
        list := list + [firstList[count]/secondList[count]];
        count += 1;
    }
    % Seperate every list entry with a plus ([2/3,1] -> "2/3+1")
    str := join(list, "+");
    % eval executes the string above and thus calculates our sum
    return str + "=" + eval(str);
};


Cosa succede se #firstList è diverso da #secondList?
RosLuP,

intendi le dimensioni di Internet? La domanda afferma che il primo elenco è utilizzato
dall'enumeratore

ma a parte questo: se il secondo elenco è più lungo, le voci rimanenti verranno ignorate. Se l'elenco è più corto, si verificherà un errore di runtime.
BlueWizard,

1

Perl 6, 72 byte 65 byte

Le razionali native e automatiche dovrebbero renderlo facile, ma la stringa di default è ancora decimale, quindi dobbiamo .nude( nu merator e de nominator) che uccide il nostro punteggio e rende il brutto 1 :(

my \n = 1,2,3,3,6; my \d = 2,9,3,2,4;
(n Z/d)».nude».join("/").join("+")~"="~([+] n Z/d).nude.join("/")

Aggiornamento: rimosse le parentesi non necessarie, uccidi più spazio e usa una mappa più intelligente. Salva i personaggi sulla soluzione di Brad al costo di non essere un sub lambda.


Benvenuti nel sito! Bella prima risposta!
programmatore



1

PHP> = 7,1, 190 byte

<?function f($x,$y){for($t=1+$x;$y%--$t||$x%$t;);return$x/$t."/".$y/$t;}[$n,$d]=$_GET;for($p=array_product($d);$x=$n[+$k];$e+=$x*$p/$y)$r[]=f($x,$y=$d[+$k++]);echo join("+",$r)."=".f($e,$p);

Versione online

+14 byte per la sostituzione return$x/$t."/".$y/$t;con return$y/$t>1?$x/$t."/".$y/$t:$x/$t;output ninvece chen/1


1

F #, 244 241 239 byte

let rec g a=function|0->abs a|b->g b (a%b)
let h a b=g a b|>fun x->a/x,b/x
let s,n,d=List.fold2(fun(s,n,d)N D->
 let(N,D),(n,d)=h N D,h(n*D+N*d)(d*D)
 s@[sprintf"%i/%i"N D],n,d)([],0,1)nom div
printf"%s=%i/%i"(System.String.Join("+",s))n d

Provalo online!


1

setlX , 62 byte

[a,b]|->join([x/y:[x,y]in a><b],"+")+"="++/[x/y:[x,y]in a><b];

ungolfed:

[a,b]|->                  define a function with parameters a and b
  join(                 
    [ x/y :               using set comprehension, make a list of fractions 
      [x,y] in a><b       from the lists zipped together
    ],
    "+"
  )                       join them with "+"
  + "="                   concat with an equals sign
  +                       concat with
  +/[x/y:[x,y]in a><b]    the sum of the list
;

interpreter session


0

R, 109 byte

f=MASS::fractions;a=attributes
g=function(n,d)paste(paste(a(f(n/d))$f,collapse='+'),a(f(sum(n/d)))$f,sep='=')

richiede la MASSlibreria (per la sua fractionsclasse). la funzione grestituisce l'output richiesto come stringa.

Provalo online! (Link violino)


0

MATL , 32 byte

/YQv'%i/%i+'wYD3L)61yUYQVwV47b&h

Provalo online!

Spiegazione

Considera [1, 2, 3, 3, 6], [2, 9, 3, 2, 4]come input.

/         % Implicit inout. Divide element-wise
          % STACK: [0.5 0.222 1 1.5 1.5]
YQ        % Rational approximation (with default tolerance)
          % STACK: [1 2 1 3 3], [2 9 1 2 2]
v         % Conctenate all stack elements vertically
          % STACK: [1 2; 2 9; 1 2; 3 2; 3 2]
'%i/%i+'  % Push this string (sprintf format specifier)
          % STACK: [1 2; 2 9; 1 2; 3 2; 3 2], '%i/%i+'
wYD       % Swap, sprintf
          % STACK: '1/2+2/9+1/1+3/2+3/2+'
3L)       % Remove last entry
          % STACK: '1/2+2/9+1/1+3/2+3/2'
61        % Push 61 (ASCII for '=')
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61
y         % Duplicate from below
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '1/2+2/9+1/1+3/2+3/2'
U         % Evaluste string into a number
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, 4.722
YQ        % Rational approximation 
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, 85, 18
VwV       % Convert to string, swap, convert to string
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '18', '85'
47        % Push 47 (ASCII for '/')
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '18', '85', 47
b         % Bubble up in stack
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '85', 47, '18'
&h        % Concatenate all stack elements horizontally. Implicitly display
          % STACK: '1/2+2/9+1/1+3/2+3/2=85/18'

0

TI-BASIC, 100 byte

:L₁⁄L₂                                              //Creates a fraction from Lists 1 & 2, 7 bytes
:toString(Ans→Str1                                  //Create string from list, 7 bytes
:inString(Ans,",→A                                  //Look for commas, 9 bytes
:While A                                            //Begin while loop, 3 bytes
:Str1                                               //Store Str1 to Ans, 3 bytes
:sub(Ans,1,A-1)+"+"+sub(Ans,A+1,length(Ans)-A→Str1  //Replace "," with "+", 33 bytes
:inString(Ans,",→A                                  //Check for more commas, 9 bytes
:End                                                //End while loop, 2 bytes
:Str1                                               //Store Str1 to Ans, 3 bytes
:sub(Ans,2,length(Ans)-2                            //Remove opening and closing brackets, 13 bytes
:Ans+"="+toString(expr(Ans                          //Add "=" and answer, 11 bytes

Nota all'inizio, diverso da /. Questo fa sì che le frazioni mantengano le loro forme. Si fa lavorare con le frazioni negative.

Sigh . TI-BASIC è orribile con le stringhe. Se tutto ciò che dovevamo fare fosse stampare le frazioni e quindi la loro somma, il codice sarebbe:

TI-BASIC, 12 byte

:L₁⁄L₂    //Create fractions from lists, 7 bytes
:Disp Ans //Display the above fractions, 3 bytes
:sum(Ans  //Display the answer, 2 bytes

Ciò significa che 88 byte del mio codice vengono spesi solo per formattare la risposta! Hmph .


0

C, 171 byte

Prova online

i;t;x;y;f(int s,int*a,int*b){x=*a;y=*b;while(++i<s)x=(y-b[i])?(x*b[i])+(a[i]*y):(x+a[i]),y=(y-b[i])?(b[i]*y):y;for(i=1;i<=(x<y?x:y);++i)t=(x%i==0&&y%i==00)?i:t;x/=t;y/=t;}

0

Assioma, 212 byte

C==>concat;S==>String;g(a)==C[numerator(a)::S,"/",denom(a)::S];h(a:List PI,b:List PI):S==(r:="";s:=0/1;#a~=#b or #a=0=>"-1";for i in 1..#a repeat(v:=a.i/b.i;s:=s+v;r:=C[r,g(v),if i=#a then C("=",g(s))else"+"]);r)

test

(5) -> h([1,3,4,4,5,6], [2,9,5,5,6,7])
   (5)  "1/2+1/3+4/5+4/5+5/6+6/7=433/105"
                                                             Type: String
(6) -> h([1,3,4,4], [2,9,5,5,6,7])
   (6)  "-1"
                                                             Type: String

0

Casio Basic, 161 byte

Dim(List 1)->A
for 1->I to A step 1
3*I-2->B
List 1[I]->C
List 2[I]->D
locate 1,B,C
locate 1,B+1,"/"
locate 1,B+2,D
C/D+E->E
next
locate 1,B+3,"="
locate 1,B+4,E

Spiegazione:

  • Il numero di input è stato salvato in A
  • A iterazioni
  • B funge da contatore per una corretta visualizzazione
  • I'elemento dell'elenco 1 e 2 salvato in CeD
  • Visualizzazione di variabile C/ variabileD
  • salva C/ D+ EinE
  • Dopo l'ultimo numero individuare =eE

0

Haskell (Lambdabot), 94 91 86 byte

t=tail.((\[n,_,d]->'+':n++'/':d).words.show=<<)
a#b|f<-zipWith(%)a b=t f++'=':t[sum f]

Provalo online!

Grazie @Laikoni per i -8byte!

Ungolfed

-- convert each fraction to a string (has format "n%d", replace '%' with '/' and prepend '+' ("+n/d"), keep the tail (dropping the leading '+')
t = tail.((\[n,_,d]->'+':n++'/':d).words.show=<<)
-- build a list of fractions
a # b = let f = zipWith(%) a b in
-- stringify that list, append "=" and the stringified sum of these fractions
  t f ++ "=" ++ t [sum f]

La tua mancante a import Data.Ratioper la %quale non è in Preludio.
Laikoni,

1
È possibile salvare alcuni byte sostituendoli "?"++con '?':.
Laikoni,

1
L'accorciamento funziona anche per "/"++de "="++.
Laikoni,

1
La riorganizzazione consente di risparmiare ancora qualche byte:tail(f>>=t)++'=':(tail.t.sum)f
Laikoni,

1
Mettere taile =<<in tsalva un po 'di più: Provalo in rete!
Laikoni,

0

Fogli Google, 83 81 byte

=ArrayFormula(JOIN("+",TRIM(TEXT(A:A/B:B,"?/???")))&"="&TEXT(sum(A:A/B:B),"?/???"

Salvato 2 byte grazie a Taylor Scott

Fogli aggiungerà automaticamente 2 parentesi di chiusura alla fine della formula.

Le due matrici sono inserite come intere colonne Ae B. Le righe vuote sotto gli input generano errori.


dovresti essere in grado di rilasciare 2 byte rilasciando il terminale))
Taylor Scott
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.