math - Código Golf: Todos+-*/ Combinaciones para 3 enteros
code-golf (17)
Delphi - 838 747 caracteres
Versión de una sola línea (Original)
program p;{$APPTYPE CONSOLE}uses SysUtils;type g=Integer;function a(b,c:g):g;begin a:=b+c;end;function s(b,c:g):g;begin s:=b-c;end;function m(b,c:g):g;begin m:=b*c;end;function d(b,c:g):g;begin d:=b div c;end;type t=function(b,c:g):g;r=record f:t;c:char;p:boolean;end;procedure q(l:Array of g;w,e:r);var b:String;x,y,z:g;begin for x:=0 to 2 do for y:=0 to 2 do for z:=0 to 2 do if not((x=y)or(x=z)or(y=z))then begin try if(w.p)or not(w.p xor e.p)then b:=IntToStr(e.f(w.f(l[x],l[y]),l[z]))else b:=IntToStr(w.f(l[x],e.f(l[y],l[z])));except b:=''NaN'';end;writeln(l[x],w.c,l[y],e.c,l[z],''='',b);end;end;const O:Array[0..3]of r=((f:a;c:''+'';p:false),(f:s;c:''-'';p:false),(f:m;c:''*'';p :true),(f:d;c:''/'';p:true));var L:Array[0..2] of g;I,J:g; begin for I:=0 to 2 do L[I]:=StrToInt(ParamStr(I+1));for I:=0 to 3 do for J:=0 to 3 do q(l,o[I],o[J]);end.
Versión de línea única (reducida a 747 caracteres)
program p;{$APPTYPE CONSOLE}uses SysUtils,Math;type g=integer;t=function(b,c:g):g;r=record f:t;p:boolean;end;function a(b,c:g):g;begin a:=b+c end;function s(b,c:g):g;begin s:=b-c end;function m(b,c:g):g;begin m:=b*c end;function d(b,c:g):g;begin d:=b div c end;const f=true;u=false;n=[1..4];b=[1..3];c=''+-*/'';O:Array[1..4]of r=((f:a;p:f),(f:s;p:f),(f:m;p:u),(f:d;p:u));var l: Array[1..3]of g;I,J,x,y,z:g;w,e:r;begin for I in b do l[I]:=StrToInt(ParamStr(I));for I in n do for J in n do for x in b do for y in b do for z in b do if not((x=y)or(x=z)or(y=z))then begin w:=O[I];e:=O[J];write(l[x],c[I],l[y],c[J],l[z],''='');try writeLn(ifthen(w.p or not(w.p xor e.p),e.f(w.f(l[x],l[y]),l[z]),w.f(l[x],e.f(l[y],l[z]))))except writeln(''NaN'')end;end;end.
Formateado:
program p;
{$APPTYPE CONSOLE}
uses SysUtils;
type
g = Integer;
function a(b, c: g): g;
begin
a := b + c;
end;
function s(b, c: g): g;
begin
s := b - c;
end;
function m(b, c: g): g;
begin
m := b * c;
end;
function d(b, c: g): g;
begin
d := b div c;
end;
type
t = function(b, c: g): g;
r = record
f: t;
c: char;
p: boolean;
end;
procedure q(l: Array of g; w, e: r);
var
b: String;
x, y, z: g;
begin
for x := 0 to 2 do
for y := 0 to 2 do
for z := 0 to 2 do
if not((x = y) or (x = z) or (y = z)) then
begin
try
if (w.p) or not(w.p xor e.p) then
b := IntToStr(e.f(w.f(l[x], l[y]), l[z]))
else
b := IntToStr(w.f(l[x], e.f(l[y], l[z])));
except
b := ''NaN'';
end;
writeln(l[x], w.c, l[y], e.c, l[z], ''='', b);
end;
end;
const
O: Array [0..3] of r = ((f: a; c: ''+''; p: false), (f: s; c: ''-''; p: false),
(f: m; c: ''*''; p: true), (f: d; c: ''/''; p: true));
var
l: Array [0..2] of g;
I, J: g;
begin
for I := 0 to 2 do
l[I] := StrToInt(ParamStr(I + 1));
for I := 0 to 3 do
for J := 0 to 3 do
q(l, O[I], O[J]);
end.
Este es de lejos el código más feo que he escrito.
Escriba un programa que tome 3 enteros separados por espacios y realice cada combinación de operaciones de suma, resta, multiplicación y división posibles y muestre el resultado con la combinación de operaciones utilizada.
Ejemplo:
$./solution 1 2 3
Resultados en la siguiente salida
1+2+3 = 6
1-2-3 = -4
1*2*3 = 6
1/2/3 = 0
(respuestas enteras solamente, redondear a .5)
1*2-3 = -1
3*1+2 = 5
etc ...
Se aplican las reglas de orden de operación, suponga que no se usarán paréntesis, es decir, (3-1)*2 = 4
no es una combinación, aunque podría implementar esto para "crédito adicional"
Para los resultados donde ocurre una división por 0, simplemente devuelva NaN
Editar: Permutando la entrada es necesario, es decir, si la entrada es 1 2 3
, entonces 3*1*2
es una combinación válida.
Java - 666 caracteres
También tiene oneliners, afortunadamente tenemos Eclipse y el formato de código automático de Netbeans. :-) También implementó paréntesis (pero también contiene operaciones triviales)?
public class CodeGolf{static String[]o={"+","-","/","*"};static void p(N a,int b,N c,int d,N e,int i){System.out.printf("%s%s(%s%s%s) = %s/n",a,o[b],c,o[d],e,new N(a,b,new N(c,d,e)));}public static void main(String[]v){N[]n={new N(v[0]),new N(v[1]),new N(v[2])};for(int i=0,j=0,k=0,l=0,m=0;m<3;i++,j+=i==4?1:0,i%=4,k+=j==4?1:0,j%=4,l+=k==3?1:0,k%=3,m+=l==3?1:0,l%=3){p(n[k],i,n[l],j,n[m],0);}}static class N{Double v;N(String s){v=v.parseDouble(s);}N(N a,int o,N b){if(a.v==null||b.v==null)return;double x=b.v, y=a.v; switch(o){case 0:x=-x;case 1:v=y-x;return;case 3:v=y*x;x=0;case 2:if(x!=0)v=y/x;}}public String toString(){return v!=null?""+Math.round(v):"NaN";}}}
Ampliado, formateado, versión con comentarios :
public class CodeGolf {
// operators
static String[] o = {"+", "-", "/", "*"};
// print
static void p(N a, int b, N c, int d, N e, int i) {
System.out.printf("%s%s(%s%s%s) = %s/n", a, o[b], c, o[d], e,
new N(a, b, new N(c, d, e))); // calculate
}
public static void main(String[] v) {
N[] n = {new N(v[0]), new N(v[1]), new N(v[2])};
// Nested for-loops? Nah, too much code!
// Conditional operator, modulus is way cooler.
for (int i = 0, j = 0,
k = 0, l = 0, m = 0; m < 3; i++,
j += i == 4 ? 1 : 0,
i %= 4,
k += j == 4 ? 1 : 0,
j %= 4,
l += k == 3 ? 1 : 0,
k %= 3,
m += l == 3 ? 1 : 0,
l %= 3) {
p(n[k], i, n[l], j, n[m], 0);
}
}
// number wrapper
static class N {
Double v;
// parse input
N(String s) {
v = v.parseDouble(s);
}
// calculate input
N(N a, int o, N b) {
// NaN''s should fall through
if (a.v == null || b.v == null) {
return;
}
double x = b.v, y = a.v;
// operator execution
switch (o) {
case 0:
x = -x;
// fall through; y + x = y - (-x)
case 1:
v = y - x;
return; // break would make it 665 characters, not as cool
case 3:
v = y * x;
x = 0;
// fall through; no return needed
case 2:
if (x != 0) {
v = y / x;
}
// will NaN because v = null if x = 0
}
}
// rounding and NaN
public String toString() {
return v != null ? "" + Math.round(v) : "NaN";
}
}
}
Iterar en ambos operadores (4 * 4) y permutar en operandos, dos (3! * 2) marcas (4 * 4 * 3 * 2 * 2 = 192 posibilidades).
+ / - 2.5 horas :-) ¡Disfrútalo!
Javascript, 169 caracteres
(sin contar saltos de línea e indentación innecesarios)
Editar : ahora con permutación de entrada
o=" ";i=i.split(o);z="+-*/";for(y=0;y<27;y++)for(x=0;x<16;x++){a=y/9|0;b=(y/3|0)%3;c=y%3;if(a!=b&&a!=c&&b!=c){s=i[a]+z[x/4|0]+i[b]+z[x%4]+i[c];o+=s+"="+~~(eval(s)+.5);}}
Con sangría:
o=" ";
i=i.split(o);
z="+-*/";
for(y=0;y<27;y++)
for(x=0;x<16;x++)
{
a=y/9|0;
b=(y/3|0)%3;
c=y%3;
if(a!=b&&a!=c&&b!=c)
{
s=i[a]+z[x/4|0]+i[b]+z[x%4]+i[c];
o+=s+"="+~~(eval(s)+.5);
}
}
Perl - 76 letras
$a=1;$b=2;$c=3;
warn eval for map{$x=$_;map"$a$x$b$_$c",@a}@a=split//,''+-/*'';
do
600 bytes en el disco con terminaciones de línea de DOS.
#define C B a,B b
#define D(N,O)B N(C){return a O b;}
#define E(A,B,C)i=A;j=B;k=C;X(m,p)X(m,m)X(t,t)X(d,t)X(t,d)X(d,d)Y(m,p)Y(p,p)Y(p,t)Y(p,d)Y(m,t)Y(m,d)
#define U"%.0f"
#define P(S,T)printf(U Z(S)U Z(T)U"="U"/n",v[i],v[j],v[k],
#define p +
#define m -
#define t *
#define d /
#define X(S,T)P(S,T)f##S(f##T(v[i],v[j]),v[k]));
#define Y(S,T)P(S,T)f##S(v[i],f##T(v[j],v[k])));
#define Z(A)#A
typedef double B;D(fp,+)D(fm,-)D(ft,*)B fd(C){return b?(int)(a/b+.5):-0.0;}main(int i,char*b[]){int j,k;B v[3]={atoi(b[1]),atoi(b[2]),atoi(b[3])};E(0,1,2)E(0,2,1)E(1,0,2)E(1,2,0)E(2,0,1)E(2,1,0)}
C no parece tener literales NaN, por lo que obtienes -0 si hay algo mal en lugar de eso.
Sin embargo, creo que se ajusta a la ley de lo contrario. (Tenga en cuenta que el tipo de datos es el double
modo que si DID tiene un NaN allí, se imprimirá como tal con printf
.)
Bash shell, 126 - 169 - 156 - 140 caracteres
Debería funcionar en cualquier Bash semi-moderno, creo (probado con GNU bash, 3.2.48 (1) x86_64-apple-build).
Maneja la división por cero (caso Nan
).
Todas las sugerencias y comentarios son bienvenidos!
for a in $@;do
s+={`echo $@|tr '' '' ,`}{+,-,*,/};done
for i in `eval echo ${s::${#s}-9}`;do
[[ $i == */0* ]]&&y=Nan||y=$[$i];echo $i=$y;done
Los parámetros de suministro a través de la línea de comando:
./combinate.sh 5 0 12
F #, 584 bytes
(incluye sangría necesaria y LF)
let d a b=if b=0.0 then nan else a/b
let o=["*",((*),1);"+",((+),0);"/",(d,1);"-",((-),0)]
let b=double
let rec z=function|[x]->[x,[]]|x::s->(x,s)::List.map(fun(y,l)->y,x::l)(z s)
let rec p=function|[]->[[]]|l->z l|>List.collect(fun(x,r)->p r|>List.map(fun l->x::l))
let f=fst
let e o p x y z=if snd o<snd p then (f o)x ((f p) y z) else (f p)((f o) x y)z
[<EntryPoint>]let m a=
for i in p(Seq.toList a)do
let x,y,z=b i.[0],b i.[1],b i.[2]
for j in[for j in o do for k in o do yield[j;k]]do
printfn "%.0f%s%.0f%s%.0f = %.0f" x (f j.[0])y (f j.[1])z (e(snd j.[0])(snd j.[1])x y z)
0
Felicitaciones a kvb por su función de permutaciones .
Terminó siendo bastante similar en estructura a la solución C # de Thomas (tal vez porque su solución ya es bastante funcional)
Haskell, 221 caracteres
Argh !!, las importaciones tardan 50 caracteres.
import Data.List
import System
import Text.Printf
o=zip[(+),(-),(*),(/)]"+-*/"
main=do v<-getArgs;sequence[printf"%.0g%c(%.0g%c%.0g)=%.0g/n"x h y i z$f x$g y z|(f,h)<-o,(g,i)<-o,[x,y,z]<-permutations(map read v::[Float])]
getArgs
needs System, printf
needs Text.Printf, permutations
needs Data.List, el [[Float]]
es necesario porque /
necesita una instancia de Fractional. No podemos usar div
porque arrojará cuando se divida por cero.
Básicamente, esto itera sobre todas las combinaciones posibles de operadores y permutaciones de argumentos de entrada e imprime el resultado.
El 3 %.0g
puede reemplazarse por %g
para eliminar 6 caracteres, pero el resultado será 1.0/(2.0*3.0)=0
que es feo.
~$ ./a.out 0 4 9
0+(4+9)=13
4+(0+9)=13
9+(4+0)=13
4+(9+0)=13
9+(0+4)=13
0+(9+4)=13
0+(4-9)=-5
4+(0-9)=-5
9+(4-0)=13
4+(9-0)=13
9+(0-4)=5
0+(9-4)=5
0+(4*9)=36
4+(0*9)=4
9+(4*0)=9
4+(9*0)=4
9+(0*4)=9
0+(9*4)=36
0+(4/9)=0
4+(0/9)=4
9+(4/0)=Infinity
4+(9/0)=Infinity
9+(0/4)=9
0+(9/4)=2
0-(4+9)=-13
4-(0+9)=-5
9-(4+0)=5
4-(9+0)=-5
9-(0+4)=5
0-(9+4)=-13
0-(4-9)=5
4-(0-9)=13
9-(4-0)=5
4-(9-0)=-5
9-(0-4)=13
0-(9-4)=-5
0-(4*9)=-36
4-(0*9)=4
9-(4*0)=9
4-(9*0)=4
9-(0*4)=9
0-(9*4)=-36
0-(4/9)=-0
4-(0/9)=4
9-(4/0)=-Infinity
4-(9/0)=-Infinity
9-(0/4)=9
0-(9/4)=-2
0*(4+9)=0
4*(0+9)=36
9*(4+0)=36
4*(9+0)=36
9*(0+4)=36
0*(9+4)=0
0*(4-9)=-0
4*(0-9)=-36
9*(4-0)=36
4*(9-0)=36
9*(0-4)=-36
0*(9-4)=0
0*(4*9)=0
4*(0*9)=0
9*(4*0)=0
4*(9*0)=0
9*(0*4)=0
0*(9*4)=0
0*(4/9)=0
4*(0/9)=0
9*(4/0)=Infinity
4*(9/0)=Infinity
9*(0/4)=0
0*(9/4)=0
0/(4+9)=0
4/(0+9)=0
9/(4+0)=2
4/(9+0)=0
9/(0+4)=2
0/(9+4)=0
0/(4-9)=-0
4/(0-9)=-0
9/(4-0)=2
4/(9-0)=0
9/(0-4)=-2
0/(9-4)=0
0/(4*9)=0
4/(0*9)=Infinity
9/(4*0)=Infinity
4/(9*0)=Infinity
9/(0*4)=Infinity
0/(9*4)=0
0/(4/9)=0
4/(0/9)=Infinity
9/(4/0)=0
4/(9/0)=0
9/(0/4)=Infinity
0/(9/4)=0
J, 75 55 caracteres.
Emite números racionales, no enteros.
(],"1''='',"1 ":@x:@".)(('' '',>@{.),@,.":"0@>@{:)"1>{(,{;~''+-*%'');<<"1(i.!3)A.
La versión anterior que no permute la entrada (tenía 55 caracteres)
(],"1''='',"1 ":@x:@".)(>,{;~''+-*%'')('' ''I.@:E.s)}"1 s=:":
Ejemplo (tenga en cuenta que el orden de las operaciones de J es de derecha a izquierda):
(],"1''='',"1 ":@x:@".)(('' '',>@{.),@,.":"0@>@{:)"1>{(,{;~''+-*%'');<<"1(i.!3)A.1 2 3
1+2+3=6
1+3+2=6
2+1+3=6
2+3+1=6
3+1+2=6
3+2+1=6
1+2-3=0
1+3-2=2
2+1-3=0
2+3-1=4
3+1-2=2
3+2-1=4
1+2*3=7
1+3*2=7
2+1*3=5
2+3*1=5
3+1*2=5
3+2*1=5
1+2%3=5r3
1+3%2=5r2
2+1%3=7r3
2+3%1=5
3+1%2=7r2
3+2%1=5
1-2+3=_4
1-3+2=_4
2-1+3=_2
2-3+1=_2
3-1+2=0
3-2+1=0
1-2-3=2
1-3-2=0
2-1-3=4
2-3-1=0
3-1-2=4
3-2-1=2
1-2*3=_5
1-3*2=_5
2-1*3=_1
2-3*1=_1
3-1*2=1
3-2*1=1
1-2%3=1r3
1-3%2=_1r2
2-1%3=5r3
2-3%1=_1
3-1%2=5r2
3-2%1=1
1*2+3=5
1*3+2=5
2*1+3=8
2*3+1=8
3*1+2=9
3*2+1=9
1*2-3=_1
1*3-2=1
2*1-3=_4
2*3-1=4
3*1-2=_3
3*2-1=3
1*2*3=6
1*3*2=6
2*1*3=6
2*3*1=6
3*1*2=6
3*2*1=6
1*2%3=2r3
1*3%2=3r2
2*1%3=2r3
2*3%1=6
3*1%2=3r2
3*2%1=6
1%2+3=1r5
1%3+2=1r5
2%1+3=1r2
2%3+1=1r2
3%1+2=1
3%2+1=1
1%2-3=_1
1%3-2=1
2%1-3=_1
2%3-1=1
3%1-2=_3
3%2-1=3
1%2*3=1r6
1%3*2=1r6
2%1*3=2r3
2%3*1=2r3
3%1*2=3r2
3%2*1=3r2
1%2%3=3r2
1%3%2=2r3
2%1%3=6
2%3%1=2r3
3%1%2=6
3%2%1=3r2
Lua - 240 letras
Nota: Imprime 1. # INF y -1. # INF en lugar de NaN.
a,b,c=...o="+-*/"f=function(...)g=table.concat({...})loadstring(''x=''..g)()print(g..'' = ''..math.floor(x+.5))end for d in o:gmatch(".")do for e in o:gmatch(".")do f(a,d,b,e,c)f(a,d,c,e,b)f(b,d,a,e,c)f(b,d,c,e,a)f(c,d,a,e,b)f(c,d,b,e,a)end end
Salida
5+0+13 = 18 5+13+0 = 18 0+5+13 = 18 0+13+5 = 18 13+5+0 = 18 13+0+5 = 18 5+0-13 = -8 5+13-0 = 18 0+5-13 = -8 0+13-5 = 8 13+5-0 = 18 13+0-5 = 8 5+0*13 = 5 5+13*0 = 5 0+5*13 = 65 0+13*5 = 65 13+5*0 = 13 13+0*5 = 13 5+0/13 = 5 5+13/0 = 1.#INF 0+5/13 = 0 0+13/5 = 3 13+5/0 = 1.#INF 13+0/5 = 13 5-0+13 = 18 5-13+0 = -8 0-5+13 = 8 0-13+5 = -8 13-5+0 = 8 13-0+5 = 18 5-0-13 = -8 5-13-0 = -8 0-5-13 = -18 0-13-5 = -18 13-5-0 = 8 13-0-5 = 8 5-0*13 = 5 5-13*0 = 5 0-5*13 = -65 0-13*5 = -65 13-5*0 = 13 13-0*5 = 13 5-0/13 = 5 5-13/0 = -1.#INF 0-5/13 = 0 0-13/5 = -3 13-5/0 = -1.#INF 13-0/5 = 13 5*0+13 = 13 5*13+0 = 65 0*5+13 = 13 0*13+5 = 5 13*5+0 = 65 13*0+5 = 5 5*0-13 = -13 5*13-0 = 65 0*5-13 = -13 0*13-5 = -5 13*5-0 = 65 13*0-5 = -5 5*0*13 = 0 5*13*0 = 0 0*5*13 = 0 0*13*5 = 0 13*5*0 = 0 13*0*5 = 0 5*0/13 = 0 5*13/0 = 1.#INF 0*5/13 = 0 0*13/5 = 0 13*5/0 = 1.#INF 13*0/5 = 0 5/0+13 = 1.#INF 5/13+0 = 0 0/5+13 = 13 0/13+5 = 5 13/5+0 = 3 13/0+5 = 1.#INF 5/0-13 = 1.#INF 5/13-0 = 0 0/5-13 = -13 0/13-5 = -5 13/5-0 = 3 13/0-5 = 1.#INF 5/0*13 = 1.#INF 5/13*0 = 0 0/5*13 = 0 0/13*5 = 0 13/5*0 = 0 13/0*5 = 1.#INF 5/0/13 = 1.#INF 5/13/0 = 1.#INF 0/5/13 = 0 0/13/5 = 0 13/5/0 = 1.#INF 13/0/5 = 1.#INF
Perl 130 caracteres
Siempre que las bibliotecas externas estén permitidas:
use Algorithm::Permute"permute";
permute{for$x(@a=qw(+ - / *)){for$y(@a){$_="@ARGV";s/ /$x/;s/ /$y/;printf"
$_ = %.0f",eval}}}@ARGV
La 2da nueva línea es significativa.
Sin un módulo, y suponiendo que las tres entradas son distintas, aquí hay otra solución:
@n=& ARGV;
@o=( q[+],
"-", q{/}, ''*'' );;
for$ {a}(@ n){ for
$b(@n){for$c(@ {n}){ for $x(
@o){for$y(@o){ ($a-$ b)*($a-$c)* ($b-$
c)||next;$_=$a .$x.$ b."$y$c";$% =42
/84+ eval; print"",$_, "$S="
,$S, $%,$/ }}} }};
;sub ARGV{ $S= $".
"";@ ARGV} ;1+ 2+3
Python (171 caracteres)
Esto evita el déficit de la solución anterior de python (solo números de 1 dígito codificados, dependencia de las bibliotecas más nuevas). Lee de stdin: si quieres cmdline, reemplaza "raw_input (). Split ()" con "sys.argv [1: 4]"
x=raw_input().split()
for e in[x[i/3]+p+x[i%3]+''.''+q+x[3-i/3-i%3]for i in range(9)if i%4for p in''+-*/''for q in''+-*/'']:
try:r=round(eval(e))
except:r=''NaN''
print e,''='',r
PD. disminuyó a 147-> 138
pps. cambió los cálculos de int a float con redondeo, 138-> 153
ppps. soporte adicional para / 0 = NaN, 153-> 179
pppps. disminuyó 179-> 177 ppppps. belleza sacrificada por brevedad, 177-> 171
Python - 125 175 177 caracteres:
(ahora no cuenta la sangría)
Se agregó la entrada de la línea de comandos, no más restricción de un solo dígito / distinto de cero, funciona con cero (NaN)
import sys
from itertools import permutations as p
for i,j,k in p(sys.argv[1:4],3):
for x,y in p(''+-*/''*2,2):
s=i+x+j+''.''+y+k
try:e=eval(s)
except:e=''NaN''
print s,''='',e
Todavía No hay más trunca en lugar de redondear a 0.5
Rubí
(lee de la lista de argumentos y devuelve NaN si no es divisible)
(Sería solo la última línea si ruby tuviera una biblioteca de permutación)
class Array
def perm(n = size)
if size < n or n < 0
elsif n == 0
yield([])
else
self[1..-1].perm(n - 1) do |x|
(0...n).each do |i|
yield(x[0...i] + [first] + x[i..-1])
end
end
self[1..-1].perm(n) do |x|
yield(x)
end
end
end
end
ARGV.perm(3){|a,b,c| "++//**--".split(//).perm(2){ |d,e| x=a+d+b+e+c;puts "#{x} = #{eval(x)}" rescue puts "#{x} = NaN"} }
Ruby, 105 110 142 114 caracteres
o=%w{+ - * /};[*ARGV.permutation].product(o.product o).map{|x,y|e=x.zip(y)*"";p"#{e}=#{eval(e)rescue:N}"}
Uso
ruby prog.rb 1 2 3
Explicación
# o = ["+", "-", "*", "/"]
o=%w{+ - * /};
# ARGV = array of numbers. Generate all permutations, and apply splat operator
[*ARGV.permutation]
# Generate cartesian product of all permuted numbers and operators
# There will be 16 operator permutations, and 6 number permutations giving a
# total of 96 elements
.product(o.product o)
# For each of the 96 pairs, merge the operators and numbers into 1 array.
# ex - [1,2,3].zip(["+", "-"]) gives [[1, ''+''], [2, ''-''], [3, nil]]
# then convert the array to string by multiplying with "" => "1+2-3"
.each{|x,y|e=x.zip(y)*"";
# print output and eval result. On exception return infinity - ∞
p"#{e}=#{eval(e)rescue:N}"}
Salida
1+2+3=6
1+2-3=0
1+2*3=7
1+2/3=1
1-2+3=2
1-2-3=-4
1-2*3=-5
1-2/3=1
1*2+3=5
1*2-3=-1
1*2*3=6
1*2/3=0
1/2+3=3
1/2-3=-3
1/2*3=0
1/2/3=0
1+3+2=6
1+3-2=2
1+3*2=7
1+3/2=2
1-3+2=0
1-3-2=-4
1-3*2=-5
1-3/2=0
1*3+2=5
1*3-2=1
1*3*2=6
1*3/2=1
1/3+2=2
1/3-2=-2
1/3*2=0
1/3/2=0
2+1+3=6
2+1-3=0
2+1*3=5
2+1/3=2
2-1+3=4
2-1-3=-2
2-1*3=-1
2-1/3=2
2*1+3=5
2*1-3=-1
2*1*3=6
2*1/3=0
2/1+3=5
2/1-3=-1
2/1*3=6
2/1/3=0
2+3+1=6
2+3-1=4
2+3*1=5
2+3/1=5
2-3+1=0
2-3-1=-2
2-3*1=-1
2-3/1=-1
2*3+1=7
2*3-1=5
2*3*1=6
2*3/1=6
2/3+1=1
2/3-1=-1
2/3*1=0
2/3/1=0
3+1+2=6
3+1-2=2
3+1*2=5
3+1/2=3
3-1+2=4
3-1-2=0
3-1*2=1
3-1/2=3
3*1+2=5
3*1-2=1
3*1*2=6
3*1/2=1
3/1+2=5
3/1-2=1
3/1*2=6
3/1/2=1
3+2+1=6
3+2-1=4
3+2*1=5
3+2/1=5
3-2+1=2
3-2-1=0
3-2*1=1
3-2/1=1
3*2+1=7
3*2-1=5
3*2*1=6
3*2/1=6
3/2+1=2
3/2-1=0
3/2*1=1
3/2/1=1
OK, no es realmente corto, pero lo publico de todos modos, solo por diversión ...
Tenga en cuenta que a diferencia de la mayoría de las otras respuestas, esta no usa eval
ya que no está disponible en C # (sería mucho más corto con ella)
C #, 729 caracteres
using System;using System.Linq;using w=System.Double;class Op{public char c;public int p;public Func<w,w,w>f;}class Program{static void Main(string[]p){var nb=p.Select((n,i)=>new{n=w.Parse(n),i});var op=new[]{new Op{c=''+'',p=0,f=(a,b)=>a+b},new Op{c=''-'',p=0,f=(a,b)=>a-b},new Op{c=''*'',p=1,f=(a,b)=>a*b},new Op{c=''/'',p=1,f=(a,b)=>a/b},};Func<Op,Op,Func<w,w,w,w>>fg=(o1,o2)=>(x,y,z)=>o1.p>=o2.p?o2.f(o1.f(x,y),z):o1.f(x,o2.f(y,z));Func<w,w>nan=d=>w.IsInfinity(d)?w.NaN:d;var res=from o1 in op from o2 in op from x in nb from y in nb where x.i!=y.i from z in nb where z.i!=x.i&&z.i!=y.i let r=nan(fg(o1,o2)(x.n,y.n,z.n))select string.Format("{0}{1}{2}{3}{4}={5:F0}",x.n,o1.c,y.n,o2.c,z.n,r);res.ToList().ForEach(Console.WriteLine);}}
Versión expandida
using System;
using System.Linq;
using w=System.Double;
// Operator class
// c = character
// p = priority
// f = function
class Op { public char c; public int p; public Func<w, w, w> f; }
class Program
{
static void Main(string[] args)
{
// Parse the input and associate each number with its index
var nb = args.Select((n, i) => new { n = w.Parse(n), i });
// Operators definition
var op = new[]
{
new Op { c = ''+'', p = 0, f = (a, b) => a + b },
new Op { c = ''-'', p = 0, f = (a, b) => a - b },
new Op { c = ''*'', p = 1, f = (a, b) => a * b },
new Op { c = ''/'', p = 1, f = (a, b) => a / b },
};
// Function generator to compute the result ; handles operator priority
Func<Op, Op, Func<w, w, w, w>> fg =
(o1, o2) =>
(x, y, z) =>
o1.p >= o2.p
? o2.f(o1.f(x, y), z)
: o1.f(x, o2.f(y, z));
// Converts +/- Infinity to NaN
Func<w, w> nan = d => w.IsInfinity(d) ? w.NaN : d;
// Results
var res =
// Combinations of 2 operators
from o1 in op
from o2 in op
// Permutations of numbers
from x in nb
from y in nb
where x.i != y.i
from z in nb
where z.i != x.i && z.i != y.i
// Compute result
let r = nan(fg(o1, o2)(x.n, y.n, z.n))
// Format output
select string.Format("{0} {1} {2} {3} {4} = {5:F0}", x.n, o1.c, y.n, o2.c, z.n, r);
res.ToList().ForEach(Console.WriteLine);
}
}
¿Quién dijo que no puedes hacer programación funcional en C #? ;)
EDITAR: corregido para que funcione con números duplicados
F #: 280 caracteres, incl. nuevas líneas
La versión ilegible:
let q s=System.Data.DataTable().Compute(s,"")|>string|>float
let e(a,b,c)=let o=["+";"-";"*";"/"]in for x in o do for y in o do let s=a+x+b+y+c in printfn"%s=%.0f"s (q s)
[<EntryPoint>]let p(A:_[])=(for i=0 to 2 do let p,q,r=A.[i],A.[(i+1)%3],A.[(i+2)%3]in e(p,q,r);e(p,r,q));0
La versión de tl; dr:
//This program needs to be compiled as a console project
//It needs additional references to System.Data and System.Xml
//This function evaluates a string expression to a float
//It (ab)uses the Compute method of System.Data.DataTable which acts
//as .Net''s own little eval()
let q s =
//the answer is an object
System.Data.DataTable().Compute(s,"")
//so convert it to a string and then parse it as a float
|> string
|> float
//This function first generates all 6 permutations of a 3-tuple of strings
//and then inserts all operator combination between the entries
//Finally it prints the expression and its evaluated result
let e (a,b,c) =
let o = ["+";"-";"*";"/"]
//a double loop to get all operator combos
for x in o
do for y in o do
let s=a+x+b+y+c //z is expression to evaluate
//print the result as expression = result,
//the %.0f formatter takes care of rounding
printfn "%s=%.0f" s (q s)
//This is the entry point definition.
//A is the array of command line args as strings.
[<EntryPoint>]
let p(A:_[]) =
//Generate all permutations:
//for each index i:
// put the i-th element at the front and add the two remaining elements
// once in original order and once swapped. Voila: 6 permutations.
for i=0 to 2 do
let p,q,r = A.[i], A.[(i+1)%3], A.[(i+2)%3]
e(p,q,r) //evaluate and print "p + <op> + q + <another op> + r"
e(p,r,q) //evaluate and print "p + <op> + r + <another op> + q"
0 //the execution of the program apparently needs to return an integer
Ejemplo de salida:
> ConsoleApplication1 1 2 0
1+2+0=3
1+2-0=3
1+2*0=1
1+2/0=Infinity
1-2+0=-1
1-2-0=-1
1-2*0=1
1-2/0=-Infinity
1*2+0=2
1*2-0=2
1*2*0=0
1*2/0=Infinity
1/2+0=1
1/2-0=1
1/2*0=0
1/2/0=Infinity
1+0+2=3
1+0-2=-1
1+0*2=1
1+0/2=1
...