マイルドにマイルドさを重ねて書いても

いや怖いと思う。

最上級マイルドでないとしても,だいたいマイルドになるかどうか確認して書いても,攻撃食うことって世の中あるんだなと思いつつ。。。。もうちょっとエクスキューズ書かないといけないのかね。さすがにそのレベルでチェックかけて書くとしんどいので,これぐらいでいいかで自分は止めたりするけど。

さすがに微にわたり細にわたり最上級のマイルドまで意識しては書いてないけど。要は意図せずどっかにとげがのこってないかを詳細に詰めるチェックまではしてないと。

まあ自分はいいとして,いや,さすがにその話題でそれ書いてこの攻撃がくるのか,というシーンを見てしまうと怖すぎる怖すぎると思う。。。。

いろいろみながらびびってるけど,いや,そういわれてそういうなら最初からそう書いておけよという思いが強い。だいたい,それは私が読み取ってる文脈そのものだし,暗黙の文脈わかってればそれが読めるけど,ても表面的に見てれば普通はこれそうは読めない人いるんじゃない,とオブラートに包んで書いたら,そうじゃないってばしってやる。恐ろしい世の中だ。

あとは,こっちの立場で論評風に書いて主張するのは無理だしそこまでの確証がないから主張はしないし,コストはかけられないけど,とりあえず記録として印象論でこうかなでも書いておこうかぐらいでも宣戦布告的に取られるとか怖い怖い。

理系の学問という対象は嫌いではないけど,それに集まっている理系の人は嫌いな人が多い,という理由で文系やってる私としては,そのおぞましさを久々に見た思いがする。文系と決めた後で,意外とおぞましくない理系の人も数々みてきてるから昔よりかは理系に対するおぞましさは薄れるけどね。。。。

ちょっと忙しくてばしっと書いた記事をさらすのは怖いので。。。いや,それでこういう攻撃されるなら書けないな。。。ほんと。。。。

とりあえずは茶色にしたが・・・

とりあえず,かなりの回数参加して,あまり努力せずにAtCoderを茶色にしてみたが・・・

とりあえず自分の勉強用としては,相当にマッチしているサイトで良かったと思う。ただ,その前提って高校数学が少しだけわかり,大学数学はほんの少しみたことあって,経済学にかすかに触れて最適化の感覚になんとなくなじんでいるから,という特殊背景があったような気がしないでもない。

茶色までは楽できると期待は外れたとこがある。例えば,緑まではc++いらないって書かれていたことを信じてたのが裏切られたとか(ACしているのを見ると可能だが,私には面倒で無理な話だったということ。)。仕方がないと,少しだけc++も使うことが何回かあった。このために公式提供のサイトで少しだけc++を勉強した(これは良かった・さくっとできたので),というかコンテスト中に公式提供のc++の書き方を見ながら書いたことが何度もあった(というか今も)。

あと,世間のforとifがわかってほんの少しだらだら勉強してたら茶色になれるも信じてた。だったらノー勉で茶色までいけるならだらだらとやるかと始めた。ただ,それが当てはまる人と当てはまらない人がいそうだというのが最近の実感。以下,それについてだらだらと書いてみる。

パフォーマンス400のライン

ここ3回のパフォーマンス400の境界をざっと目視で確認すると。

  • 158 : Cまで, 約60分
  • 157 : Bまで, 約20分
  • 156 : Cまで, 約30分

となる。普通にやったらCまでは解かないと茶色にはなれないと言えそう。

ここ3回の400のラインで求められていると思われるもの

158

8%消費税と10%消費税の額が与えられて,元の額の最小値を求める問題。

少なくとも制約を見て,支払う金額のループで解けるということを思いつく必要がある。それか切り捨ての不等式を真面目に考えられる算数的能力。

157

3x3のビンゴの判定を20分以内に解く or 条件を満たす最小の整数(C問題)を解く。

Cは制約考えると1から順番に考えていって解けるらしいが・・・私は,桁数で場合分けして解いて,ちょっと痛いミスをして解けなかったが。。。

156

C は,x_iの列が与えられたときの(x_i -m)2の和を最小にする問題。

mはx_iの最小と最大の間にあるということに気付いて実装する(20分以内に!)か,確率・統計(最小二乗法の感覚)の常識で,mが実数ならmの値は平均値なので,その前後の整数を試せば良いことに気付くか,さらに2次関数の知識で整数に近い方が解答になることに気付くか。制約読んで,総当たりでも行けると気付く解法もある。c++以外で間に合うかはわからないが。

