digitalmars.D.learn - Convert little imperative code to functional coding style
- bioinfornatics (39/39) Aug 09 2012 Dear,
- bioinfornatics (7/60) Aug 09 2012 ) *
- Timon Gehr (13/13) Aug 10 2012 Is this what you are looking for?
- Nathan M. Swan (2/16) Aug 10 2012 Ugh! I guess functional isn't always the best ;)
- bearophile (12/13) Aug 10 2012 There are many situations where I prefer simple procedural code
- Timon Gehr (3/22) Aug 12 2012 In an attempt to destroy that guess I have uncovered the following
- bioinfornatics (3/21) Aug 11 2012 oh yes beautiful thanks
Dear,
i try convert a code to functional coding style:
commented code is what i try to convert to functional
_______________________________________
import std.stdio;
import std.range;
import std.algorithm;
import std.conv : to;
import std.typecons : tuple;
import std.math : sqrt, floor;
import std.array : empty, array;
void main( ){
immutable size_t limit =3D cast(size_t )
floor( sqrt( cast(double)1_000 ) );
//~ foreach( m; iota( 2, limit ) ){
//~ foreach( n; iota( 1, m-1) ){
//~ if( 2 * m * (m+n) =3D=3D 1_000 ) writeln((m ^^ 2 - n ^^ 2) =
*
(2 * m * n) * (m ^^ 2 + n ^^ 2));
//~ }
//~ }
auto r =3D iota(2, limit )
.map!( m =3D> tuple( m, iota( 1, m - 1)
.filter!( n =3D> 2 * m * (m+n) =3D=3D 1_000=
)
)
).filter!( n =3D> !n[1].empty );
auto m =3D r.array[0][0];
auto n =3D r.array[0][1];
writeln( typeid( n ) );
writeln( n );
//~ writeln( (m ^^ 2 - n ^^ 2) * (2 * m * n) * (m ^^ 2 + n ^^ 2));
}
_______________________________________
I want to compute (m ^^ 2 - n ^^ 2) * (2 * m * n) * (m ^^ 2 + n ^^ 2)
when n =3D> 2 * m * (m+n) =3D=3D 1_000
I do this in 2 step maybe that is possible in one.
I search to convert m and n to size_t type
thanks for your help
Aug 09 2012
Le jeudi 09 ao=C3=BBt 2012 =C3=A0 18:49 +0200, bioinfornatics a =C3=A9crit = :Dear, i try convert a code to functional coding style: =20 commented code is what i try to convert to functional =20 =20 _______________________________________ =20 import std.stdio; import std.range; import std.algorithm; import std.conv : to; import std.typecons : tuple; import std.math : sqrt, floor; import std.array : empty, array; =20 =20 void main( ){ immutable size_t limit =3D cast(size_t ) floor( sqrt( cast(double)1_000 ) ); =20 //~ foreach( m; iota( 2, limit ) ){ //~ foreach( n; iota( 1, m-1) ){ //~ if( 2 * m * (m+n) =3D=3D 1_000 ) writeln((m ^^ 2 - n ^^ 2=) *(2 * m * n) * (m ^^ 2 + n ^^ 2)); //~ } //~ } =20 auto r =3D iota(2, limit ) .map!( m =3D> tuple( m, iota( 1, m - 1) .filter!( n =3D> 2 * m * (m+n) =3D=3D 1_0=00 )) ).filter!( n =3D> !n[1].empty ); =20 auto m =3D r.array[0][0]; auto n =3D r.array[0][1]; writeln( typeid( n ) ); writeln( n ); //~ writeln( (m ^^ 2 - n ^^ 2) * (2 * m * n) * (m ^^ 2 + n ^^ 2)); } =20 _______________________________________ =20 =20 I want to compute (m ^^ 2 - n ^^ 2) * (2 * m * n) * (m ^^ 2 + n ^^ 2) when n =3D> 2 * m * (m+n) =3D=3D 1_000 =20 I do this in 2 step maybe that is possible in one. =20 I search to convert m and n to size_t type =20 thanks for your help =20by using auto n =3D r.array[0][1].front; i am able to get the result. So now how cleanuo the code ? to compute only filter is true ? using until ?
Aug 09 2012
Is this what you are looking for?
import std.stdio;
import std.range : iota;
import std.algorithm : map, filter, joiner;
import std.typecons : tuple;
import std.math : sqrt, floor;
void main(){
immutable limit = cast(size_t)floor(sqrt(1_000.0));
auto r = iota(2,limit).map!(m=>iota(1,m-1).map!(n=>tuple(m,n))).joiner
.filter!(t=>2*t[0]*(t[0]+t[1])==1_000)
.map!(t=>(t[0]^^4-t[1]^^4)*(2*t[0]*t[1]));
writeln(r.front);
}
Aug 10 2012
On Friday, 10 August 2012 at 18:26:56 UTC, Timon Gehr wrote:
Is this what you are looking for?
import std.stdio;
import std.range : iota;
import std.algorithm : map, filter, joiner;
import std.typecons : tuple;
import std.math : sqrt, floor;
void main(){
immutable limit = cast(size_t)floor(sqrt(1_000.0));
auto r =
iota(2,limit).map!(m=>iota(1,m-1).map!(n=>tuple(m,n))).joiner
.filter!(t=>2*t[0]*(t[0]+t[1])==1_000)
.map!(t=>(t[0]^^4-t[1]^^4)*(2*t[0]*t[1]));
writeln(r.front);
}
Ugh! I guess functional isn't always the best ;)
Aug 10 2012
Nathan M. Swan:Ugh! I guess functional isn't always the best ;)There are many situations where I prefer simple procedural code over puzzle-style Haskell code that uses every operator of the Control.Arrow standard module :-) But in this case the code is not too much hard to read. Regarding Timon's code, Code Golfing is fun, but I suggest do do it only on sites like this: http://codegolf.com/ Otherwise I suggest to add spaces around operators, after commas, etc. Bye, bearophile
Aug 10 2012
On 08/10/2012 09:59 PM, Nathan M. Swan wrote:On Friday, 10 August 2012 at 18:26:56 UTC, Timon Gehr wrote:In an attempt to destroy that guess I have uncovered the following compiler bug: http://d.puremagic.com/issues/show_bug.cgi?id=8542Is this what you are looking for? import std.stdio; import std.range : iota; import std.algorithm : map, filter, joiner; import std.typecons : tuple; import std.math : sqrt, floor; void main(){ immutable limit = cast(size_t)floor(sqrt(1_000.0)); auto r = iota(2,limit).map!(m=>iota(1,m-1).map!(n=>tuple(m,n))).joiner .filter!(t=>2*t[0]*(t[0]+t[1])==1_000) .map!(t=>(t[0]^^4-t[1]^^4)*(2*t[0]*t[1])); writeln(r.front); }Ugh! I guess functional isn't always the best ;)
Aug 12 2012
Le vendredi 10 ao=C3=BBt 2012 =C3=A0 20:26 +0200, Timon Gehr a =C3=A9crit :Is this what you are looking for? =20 import std.stdio; import std.range : iota; import std.algorithm : map, filter, joiner; import std.typecons : tuple; import std.math : sqrt, floor; =20 void main(){ immutable limit =3D cast(size_t)floor(sqrt(1_000.0)); =20 auto r =3D iota(2,limit).map!(m=3D>iota(1,m-1).map!(n=3D>tuple(m,n))=).joiner.filter!(t=3D>2*t[0]*(t[0]+t[1])=3D=3D1_000) .map!(t=3D>(t[0]^^4-t[1]^^4)*(2*t[0]*t[1])); =20 writeln(r.front); } =20oh yes beautiful thanks
Aug 11 2012









bioinfornatics <bioinfornatics fedoraproject.org> 