Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Project Eulerの話

nozma
April 05, 2019

Project Eulerの話

Project Eulerについて紹介しました。

nozma

April 05, 2019
Tweet

More Decks by nozma

Other Decks in Programming

Transcript

  1. AtCoder のランキング APIがあったのでそこからデータ取得 kenkoooo/AtCoderProblems: Problem manager for AtCoder users jsonをrlistパッケージで読み込んで加工

    次の項目を計算してグラフを作成 ユーザー数 ... ACが1件以上あればユーザとカウント AC平均 ... Accepted合計 / ユーザー数 15 / 40
  2. Project Euler のランキング Statistics - Project Eulerに統計情報があるので取得 認証が必要なのでRSelenium パッケージでログイン rvestでスクレイピング

    次の情報があるので可視化(件数が多いので上位50%のみ) ユーザー数...ユーザーがプロフィールで設定するもの 回答率...回答数/問題数が言語別に集計されたもの 18 / 40
  3. 素直に解く ans 0 for (i in seq_len(999)) { if (i

    3 0 | i 5 0) { ans ans + i } } 良いと思います。 24 / 40
  4. もっと最近のR っぽく library(dplyr) data.frame(x = 1:999) %>% filter(x 3 0

    | x 5 0) %>% summarise(answer = sum(x)) 好きなライブラリを使ったって良いんです。 26 / 40
  5. Python が使いたいんじゃ print(sum(i for i in range(1000) if i %

    3 0 or i % 5 0)) どうしてもPythonが良いというなら止めません。 27 / 40
  6. Problem 92 Square digit chains 「各桁の値の2乗の合計を計算する」という操作を繰返します。 44 -> 32 ->

    13 -> 10 -> 1 -> 1 85 -> 89 -> 145 -> 42 -> 20 -> 4 -> 16 -> 37 -> 58 -> 89 1つめの例では、1に到達し、2つめの例では89から始まるループに到達しています。実 は、操作を繰り返すとすべての自然数は1または89に到達します。 1千万以下の自然数のうち、89に到達する数はいくつあるでしょうか? 29 / 40
  7. コードにするとこう solve function(a, b, m) { ans = 1 for

    (i in seq_len(b)) { if (i b) m = 1e8 ans = modpow(a, ans, m) } return(ans) } solve(1777, 1855, 4e7) ※冪乗の剰余を計算する関数がRには無いので適当に定義する必要がありま す。メンドイ!! 38 / 40
  8. 実は… ループは10回で良い で剰余とっても良い Pythonだと楽 x = 1 for i in

    range(10): x = pow(1777, x, 10 8) print(x) とかいろいろあって闇が奥が深いです。問題解いてからforum覗いてみるとよ いでしょう。 10 8 39 / 40