D は,教科書レベルの組み合わせ + 指数・2項係数の高速化(D問題)が必要な問題。

プログラミングのお勉強で茶色に行けるのか?

私がずっと思ってることとして,出題者・参加者双方,中受算数か大学受験数学をくぐっているか,高校数学ぐらい苦労せずに身に着けられる頭脳を持っている人のような気がしてならない。

156のCは,たぶん本当の進学校とかだと数1の段階で授業で触れられてる話だと思う。しかし,高校生の自分が,知識として(x_i-a)2の和を最小にするようなaは平均値,という知識を知らずにこの問題を解けるかと言われると怪しい。そういえば,過去には|x_i-a|の和を最小にするのはaが中央値のとき,という知識も必要な問題もあった記憶がある。

最小を取るaは両端の間にある,なら求められる知識はいらないといわれると思う。しかし,それも式の形を見て最小にあたりをつけるというある種の高校数学的感覚がないとでてこない発想だと思う。常識で思いつくと言えばそれまでだが,その常識がある人もそれなりの知能がある人だと思う。

そもそも偏差二乗和の和を求める式は,x_iを定数とみてmを変数と見て1変数関数ととらえる感覚の有無が解答のしやすさに大きく効いてくると思われる。しかし,それを高校数学で偏差値50切る人がわかってる感覚とは思えない。少なくとも自分には,知識とか訓練なしであの式を1変数関数とは見れない。

157のBのビンゴは確かにforとifの典型題だと思う。これを20分ならまあまあお勉強と言える。しかし,そういう早解きでなくCの2項係数で考えると,これは競プロ自体のお勉強が必要になる。

158は算数だと思う。ただ,元の支払額のループで考えて良い,ということは何回か過去問を解いてるとわかってくる感覚かな・・・

以上3つは,(私は文系だが)理系の世界に住んでいれば,こんなのわからない人いるの?と言われる話で,算数や数学と呼ぶことすらはばかられる話だと思う。しかし,文系の一般の人にこれプログラミングの練習してれば茶色になれますよ,とは言えるというかと言えない。

算数・数学を通した得たふわっとした感覚が求められている

算数・数学を勉強すればなんとかなる,とも言えない。こういう数学が典型で頻出,というわけでなく,いろいろなところを断片的につまんでばらばらに出題している感じだから。こういうのは,知識の増強で対処できるものではなく,受験数学のような教科書の類題の単純あてはめっぽくない訓練をした経験が求められている感じである。それも,できるだけ誘導少ない問題で。あるいは,それを訓練せずともできる地頭があるか。

また,最適化のような考え方になじんでいるかも影響しそうだと感じている。自分はほんのわずかだけ経済学に触れたことがあるので,その経験からするとこれ常識よね,と思えることは何回かあった。しかし,それが高校以前にわかったとか,本で勉強して身に着けたか?と言われると疑問である。最適化の数式によるかっちりとした理解,というよりも言葉でふわっと最適化を考える感覚を使ってる感がある。自分は,この感覚を経済学部に存在しているだけで,勉強なしで自然と身につけた自覚がある。しかし,文系の一般人にお勉強で身に着けろ,と言われると?となる。

茶色は文系の一般人が「お勉強」でなれるものだと思っていたが,茶色でもそれが無理なんだというのが今の自分の実感。

勉強として使うには

レートとか気にせずA,Bを入門の問題集として解いていくのは算数微妙な人も含めて強くおすすめできる。Pythonとかでやれば良いと思う(自分はPythonでなく別のスクリプト言語使ってるけど)。本当のプログラミング初心者がA,Bをc++で解くことにこだわるのは,あまり意味がないと思う。

ただ,Cは数学っぽい問題とそれ以外の問題が混ざっているので,仕分けしながら解いていかないといけないかなといった感じ。

文系で数学が少しだけ得意とか,少しでも理系っぽい人は,特殊な勉強をしなくてもCぐらいまでは良い練習問題として使えるような気がする。だから,茶色ぐらいになるようにすれば?は正しそうな気がする。

