Ajout de fractions

14

Écrivez un programme ou une fonction qui prend deux listes non vides de la même longueur en entrée et effectue les opérations suivantes:

  • utilise des éléments de première liste pour obtenir des numérateurs,
  • utilise des éléments de la deuxième liste pour obtenir des dénominateurs,
  • affiche les fractions résultantes après simplification (2/4=>1/2), séparées par des "+",
  • affiche "=" et le résultat de l'addition après la dernière fraction.

Exemple:

Contribution

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

Production

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

À propos des règles

  • les éléments des listes seront des entiers positifs,
  • les éléments peuvent être séparés par des espaces, par exemple: 1/2 + 2/9 + 1 + 3/2 + 3/2 = 85/18est ok,
  • le retour à la ligne est autorisé,
  • les listes peuvent être prises dans d'autres formats que ci-dessus, par exemple: (1 2 3 3 6)ou {1;2;3;3;6}, etc.,
  • 1peut être exprimé comme suit 1/1:
  • au lieu d'imprimer, vous pouvez renvoyer la chaîne appropriée,
  • vous n'avez pas besoin de gérer une mauvaise entrée,
  • le code le plus court gagne .

la source
Quelle gamme de valeurs doit-elle supporter?
Brad Gilbert b2gills
@ BradGilbertb2gills Je dirais au moins -30 000 à 30 000, mais je ne sais pas si ce serait un problème supplémentaire pour certaines langues. Alors peut-être juste une plage entière standard de la langue de votre choix.
@ PrzemysławP disant que "la plage d'entiers standard de la langue de votre choix" n'est pas une bonne idée, certaines langues ont un entier standard comme booléen
Felipe Nardi Batista
Je vous remercie! @ BradGilbertb2gills Puis au moins -30 000 à 30 000.
Pouvons-nous obtenir des fractions comme à la [1, 2] [2, 9] [3, 3] ...place?
Olivier Grégoire

Réponses:

1

M , 12 11 octets

÷µFj”+;”=;S

Il s'agit d'un lien dyadique. En raison d'un bogue, il ne fonctionne pas comme un programme complet. Fest également requis en raison d'un bogue.

Essayez-le en ligne!

Comment ça fonctionne

÷µ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.
Dennis
la source
J'aime que plus d'un quart du programme consiste à ajouter le «=». :)
Computronium
7

Ruby 2.4, 54 53 caractères

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

Grâce à:

Ruby, 58 57 56 caractères

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

Exemple d'exécution:

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

Essayez-le en ligne!

homme au travail
la source
1
a=n.zip(d).map{|f|(f*?/).to_r};a*?++"=#{a.sum}"dans Ruby 2.4 vous permet d'économiser 3 octets.
Value Ink
Merci @ValueInk. Je soupçonnais que c'était possible, je n'avais pas de 2.4 ni localement ni sur TIO.
manatwork
1
Oui, j'ai installé 2.4 spécifiquement pour pouvoir tester des solutions avec sumhaha. De plus, je me souviens juste qu'il .map{|i,j|i.to_r/j}est plus court d'un octet
Value Ink
Doh. J'ai essayé différentes approches .to_fet divisions, mais je n'ai pas pensé à diviser Rationalavec Fixnum. Merci encore, @ValueInk.
manatwork
6

Mathematica, 33 octets

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

contribution

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

J42161217
la source
N'est-ce pas Row@@{#/#2,"+"}la même chose que Row[#/#2,"+"]?
feersum
Oui! tu as raison!
J42161217
1
Fantastique! Je ne savais pas que Rowc'était si pratique pour des choses comme ça :)
Greg Martin
3

Python 3 , 104 octets

9 octets grâce à Felipe Nardi Batista.

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

Essayez-le en ligne!

Leaky Nun
la source
golfé un peu
Felipe Nardi Batista
@FelipeNardiBatista muito.
Leaky Nun
changer +'='+str(sum(c))pour,'=',sum(c)
Felipe Nardi Batista
@FelipeNardiBatista Merci, j'ai également utilisé Python 3 ici (en fonction de vos préférences personnelles).
Leaky Nun
3

Perl 6 ,  77  73 octets

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

Essayez-le

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

Essayez-le

Étendu:

{  # 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
}
Brad Gilbert b2gills
la source
3

Clojure, 71 octets

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

Ouais pour les fractions intégrées!

NikoNyrh
la source
2

Mathematica, 61 octets

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

JavaScript (ES6), 111 octets

Prend les listes dans la syntaxe de 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]))

Arnauld
la source
2

Java, 225 octets

int c(int a,int b){return b>0?c(b,a%b):a;}
(N,D)->{int n=0,d=1,i=0,g;String s="";for(;i<N.length;g=g(N[i],D[i]),N[i]/=g,D[i]/=g,s+=(i>0?"+":"")+N[i]+"/"+D[i],n=n*D[i]+N[i]*d,d*=D[i++],g=g(n,d),n/=g,d/=g);return s+"="+n+"/"+d;}

