|
吉川 マサル |
| 完全なるパクリなのですが、解けた小学生が、「俺、すごいかも」と思ってくれればということで... |
|
MBP
2月27日(木) 0:13:43
HomePage:算チャレ 48798 |
|
吉川 マサル |
| 文字化け問題、金曜日に対処します。(明日はまだ、後期医学部の直線対策がありまして...m(__)m) |
|
MBP
2月27日(木) 0:15:06
HomePage:算チャレ 48799 |
|
ベルク・カッツェ |
|
Pが角ACBの内側にあるとき、四角形APBCの面積が1.5以上2以下なので、底辺をABとしたときの三角形PABの高さが三角形CABの0.5倍から1倍になる範囲で、2×2-1.5×1.5=1.75になります。
Pが角ACBの対頂角の内側にあるとき、底辺をABとしたときの三角形PABの高さが三角形CABの高さの1.5倍から2倍になればいいので、範囲は1×1-0.5×0.5=0.75になります。 それぞれ3方向に同様の図ができるので(1.75+0.75)×3=7.5になりました。 |
|
2月27日(木) 0:16:49
48800 |
|
量子論 |
|
初のベスト10入りが、名前の入力ミス。
これも記念とします。 各辺を伸ばし、さらに各辺の平行線をひいて 6角形にしました。面積を2cm2から3cm2の範囲に 絞るには相似を使いました。 |
|
2月27日(木) 0:29:31
48801 |
|
限界bot |
|
初書き込みです。
もしかして、今年の東大理系数学第2問と同じ問題ですか? |
|
2月27日(木) 0:45:03
48802 |
|
今年から高齢者 |
|
問題をよく読まず、図をみて、三角形2つの和で計算していた。
|
|
2月27日(木) 0:45:23
48803 |
|
限界bot |
|
初書き込みです。
もしかして、今年の東大理系数学第2問と同じ問題ですか? |
|
2月27日(木) 0:47:23
48804 |
|
紫の薔薇の人 |
|
平面を直線AB、BC、CAで区切られる7つの領域に分け、Pが各領域を動くとき、
いつ条件を満たすかを考えます。 まず、Pを△ABCの内部に取ると、面積和は1になってしまうので該当しません。 次に、PをCAをAの外に延長した直線上にとると、条件を満たすのは、 延長幅がCAの1/2倍の点Qから1倍の点Dの範囲(線分QD)と分かります。 次に、PをQD上にとり、ABに平行に移動させても、面積和は変わりません。 次に、PをQD上にとり、BCに平行に移動させても、面積和は変わりません。 このことから、 CAをAの外にCAの1/2倍だけ延長した点をQ、CAの1倍だけ延長した点をD CBをBの外にCBの1/2倍だけ延長した点をR、CBの1倍だけ延長した点をE ABをBの外にABの1/2倍だけ延長した点をS、ABの1倍だけ延長した点をF ACをCの外にACの1/2倍だけ延長した点をT、ACの1倍だけ延長した点をG BCをCの外にBCの1/2倍だけ延長した点をU、BCの1倍だけ延長した点をH BAをAの外にBAの1/2倍だけ延長した点をV、BAの1倍だけ延長した点をI とすると、各辺が△ABCの辺と平行な2つの6角形QRSTUVと、 DEFGHIに挟まれた領域が求める領域になります。 (4-9/4)*3+(1-1/4)*3=15/2 |
|
2月27日(木) 0:51:27
48805 |
|
量子論 |
|
うわー! ほんと、同じですわ。限界botさん
これを今日、ここで出題するマサルさん、感服しました。 |
|
2月27日(木) 0:55:31
48806 |
|
紫の薔薇の人 |
|
#48805
>次に、PをQD上にとり、ABに平行に移動させても、面積和は変わりません。 >次に、PをQD上にとり、BCに平行に移動させても、面積和は変わりません。 直線で区切られた領域内で動かした場合 |
|
2月27日(木) 0:59:32
48807 |
|
ベルク・カッツェ |
|
東大の問題見てきました。まったく同じですね。
さっき書き忘れてましたが、・ル・〓ッ。 さんが私です。 |
|
2月27日(木) 1:09:20
48808 |
|
にゃもー君 |
|
とりあえず暗算で解けて安心。
でも図を描かないで文で解き方を描くのは面倒。 ABとBCとACを延長して△ABCの外側を6つの領域に分けた。 6つの領域は、以下の�,��△吠�けられ、点Pがどちらに入るかを考える。 �\�分PCが線分AB・線分PBが線分AC・線分PAが線分BCと交わる場合(曖昧な言い方をすると、PとCが線分ABの対岸にある、みたいな) �◆´,領琉莪奮� �,両豺隋¬明僂蓮�7/4×3=21/4 �△両豺隋〔明僂蓮�3/4×3=9/4 あわせて 15/2 |
|
浦和
2月27日(木) 1:10:37
HomePage:アニメネタで入試問題を作って放置中のページ 48809 |
|
紫の薔薇の人 |
|
サ遉ホ鬯魃、ホソヘ さんが私です。
今の東大は初等幾何出るんですね。 |
|
2月27日(木) 1:20:09
48810 |
|
吉川 マサル |
|
はい、今年の東大(しかも理系!)です。思わず「あれ、文系のほうを印刷しちゃったかな」とか思ってしまいました。1.も文系範囲で解ける問題だったので...。
これを出題したのはただの手抜きですが、小学生にやってみてもらうのも良いかなーと思ったのも事実で。 |
|
MBP
2月27日(木) 1:43:31
HomePage:算チャレ 48811 |
|
「数学」小旅行 |
| ぐるりんと回るのを失念してしまっていました。 |
|
2月27日(木) 7:42:39
48812 |
|
CRYING DOLPHIN |
|
三角格子を書いて考えました。これだと等積変形の様子が見やすかったです。
ttp://http://cdcdcd.sansu.org/pika/junkfoods/san1-q1125-2kara3ryoiki.png (h抜き表記はもはやインターネット老人会の範疇か?) これ今年の東大の問題なんですね! 麻布か灘第2日の問題としても通用しそうです。 |
|
顔上げた道の先
2月27日(木) 8:32:50
MAIL:ぴかー HomePage:ぴかぴかさんすう。 48813 |
|
せいちゃんだよ~~ん |
|
これって本番では楽勝問題だったのだろうか?
今では初等幾何って大学入試レベルなのかね |
|
竜田川の辺り
2月27日(木) 10:27:19
48814 |
|
baLLjugglermoka |
| 最近算チャレを紙とペン使わず暗算でチャレンジしていますが、今回は暗算で間違えまくり何とか暗算で正解しました。え、東大理系の問題でしたか^^;でもフツーに算数で解ける問題でしたね。 |
|
2月27日(木) 16:15:09
48815 |
|
スモークマン |
|
みなさんと同じでした ^^
△の辺に関して...2^2-1.5^2=3.5*0.5=1.75=7/4 △の頂点側に関して...1*(1-1/4)=3/4 so... (7/4+3/4)*3=(10/4)*3=30/4=15/2=7.5 解けたら気持ちいいですね♪ (図を描けたら) |
|
2月27日(木) 16:59:00
48816 |
|
Mr.ダンディ |
|
図で「3隅?」の部分が不正確で 何回か誤答を送信しておりました。
(それほど難しくない割には苦戦しました) |
|
2月27日(木) 19:49:21
48817 |
|
Mr.ダンディ |
|
#48817
>「図で「3隅?」の部分が不正確で」 というのは、わたしが描いた動く範囲での図でのことで、問題にある図でのこ とではありません。 (誤解をうみそうなので 訂正しようとしたのですが、訂正ができないので 思って「断り」を入れました) |
|
2月27日(木) 23:50:09
48818 |
|
ゴンとも |
|
今回の問題は東京大学の入試問題そのものだっとは驚きでした!!
京都大学の5番を十進Basic でやってみました!! for a=1 to 4 for b=1 to 4 for c=1 to 4 for d=1 to 4 IF a*b*c*d<>24 or a+b+c+d<>10 then goto 130 for e=1 to 4 for f=1 to 4 for g=1 to 4 for h=1 to 4 IF e*f*g*h<>24 or e+f+g+h<>10 then goto 90 for i=1 to 4 for j=1 to 4 for k=1 to 4 for l=1 to 4 IF i*j*k*l<>24 or i+j+k+l<>10 then goto 50 for m=1 to 4 IF a*e*i*m<>24 or a+e+i+m<>10 then goto 40 for n=1 to 4 IF b*f*j*n<>24 or b+f+j+n<>10 then goto 30 for o=1 to 4 IF c*g*k*o<>24 or c+g+k+o<>10 then goto 20 for p=1 to 4 IF d*h*l*p<>24 or d+h+l+p<>10 then goto 10 IF m*n*o*p<>24 or m+n+o+p<>10 then goto 10 let s=s+1 10 next p 20 next o 30 next n 40 next m 50 next l 60 next k 70 next j 80 next i 90 next h 100 next g 110 next f 120 next e 130 next d 140 next c 150 next b 160 next a print s end f9押して 576・・・・・・(答え) 問題見てプログラムを書いて10分で答えがでましたが 手でやるともっとサイズの大きいラテン方陣もできるのかな-? |
|
豊川市
2月28日(金) 9:31:13
MAIL:fttnm528@ybb.ne.jp 48819 |
|
物理好き |
|
軌跡か??と思ったら東大入試、そういう事だったんですね…
初等幾何、それも相似の知識だけで解けてしまうの、美しい |
|
大阪府
2月28日(金) 19:04:42
MAIL:butsuri.0523@gmail.com HomePage:Twitter 48820 |
|
通りすがりの高一 |
|
東大理系の2番ですね。
最初、ABCPが凸四角形となる場合しか考慮しておらず、無限に範囲が広がる気がしていましたが、解けると非常にスッキリしました。良い問題だと思います。 |
|
3月1日(日) 0:29:43
48821 |
|
通りすがりの高一 |
| 灘の2日目に出てきそうだという意見、とてもわかります。 |
|
3月1日(日) 0:33:39
48822 |
|
物理好き |
|
#48819
C言語にて、再帰を利用して、かつ、一番上の行を1 2 3 4 ... Nに固定して一番左の列を1 2 3 4 ... Nになるように並べ替えることを仮定したうえで最後に (N! * (N-1)!) を掛けるという方針で実装すると、N=7までは手元のPCでも充分高速(1分未満)に求められました #include<stdio.h> long long factorial(long long x){ long long i,r=1; for(i=x;i>=1;i--){ r*=i; } return r; } long long n; long long res=0; long long row[16][16]={0},column[16][16]={0}; long long latin_sq[16][16]; void rec(long long a,long long b){ if(b==n){a++;b=0;} if(a==n){res++;return;} long long i; for(i=1;i<=n;i++){ if(a==0 && b!=(i-1)){continue;} if(b==0 && a!=(i-1)){continue;} if(row[a][i]==1 || column[b][i]==1){continue;} row[a][i]=1;column[b][i]=1; latin_sq[a][b]=i; rec(a,b+1); row[a][i]=0;column[b][i]=0; } } int main(){ scanf("%lld",&n); rec(0,0); printf("%lld\n",res*factorial(n)*factorial(n-1)); } それ以上は組み合わせ爆発の例に使われるくらいには値が肥大化してしまいますね… https://oeis.org/A002860 https://en.wikipedia.org/wiki/Combinatorial_explosion |
|
大阪府
3月1日(日) 19:30:31
MAIL:butsuri.0523@gmail.com HomePage:Twitter 48823 |
|
にゃもー君 |
|
大学入試には算数みたいな問題も結構出るもんですね。
今年の一橋大学の入試に、算数の範囲で解けそうな問題がありました。 表現を算数で出せるように直しました。 10を10回かけた数、すなわち10000000000を 2020で割った余りは 〔� 佑任后� また、100桁の正の整数で、各位の和が2となるもののうち、 2020で割り切れるものの個数は〔�◆佑任后� (2020年中学受験は大体終わりなので、実際の中学受験で出題は無いでしょうけど… あと、算数の範囲であれば、「正の」は不要?) |
|
浦和
3月2日(月) 20:56:49
HomePage:アニメネタで入試問題を作って放置中のページ 48824 |
|
ゴンとも |
|
#48823
物理好き さん レスありがとうございます。 組み合わせ爆発の典型例で11*11までぐらいで止まってるんですね。 7*7は自分でもやってみました!! 十進Basicで ラテン方陣を (001)(002)(003)(004)(005)(006)(007) (002)(a01)(a02)(a03)(a04)(a05)(a06) (003)(a07)(a08)(a09)(a10)(a11)(a12) (004)(a13)(a14)(a15)(a16)(a17)(a18) (005)(a19)(a20)(a21)(a22)(a23)(a24) (006)(a25)(a26)(a27)(a28)(a29)(a30) (007)(a31)(a32)(a33)(a34)(a35)(a36) としてa1,a36までの通り数を求め7!*6!かけると 7^2のラテン方陣の総数となる。 PRINT TIME$ for a1=1 to 7 if a1=2 then goto 360 for a2=1 to 7 if a2=a1 or a2=2 or a2=3 then goto 350 for a3=1 to 7 if a3=a1 or a3=a2 or a3=2 or a3=4 then goto 340 for a4=1 to 7 if a4=a1 or a4=a2 or a4=a3 or a4=2 or a4=5 then goto 330 for a5=1 to 7 if a5=a1 or a5=a2 or a5=a3 or a5=a4 or a5=2 or a5=6 then goto 320 for a6=1 to 6 if a6=2 then goto 310 if a6=a1 or a6=a2 or a6=a3 or a6=a4 or a6=a5 then goto 310 for a7=1 to 7 IF a7=a1 OR a7=3 OR a7=2 THEN GOTO 300 for a8=1 to 7 IF a8=a2 OR a8=a7 OR a8=3 THEN GOTO 290 for a9=1 to 7 IF a9=a3 OR a9=a7 OR a9=a8 OR a9=3 OR a9=4 THEN GOTO 280 for a10=1 to 7 IF a10=a4 OR a10=a7 OR a10=a8 OR a10=a9 OR a10=3 OR a10=5 THEN GOTO 270 for a11=1 to 7 IF a11=a5 OR a11=a7 OR a11=a8 OR a11=a9 OR a11=a10 OR a11=3 OR a11=6 THEN GOTO 260 for a12=1 to 6 IF a12=a6 OR a12=a7 OR a12=a8 OR a12=a9 OR a12=a10 OR a12=a11 OR a12=3 THEN GOTO 250 for a13=1 to 7 IF a13=a1 OR a13=a7 OR a13=4 OR a13=2 THEN GOTO 240 for a14=1 to 7 IF a14=a2 OR a14=a8 OR a14=a13 OR a14=4 OR a14=3 THEN GOTO 230 for a15=1 to 7 IF a15=a3 OR a15=a9 OR a15=a13 OR a15=a14 OR a15=4 THEN GOTO 220 for a16=1 to 7 IF a16=a4 OR a16=a10 OR a16=a13 OR a16=a14 OR a16=a15 OR a16=4 OR a16=5 THEN GOTO 210 for a17=1 to 7 IF a17=a5 OR a17=a11 OR a17=a13 OR a17=a14 OR a17=a15 OR a17=a16 OR a17=4 OR a17=6 THEN GOTO 200 for a18=1 to 6 IF a18=a6 OR a18=a12 OR a18=a13 OR a18=a14 OR a18=a15 OR a18=a16 OR a18=a17 OR a18=4 THEN GOTO 190 for a19=1 to 7 IF a19=a1 OR a19=a7 OR a19=a13 OR a19=5 OR a19=2 THEN GOTO 180 for a20=1 to 7 IF a20=a2 OR a20=a8 OR a20=a14 OR a20=a19 OR a20=5 OR a20=3 THEN GOTO 170 for a21=1 to 7 IF a21=a3 OR a21=a9 OR a21=a15 OR a21=a19 OR a21=a20 OR a21=5 OR a21=4 THEN GOTO 160 for a22=1 to 7 IF a22=a4 OR a22=a10 OR a22=a16 OR a22=a19 OR a22=a20 OR a22=a21 OR a22=5 THEN GOTO 150 for a23=1 to 7 IF a23=a5 OR a23=a11 OR a23=a17 OR a23=a19 OR a23=a20 OR a23=a21 OR a23=a22 OR a23=5 OR a23=6 THEN GOTO 140 for a24=1 to 6 IF a24=a6 OR a24=a12 OR a24=a18 OR a24=a19 OR a24=a20 OR a24=a21 OR a24=a22 OR a24=a23 OR a24=5 THEN GOTO 130 for a25=1 to 7 IF a25=a1 OR a25=a7 OR a25=a13 OR a25=a19 OR a25=6 OR a25=2 THEN GOTO 120 for a26=1 to 7 IF a26=a2 OR a26=a8 OR a26=a14 OR a26=a20 OR a26=a25 OR a26=6 OR a26=3 THEN GOTO 110 for a27=1 to 7 IF a27=a3 OR a27=a9 OR a27=a15 OR a27=a21 OR a27=a25 OR a27=a26 OR a27=6 OR a27=4 THEN GOTO 100 for a28=1 to 7 IF a28=a4 OR a28=a10 OR a28=a16 OR a28=a22 OR a28=a25 OR a28=a26 OR a28=a27 OR a28=6 OR a28=5 THEN GOTO 90 for a29=1 to 7 IF a29=a5 OR a29=a11 OR a29=a17 OR a29=a23 OR a29=a25 OR a29=a26 OR a29=a27 OR a29=a28 OR a29=6 THEN GOTO 80 for a30=1 to 5 IF a30=a6 OR a30=a12 OR a30=a18 OR a30=a24 OR a30=a25 OR a30=a26 OR a30=a27 OR a30=a28 OR a30=a29 THEN GOTO 70 for a31=1 to 6 IF a31=a1 OR a31=a7 OR a31=a13 OR a31=a19 OR a31=a25 OR a31=7 OR a31=2 THEN GOTO 60 for a32=1 to 6 IF a32=a2 OR a32=a8 OR a32=a14 OR a32=a20 OR a32=a26 OR a32=a31 OR a32=7 OR a32=3 THEN GOTO 50 for a33=1 to 6 IF a33=a3 OR a33=a9 OR a33=a15 OR a33=a21 OR a33=a27 OR a33=a31 OR a33=a32 OR a33=7 OR a33=4 THEN GOTO 40 for a34=1 to 6 IF a34=a4 OR a34=a10 OR a34=a16 OR a34=a22 OR a34=a28 OR a34=a31 OR a34=a32 OR a34=a33 OR a34=7 OR a34=5 THEN GOTO 30 for a35=1 to 6 IF a35=a5 OR a35=a11 OR a35=a17 OR a35=a23 OR a35=a29 OR a35=a31 OR a35=a32 OR a35=a33 OR a35=a34 OR a35=7 OR a35=6 THEN GOTO 20 for a36=1 to 6 IF a36=a6 OR a36=a12 OR a36=a18 OR a36=a24 OR a36=a30 OR a36=a31 OR a36=a32 OR a36=a33 OR a36=a34 OR a36=a35 THEN GOTO 10 let s=s+1 10 next a36 20 next a35 30 next a34 40 next a33 50 next a32 60 next a31 70 next a30 80 next a29 90 next a28 100 next a27 110 next a26 120 next a25 130 next a24 140 next a23 150 next a22 160 next a21 170 next a20 180 next a19 190 next a18 200 next a17 210 next a16 220 next a15 230 next a14 240 next a13 250 next a12 260 next a11 270 next a10 280 next a9 290 next a8 300 next a7 310 next a6 320 next a5 330 next a4 340 next a3 350 next a2 360 next a1 print s PRINT TIME$ END f9押して 22:21:00 16942080 22:44:19 より 16942080*7!*6!; 61479419904000・・・・・・(7*7のラテン方陣の答え) 実行時間が23分19秒というのも・・・ 2011年の春モデルのaspire製5750G(製品名) でcpuがcore i7の第2世代(sandy bridge)で・・・ 2003のセレロンより同じプログラムで2.5倍くらい速かったんですけど・・・ C言語等のコンパイル言語でやり直したいところですね。 |
|
豊川市
3月2日(月) 23:04:52
MAIL:fttnm528@ybb.ne.jp 48825 |
|
ばち丸 |
|
灘中学の問題の方がよっぽどぴりっとしている。
友達と「灘中入試問題のできそこない」と言ってやった |
|
3月4日(水) 21:20:45
48826 |
|
「数学」小旅行 |
|
今週はお休みということですので、話題になっている京大の問題のプログラムを考えてみました。先日教えていただいたrubyを使っています。
4×4のとき、これはスタートしてほとんどすぐに出てきました。 # 算チャレ第1125回 京大問題編 row=Array.new();col=Array.new() 1.upto(5){|i|row[i-1]=[0,0,0,0,0];col[i-1]=[0,0,0,0,0]} # 一行目を1から4、一列目も1から4にします。 1.upto(4){|i|row[1][i]=1;row[i][i]=1;col[1][i]=1;col[i][i]=1} #countは適する方陣の個数です。 count=0 # 各要素を1から4にして、すべての場合を調べます。ただし、各行列で既に使われた数字は除外します。 1.upto(4){|a22|if row[2][a22]==0&&col[2][a22]==0 then row[2][a22]=1;col[2][a22]=1 1.upto(4){|a23|if row[2][a23]==0&&col[3][a23]==0 then row[2][a23]=1;col[3][a23]=1 1.upto(4){|a24|if row[2][a24]==0&&col[4][a24]==0 then row[2][a24]=1;col[4][a24]=1 1.upto(4){|a32|if row[3][a32]==0&&col[2][a32]==0 then row[3][a32]=1;col[2][a32]=1 1.upto(4){|a33|if row[3][a33]==0&&col[3][a33]==0 then row[3][a33]=1;col[3][a33]=1 1.upto(4){|a34|if row[3][a34]==0&&col[4][a34]==0 then row[3][a34]=1;col[4][a34]=1 1.upto(4){|a42|if row[4][a42]==0&&col[2][a42]==0 then row[4][a42]=1;col[2][a42]=1 1.upto(4){|a43|if row[4][a43]==0&&col[3][a43]==0 then row[4][a43]=1;col[3][a43]=1 1.upto(4){|a44|if row[4][a44]==0&&col[4][a44]==0 then count+=1 end}; row[4][a43]=0;col[3][a43]=0 end}; row[4][a42]=0;col[2][a42]=0 end}; row[3][a34]=0;col[4][a34]=0 end}; row[3][a33]=0;col[3][a33]=0 end}; row[3][a32]=0;col[2][a32]=0 end}; row[2][a24]=0;col[4][a24]=0 end}; row[2][a23]=0;col[3][a23]=0 end}; row[2][a22]=0;col[2][a22]=0 end} # 最後に4!×3!を掛けて答を出します。 p count*4*3*2*3*2 で、次に7×7に挑戦です。以下のプログラムですが、規則的なので(中略)します。 # 算チャレ第1125回 京大問題編 7×7の場合 row=Array.new();col=Array.new() 1.upto(8){|i|row[i-1]=[0,0,0,0,0,0,0,0];col[i-1]=[0,0,0,0,0,0,0,0]} # 一行目を1から7、一列目も1から7にします。 1.upto(7){|i|row[1][i]=1;row[i][i]=1;col[1][i]=1;col[i][i]=1} #countは適する方陣の個数です。 count=0; p Time.now # 各要素を1から7にして、すべての場合を調べます。ただし、各行列で既に使われた数字は使いません。 1.upto(7){|a22|if row[2][a22]==0&&col[2][a22]==0 then row[2][a22]=1;col[2][a22]=1 1.upto(7){|a23|if row[2][a23]==0&&col[3][a23]==0 then row[2][a23]=1;col[3][a23]=1 1.upto(7){|a24|if row[2][a24]==0&&col[4][a24]==0 then row[2][a24]=1;col[4][a24]=1 1.upto(7){|a25|if row[2][a25]==0&&col[5][a25]==0 then row[2][a25]=1;col[5][a25]=1 1.upto(7){|a26|if row[2][a26]==0&&col[6][a26]==0 then row[2][a26]=1;col[6][a26]=1 1.upto(7){|a27|if row[2][a27]==0&&col[7][a27]==0 then row[2][a27]=1;col[7][a27]=1 1.upto(7){|a32|if row[3][a32]==0&&col[2][a32]==0 then row[3][a32]=1;col[2][a32]=1 1.upto(7){|a33|if row[3][a33]==0&&col[3][a33]==0 then row[3][a33]=1;col[3][a33]=1 (中略) 1.upto(7){|a76|if row[7][a76]==0&&col[6][a76]==0 then row[7][a76]=1;col[6][a76]=1 1.upto(7){|a77|if row[7][a77]==0&&col[7][a77]==0 then count+=1 end}; row[7][a76]=0;col[6][a76]=0 (中略) end}; row[2][a23]=0;col[3][a23]=0 end}; row[2][a22]=0;col[2][a22]=0 end} # 最後に7!×6!を掛けて答を出します。 p count*7*6*5*4*3*2*6*5*4*3*2 p Time.now かかった時間は9分9秒でした。Corei5-4200M_2.50GHz_RAM8.00G lenovoL540ノートパソコンを使いました。 プログラムを書いてみて、再起呼び出しがどれだけ便利なものかよくわかりました。(^^)!! |
|
3月5日(木) 14:13:43
48827 |
|
おすまん |
| 今週の出題がなかったのでおかげで、間に合いました(^^; |
|
somewhere in the world
3月5日(木) 18:53:07
48828 |
|
「数学」小旅行 |
|
再帰関数を使ってみました。
この方が断然速かったです。前回と同じスペックで、5分30秒でした。 # 算チャレ第1125回 京大問題編 7×7の場合 $row=Array.new();$col=Array.new() #グローバル変数とします。 1.upto(8){|i| $row[i-1]=[0,0,0,0,0,0,0,0];$col[i-1]=[0,0,0,0,0,0,0,0]} #1行目をrow[1]、1列目をcol[1]で表わすために8×8としました。 1.upto(7){|i|$row[1][i]=1;$row[i][i]=1;$col[1][i]=1;$col[i][i]=1} # 1行目を1から7、1列目も1から7にします。 $count=0; #$countが求める方陣の個数です。 #再帰関数の定義部分です。 #(a,b)成分を1から7まで変化させ、その数がa行およびb列にあるかどうかを判定して、なければその数を(a,b)成分とし、次の行列成分に進んで同じように入れてゆく関数を定義します。 #(n,n)要素まで入れ終わることができたらカウントしてから、またひとつ前の位置に戻って次の数(1から7)を入れて調べて行くことにします。 def seibunsirabe(a,b) 1.upto(7){|i| if $row[a][i]==0&&$col[b][i]==0 then;if a==7&&b==7 then$count+=1 else $row[a][i]=1;$col[b][i]=1;b==7 ? seibunsirabe(a+1,2):seibunsirabe(a,b+1) end $row[a][i]=0;$col[b][i]=0 end } end seibunsirabe(2,2) #再帰関数を実行します。 p $count*7*6*5*4*3*2*6*5*4*3*2 # 最後に7!×6!を掛けて答を出します。 |
|
3月6日(金) 11:12:42
48829 |
|
「数学」小旅行 |
|
独りで遊んでいてすみません。この流れで、ナンプレ(数独)の解法プログラムも作ってみました。
# ナンバープレイス 解法プログラム $con=Array.new() #初期に与えられた数を入れます。1行1列目は$con[1][1]です。 #(1,1)から(9,9)にナンプレの問題を入力します。 $con[0]=[0,0,0,0,0,0,0,0,0,0] $con[1]=[0,0,0,0,2,0,0,0,0,0] $con[2]=[0,0,0,0,8,0,9,5,4,7] $con[3]=[0,0,0,1,0,6,0,8,0,0] $con[4]=[0,3,0,0,0,0,0,0,0,5] $con[5]=[0,8,0,9,1,0,0,0,0,0] $con[6]=[0,0,0,6,0,0,0,0,7,0] $con[7]=[0,0,0,0,0,5,0,3,0,8] $con[8]=[0,6,2,0,4,0,0,0,0,0] $con[9]=[0,0,0,0,0,0,0,9,0,0] #-------------------------------------- $row=Array.new();$col=Array.new();$sol=Array.new();$blk=Array.new() #グローバル変数とします。 $count=0;#$countが求める方陣の個数です。 # a行b列のブロック番号(3×3のブロック9個を左上から右・下へと番号を付けます。)を返します。 def blkid(a,b) return (b-1)/3+1+3*((a-1)/3) end 1.upto(10){|i| $row[i-1]=[0,0,0,0,0,0,0,0,0,0];$col[i-1]=[0,0,0,0,0,0,0,0,0,0];$sol[i-1]=[0,0,0,0,0,0,0,0,0,0];$blk[i-1]=[0,0,0,0,0,0,0,0,0,0]} #1行目をrow[1]、1列目をcol[1]で表わすために8×8としました。 1.upto(9){|i|1.upto(9){|j| $row[i][$con[i][j]]=1;$col[j][$con[i][j]]=1;$blk[blkid(i,j)][$con[i][j]]=1}}# 各行列ブロックで使われている数字をチェックします。 #--------------------------------------- #再帰関数の定義部分です。 #(a,b)成分を1から9まで変化させ、その数がa行およびb列にあるかどうかを判定して、なければその数を(a,b)成分とし、次の行列成分に進んで同じように入れてゆく関数を定義します。 #(9,9)要素まで入れ終わることができたらカウントしてから、またひとつ前の位置に戻って次の数(1から9)を入れて調べて行くことにします。 def seibunsirabe(a,b) if $con[a][b]==0 then 1.upto(9){|i| if $row[a][i]==0&& $col[b][i]==0&& $blk[blkid(a,b)][i]==0 then $sol[a][b]=i if a==9&&b==9 then $count+=1;1.upto(9){|j|p $sol[j]} else $row[a][i]=1;$col[b][i]=1;$blk[blkid(a,b)][i]=1;b==9 ? seibunsirabe(a+1,1):seibunsirabe(a,b+1) $row[a][i]=0;$col[b][i]=0;$blk[blkid(a,b)][i]=0 endend } else $sol[a][b]=$con[a][b];if a==9&&b==9 then $count+=1;1.upto(9){|j|p $sol[j]} else b==9 ? seibunsirabe(a+1,1):seibunsirabe(a,b+1) end end end seibunsirabe(1,1);p $count これをルビーで実行すると解が1つ出ますが、例えば、2行9列の7を定めないときは解が66通りあるとかも出てきます。 たっぷりと楽しんでしまいました。ありがとうございました。 |
|
3月9日(月) 14:04:09
48830 |