英語わからないけどCheck iOでPythonプログラミング
少し前にこんな記事が出ていました。
まず、プログラミングをしないと「ユーザー登録」が出来ない開発者コミュニティ「CheckiO」が天才過ぎる! | APPGIGA!!(アプギガ)
プログラミングにゲーム要素を加えた開発者コミュニティです。
英語はよくわかりませんが、なんとなく面白そうなので初めてみました。
Pythonはまだ参考書1冊も終えていない初心者なのですが、一回覚えてみたいと思っていましたし。
ユーザー登録についてはリンク先を参照してください。
プログラミング未経験者でも「配列のn番目を取り出す」という構文を調べれば簡単に解ける問題ですが、サイトの内容はばっちり経験者向けですね。
ログインするとマップが表示されます。
夜だったのでマップも暗くなっています。
「さて、最初はどんな問題があるのかな・・・」
と思いましたが、ここでいきなりつまづく。
「あれ、最初の問題ってどこから始められるん?」
英語力の無さがいきなり発揮されたか・・・
マップ上をひたすらクリックしてみたりあちこちのページを行ったり来たり・・・
10分くらいさ迷ってようやく見つけました。
ここ。マイページの島の名前がついたアイコンです。
単なる進捗の表示かと思ったら・・・!!!!
問題ページに行くと、挑戦出来る問題がリスト表示されています。
とりあえず一番上に挑戦しましょう。
問題文はこんな風に表示されます。
見てください! 英語がわからなくても例を見ればわかりますよ!
この問題はユニークな数字をリストから取り除け・・・つまり
「よーし、好きな奴らで2人組作れー! お、何だお前余ったのか、だったらお前はあっちに行ってなさい」
ということですね。鬼か。
右下のSolve Itをクリックするとエディタ画面に移動します。
エディタ詳細は最初に紹介した記事で見てもらうとして、移動直後簡単なチュートリアル動画を見ることが出来ます。
これを見ると英語が聞き取れなくてもとりあえず
「上にあるcheckioという関数を編集して」
「左上のRunを押して」
「正解かどうかは右側に表示される」
ということがわかります。
よしやろう。
さて、ユニークな数字を抜いたリストを作るという問題ですが、Pythonでリストを作るということは恐らくリスト内包とかで1行で書けちゃったりするのでしょう。
うーん、リスト内にその要素が何個あるか数える関数とかないのかな・・・
こんな感じにしてみました。
def checkio(data): return [i for i in data if len(list(filter(lambda x: x == i, data))) > 1]
filterを使って自分の数を調べて、2個以上なら合格にしています。
うん、でもlenから続く関数まみれな感じがいけてないし、きっともっと良いやり方あるんだろうなぁと思いつつRunでチェック。
合格しました。
どうやら今回の自分の回答をいくつかのカテゴリーに投稿できるらしく、ただ「クリアしたよ!」というものやコードの短さ重視といったいろいろな回答のカテゴリーに投稿でき、その内容に関して他ユーザーのアドバイスやGood!がもらえるようです。
といっても僕の今回の回答はそんなに人様に見せるものではないのでUncategorizedのまま View other solutions で他の人の回答を見てみます。
そうするとGood!がたくさんついた回答があったのでチェックしてみると・・・
def checkio(data): return [row for row in data if data.count(row) > 1]
僕の回答とほぼ一緒ですが、listには count といういかにもな関数があったのですね。
といった感じで、ただ問題を解くだけじゃなくて他の人の良い回答もすぐ見つけて参考にすることが出来ます。
他の問題も数問やってみましたが、僕は純粋にPythonの構文だったり関数を知らなかったりで損していることが多い・・・ということがわかりました。初心者だから仕方が無いといえばそこまでですが、つまりやり続ければスキルは上がる! ということ。
Pythonという言語自体、簡潔に書けて色々なところで使えるので、JavaとかC系しかやったことのないプログラマーの人はこのサイトで勉強してみると役に立つかもしれません。
注:Check iOはPython3です。普通にreduce使おうとしたらなくてびっくりしました。標準から外されちゃったんですね、reduce。