From: Kenta Murata Date: 2010-01-28T12:43:40+09:00 Subject: [ruby-dev:40201] Re: [Feature #2673] the length for an enumerator generated by Array#permutation and Array#combination --Apple-Mail-3-727108864 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=iso-2022-jp =1B$B$`$i$?$G$9!#=1B(B permutation size =1B$B$N7W;;<0$r4V0c$($F$^$7$?!#=1B(B =1B$B=3D$@5$7$?%Q%C%A$r:FEYE:IU$7$^$9!#=1B(B On 2010/01/28, at 11:59, Kenta Murata wrote: > Feature #2673: the length for an enumerator generated by = Array#permutation and Array#combination > http://redmine.ruby-lang.org/issues/show/2673 >=20 > =1B$B5/I< =1B$B%9%F!<%?%9=1B(B: Open, =1B$BM%@hEY=1B(B: Normal > =1B$B%+%F%4%j=1B(B: core, Target version: 1.9.2 >=20 > Array#permutation =1B$B$H=1B(B Array#combination =1B$B$,@8@.$9$k=1B(B = enumerator =1B$B$OMWAG?t$,3NDj$G$-$^$9$,!"=1B(B > Enumerator#length =1B$B$,B8:_$7$J$$$?$a!"=1B(Bto_a = =1B$B$GG[Ns2=3D$7$J$1$l$PD9$5$r=20 > =1B$B$3$N7gE@$r2r>C$9$k$?$a!"=1B(BArray#permutation =1B$B$H=1B(B = Array#combination =1B$B$,@8@.$9$k=1B(B enumerator =1B$B$KBP$7$F=1B(B > length =1B$B%a%=3D%C%I$rFC0[%a%=3D%C%I$H$7$FDI2C$9$k%Q%C%A$r=3Dq$-$^$7$?= !#=1B(B > =1B$B:9$7;Y$($J$$$h$&$G$7$?$i=1B(B trunk = =1B$B$X$N=20 > =1B$B$h$m$7$/$*4j$$$7$^$9!#=1B(B >=20 >=20 > ---------------------------------------- > http://redmine.ruby-lang.org >=20 -- Kenta Murata OpenPGP FP =3D FA26 35D7 4F98 3498 0810 E0D5 F213 966F E9EB 0BCC =1B$BK\$r=3Dq$-$^$7$?=1B(B!! =1B$B!X=1B(BRuby =1B$B5U0z$-%l%7%T!Y=1B(B = http://www.amazon.co.jp/dp/4798119881/mrkn-22 E-mail: mrkn@mrkn.jp twitter: http://twitter.com/mrkn/ blog: http://d.hatena.ne.jp/mrkn/ --Apple-Mail-3-727108864 Content-Disposition: attachment; filename=0001-array.c-rb_ary_permutation-rb_ary_combiation-test-ru.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-array.c-rb_ary_permutation-rb_ary_combiation-test-ru.patch" Content-Transfer-Encoding: quoted-printable =46rom=2092edb0570cec09967d7561cd58438c803abb186e=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Kenta=20Murata=20=0ADate:=20Thu,=20= 28=20Jan=202010=2012:30:06=20+0900=0ASubject:=20[PATCH]=20*=20array.c=20= (rb_ary_permutation,=20rb_ary_combiation),=20test/ruby/test_array.rb=0A=20= =20=20(TestArray#test_permutation_length,=20= TestArray#test_combination_length):=0A=20=20=20length=20method=20was=20= added=20for=20an=20enumerator=20generated=20by=20Array#permutation=0A=20=20= =20and=20Array#combination.=0A=0A---=0A=20ChangeLog=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20=20=20=207=20+++++++=0A=20array.c=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20|=20=20=2022=20= +++++++++++++++++++---=0A=20test/ruby/test_array.rb=20|=20=20=2014=20= ++++++++++++++=0A=203=20files=20changed,=2040=20insertions(+),=203=20= deletions(-)=0A=0Adiff=20--git=20a/ChangeLog=20b/ChangeLog=0Aindex=20= 639993a..ed66eb4=20100644=0A---=20a/ChangeLog=0A+++=20b/ChangeLog=0A@@=20= -1,3=20+1,10=20@@=0A+Thu=20Jan=2028=2011:48:00=20=20Kenta=20Murata=20=20= =0A+=0A+=09*=20array.c=20(rb_ary_permutation,=20= rb_ary_combiation),=20test/ruby/test_array.rb=0A+=09=20=20= (TestArray#test_permutation_length,=20= TestArray#test_combination_length):=0A+=09=20=20length=20method=20was=20= added=20for=20an=20enumerator=20generated=20by=20Array#permutation=0A+=09= =20=20and=20Array#combination.=0A+=0A=20Thu=20Jan=2028=2009:44:19=202010=20= =20NARUSE,=20Yui=20=20=0A=20=0A=20=09*=20regcomp.c=20= (onig_compile):=20initialize=20ScanEnv.=0Adiff=20--git=20a/array.c=20= b/array.c=0Aindex=20b844d0c..76dd866=20100644=0A---=20a/array.c=0A+++=20= b/array.c=0A@@=20-3853,10=20+3853,20=20@@=20rb_ary_permutation(int=20= argc,=20VALUE=20*argv,=20VALUE=20ary)=0A=20=20=20=20=20long=20r,=20n,=20= i;=0A=20=0A=20=20=20=20=20n=20=3D=20RARRAY_LEN(ary);=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20/*=20Array=20length=20*/=0A-=20=20=20=20= RETURN_ENUMERATOR(ary,=20argc,=20argv);=20=20=20/*=20Return=20enumerator=20= if=20no=20block=20*/=0A=20=20=20=20=20rb_scan_args(argc,=20argv,=20"01",=20= &num);=0A=20=20=20=20=20r=20=3D=20NIL_P(num)=20?=20n=20:=20= NUM2LONG(num);=20=20=20/*=20Permutation=20size=20from=20argument=20*/=0A= -=0A+=20=20=20=20if=20(!rb_block_given_p())=20{=0A+=09VALUE=20enu=20=3D=20= rb_enumeratorize(ary,=20ID2SYM(rb_frame_this_func()),=20argc,=20argv);=0A= +=09long=20nlen=20=3D=200;=0A+=09if=20(0=20<=3D=20r=20&&=20r=20<=3D=20n)=20= {=0A+=09=20=20=20=20nlen=20=3D=201;=0A+=09=20=20=20=20for=20(i=20=3D=20= 0;=20i=20<=20r;=20++i)=0A+=09=09nlen=20*=3D=20n=20-=20i;=0A+=09}=0A+=09= rb_iv_set(enu,=20"@length",=20LONG2NUM(nlen));=0A+=09= rb_define_attr(rb_singleton_class(enu),=20"length",=201,=200);=0A+=09= return=20enu;=0A+=20=20=20=20}=0A=20=20=20=20=20if=20(r=20<=200=20||=20n=20= <=20r)=20{=0A=20=09/*=20no=20permutations:=20yield=20nothing=20*/=0A=20=20= =20=20=20}=0A@@=20-3936,8=20+3946,14=20@@=20rb_ary_combination(VALUE=20= ary,=20VALUE=20num)=0A=20=20=20=20=20long=20n,=20i,=20len;=0A=20=0A=20=20= =20=20=20n=20=3D=20NUM2LONG(num);=0A-=20=20=20=20RETURN_ENUMERATOR(ary,=20= 1,=20&num);=0A=20=20=20=20=20len=20=3D=20RARRAY_LEN(ary);=0A+=20=20=20=20= if=20(!rb_block_given_p())=20{=0A+=09VALUE=20enu=20=3D=20= rb_enumeratorize(ary,=20ID2SYM(rb_frame_this_func()),=201,=20&num);=0A+=09= long=20nlen=20=3D=20combi_len(len,=20n);=0A+=09rb_iv_set(enu,=20= "@length",=20LONG2NUM(nlen));=0A+=09= rb_define_attr(rb_singleton_class(enu),=20"length",=201,=200);=0A+=09= return=20enu;=0A+=20=20=20=20}=0A=20=20=20=20=20if=20(n=20<=200=20||=20= len=20<=20n)=20{=0A=20=09/*=20yield=20nothing=20*/=0A=20=20=20=20=20}=0A= diff=20--git=20a/test/ruby/test_array.rb=20b/test/ruby/test_array.rb=0A= index=20f05c9e4..e8c75a6=20100644=0A---=20a/test/ruby/test_array.rb=0A= +++=20b/test/ruby/test_array.rb=0A@@=20-1355,6=20+1355,11=20@@=20class=20= TestArray=20<=20Test::Unit::TestCase=0A=20=20=20=20=20= assert_equal(@cls[],=20@cls[1,2,3,4].combination(5).to_a)=0A=20=20=20end=0A= =20=0A+=20=20def=20test_combination_length=0A+=20=20=20=20= assert_equal(6,=20@cls[1,2,3,4].combination(2).length)=0A+=20=20=20=20= assert_equal(4,=20@cls[1,2,3,4].combination(3).length)=0A+=20=20end=0A+=0A= =20=20=20def=20test_product=0A=20=20=20=20=20= assert_equal(@cls[[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]],=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20@cls[1,2,3].product([4,5]))=0A@@=20= -1388,6=20+1393,15=20@@=20class=20TestArray=20<=20Test::Unit::TestCase=0A= =20=20=20=20=20assert_equal(@cls[1,=202,=203,=204].permutation.to_a,=20= b)=0A=20=20=20end=0A=20=0A+=20=20def=20test_permutation_length=0A+=20=20=20= =20assert_equal(6,=20@cls[1,=202,=203].permutation.length)=0A+=20=20=20=20= assert_equal(1,=20@cls[1,=202,=203].permutation(0).length)=0A+=20=20=20=20= assert_equal(3,=20@cls[1,=202,=203].permutation(1).length)=0A+=20=20=20=20= assert_equal(6,=20@cls[1,=202,=203].permutation(3).length)=0A+=20=20=20=20= assert_equal(0,=20@cls[1,=202,=203].permutation(4).length)=0A+=20=20=20=20= assert_equal(24,=20@cls[1,=202,=203,=204].permutation(3).length)=0A+=20=20= end=0A+=0A=20=20=20def=20test_take=0A=20=20=20=20=20= assert_equal([1,2,3],=20[1,2,3,4,5,0].take(3))=0A=20=20=20=20=20= assert_raise(ArgumentError,=20'[ruby-dev:34123]')=20{=20[1,2].take(-1)=20= }=0A--=20=0A1.6.4.4=0A=0A= --Apple-Mail-3-727108864--