世間のプログラミング入門で絵をかいたり何かを作ったりというのがおすすめされるが,それは万人に向いているようで向いてないと思っている。絵とかゲームに興味のない人には自分で作りたいものが考えられないので,自分で考えて何かを解いた経験がいつまでたってもできない。それと同じで,このサイトは数学やパズルのようなものになじんでいない人には自分で考えることができない学習サイトである。しかしそれらになじんでいる人には適したサイトなのだからそれで良いよね,と思う。

今年の入試問題を解いていて

お手軽な某国立大学の文系の問題を解いていたら,こんな問題があった。

f:id:baruku07:20200301133612p:plain

 \cos B = -4/5とする。このときにBHの長さを求めよという問題。


 \displaystyle
 AC^2= 16^2+25^2-2 \times 16 \times 25 \times \left( -\frac{4}{5} \right) = 1521

になるので,AC=39となって後はBHが出るという構図らしい。

こうすれば典型なのはわかる。しかし,1521を39に直せるなんて気付くのか。すごいな。。。

ここまでの誘導

そもそもこの問題,色々な紆余曲折を経て前問では


 \displaystyle
(\cos B, \sin B ) =  \left(-\frac{4}{5}, \frac{3}{5}  \right)

を導かせて,この問ではACとBの点と直線の距離を求めよという形式での出題である。しかも,BC=25, AB=16はこの問のためだけに急遽与えらた数値てある。急遽数値を与えるということは,計算が簡単になるように与えるはずである。したがって,16と25という数値を与えてきた時点で,162 + 252 などという計算をさせることが想定解法だとは思わない。回避を考えるのが自然である。

また,辺の長さの25にcosやsinかければ座標はきれいな値になることは数値を見た瞬間わかる。そうなるように25という数値を与えてきたのだなとも読む。とりあえず,Cは座標設定しておいてゆっくり考えてよさそう。ということは,座標設定して点と直線の距離の公式に持ち込めというのが誘導だと思った。Bを原点においてしまえば,計算量など知れているし。

図を描いてると余弦定理導出と同様にできることに気付く

ただ,それすらも直線の式計算するのは嫌だな。2桁の数の引き算なんかしたくないしと考えた私は図を描いていくうちにひらめいた。余弦定理の導出相当の図を描けば,sinAが求まるのでこれ簡単だと。すなわち,次の図が思いついたということ。

f:id:baruku07:20200301140905p:plain

この図より, \mathrm{CH}:\mathrm{AH} = 15:36 = 5:12であることがわかりこれは5,12,13の直角三角形だから斜めは13。三角比は縮小した三角形で求めて良いので


 \displaystyle
 \sin A = \frac{5}{13}

であることがわかる。これさえわかってしまえば,


 \displaystyle
\mathrm{BH}=  \mathrm{AB} \times \sin A = 16 \times  \frac{5}{13} = \frac{80}{13}

となることがわかる。この解法のポイントは,三角比を考えることで比の部分でうまく数値が小さくなるということである。また,出題者は5:12:13をうまく使って問題を作っていることもわかる。

ただ,この解答は書きにくい。だったら,表の式は余弦定理導出で計算してACの長さを導出してしまったことにして答えを書けば良い。さきほど,1/3の三角形に縮小して考えたので,ACは3倍してあげれば良い。答えさえわかってしまえばやり放題である。

今後の教訓としては,今のプロセスを一般的な式にすれば,


 \displaystyle
\mathrm{BH}=  \left(\mathrm{AB} + \mathrm{BC} \cos B \right)^2 + \mathrm{BC} \sin ^2 B = (16+20)^2+15^2 =3^2(12^2+5^2)

のような感じにすると,2乗の箇所が2か所で済むので計算が楽になることもあるぐらいか。ただ,コンピュータ時代には全くの不要な知識なのだが。。。

普通に座標に置くとしてもそんなに難しくない

f:id:baruku07:20200301143051p:plain

ACの式は


 \displaystyle
 y = \frac{-15}{16-(-20)} (x-16)

で傾きがうまく約分できて,いい感じで変形すると


 \displaystyle
5x + 12y -5 \times 16 = 0

になって,点と直線の距離の公式を使うと


 \displaystyle
 \frac{|-5 \times 16|}{\sqrt{5^2 + 12^2}} =  \frac{16 \times 5}{13} = \frac{80}{13}

となり,普通に肩がつく。この解法でも,傾きのとこで約分が効くことと,5,12,13が出てくることで計算が楽になっている。

