Rでマネーフォワードをスクレイピングする

マネーフォワードのポートフォリオ(資産ページ)は資産の内訳が一覧できて便利なのだが、銘柄コードがあるものは全部株、という感じでざっくりしている。商品の区分も業種の区分もわからないので、もうちょい細かく見たいときに困る。というか自分のポートフォリオが実際どうなっているのかよく分かってない。これでは良くないということできちんと集計しようと考えた。

しかし証券会社のwebサイトの出力はしょぼいし、マネーフォワードのポートフォリオはそもそも出力できないしユーザーが使えるAPIも公開されてない、ということでマネーフォワードをスクレイピングすることにした。

続きを読む

似非エラトステネスの篩は「アイデアとして正しい」のか?

少し前に某所でエラトステネスの篩の実装が正しくないとかなんとかで話題になったことがあった*1*2。そこでの結論が「アイデアとしては正しいが高速化のための実装としては間違い」みたいなところに落ち着いてしまってイマイチ腑に落ちなかったので少し調べた。

続きを読む

食洗機を買った

食洗機は前から買おうと思っていたのだが、在宅勤務も長くなり、家で食事を作る機会が増えてきたので買った。導入までやったことを記しておく。まだ今日設置したところなので、食洗機買って良かったかどうかという判断はできていない。大変だったので設置できたことについての満足感はある。

続きを読む

メンデルの法則をめぐる論争について (4) - 連鎖および近年のメンデルに対する評価

関連記事一覧


前回まで3回にわたってメンデルの法則をめぐる論争について取り上げた。この話に関連してよく取り上げられる話題はもう一つある。

それは「メンデルは連鎖を見つけられたのではないか?」というものだ。

続きを読む

メンデルの法則をめぐる論争について (3) - 「データができすぎている」は解決できない

関連記事一覧


前々回前回とメンデルの法則をめぐる法則を紹介し、前回はフィッシャーの2つの指摘のうち1つについて否定が可能という説明をした。今回はフィッシャーの指摘のもうひとつの要点である「データが理論値に一致しすぎている」について説明する。今回が本題である。

そもそも、Weldonに始まるメンデルのデータに対する疑問はこの「データが理論値に一致しすぎている」が発端である。前回取り上げた「1:1.7」問題はフィッシャーの疑念をより強めたポイントではあったが、それ単体で見れば「運が良かった」でも済ませられる程度のものであった。

続きを読む

メンデルの法則をめぐる論争について (2) - 「1:1.7問題」は解決できる

関連記事一覧


前回、メンデルの法則をめぐる論争の背景について説明し、フィッシャーの2つの指摘を紹介した。

今回はフィッシャーの指摘のうちの1つ、「F₂世代で優性型を示した個体の雑種型と不変型の分離比は2:1ではなく1.7:1として観測されるべきだがデータは2:1に近接している」という点について説明する。

続きを読む

メンデルの法則をめぐる論争について (1) - メンデルはデータを捏造したのか?フィッシャーによる2つの指摘

関連記事一覧


「メンデルのデータには捏造があるのではないか」という説は統計学の読み物や教科書にしばしば登場する。多くの場合、これはR. A. フィッシャーによる指摘として紹介される。例として『背信の科学者たち』の一節を次に引用する。

しかしながら、メンデルのデータが極めて正確であったため、一九三六年、高名な統計学者であるロナルド・A・フィッシャーは、メンデルの方法を綿密に検討することにした。その結果はあまりにもうまくできすぎていた。フィッシャーは、精力的な実験の陰に何かがあったにちがいないと結論し、「すべてではないにしても、ほとんどの実験データがメンデルの期待に非常によく一致するように曲げられている」と書いている。

(ウイリアム・ブロード, ニコラス・ウェイド著, 牧野賢治訳 『背信の科学者たち 論文捏造はなぜ繰り返されるのか?』)

日本語のテキストにおける取り上げられ方は似たようなもので、メンデルにとって不利な記述であるものが目立つ。そのような状況のなか、「『メンデルが捏造』はすでに否定されているようだ」ということが数年前に少し話題となった。

ただ、結局のところ論争は終わっているのか、結論はどうなっているのかという点が当時はよく納得できなかった。結局そのときはきちんと調べなかった。この件について日本語で解説された資料があまりに少なく、かといってゆっくり英語文献を調べる気にもならなかったというのもあった。

