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

Project Eulerの話

Avatar for nozma nozma
April 05, 2019

Project Eulerの話

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

Avatar for nozma

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