肉は野菜と別に焼く方が良いという当たり前の事実を知る

今日は,肉はあってもなくても良いので,鶏もも肉だけを焼いておいて,気が向いたら一部を食べようということで焼き始めた。

例のごとくヘルシオのまかせて焼きで適当に鶏肉を焼く。鶏肉を食べた!という感じにしたかったのと,切り分けるのがめんどかったので,鶏肉を400gを200と100と100ぐらいの3分割ぐらいで切り分けて焼いた。鶏肉はキッチンばさみで切るだけなので簡単簡単てある。

これをただ焼くだけ。塩の計量なども考えたくなかったので,塩は後がけで焼いた。で食べたらものすごくおいしく仕上がっててびびる。どう考えても,肉はあまり切りすぎない方が良いし,野菜とも別々に焼いた方が良いという当たり前の事実がわかる。

最近,動画でヘルシオで網焼きチキンは最高であると宣伝されていた。確かに気持ちはわかる。久しぶりにこの形で食べたけど,これはおいしい。

ただ,節約になるかというと微妙であるが。自分で焼くとおいしいさのあまり,ついつい食べ過ぎてしまう。2割引のスーパーで焼いてあるチキンより食べ過ぎてしまってお値段的にはそのチキンよりオーバーしすぎてしまうのである。どうしたことか。

サンプル問題が普通に解けない

Pythonのサンプル問題をついに解いた。以下,正しさは一切保証しません。そしてキーワードにひっかけないため試験名は一切書かないけど何のことかわかりますよねと。

設問1

まず,この試験お得意の「問題文読めてますか?」である。五角形の問題は,ここのとこの小学校プログラミングで外角で考える必要があって,その角度は 2\pi/nであることを知っているからあっさり行ける。しらなかったらどうなんでしょう。これはPythonというか算数か数学プラス読解の問題ですよね。。。

設問2

c

まず,cはリスト内包記法と[:]の文法で知ってるかどうか。ここはプログラミングの問題と言ってもよさそう。

d, e

d1とd2はこんなのお絵かきでdxとdyという記法から常識で進む方向を決めようとして,だったら進む方向は r\cos (x)r\sin(y)に決まってるで終わり。これ算数か数学か物理では?

eは下のコメントからして,こんなの今いるところから方向なんだから自分自身の現在の居場所以外ありえない。これはPythonの文法のselfの問題ともいえるけど,これも算数か数学か物理では?もちろん,コンピュータでお絵かきしたことあれば常識だろうけど。。。。

f

fはまあ関数の仕様読めますか?だけど,関数の意味を考えたらあてはまるものはほとんどない。なんとなくはまる。Pythonを何も知らない私は,二変数なのになんで一個なんだと思ってしまうが,まあクラス内のメソッド定義(関数というのか?わからん)のselfは書くけど呼ぶときは省略というPythonの文法的お作法でもたぶんあるんでしょう,後のハッシュのとこ考えてもこれしかうまる選択肢はないしで埋まる。

最後のスタックの部分(g,h,i)

私の能力では,何書いてるかがさっぱりとわからない。わからないけど,この問題は出力をつけてくれるという親切なヒント付き。というか,そうしないと基本の範囲の難易度ではないということでしょう。

まず,出力の最後の要素を眺めていると,2つ目の要素がある条件を満たしたときに消えている。ということは,iは末尾の要素の消去と考えるのが自然。スタックなんだから,後から積んだ要素が先に消えないとおかしい。また,ifのtrueのときにrestが1ずつ減っていっていて,出力もそんな感じで減っていってて,減り終わったところで末尾の要素が姿を消しているのでこれで良いでしょうと。

gの条件判定はrestが1になって0には行かずに消えるとなってる。となると,そこの判定条件は1かそれより大きいかになる。

あとは全体を見る。whileがopnoの条件で消えてるのにopnoがどこで変化されてるかわからない。だいたい,繰り返し命令かからなかったらopnoが永久に変化しないで終わりってこと?と思って良く見返したら末尾にopnp+=1がある。で,もし繰り返し命令が一回も呼ばれなければ命令が元の命令列の長さだけ呼ばれて終了ということになる。ということは,逆に言えば繰り返しが入ったときにはopnpを操作してあげないと,途中で終了という悲しい目に合う。よって,opnpを書き換える選択肢が正しい答え。