最近また少しこの話が気になってきたので、いくつかの文献をある程度真面目に読んだ。そこで、ここまで理解したことをまとめた。長くなったので、何回かに分割して説明する。

なお結論はメンデルの法則をめぐる論争について (3) - 「データができすぎている」は解決できないに述べたが、「メンデルが捏造はすでに否定されている」とは言えないというのが現時点の感想である。

続きを読む

ABC 125反省会

問題自体はそれほど難しくなかったが、問題が正しく読めて無くてCとDでWAを何度か出してしまった。読解力を鍛えたい。

A. Biscuit Generator

「0.5秒」のところで若干不安になったけどとりあえずこれで正解だった。

#include <bits/stdc++.h>
using namespace std;

int main(){
  int a, b, t;
  cin >> a >> b >> t;
  cout << t / a * b << endl; 
}

B. Resale

これは危なげなくクリア。

#include <bits/stdc++.h>
using namespace std;

int main(){
  int n;
  cin >> n;
  vector<int> v(n);
  vector<int> c(n);
  
  for (int i = 0; i < n; i++) {
    cin >> v.at(i);
  }
  for (int i = 0; i < n; i++) {
    cin >> c.at(i);
  }
  int ans = 0;
  for (int i = 0; i < n; i++) {
    if (v.at(i) > c.at(i)) ans += v.at(i) - c.at(i);
  }
  cout << ans << endl;
}

C. GCD on Blackboard

gcd(a, b, c) = gcd(gcd(a, b), c)なので、順番に見ていってOK。

任意の数に変更できるというのは数を除外するのと同じなので「次の数を使わないパターン」がこれまでの最大ケースより大きいかどうかを順次比較しつつ結果を更新していけばよい。

最初手間取ったので、もうちょっとコードを綺麗にできそうな気もする。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll gcd(ll a, ll b) {
  ll tmp = 0;
  while (b != 0) {
    if (b < a) {
      swap(a, b);
    }
    b = b % a;
  }
  return a;
}

int main(){
  ll N;
  cin >> N;
  vector<ll> A(N);
  for (int i = 0; i < N; i++) {
    cin >> A.at(i);
  }

  if (A.size() == 2) {
    cout << max(A.at(0), A.at(1)) << endl;
  } else {
    ll a = A.at(0);
    ll b = A.at(1);
    ll c = A.at(2);
    ll gcd_max = 0;
    ll gcd_all = gcd(a, b);
    if (gcd(a, c) > gcd(b, c)) {
      gcd_max = gcd(a, c);
    } else {
      gcd_max = gcd(b, c);
    }
    for (int i = 2; i < N; i++) {
      ll c = A.at(i);
      gcd_max = gcd(gcd_max, c) > gcd_all ? gcd(gcd_max, c) : gcd_all;
      gcd_all = gcd(gcd_all, c);
    }
    cout << gcd_max << endl;
  }
}

D. Flipping Signs

Cより簡単だった気がする。実際正解者数もCよりかなり多かった様子。

最初、最後の1個だけ見るのかと思ってWAを2回ほど出してしまった。

操作はいくらでもできるので、負数が偶数個なら全部正整数にできるし、奇数個ならどれか1つが負数になる。

したがって、負数をカウントして偶数なら絶対値の和が答えになり、奇数個なら絶対値の和から絶対値が最小の値の2倍を引けば答えになる。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main(){
  ll N;
  cin >> N;
  vector<ll> A(N);
  for (ll i = 0; i < N; i++) {
    cin >> A.at(i);
  }

  ll ans = 0; // 絶対値の合計
  for (ll i = 0; i < N; i++){
    ans += abs(A.at(i));
  }

  int minus_cnt = 0; // 負数の数を数える
  for (ll i = 0; i < N; i++) {
    if (A.at(i) < 0) minus_cnt++;
  }
  
  if (minus_cnt % 2 != 0) { // 負数が奇数個ならどれか一つ-が残るので、絶対値が一番小さいものを負にする
    ll min = abs(A.at(0));
    for (ll i = 1; i < N; i++) {
      if (abs(A.at(i)) < min) min = abs(A.at(i));
    }
    ans -= abs(min) * 2;
  }
  
  cout << ans << endl;
}