Net Dsont tous deux int[]contextualisés.

J'ai réutilisé la fonction GCD de Kevin Cruijssen .

Voir et tester en ligne!

Olivier Grégoire
la source
2

Julia v0.4 +, 66 53 octets

-13 octets grâce à Dennis

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

Essayez-le en ligne!

Alternativement, si les fractions peuvent être affichées en utilisant //plutôt que /, les éléments suivants fonctionnent pour 35 octets :

a^b=join(a.//b,'+')"=$(sum(a.//b))"
Julian Wolf
la source
2

setlX , 103 octets

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

Crée une fonction appelée foù vous insérez deux listes.

non golfé:

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

avec des variables nommées et des annotations:
setlX ne fournit pas de fonction de commentaire, alors faisons comme si nous pouvions commenter avec%

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

BlueWizard
la source
Et si #firstList est différent de #secondList?
RosLuP
vous voulez dire la taille differnet? La question indique que la première liste est utilisée par l'énumérateur et qu'une entrée incorrecte peut être générée
BlueWizard
mais à part cela: si la deuxième liste est plus longue, les entrées restantes seront ignorées. Si la liste est plus courte, une erreur d'exécution se produit.
BlueWizard
1

Perl 6, 72 octets 65 octets

Les rationnels natifs et automatiques devraient rendre cela facile, mais la chaîne de caractères par défaut est toujours aussi décimale, nous devons donc .nude( nu merator et de nominator) ce qui tue notre score et rend le 1 laid :(

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("/")

Mise à jour: Suppression des supports inutiles, tuez plus d'espace et utilisez une carte plus intelligente. Enregistre les personnages sur la solution de Brad au prix de ne pas être un sous-marin lambda

Dean Serenevy
la source
Bienvenue sur le site! Belle première réponse!
programmer5000
1

PHP> = 7.1, 190 octets

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

Version en ligne

+14 octets pour le remplacement return$x/$t."/".$y/$t;par la return$y/$t>1?$x/$t."/".$y/$t:$x/$t;sortie nau lieu den/1

Jörg Hülsermann
la source
1

F #, 244 241 239 octets

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

Essayez-le en ligne!

Brunner
la source
1

setlX , 62 octets

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

non golfé:

[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

corvus_192
la source
0

R, 109 octets

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

nécessite la MASSbibliothèque (pour sa fractionsclasse). la fonctiong renvoie la sortie requise sous forme de chaîne.

Essayez-le en ligne! (Lien R-violon)

Giuseppe
la source
0

MATL , 32 octets

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

Essayez-le en ligne!

Explication

Considérez [1, 2, 3, 3, 6], [2, 9, 3, 2, 4]comme entrée.

/         % 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'
Luis Mendo
la source
0

TI-BASIC, 100 octets

: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

Notez le au début, différent de /. Cela fait que les fractions conservent leurs formes. Il fait le travail avec des fractions négatives.

Soupir . TI-BASIC est horrible avec des cordes. Si tout ce que nous avions à faire était d'imprimer les fractions, puis leur somme, le code serait:

TI-BASIC, 12 octets

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

Cela signifie que 88 octets de mon code sont dépensés juste pour formater la réponse! Hmph .

Scott Milner
la source
0

C, 171 octets

Essayez en ligne

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;}
Khaled.K
la source
0

Axiome, 212 octets

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)

tester

(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
RosLuP
la source
0

Casio Basic, 161 octets

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

Explication:

  • Le nombre d'entrées est enregistré dans A
  • A itérations
  • B agit comme un compteur pour un affichage correct
  • I'e élément des listes 1 et 2 enregistré dans CetD
  • Affichage de variable C/ variableD
  • enregistrer C/ D+ EdansE
  • Après le dernier numéro, localisez =etE
ADDB
la source
0

Haskell (Lambdabot), 94 91 86 octets

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

Essayez-le en ligne!

Merci @Laikoni pour les -8octets!

Non golfé

-- 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 source
Votre manque un import Data.Ratiopour %qui n'est pas Prelude.
Laikoni
1
Vous pouvez enregistrer quelques octets en les remplaçant "?"++par '?':.
Laikoni
1
Le raccourcissement fonctionne également pour "/"++det "="++.
Laikoni
1
Réorganiser permet d'économiser encore plus d'octets:tail(f>>=t)++'=':(tail.t.sum)f
Laikoni
1
Mettre tailet =<<en téconomise encore plus: essayez-le en ligne!
Laikoni
0

Google Sheets, 83 81 octets

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

Enregistré 2 octets grâce à Taylor Scott

Les feuilles ajouteront automatiquement 2 parenthèses fermantes à la fin de la formule.

Les deux tableaux sont entrés comme l' intégralité des colonnes Aet B. Les lignes vides sous les entrées génèrent des erreurs.

Ingénieur Toast
la source
vous devriez pouvoir supprimer 2 octets en supprimant le terminal))
Taylor Scott