2018-05-17

AtCoder Beginner Contestの問題を解きながら思ったこ

https://qiita.com/drken/items/fd4e5e3630d0f5859067 ← これ。

コンテスト自体が一問5分という制限があるためか、やっつけで片付ける事が目的ですよね。

結果としてビギナー所詮この程度とバカにしたようなコードしかない。

ガチ初心者ならそれで良いと思うけど、5分でさっと書ける実力のある人がそのコード残すの?

と思うと残念でならない。

私はプログラマでもないし、言語は一つしか使えないし、下手すると解くのに何時間もかかってしまうけど、

インターネット上に残るにはずっとマシなコードだと思ってる。

そして、初心者が成長に必要なのはこっちじゃない?って思う。

というか、私が欲しかったのは、そういう最低限問題が解けるだけの、

豚にメシをくれてやるような雑なコードじゃなかった。

たとえば、第 8 問: ABC 085 C - Otoshidama (300 点)。

パフォーマンス意識し始める問題

愚直にやると何回ループさせられるか分からないのだけど、

ここで重要な知見として

1 秒間で処理できる for 文ループの回数は、10^8=100,000,000 回程度

というのがあります

なんて書かれてる。

えー。私の環境、for(1..10**8) {} (本当に何もしない繰り返し)で3秒かかりました。

for(1..10**8) { i=0 } (変数になにか代入するだけ)で6~7秒くらい。

ガチ初心者は3重ループしなくて良いんだと気づけるだけで良い。

でもハエを払うように5分で済ませられる実力のある人だったらさぁ……

まず、総当たりする前にそもそも解があるか、超簡単確認くらいしようよ?

if ( is_resolvable(N, Y) ) {
    do_something(N, Y);
} else {
    print "-1 -1 -1";
}

sub is_resolvable() {
	if ( Y > 10000*$N ) { # Shortage
	    return 0; 
	} elsif ( $Y <  1000*$N ) { # Too much
	    return 0; 
	} else {
	    return 1;
	}
}

(is_resolvable()って、なんかDNS関係っぽくて好きじゃない名前だけど)

(追:&とか不等号が文字参照になって見づらいので置換。架空言語でも概略分かればいいじゃない……)

もしかして業界自力で出来るようにならない初心者は、必要のない初心者

もしくは、アウトプットするような人はみんな出来る人だから

本当に出来ない人がようやく越えられた一歩なんて、見落としてるのかな。

まぁ私自身は

 いじったらすごくなる → たーのし

 もうちょっとがんばっていじる → たーのし

最終的に10前後ループで済むようになって、

これってプログラミング醍醐味なのかしら?たーのしーと思いつつ、

最終的に丸一日かかって第8問が完成致しました。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん