takaisa |
9*8*7*6*5/3=5040 |
4月7日(木) 0:05:53
24827 |
Taro |
全体の1/3だなぁとは見当がつきましたが、不安なので
解答送信後にプログラムで確かめました。 |
じたく・・・帰宅直後
4月7日(木) 0:06:39
24828 |
ミキティ |
うう、遅すぎる。(T_T) #24827 の通りですよね。
何も考えずにプログラム組んじゃいました。 |
4月7日(木) 0:07:00
HomePage:みきこむ 24829 |
そのうち勝つ |
最初Cで考えて42送ってしまいました。
9P5のあと各桁の和を考えようと思いましたが 1〜9までそろっていることだし、平等に3分の1かなと即決しました。 |
アトランティスモード 魚群来い!
4月7日(木) 0:07:17
24830 |
はなう |
あー、そうか。1/3かあ
あたりまえだ_| ̄|○ 頑張って表書いて計算しました(一回間違ったし |
とーきょ
4月7日(木) 0:08:01
HomePage:http://hanau.daa.jp/blog2/ 24831 |
トトロ@N |
A{1,4,7}、B{2,5,8}、C{3,6,9}の3グループに分ける。
A,B,Cの各グループから選ぶ個数で場合分けすると (1,1,3)が9通り、(2,2,1)が27通り、(3,0,2)(0,3,2)が 各3通りなので、5×4×3×2×1×(9+27+3+3)=5040(通り) |
兵庫県明石市
4月7日(木) 0:09:12
MAIL:h-sakai@zb3.so-net.ne.jp 24832 |
CRYING DOLPHIN |
カードが「1枚ずつ」だから、本当はすんなり1/3とはいかないか…
3n型、(3n+1)型、(3n+2)型のカードが3枚ずつなので、カンで 1/3としてしまった… |
1年ピカチュウ組
4月7日(木) 0:10:33
HomePage:算数の限界ってどのくらい? 24833 |
エルク |
私も42送ってしまった・・・
(147、258、369)の3グループに分けて それぞれから使う数字の数を考えると (1,1,3)(3,0,2)(0,3,2)(2,2,1)が有って それぞれ9、3、3、27通り。計42通りに あとは(5!=120)かけて終わりと。 |
魔法の国
4月7日(木) 0:11:39
HomePage:迷いの森 24834 |
taku |
1〜9を3で割ったあまりで考えて
あまり0は3,6,9 あまり1は1,4,7 あまり2は2,5,7 5桁で3の倍数になるのは 0,0,0,1,2のとき1080通り 0,0,1,1,1のとき360通り 0,0,2,2,2のとき360通り 0,1,1,2,2のとき3240通り 合計5040通り。 もう寝ます。 |
4月7日(木) 0:12:24
MAIL:takuo@kcv.ne.jp 24835 |
エルク |
トトロ@Nさんのと同じだ・・・
書き込み遅れるとむなしいね(汗 |
魔法の国
4月7日(木) 0:12:31
HomePage:迷いの森 24836 |
ゴンとも |
十進BASIC で以下でした。3分くらいかかりました。
FOR A=1 TO 9 FOR B=1 TO 9 FOR C=1 TO 9 FOR D=1 TO 9 FOR E=1 TO 9 LET M=A+B+C+D+E IF MOD(M,3)=0 AND A<>B AND A<>C AND A<>D AND A<>E AND B<>C AND B<>D AND B<>E AND C<>D AND C<>E AND D<>E THEN PRINT A;B;C;D;E NEXT E NEXT D NEXT C NEXT B NEXT A END |
4月7日(木) 0:12:39
MAIL:fttnm528@ybb.ne.jp 24837 |
姉小路 |
足して3になる物を全てあげると、42通りなので、
5!*42=5040 としました。 |
算数の街
4月7日(木) 0:15:29
MAIL:pctakada@mail.goo.ne.jp HomePage:高田の呟き 24838 |
taku |
#24835の訂正
あまり2は2,5,8 (りゃんうーぱー)本当に寝ます。 |
4月7日(木) 0:18:55
MAIL:takuo@kcv.ne.jp 24839 |
ipal |
> FOR A=1 TO 9
> FOR B=1 TO 9 : : の"1"をずっと"0"でやってた... |
4月7日(木) 0:19:01
24840 |
linear |
takuさんと同じやり方でした。ただ、1から9までのシグマは45=(3の倍数)に留意すれば、使わない4枚のカードの合計が3の倍数となればいいので、こちらを数えたほうが、いささか簡潔になります。方法を思いついてから正解まではおそらく2分もかからなかったと思います、最初に変なこと考えていたのがいけませんでした。 |
4月7日(木) 0:19:53
MAIL:linearsupertrain@yahoo.co.jp 24841 |
linear |
takuさんと同じやり方でした。ただ、1から9までのシグマは45=(3の倍数)に留意すれば、使わない4枚のカードの合計が3の倍数となればいいので、こちらを数えたほうが、いささか簡潔になります。方法を思いついてから正解まではおそらく2分もかからなかったと思います、最初に変なこと考えていたのがいけませんでした。 |
4月7日(木) 0:21:45
MAIL:linearsupertrain@yahoo.co.jp 24842 |
tomh |
#24832のトトロ@Nさんと同じで、
剰余類に分けて考えました。 |
新潟市
4月7日(木) 0:22:43
MAIL:tomh@yahoo.co.jp HomePage:H to M 24843 |
吉川@でんしゃ |
帰宅中です。
今回のは、3分の1決め打ちの人がいるだろうなーと思いつつ出題しました。 ちなみに選び出す枚数がある条件を満たすときは3分の1になるんですよね。 |
4月7日(木) 0:23:02
24844 |
アヒーのおじさん |
遅い割には9P5/3でした(^^;
最初も一瞬「3分の1かな?」とは感じたものの、地道に計算 更新してみると25秒でといているひとがいたので 「これはもう3分の1だなw 決まり!」みたいな感じで(苦笑) |
アンドロメダ大星雲
4月7日(木) 0:37:07
HomePage:正体不明 24845 |
ノビッタ |
初めて参加します。
僕も迷いつつ、3分の1で解いてしまいました。 ちなみに、これが「1から8までの数字」だったら、 一筋縄には行かなくなるのでしょうか。 |
鎌倉、の近く
4月7日(木) 1:05:20
24846 |
ゴンとも |
#24846 #24837 のプログラムでloopの9を8に変え2400でしたが
そこよりも3の倍数は各桁の和が3の倍数だとそうなので たいして難しくないような気がします。 3の倍数を7とか11に変える方が難しいじゃないかと・・・。 |
4月7日(木) 1:16:44
MAIL:fttnm528@ybb.ne.jp 24847 |
万打無 |
私もtakuさんと同じく各数字を3で割った時の余りでグループ分けし、その組み合わせを考えました。
ただ、私は9枚の中から4枚残すと考えました。 1から9までの整数の総和は45。 選んだ5枚の数の総和が3の倍数だから、残す4枚の数の総和も3の倍数になる。 その組み合わせは 0,0,1,2 27通り 0,1,1,1 3通り 0,2,2,2 3通り 1,1,2,2 9通り 合わせて42通り。 選んだ5枚を並べ替える組み合わせは5!=120通り。 よって全ての組み合わせは 42×120=5040通り。 |
4月7日(木) 8:12:26
MAIL:akkk@hi-net.ne.jp 24848 |
kasama |
おはようございます(*^_^*)。
import java.util.*; public class Question445 { public static void main(String[] args) { int count = 0; List list = new Permutation(Arrays.asList(new String[]{ // クラスPermutationは#18624を参照 "1", "2", "3", "4", "5", "6", "7", "8", "9"}), 5).getList(); for (Iterator iter = list.iterator(); iter.hasNext(); ) { List eList = (List) iter.next(); StringBuffer sb = new StringBuffer(); for (Iterator eIter = eList.iterator(); eIter.hasNext(); ) sb.append((String) eIter.next()); if (Integer.parseInt(sb.toString()) % 3 == 0) ++count; } System.out.println(count); } } |
出先
4月7日(木) 9:15:08
24849 |
uchinyan |
これはやさしい。
とはいえ、朝の忙しいときだったので、暗算でやったら、2回も計算違いしてしまいました (^^; 解法は、皆さんと同じですが、一応。 最初に、選ぶ数字の組み合わせを調べ、それらを5桁の数字とするために並べます。 まずは、選ぶ数字の組み合わせ。数字の和が3の倍数になればいいので、 選ぶ数字の中に3の倍数が3個ある場合: 1 * 3 * 3 = 9 通り 選ぶ数字の中に3の倍数が2個ある場合: 3 * (1 + 1) = 6 通り 選ぶ数字の中に3の倍数が1個ある場合: 3 * 3 * 3 = 27 通り 選ぶ数字の中に3の倍数が0個ある場合: 0 通り となるので、組み合わせは、9 + 6 + 27 = 42 通り。 そこで、並べると、5桁の数字は、42 * 5! = 5040 通り。 |
ネコの住む家
4月7日(木) 9:21:34
MAIL:uchi@sco.bekkoame.ne.jp 24850 |
まるケン |
おはようございます。
#24844 選び出す枚数が3の倍数の場合(3枚とか6枚の場合)は1/3にはならないんですね。 3の倍数は全504通り中180通りになります。 ちなみに、3で割って1あまる数、2余る数は、どちらも162通りです。 なかなか絶妙な数値設定だったんですね、9枚中5枚って。 |
4月7日(木) 10:35:18
MAIL:take4310@mobile.email.ne.jp HomePage:まるケンの部屋 24851 |
みかん |
いちいち5つの数字の組み合わせ126通りについて3の倍数かを考えるのは
面倒だな…ということで、当てずっぽうで3分の1としてごまかしちゃいました。 |
4月7日(木) 10:45:11
24852 |
ハラギャーテイ |
今回はやさしかった。一発正解は気持ちが良い。 |
北九州
4月7日(木) 10:46:42
HomePage:信号処理に挑戦 24853 |
??? |
次のプログラムにすると、少しは速いかな。試していないけど。
LET KOTAE=0 FOR A=1 TO 9 FOR B=1 TO 9 IF A<>B THEN FOR C=1 TO 9 IF A<>C AND B<>C THEN FOR D=1 TO 9 IF A<>D AND B<>D AND C<>D THEN FOR E=3-MOD(A+B+C+D,3) TO 9 STEP 3 IF A<>E AND B<>E AND C<>E AND D<>E THEN LET KOTAE=KOTAE+1 PRINT KOTAE;A;B;C;D;E END IF NEXT E END IF NEXT D END IF NEXT C END IF NEXT B NEXT A END |
4月7日(木) 12:14:21
24854 |
uchinyan |
#24844:
もう少し要領よくできそうですが、まぁ、大したことはないので実際に計算すると、 1 〜 9 が1枚ずつある場合、選ぶ枚数が、3の倍数では1/3にはならず、3の倍数でなければ1/3になりますね。 どなたかも書かれていたように、1 〜 9 までの和は 45 で、3の倍数なので、 k枚選んで3の倍数を作る場合の数字の組合せは、(9-k)枚選んで3の倍数を作る場合の数字の組合せと一致します。 そこで、k = 1, 2, 3, 4 を考えれば十分。実際に求めると... 1枚又は8枚選ぶ場合:数字の組合せは、3通り。3 * 1! = (9) * 1/3 or 3 * 8! = (9!/1!) * 1/3 なので、1/3。 2枚又は7枚選ぶ場合:数字の組合せは、12通り。12 * 2! = (9 * 8) * 1/3 or 12 * 7! = (9!/2!) * 1/3 なので、1/3。 3枚又は6枚選ぶ場合:数字の組合せは、30通り。30 * 3! not= (9 * 8 * 7) * 1/3 or 30 * 6! not= (9!/3!) * 1/3 なので、1/3 にならない。 4枚又は5枚選ぶ場合:数字の組合せは、42通り。42 * 4! = (9 * 8 * 7 * 6) * 1/3 or 42 * 5! != (9!/4!) * 1/3 なので、1/3。 そうそう、これがもれていました (^^; 9枚選ぶ場合:数字の組合せは、1通り。1 * 1! not= 1 * 1/3 なので、1/3 にならない。 0枚選ぶのは意味ありませんね。 というわけで、選ぶ枚数が3の倍数、3, 6, 9 の場合だけが1/3になりません。 最初から、今回の問題では、1/3になることいえるのかな? また、もう少し一般的に何かいえる? もっとも、問題をうまく拡張しないと題意がおかしくなりそうですが。 |
ネコの住む家
4月7日(木) 13:15:19
MAIL:uchi@sco.bekkoame.ne.jp 24855 |
tapu |
9×8×7×6×5÷3 |
4月7日(木) 13:04:03
24856 |
n厨 |
選ぶ枚数について違う
まだ遊べそうです |
4月7日(木) 15:22:32
24857 |
uchinyan |
#24844 & #24855:
特に、#24855の >最初から、今回の問題では、1/3になることいえるのかな? 簡単でした (^^v 今、5個の数字を選んでその和が3の倍数になったとします。 それら5個の数字にそれぞれ +1 をします。9の場合には10になりますが、この場合には9だけずらして、1を対応させます。 明らかに、こうして得られた5個の数字に等しいものはありません。 さらにこれらの数字の和を取ると、+5 又は +5-9 = -4 だけ変化するので、和は3で割って2だけ余る数になります。 つまり、この5個の数字で作られる5桁の数字は、3で割ると2だけ余ります。 同様にして、和が3の倍数の5個の数字に -1 をし、0となった場合には9を対応させることにすると、 それらの数字はすべて異なり、その和は、-5 又は -5+9 = 4 だけ変化するので、3で割って1余る数になります。 これらの操作は、逆もいえるので、3の倍数、3で割って1余る数、3で割って2余る数の間に1対1の対応が存在します。 そこで、3の倍数の個数は、全体の1/3になり、9P5 * 1/3 = 9!/4! * 1/3 = (9 * 8 * 7 * 6 * 5)/3 = 5040 通り。 この操作は、選ぶ数字の個数が3の倍数でない場合には同様にうまく機能し、3の倍数の個数は全体の1/3になります。 なお、選ぶ数字の個数が3の倍数の場合には、選んだ数字の和は3の倍数しか増減しないので、うまく機能しません。 もっとも、これだけでは、3の倍数の個数が1/3に「ならない」ことの証明にはなりませんが。 また、選べる数字が、1 〜 9 ということも重要ですね。例えば、1 〜 8 ではうまく機能しません。 (追加) かえって面倒になってしまいましたが... 選ぶ数字の枚数が3の倍数の場合、特に、3枚を選ぶ場合を考えます。6枚の場合でも同様です。 この場合、+1, -1 の操作によって、選んだ数字の和を3で割った余りは変わりません。 これは、この操作によって移り合う9組の3個の数字の組が、3で割った余りに関して同じ集合に属することを意味します。 したがって、選ばれた数字から作られる数、3の倍数、3で割って1余る数、3で割って2余る数それぞれの個数が、9の倍数になることを意味します。 そして、各桁の数字は、+1, -1 の操作で 1 〜 9 に変化します。そこで、例えば、下一桁の数字を 9 に固定できます。 このとき、作られる数の個数は、残る2桁を 1 〜 8 までの数字から作る場合の数を、9倍したものになります。 ところが、この2桁の数を作る数字の組合せは、8 * 7 / 2 = 28 通り(数として並べる場合はこの 2! 倍)で、 これが、3の倍数、3で割って1余る数、3で割って2余る数を作る数字の組合せの個数の和です。 つまり、作られる数が3の倍数となる場合は、この28通りの一部を、2倍し、さらに9倍したものでなければなりません。 したがって、28は3で割れないので、3の倍数の個数は全体の1/3にはなれません。 実際には、28 = 10 + 9 + 9 となり、3の倍数が 10 * 2 * 9 = 180 通り、3で割って1余る数が 9 * 2 * 9 = 162 通り、 3で割って1余る数は 9 * 2 * 9 = 162 通り、となります。 |
ネコの住む家
4月7日(木) 21:52:09
MAIL:uchi@sco.bekkoame.ne.jp 24858 |
いちたすには |
0が3個、1が3個、2が3個
その中から5個とることにしました |
4月7日(木) 17:52:02
24859 |
ゴンとも |
#24854 を十進basicで試しました。45秒でした。自分の #24837 も
45秒くらいですが。問題が桁が増えとしてloopが増えると自分のは駄目で FOR の間に IF THEN をはさむですると対応するNEXT側 も END IF ですか。ありがとうございます。真ん中だけIF THEN することしか知らず 繰り返しがおおすぎなのか止まる事がおおくてなんとかしたい と思ってたんです。お手本としてメモ帳に保存(インターネット上の 問題は全て紙でなくメモ帳でやってます。)学ばせていただきます。では。 |
豊川市
4月7日(木) 18:10:52
MAIL:fttnm528@ybb.ne.jp 24860 |
スモークマン |
そうか。わたしも剰余類で考えましたが・・・
1〜9の5個の数字で出来るものは、3で割って1余るものと2余るものと割り切れるものの数は同じはずだわね〜(直感!) |
4月7日(木) 23:32:05
MAIL:kennji72001@yahoo.co.jp 24861 |
uchinyan |
いちたすには さんへ:(今回の問題には直接関係ないので、他の皆さん、ごめんなさい。)
この間の、シュタイナー点又はフェルマー点ですが、次のサイトを見つけました。 このサイトでは、「フェルマ点」になっていますが、かなり一般化できるようです。 http://aozoragakuen.sakura.ne.jp/taiwaN/p-geo/node2.html 私は知りませんでしたが、このサイト、ひょっとしたら有名なサイトかも。 高校レベルですが、面白いことがいろいろ書いてあります。 |
ネコの住む家
4月8日(金) 13:17:55
MAIL:uchi@sco.bekkoame.ne.jp 24862 |
K.N.I.F.E. |
直感で
(9P5)/3=15120/3=5040 こんな式になりました。 |
4月8日(金) 17:33:24
24865 |
K.N.I.F.E. |
直感で
(9P5)/3=15120/3=5040 こんな式になりました。 |
4月8日(金) 17:39:27
24866 |
航空アニマル |
9*8*7*6*5=15120、15120から、3を割って5040、終了。簡単。 |
4月8日(金) 23:11:56
24867 |
よーわからん |
15120を3で割る理由をちゃんと説明して欲しいです |
4月8日(金) 23:26:45
24868 |
いちたすには |
uchinyan様:(今回の問題には直接関係ないので、他の皆さん、ごめんなさい。)
まだシュタイナー点にこだわっていたのでありがたいです。 ∠Cの大きさが異なるCB=CAの二等辺三角形をいくつか書いてみました。 ∠Cを大きくしていくとシュタイナー点PはどんどんCに近づき ∠C=120°の時PはCに一致するのですが 私にはその軌跡が二点B,Cを通る円のように見えます。 楕円を使う別解証明に驚きました。別解にはいつも唖然とします。 考え方はよ〜く分かったのですが 「楕円の接線の性質」とやらがよく分からなかったりします。 |
4月9日(土) 12:49:41
24869 |
吉川 マサル |
#24868(よーわからん さん)
3で割って良い理由ですが(ちなみに取り出す枚数が3と互いに素であるときは3で割って良いんですね)、uchinyanさんの#24858が簡明で分かりやすいかと思います。 |
PowerBook G4
4月9日(土) 12:59:38
MAIL:masaru-y@san su.org HomePage:算チャレ 24870 |
いちたすには |
再びuchinyan様
「楕円の接線の性質」の件、了解です。ごめんなさい。 前回の書き込みは 「二定点B,Cをとる。動径AC(AC=BC)をCを中心に回転させ」の意です。 |
4月9日(土) 14:24:59
24871 |
uchinyan |
いちたすには さんへ:
#24869の >私にはその軌跡が二点B,Cを通る円のように見えます。 は、次のように考えれば、明らか、かと思います。 シュタイナー点の特徴にはいろいろありますが、いちたすにはさんが、以前にご指摘になった、 △ABCの各辺上にその辺を一辺とする正三角形を作り、その正三角形の△ABC以外の頂点と、 △ABCのその正三角形に含まれない頂点とを結んだ3本の直線の交点が、シュタイナー点になることを使います。 これら3本の直線が一点に交わることは、#24862のサイトの証明どおりですが(正三角形の場合はもっと簡単)、 ここで現れるシュタイナー点を通る円は、実は、各辺上の三つの正三角形それぞれの外接円になっており、 この三つの円がシュタイナー点で一点に交わっていることが分かります。 そうなると、例えば、BCを固定して、∠ACBを変化させた場合、これら三つの正三角形及び円とシュタイナー点との関係は、 少なくとも、∠ACB <= 120度までは変わらないし、BCは固定しているので、BCを通る円は固定されており、 シュタイナー点は、BCを通る先ほどの円上を動くことになります。 なお、楕円を使った証明は、私も新鮮でした。 通常の平面幾何は、円と多角形程度ですが、一般の二次曲線まで使うと、新たな視点が開けるかもしれませんね ^^/ |
ネコの住む家
4月10日(日) 14:24:13
MAIL:uchi@sco.bekkoame.ne.jp 24872 |
ぷー太郎 |
気合で書き出した |
4月11日(月) 16:21:35
24873 |
まるケン |
#24860
プログラムの実行時間を語るには、マシンのスペックの条件が大事かと。 ちなみに、rubyでかいたプログラムをVictorのちっちゃいノートInterLink(PentiumM、1GHz)で走らせたところ、3.3秒くらいで出ました。 まだまだ速くできるところは残っていますが、以下にプログラムを晒します。 (段下げのために全角スペースを使ってます) j = k = 0 (12345..98765).each do |i| (a=i.to_s.split('').uniq).delete('0') if(a.size == 5) then j += 1 k += 1 if((i%3) == 0) end end p j, k プログラムの解説: 数字が重複しようが0が入ろうが、全くかまわずに12345から98765までの連続した数字を作ります。(12345..98765) そのそれぞれについて(each do ・・・ end)、数字を文字列に変換(to_s)し、構成する文字を一桁ずつばらし(split)、ここではじめて重複する文字を除き(uniq)、さらに'0'を取り除きます(delete)。 この結果の桁数(size)が、元の桁数(=5)と等しかった場合は、今回の問題で作れる数字であると言うことで、その総数(変数j)を1増やします。 また、この結果の数字が3で割り切れるならば、その総数(変数k)を1増やします。 全部終わったら結果の表示。(p) Let's ruby!! |
4月12日(火) 10:22:46
MAIL:take4310@mobile.email.ne.jp HomePage:まるケンの部屋 24874 |
DrK |
今回は、9つから5つを選ぶ方法で、合計が3の倍数になる組み合わせを考えればよい。
3で割って1余る数の集合、2余る数の集合、割り切れる数の集合に分ける。 3で割って1余る数と2余る数の数は同じになる。0個は3で割り切れる数が5個必要なため不可、3個の場合は合計が6個となるため不可。従って1個または2個となる。 1個づつの場合は、3×3×1=9 2個づつの場合は、3×3×3=27 それぞれの集合は3個あることから、3で割って余る数については3個全てを選ぶことも可能。この場合は、3で割り切れる数を2個選ぶことになる。 この場合は、どちらかの集合を選ぶことになり、 2×3=6 合計は9+27+6=42となる これらの順列を考えればよく 42×5×4×3×2×1=5040が答え |
今は廃墟
4月12日(火) 12:58:27
MAIL:satoka@star.odn.ne.jp 24875 |
吉川 マサル |
#24874
うちのPowerBook G4(800MHz、例のパチスロ大爆発で3年前買ったやつです)だと、4.75秒〜5.04秒くらいでした。time関数で計測する方法で良いのですかねぇ?(これだとrubyを起動する時間も含まれそうですが) |
PowerBook G4
4月12日(火) 13:41:04
MAIL:masaru-y@san su.org HomePage:算チャレ 24876 |
ゴンとも |
#24874
DREAMSYS の celeron の2.49GHz で2003年9月頃に本体 5万9800円でモニター付けて8万9800円でした。 (スぺックに値段は少し関係あると思ったんで値段も参考までに) |
豊川市
4月12日(火) 15:55:59
MAIL:fttnm528@ybb.ne.jp 24877 |
まるケン |
#24876
あ、私のもtimeでの計測結果です。 rubyの起動時間等は、、、ま、誤差と言うことで。 ちなみに、#24874に晒したプログラムは、リアルタイムで挑戦したときのものでして、プログラムとしては直感的に考えられて、短く書けるっていうメリットの反面、決して効率のよいものではありませんでした。 (#24837や#24854をrubyで書き直したら、0.5秒とかで結果が出ました) ということで、本日は会社にて「各種算術計算のアルゴリズムの調査および検証」というテーマで、もっと一般的な数字(mとnを与える)順列のプログラムなどをしてみました。そしたら、プログラムは長くなっちゃったけど、実行時間は0.85秒まで短縮できました。 例によって、全角スペース使ってます。 # pPc # Permutation def perm(a, c) if(c == 0) then return [] end if(c == 1) then return a.map do |s| [s] ; end end r = Array.new a.size.times do j = a.shift r += perm(a, c-1).map do |s| s.insert(0, j); end a.push j end return r end if(ARGV.size < 2) then p = 9 c = 5 else p = ARGV[0].to_i c = ARGV[1].to_i end a = (1..p).to_a j = k = 0 perm(a, c).each do |s| j += 1 k += 1 if (s.join('').to_i % 3 == 0) end p j, k perm関数は、引数aに要素を羅列した配列、cにその中から選ぶ数を与えると、要素数cの配列の配列を返すってなことになってます。 与えられた配列の先頭の要素をshiftで取り除き、再帰呼び出しでさらに計算させ、使った要素はpushで最後尾に連結するってのがミソです。でも、そのせいで結果は辞書的順番ではなくなっちゃってますが、、、 % ruby perm.rb とかすれば、今回の問題の答えが出るし、 % ruby perm.rb 9 3 なんてすれば、全体の1/3にならないケースの検証もできます。 |
4月12日(火) 17:23:02
MAIL:take4310@mobile.email.ne.jp HomePage:まるケンの部屋 24878 |
まるケン |
#24878
ひとりつっこみです。 permの返す結果を辞書的順番にするなら、再帰呼び出しするところでソートすればよいだけでOKでした。 r += perm(a, c-1).map do |s| s.insert(0, j); end ↓ r += perm(a.sort, c-1).map do |s| s.insert(0, j); end |
4月12日(火) 19:25:21
MAIL:take4310@mobile.email.ne.jp HomePage:まるケンの部屋 24879 |
きょろ文 |
9P5*1/3 簡単
理由は知らんけど… すっかり忘れてた… P.Sこの間夙川にお花見に行ってきたぞ!! |
√2の隣
4月12日(火) 21:21:54
MAIL:kyorofumi@msn.com HomePage:きょろ文ランド 24880 |
ゆんななこ |
足して15になるのが{1,2,3,4,5}で並び替えたら120とおり
18になるのが{1,2,3,4,8}と{1,2,3,5,7}と{1,2,4,5,6}で… ってやってくと42セットでてきて、全部120ずつできるから、5040。 |
おうち
4月13日(水) 19:17:05
HomePage:ゆかんづめ 24881 |
吉川 マサル |
これから帰宅します。例によって、電車の中で更新時刻を迎えることになるかと思いますので、順位表の更新は帰宅後(今日は12:30くらいかなぁ)になるかと思います。毎度申し訳ありません。m(__)m
# ミスがなければ良いのですが...。 |
PowerBook G4
4月13日(水) 23:39:07
MAIL:masaru-y@san su.org HomePage:算チャレ 24882 |