主夫ときどきプログラマ

データベース、Webエンジニアリング、コミュニティ、etc

AtCoderのススメ方

今年はAtCoderやっていおうと決めたものの、いつやるのか問題がついてまわる。 最初は21時くらいからやってたのだけど、夕食やお風呂などで時間もずれるし、ビールとか飲んじゃうのであんまりちゃんと出来なかった。

そして「こんなこともわからんかったのか」という、プログラミング力低いなぁと思ってしまう出来事もあった。

朝やったほうがいい

人間の生産性は単純に朝のほうが高くて、太陽と共に落ちていくらしい。体感的にもほんとにそう。(これは何かの研究で結果がでてた。) なので朝やったほうが良いのは当然なので、最近は子供を保育園に連れて行ったあとの1時間ほどをRust+AtCoderに当てている。当然ちゃんとできている。

数値の各桁を足す方法がおもつかないの巻

いくつか簡単な問題を解いてて気付いたのが、そんなこともわからんのか、問題。 数値の桁数を足し合わせる、みたいなことをやる問題がいくつかあって解いてた。

始めはこの問題ABC 081 A - Placing Marblesで、各桁を文字列のまま足した。なんの工夫もない。

    let v: Vec<char> = input.chars().collect();
    let mut res = 0;
    if v[0] == '1' { res = res + 1 }
    if v[1] == '1' { res = res + 1 }
    if v[2] == '1' { res = res + 1 }

次にやったのはこの問題ABC 083 B - Some Sumsで、数値の各桁の和を求めないといけない。 そんでこうやって解いた。

fn digit_sum(x: i32) -> i32 {
    if x < 10 {
        x
    } else {
        digit_num(x) + digit_sum(x/10)
    }
}

fn digit_num(x: i32) -> i32 {
    x - (x / 10) * 10
}

再帰にしなくてもループでできるし、1桁目の数値を取るのに x - (x / 10) * 10 なんかせずに x % 10 で余りを取ればいいし、っていうなんだか冗長なコードになってしまった。modなんて使う場面が最近ないので全く思いつかなかった。プログラミング力低し。

Rust力低くてもなんとかやっていける

Rustはまだライフタイムまでしか読めてないし、所有権とか借用とかの概念も全然理解できてない。 当面の目標は標準出力のStringをいい感じで取得できるようにジェネリクスの関数に押し込めてしまうことだけど、これがうまく行かないのでまだまだ頑張らないといけない。 とはいえ頑張り過ぎてもしょうがないので、のんびりやっていこう。