2023/10/31
継続が大事なだということに気付いてもなかなか継続することができない日々を過ごしている。 このブログもすぐに途切れてしまう気がする。 やりたいことはあるが、あっちにいったりこっちにいったりで定まっていない。 1つずつ捌いていくべきなのだろうけどなかなかむずかしい。 とりあえずは統計検定準一級の勉強を優先しようと思う。 ノンパラメトリック法のところを読んだ。 ハロウィンらしいことはしていない。
Markdownで__init__.pyと書く方法
エスケープとして\バックスラッシュを書くと太文字にならない。 __init__.pyと書きたい場合は、\_\_init\_\_.pyと書く。
Djangoのテストをフォルダに入れてまとめる方法
テストをアプリ直下の1つのtests.pyに書くのではなく、いくつかのファイルに分割し、それらをフォルダに入れてまとめたいときは以下のように書く方法がある。
myapp/ __init__.py models.py views.py tests/ __init__.py test_models.py test_views.py ...
これはtestsというフォルダの中に、いくつかのテストが書かれたファイルをまとめるときの例である。
testsフォルダの中には__init__.pyを作成する必要がある。
python manage.py testにおいては、testで始まるファイルのテストが自動的に検出されるため、テストを書くファイルの名前はtest_<内容>.pyの形にすると良い。
AtCoder Beginner Contest 288 C - Don't be cycle
求めたいものは削除する辺の本数の最小値です。
よってこれをとおくことにします。
削除する辺の本数の最小値(今回求めたいもの)
次に、任意の連結なグラフ(頂点)で、かつサイクルを持たないようなグラフの辺の最大数はであるという事実から、
連結なグラフが個の場合、残すことのできる辺の数は
であることがわかります。
グラフが閉路を持たないように辺を残すときの辺の最大数
よって最終的に求める答えは
で求まります。
#include <bits/stdc++.h> using namespace std; int main() { // 入力受け取り int N, M; cin >> N >> M; // インデックスと頂点番号を合わせるためにN+1としている vector<vector<int>> G(N+1); for (int i = 1; i <= M; i++) { int A, B; cin >> A >> B; G[A].push_back(B); G[B].push_back(A); } int S = 0; vector<bool> seen(N+1, false); // BFSで連結成分の個数を調べる for (int i=1; i<=N; i++) { if (seen[i] == false) { S++; queue<int> que; que.push(i); while (!que.empty()) { int q = que.front(); que.pop(); for (int v : G[q]) { if (!seen[v]) { seen[v] = true; que.push(v); } } } } } cout << M-N+S << endl; return 0; }
AtCoder Beginner Contest 287 D - Match or Not
この問題では「SとTが前から何番目まで一致しているか」と「SとTが後ろから何番目まで一致しているか」 を先に調べることによってO(N)で問題を解くことができます。
例えば aaabbbccc と a?a?b?c の場合
前から調べると
T | T | T | T | T | T | T | ||
---|---|---|---|---|---|---|---|---|
a | a | a | b | b | b | c | c | c |
a | ? | a | ? | b | ? | c |
後ろから調べると
F | T | T | ||||||
---|---|---|---|---|---|---|---|---|
a | a | a | b | b | b | c | c | c |
a | ? | a | ? | b | ? | c |
後ろから3文字目がマッチしないため それ以降はFとします。
F | F | F | F | F | T | T | ||
---|---|---|---|---|---|---|---|---|
a | a | a | b | b | b | c | c | c |
a | ? | a | ? | b | ? | c |
前からのboolを保存する配列 front_matchと
後ろからのboolを保存する配列 rear_matchを作ります
長さはT+1としてindex0はTとしておきます。
こうすることによってx=0のときは
front_match[0], rear_match[T.length()]
x = 1のときは
front_match[1], rear_match[T.length()-1]
のandをとることによって
TならばYes
FならばNo
と判断することができます。
#include <bits/stdc++.h> using namespace std; bool is_match(char a, char b) { return (a == b || a == '?' || b == '?'); } int main() { string S, T; cin >> S >> T; vector<bool> front_match(T.length()+1, false), rear_match(T.length()+1, false); front_match[0] = true; for (int i = 0; i <= T.length(); i++) { if (!is_match(S[i], T[i])) break; front_match[i+1] = true; } reverse(S.begin(),S.end()); reverse(T.begin(),T.end()); rear_match[0] = true; for (int i = 0; i <= T.length(); i++) { if (!is_match(S[i], T[i])) break; rear_match[i+1] = true; } for (int i = 0; i <= T.length(); i++) { if (front_match[i] && rear_match[T.length()-i]) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
MacBook Air M1でFlutterを使えるようにした記録と解説
この記事はFlutterを使うために私が行ったことの記録と解説です。 MacBook Air M1 使用者向けです。
Flutterの公式サイトに行きます。
Get Started → macOS と進みます。
Appleシリコンのパソコンの場合はロゼッタをインストールするようにと書いてあるのでそこにあるコマンドをコピーしてターミナルに貼り付けてエンターを押します。
インストールに成功するとターミナルには以下のような表示があります。
Install of Rosetta 2 finished successfully
FlutterのサイトからAppleシリコン用のSDKのzipファイルをダウンロードします。
Flutterのフォルダはどこにおいても(大事そうなファイル付近はやめた方が良いと思いますが)良いので、私はFlutterのサイトでも例として挙げられているように ホームディレクトリにdevelopフォルダを作成し、その中にダウンロードしたフォルダを置きました。Flutterのサイトではunzipするためのコマンドも書いてありますが、ダウンロードしたフォルダは既に解凍済みだった(safariの機能?)のでそのまま移動させました。
よくわからない人はターミナルを開いて
cd ~ mkdir development
を1行ずつ実行した後、新しくできたdevelopmentフォルダにダウンロードしたflutterフォルダを移動させてください。
次に、パソコンにflutterの存在を教えます。 教えるためにはとあるファイルにさっきダウンロードしたflutterの位置を教える必要があります。
ターミナルを使います。 ターミナルで
echo $SHELL
と入力してください。 MacBook Air M1 の方は /bin/zsh と出力されると思います。 その場合
cd ~
とターミナルに入力し、その後一度
pwd
と入力し、表示される内容を確認します。1つ次で使います。 その後
emacs .zshrc
と入力してください。 見慣れないテキストエディタが開かれると思います。 そこにflutterの位置を書きます。 どこでも良いのですが私は最後の方に
#Flutter export PATH="$PATH:/Users/<みなさんのユーザーネーム>/development/flutter/bin
と書きました。この最後から2番目のflutterがさっきダウンロードしたflutterフォルダの場所を指します。 みなさんは<みなさんのユーザーネーム>あたりをpwdで確認したものと一致する感じに読み替えて入力してください。 そしたらこのテキストエディタを閉じます。(ちなみにこれはemacsというエディタです) 方法はcontrol + Cを押してその後control + X を押します。 すると青い(多分)文字で保存するか聞かれるのでyを押します。(yesのyです) 次に今設定したことを反映させるために以下のように入力します。(再読み込みみたいなものです)
source $HOME/.zshrc
次に
which flutter
と入力し
/Users/<みなさんのユーザーネーム>/development/flutter/bin/flutter
と出力されたら成功です。
flutter not found
の場合は何かしらで間違ってしまっています。
次に
flutter doctor -v
と入力します。 そうすると足りないものを教えてくれます。 それらをそこに英語でかかれている指示に従いインストールします。
私の場合はまずはじめにAndroid Studioをインストールすることにしました。
Download Android Studio & App Tools - Android Developers
同意してダウンロードします。 そしてAndroid Studioを起動、 Nextで進み、Standardを選択し、いろいろ同意してダウンロードします。 ダウンロードし終わったらまたターミナルで
flutter doctor -v
と入力し実行します。 するとAndroid Studioのコマンドラインツールがないと言われました。 そこでまたAndroid Studio を開き、projects → More Actions → SDK Manager →SDK Tools そこにある Android SDK Commandl-ine ToolsをチェックしOK、同意しダウンロードします。 再度
flutter doctor -v
ライセンスが〜と言われるので
flutter doctor --android-licenses
同意してないライセンスがあると言われるので全部y
flutter doctor -v
で確認するとAndroid StudioはひとまずOKそうです。 次にXcodeです。 私は以前にインストールしていたので言われた通りに
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch
を入力しました。 再度
flutter doctor -v
するとココアポッドがないと言われたのでインストールします。 ここにインストール方法が書かれています。
CocoaPods Guides - Getting Started
初めに
sudo gem install cocoapods
次に、と思ったらこれだけでした。 再度
flutter doctor -v
をすると No issues found! 無事に終わりました。これでFlutterの環境構築は一通りOKだと思います。このブログを書きながらのため長かったです。 また、英語ではありますがdoctorに表示されている指示は親切でした。
おまけ ターミナルに以下のように入力してください。
open -a Simulator
私の場合はこのようなiPhone8のシュミレーターが起動しました。