もちろん,画面上で解いたのもあって気付くまでものすごく時間かかったが・・・・

解き終えて

全般的にPythonを読んだ気は全くしない。座標平面状でのお絵かき常識と,全体の意図をなんとなくとらえるカンと誘導をうまく使える力を聞いている問題。

どうせこんなのは座標でやってるんだから,長さに方向でやってて,そんなの当然rcos(x)にrsin(y)とか,それはいわゆるプログラミングの知識やスキルか?と言われると???なのである。

応用のアルゴリズム問題がそんな傾向で,個人的には基本よりやりやすいと思っているけどそれに似ている感じ。

情報系以外の大学理系の人でもノー勉ていける選択肢が増えたのかな?というイメージ。あと,なんとなくかしこな大学生有利な感じな気もする。でも,こういうのがかしこな層は,そもそもこの資格試験に対して意義を見出してなさそうので意味ないような。いったいこの試験,どこに向かっているのだろうか。

あと,こういうのはいくら本で勉強していても,暗黙の数学っぽさを随所にからめられて,その素養がない人はどれだけ勉強してもだめですよみたいな。そういう問題は無限にパターンが作れるので,専門系の対策は難しそう。

c++を手元で実行した経験が少ないので出力形式に気が回らない・・・

ABC154のD問題をやっていてはまった。

coutで桁数によっては突然指数表記になるとか知らないし・・・

D問題を見て,スクリプト言語だと真面目解法は間に合わないかもしれない,と思って,c++で書き出す。紆余曲折の末,解説放送と同じ発想に行き着く。

途中,何回も挫折しながら書く。まあ,AtCoderの初心者マニュアルみながら書いてレベルだし,関数はラムダ式で代用で問題ないという初心者本に頼ってたりもする。

やっと一時間ぐらいかけて書いたところで提出。だいたいのケースで通っているのだけど,なぜか一部のケースで落ちてる。小数計算を割けずに書いてるので誤差累積?でもこの程度でそんなのあるわけないだろとなって,時間を終える。

やけくそで最後で同じ解法でスクリプト言語で出したらきっちりとTLE。ところが同じ言語で通ってるのが多数あったりしてショック。。。

あと,書きながらk個分のインデックス真面目に考えるのだるいし,キューに考えてる部分の要素を入れておいて自然に最初に入れたの取り出すとかが使える人ならすっきり書けるんだろうなとか思って書いてたら,解説放送そうしてて参考になったりとか。

しかし,この問題できないと茶色すらでないという昨今の情勢は厳しすぎのような。。。問題文が読めてifとforがわかれば茶色という世界を信じてたので,まあたいして勉強せずに茶色にしておいてから,後からがんばって緑にしますかと思ってたあてがとことん外れてる。

せめてもの救いは,c++のさわりのさわりの部分は思ったより時間かけずに理解できたことだけど。

液晶追加で買った(32インチ)

家に帰って作業するときに,PCのディスプレイをみていると目がちらついてくるようになった。

目がちらつく対策でディスプレイを買うのだから,EIZO一択である。

買い足す前も,EIZOの27インチのWQHDだけど,それでも文字を拡大しないと見えにくくなってきた。Windowsのフォントレンダリングが私に会っていないのか私の目が悪くなり続けてるのかのどっちかはわからないけど。しかし,拡大をしてから見ると27インチだと情報量が少なくなりすぎてどうしようもない。

近年はiPadでごろ寝でブラウズが中心だから,PCのディスプレイは書くときに眺めるものだった。書く場合は,編集のときの文字の大きさやフォントはわりと自分で選べるので,文字が見えにくいという問題はあまり感じなかった。しかし,読む場合はなかなかそうはいかない。

ここのところ疲労が抜けない要因やPCに向かえない原因をずっと考えていて,それでたどりついたのが,ごろ寝のときの姿勢がたぶん相当悪くて,疲労を蓄積させている可能性。これをやめることを真剣に考えようというのがそもそもの始まりである。

ディスプレイから極力離れることが一番良いのだけど,次善の策としてPCディプレイ以外で画面を見る時間を極力減らす,ということでやってみうかといった感じ。お金は飛んでいくけどね。。。。

ディスプレイが来て一週間だけどAbemaの動画を27インチで見ながら右のPCで作業できるようになって幸福度は上がったがどうなることやら・・・・