蟻本 | 2-2 猪突猛進! "貪欲法"

硬貨の問題 const int v[6] = {1, 5, 10, 50, 100, 500}; int c[6]; int A; void solve() { int ans = 0; for (int i = 5; i >= 0; --i) { int t = min(A / v[i], c[i]); A -= t * v[i]; ans += t; } printf("%d\n", ans); } ```cpp ### 区間スケジューリング問題 ```cpp const int MAX_N = 100000; int N, s[MAX_N], t[MAX_N]; pair<int, int> itv[MAX_N]; void solve() { for (int i = 0; i < N; ++i) { itv[i].first = t[i]; itv[i].second = s[i]; } sort(itv, itv + N); int ans = 0; int t = 0; for (int i = 0; i < N; ++i) { if (t < itv[i].second) { t = itv[i].first; ans++; } } printf("%d\n", ans); } ```cpp ### Best Cow Line ```cpp int N; char s[100000]; void solve() { cin >> N; for (int i = 0; i < N; ++i) { cin >> s[i]; } int a = 0, b = N - 1; while (a <= b) { //左からと右からを比較 bool left = false; for (int i = 0; a + i <= b; ++i) { if (s[a + i] < s[b - i]) { left = true; break; } else if (s[a + i] > s[b - i]) { left = false; break; } } if (left) { putchar(s[a++]); } else { putchar(s[b--]); } } putchar('\n'); } ```cpp ### Saruman's Army ```cpp int n, r; int x[1010]; void solve() { cin >> n >> r; for (int i = 0; i < n; ++i) { cin >> x[i]; } sort(x, x + n); int i = 0, ans = 0; while (i < n) { int s = x[i++]; while (i < n && x[i] <= s + r) { i++; } int p = x[i - 1]; while (i < n && x[i] <= p + r) { i++; } ans++; } printf("%d\n", ans); } ```cpp ### Fence Repair ```cpp int n, l[50010]; void solve() { cin >> n; for (int i = 0; i < n; ++i) { cin >> l[i]; } LL ans = 0; while (n > 1) { int mii1 = 0, mii2 = 1; if (l[mii1] > l[mii2]) { swap(mii1, mii2); } for (int i = 2; i < n; ++i) { if (l[i] < l[mii1]) { mii2 = mii1; mii1 = i; } else if (l[i] < l[mii2]) { mii2 = i; } } int t = l[mii1] + l[mii2]; ans += t; if (mii1 == n - 1) { swap(mii1, mii2); } l[mii1] = t; l[mii2] = l[n - 1]; n--; } printf("%lld\n", ans); } ```cpp

May 22, 2020 · 3 min

蟻本 | 2-1 すべての基本 "全探索"

最近蟻本の初級編をやり直したのだが2-1と2-2の記事がなかったので一応貼り付けとく 部分和問題 bool dfs(int i, int sum) { if (i == n) { return sum == k; } if (dfs(i + 1, sum)) { return true; } if (dfs(i + 1, sum + a[i])) { return true; } return false; } void solve() { if (dfs(0, 0)) { cout << "Yes" << endl; } else { cout << "No" << endl; } } ```cpp ### Lake Counting ```cpp int n, m; char field[110][110]; void dfs(int x, int y) { //置き換える field[x][y] = '.'; for (int dx = -1; dx <= 1; ++dx) { for (int dy = -1; dy <= 1; ++dy) { int nx = x + dx; int ny = y + dy; if (0 <= nx && nx < n && 0 <= ny && ny < m && field[nx][ny] == 'W') { dfs(nx, ny); } } } } void solve() { int res = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (field[i][j] == 'W') { dfs(i, j); res++; } } } printf("%d\n", res); } ```cpp ### 迷路の最短路 ```cpp char maze[MAX_N][MAX_N + 1]; int n, m; int sx, sy; int gx, gy; int d[MAX_N][MAX_N]; //移動4方向ベクトル int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; // (sx, sy)から(gx, gy)への最短距離を求める // たどり着けないとINF int bfs() { queue<P> que; //全ての点をINFで初期化 for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { d[i][j] = INF; } } //スタート地点をqueに入れて距離を0にする que.push(P(sx, sy)); d[sx][sy] = 0; //キューが空になるまでループ while (que.size()) { //キューの先頭を取り出す P p = que.front(); que.pop(); //ゴールなら終了 if (p.first == gx && p.second == gy) { break; } //移動4方向ループ for (int i = 0; i < 4; ++i) { //移動した後の点を(nx, ny)とする int nx = p.first + dx[i]; int ny = p.second + dy[i]; //移動が可能か //すでに訪れていないか if (0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny] != '#' && d[nx][ny] == INF) { //移動できるならばキューに入れて、距離を代入 que.push(P(nx, ny)); d[nx][ny] = d[p.first][p.second] + 1; } } } return d[gx][gy]; } void solve() { int res = bfs(); printf("%d\n", res); } ```cpp

May 22, 2020 · 2 min

競プロ勉強会 第0回

最近atcoderをやっていることをツイートしたら, めちゃめちゃ頭のいいFさんにお声がけいただいて,つよつよエンジニア学生Aくんも誘って, 競プロの勉強会をすることにしました。 僕はそんなに頭がよくなく理解が遅いかつ実装が遅いのでなかなか恐れ多い勉強会ですが, 頑張って食らいついていこうと思っております。 僕はC++を使っていて, FさんとAくんはPythonを使ってます。 Fさんは来週からC++使うそうです。あっという間に抜かされそうです。 今週はatcoder150を解きました。 D - Semi Common Multiple 長さ N の偶数からなる正の整数列 A = a_1, a_2, …, a_N と、整数 M が与えられます。 任意の k ( 1 ≤ k ≤ N) に対して以下の条件を満たす正の整数 X を A の「半公倍数」と定義します。 X = a_k * (p + 0.5) を満たす負でない整数 p が存在する。 1 以上 M 以下の整数のうちの A の半公倍数の個数を求めてください。 半公倍数の理解に時間がかかった。Aの要素が2で割れる回数が全て等しくなければならないというところがミソ。 E - Change a Little Bit 0, 1からなる長さ N の異なる 2 つの数列 S , T に対し、関数 f (S , T) を以下のように定めます。 S に対し以下の操作を繰り返して T と等しくすることを考える。このとき行う操作のコストの和として考えられる最小の値が f(S , T) である。 S_i を ( 0 から 1 、もしくは 1 から 0 に) 変更する。この操作のコストは、変更の直前に S_j ≠ T_j ( 1 ≤j ≤N) であったような整数 j の個数を D として、 D * C_i である。 0 , 1 からなる長さ N の異なる 2 つの数列の組 (S , T) は 2^N × ( 2^N − 1) 通り考えられます。これらすべてに対する f( S , T) の和を 10^9 + 7 で割った余りを計算してください。 ...

May 16, 2020 · 1 min

作って理解するOS

小学生の時にWindowsXPを触った時は, PCというものの中身をいつか全部理解したいなとか思ってました。天才少年です。 そんな夢をかなえるためにOSを作っちゃおうと思い, 作って理解するOS - x86系コンピュータを動かす理論と実装という本に取り組むことにしました。その第3部から実装が始まるのですが, ハマりポイントがたくさんあると思うのでメモしていこうと思います。 docker, vagrantでは動かなかった 詳しいエラーを忘れてしましましたが, display Xに関する部分でエラーが起きてしまいます。 本ではWindows上で実装しているのですが, Macに問題が起きると嫌なので最初仮想環境でやろうと頑張ってましたが, GUIを起動する感じなのでだめでした。解決策になってないのですが諦めてParallels上でWindows10を動かす力技に取り組むことにしました。 文字コードがShift-JIS これはビビった。UTF-8じゃないんや。 iodebugをUnloadする 本の通り進めてもハマるところがここ。Plugin Control > Edit > iodebug > Unloadすればいけた。

May 15, 2020 · 1 min

Vue.js チートシート

vuejsの気になったところ watcherの注意点 wacherの中ではthisを使えない。なるべくcomputedを使う。 watch: { counter() { const vm = this; setTimeout(() => { vm.counter = 0; }, 3000); }, }, v-onディレクティブでの注意点 <!-- method event handler。vue側がいい感じに解釈 --> <button @click="countUp">+1</button> <!-- javascript式 --> <button @click="countUp()">+1</button> v-showの特徴 display: noneのcssがかかる 全てdomに追加されるため初期描画が遅い 要素を削除せずにcssをかけるだけなので描画の切り替えが早い elseがない v-forの特徴 要素の変更が最小限になるようになるべく再利用する 予期しないバグを生む可能性があるので, key属性をつける 仮想ノード createElemetで作られているのは仮想DOMを作るための仮想ノードである。いわゆるDocument Object Modelではなくjavascriptのオブジェクトである。 new Vue({ data: { name: "tak", }, render(createElement) { return createElement("h1", "hello, " + this.name) } }).$mount("#app3"); 仮想DOM DOMの変更を高速に反映するための仕組み。DOMを直接変更するには時間がかかるので, 仮想DOMを変更し前の仮想DOMとの差分を反映して高速に描画する。 Babel JavaScriptのコードを新しい書き方から古い書き方へと変換するツール Webpack webpackは、モジュールを束ねるツールです。 モジュールとは、プログラム内のJavaScriptファイル(以下:jsファイル)やsassファイルなどのことです。webpackを使うことで、複数のjsファイルをひとつのjsファイルにまとめたり、複数のsassファイルをひとつのsassファイルにしたりできます。 ...

May 10, 2020 · 2 min

Dockerチートシート

Dockerの忘れそうなところをメモ。 Dockerコンテナの実行 docker run pull, create, startを一気にやっちゃう -v /User/takaaki/html:/usr/share/nginx/html:ro バイトマウントする。roとかだとread onlyオプションをつけることができる。 -rm コンテナを停止したときに削除する。 -d バックグランド実行 -e AUTHOR="Takaaki" 環境変数を設定できる。 --link static-site:ss リンク先に通信できるようになる。リンク先の環境変数を追加できる。 docker build イメージを作成。引数にビルドコンテキストを指定。 ビルドコンテキスト…イメージが参照する範囲を指定する。ここで指定した範囲がDocker Hubにpushされるため小さい方がいい。Dockerfileがあるディレクトリの場所でもある。 docker create イメージからコンテナを作成。 -i コンテナの標準入力を取得して双方向に接続. -t コンテナ内にtty(eletypewriter)を割り当てる。 docker cp 文字通りコピー。ホストからコンテナ、コンテナからホストどちらにもできる。 docker add これは文字通りではない。tarを自動で展開したりURLからダウンロードしたりする処理が走る。cpが推奨される。 docker pause, docker unpause docker stop, docker start docker inspect docker rmi イメージを削除。 docker rm コンテナを削除。 docker attach コンテナに接続される。exitで抜けるとstopされる。itで実行していたならばctrl + p, ctrl + qで抜けるとstopされない。 docker exec コンテナ内でコマンドを実行。docker exec -it {image} /bin/bashとしてbashを実行するのによく使われ、exitで抜けてもstopされないため安全であり推奨される。 ...

April 29, 2020 · 5 min

WordPressでPrism.jsを使ってシンタックスハイライトを行う方法

久しぶりにテーマを更新したらPrism.jsが消えちゃってたのでいれなおしました。参考にしたのは以下のサイトです。 WordPressでPrism.jsを使いコードのシンタックスハイライトを行う方法 https://stupiddog.jp/note/archives/718 Prism.jsのダウンロード https://prismjs.com/download.htmlに行って自分の好みのjsとcssをダウンロードします。僕は以下のように設定しました。 themes=prism-tomorrow&languages=markup+css+clike+javascript+bash+c+cpp+cmake+css-extras+diff+django+git+go+haskell+http+java+javadoc+javadoclike+javastacktrace+jsdoc+js-templates+json+jsonp+json5+julia+kotlin+latex+makefile+markdown+markup-templating+nginx+perl+php+phpdoc+php-extras+python+r+jsx+tsx+ruby+rust+sqf+sql+swift+typescript+vim+yaml&plugins=line-highlight+line-numbers+show-invisibles+autolinker+wpd+custom-class+file-highlight+show-language+jsonp-highlight+highlight-keywords+remove-initial-line-feed+inline-color+previewers+autoloader+keep-markup+command-line+unescaped-markup+normalize-whitespace+data-uri-highlight+toolbar+copy-to-clipboard+download-button+match-braces+diff-highlight+filter-highlight-all+treeview やり過ぎた感あります。 WordPress内に配置 最初適当に配置してヘッダーいじればいいやと思って、Cyberduck繋いでうろちょろしてたんですが, WordPressが提供している方法があるそうです。以下のディレクトリに配置しました /public_html/wp-content/themes/baskerville/js/prism.js /public_html/wp-content/themes/baskerville/prism.css cssはディレクトリがなかったのでbaskerville直下に入れてみました。 ヘッダーで読み込む public_html/wp-content/themes/baskerville/functions.phpのファイルに追記しました。 /* --------------------------------------------------------------------------------------------- For Prism (2020/4/18, Takaaki Sawa) --------------------------------------------------------------------------------------------- */ function my_enqueue_scripts() { $theme_uri = get_template_directory_uri(); wp_enqueue_script( 'prism-js', $theme_uri . '/js/prism.js', array('jquery'), false, true ); wp_enqueue_style( 'prism-css', $theme_uri . '/prism.css'); } add_action( 'wp_enqueue_scripts', 'my_enqueue_scripts' ); 最後に ってな感じです。ブログ書くのってめんどくさいですね。

April 18, 2020 · 1 min

研究室セミナー | 汎用的なシミュレータ

汎用的なシミュレーターの設計 from Takaaki Sawa

January 19, 2020 · 1 min

HackBowlにて学んだこと。【TechTrain賞を受賞しました】

先日, TechBowlが主催するハッカソンに友人I氏を誘って参加させていただきました。それにまつわる話をつらつらと書こうと思います。 詳しい話は相方I氏のブログを読んでいただけたらと思います。僕のブログでは客観視などせずに僕の主観をつらつら述べさせていただきます。 開発意欲を掻き立てるために参加を決意 皆さんは, アプリを開発するときにどういったモチベーションで開発するのでしょうか。やはり, 生粋のエンジニアの方はコーディングを始めるとやめられなくなったりするのでしょうか。 僕は, いろんな言語やフレームワークをつまみ食いするにわかエンジニアですので, コーディングのみをルンルンにやるテンションは保てず, **これを作らなければ!!**みたいなモチベーションがないとだんだんやる気がなくなってきます。この時期もなんとなく作りたいなーみたいな物はたくさんあるのですがいかんせん考えるサービスがいけてないので実装するまで踏み切れることがなかなかないです。 そんな中, TechBowlが主催するHackBowlというハッカソンが開催されることを知り, これは自分が望んでいた開発しなければならない状況になれるのではないかと思い, 交通費が支給されるというお知らせと同時に参加を決意しました。 頼れる相方I氏 誰と出ようかと一瞬迷ったのですが, Donutsで一緒にアルバイトしていたI氏以外にはいないと2秒後に決意しました。 彼は本当に尊敬できます。統計の勉強やudemyを使ったさまざまな技術の勉強, 大学院を移るための勉強, 誰に言われたでもないのに自分でやっています。あと, 実装が本当に早いです。バイトでの無茶苦茶な量のコーディングも1人でやってのけますし, HTML/CSSを使って一瞬でviewを仕上げてきます。彼といると自分もちゃんとしなきゃなと思わされます。。。 クリエイティビティが欲しい HackBowlのテーマは 「2021年、エンジニアが増えた時、当たり前に使われるサービスを創造せよ」 でした。2人のスラックでいろんなアイディアを出したのですが, その中からI氏が思いついてくれた, 絶妙にニーズを突いたサービスを提案してくれました。HackBowlにて思いっきりサービス内容は発表したのですが, ここではサービス内容は伏せさせてもらおうと思います。こういうアイディアを出す能力が僕には足りてないんです…この力を伸ばすには, 日頃から自分・他人が欲しいと思った物はメモをする 世の中が動いている方向の逆を考える みたいなことが大事なのかなと最近思っています。参加したチームの フリーランスのエンジニアが案件の金額を見積もるためのサービス なんかを発表してていい着眼点だなーと思いました。 慣れていない技術の障壁 技術選定に関してはI氏のブログ通りです。ぜんっぜん開発進みませんでした。 NoSQLにめちゃめちゃ苦労して, 最後tag機能なんかを作ったのですがリレーションを作れないので全記事オブジェクトにtag_androidをもたせるとかいうやばそうな実装をしていました。また, データを入れるのも消すのもFirebaseのUIからやるのは手間で, SQLのありがたさを痛感しました… 時系列に沿って書くと長くなるので学んだことに絞って書いていきます。 HackBowlならではの旨味として, プロエンジニアさんの考え方に触れられたことが大きかったです。 当日, あらゆるスキル方面を網羅したたくさんのプロエンジニアのメンターさんがいるので, GoもVueもFirebaseも初めてな僕たちはたくさん質問させていただくことができました。それを通して, ただ技術的な解決だけでなくこのツールを使った方がいい, このドキュメントを読んだ方がいい, この道のりで学んだ方がいいなど, 1の質問に対して3, 4倍の情報量を返していただきました。それだけじゃなく, プロとして言語やフレームワークに精通した上で開発している姿を見て, かっこいいなと憧れる気持ちにもなりました。 サービスを考え抜く また, サービスに関して企業目線での意見をたくさんいただけたことも大変ありがたかったです。 僕たちは, 一般ユーザーと企業ユーザー2種類のプレイヤーがいるサービスだったので, どうしても企業ユーザー側のメリットを固めることができませんでした。しかし, 最終発表の後に5人のメンターの方から, 僕たちが気づいていないサービスのメリットをたくさん教えていただき, 普段大学生活に身を置いているだけでは想像もつかないような着想を得ることができました。しかも, その考えは自分たちの考えの2歩も3歩も先をいくものばかりで, whyを深堀していく大切さも痛感しました。企業の方のお話は学ぶことが多くて刺激的で本当に楽しかったです。 あと, ハッカソンという空間も楽しむことができました。ここ最近, なんとなく遊んだりなんとなく研究したりみたいな時間が多かったので, 2人で1つのことに没頭するという時間はあっという間に過ぎました。普段何事もこのくらい集中して取り組みたいところです。友永さん観てる場合ではないです本当に。 ...

October 27, 2019 · 1 min

Privacy Policy of Memot

built the Memot app as a Free app. This SERVICE is provided by at no cost and is intended for use as is. This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. ...

September 24, 2019 · 4 min