Neunomizuの日記

俺だけが俺だけじゃない

米国(短期)留学週記~四週~

tags: 米国(短期)留学週記

先週の自分への課題ができたかどうか

  • 個人的なやつ
    • [x] OCaml本を読み終える(3/4くらいまで読んだ)
      • 「プログラミングの基礎」は身についたと思う
    • [x] 毎日ABCのD問題を最低1問やる(LeetCode,AOJの問題を合わせて3問以上やる)
      • ただし,ちゃんとできたのはABCのみで,LCとAOJはできない日もあった
    • [x]コンピュータアーキテクチャの教科書を読み終える(3章くらいまで?読んだ)
      • 短くまとまっていて良い本だった
  • 大関
    • [ ] 信号処理工学の過去問を一応やる
      • 見てすらいない
    • [ ] I実験のレポートを作成する
      • 今週やります
  • こっち関連
    • [ ] 金曜日までのこっちの宿題を水曜日までに終わらせる
      • 宿題自体は終わったが水曜日までにはできなかった
    • [ ] アルゴリズムの中間試験が2週間後なので,復習をする
      • 復習できてない
    • [x] 課題をしっかりやる(2度目)
      • 心が折れかけたけど頑張れ

        反省点

色々あってメンタルが死んでいたので進捗がなかったです

ただ,色々試してみたところ生産的に過ごすコツみたいなのはつかめてきました.以下に箇条書き

  1. 朝起きる前と夜寝る前に電子機器に触れないようにする
  2. 朝食を取り日を浴びる
  3. 情報も過剰に摂取すると鬱になるので,情報量は少ないが時間を潰せるもの(読書)を心がける
  4. 筋トレは精神状態を向上させない
  5. 何事も始めてしまえさえすれば進捗は生めるので,スイッチとなるようなルーティーンとして立ち上がることが良いかもしれない
  6. 集中しているときは人に会わない方が良い.逆に調子が悪い時はコミュニケーションを取った方が好転しやすい

時間的には十分できる余裕はあったと思いますが,自分に甘かったです

決まり事(ルーティーン)を作って,それを守れるように色々と身の回りの環境を構築していけば進捗は生めるなぁと思ったので今週は頑張ろう~~

生活

ようやく半分(残り4週間)終わりました

慣れた部分もあれば,慣れない部分もあるなぁという感想です

周りの学科民が期末試験真っ盛りなのに自分はこれから中間試験で時差(?)を感じています

レポートでいいですよと言ってくれた先生からレポートの内容が伝えられていないので非常に不安です...

憂鬱

CNNでも例の事件が報道されていて,衝撃でした

ちょうどホームシックで日本にいる友達や家族のことを考えていたので色々感じるところがありました

憂鬱

虚構崇拝

数日前に宿題を一緒に勉強していた人が"You believe in idols."と言ってきました.前後の会話から推測するに,彼はいいところをついてきました

ここでは"idols"というより理想とか?の方が近い意味で使われていました

前々から思っていたことなんですが,自分はいつもイデア1を探しているんですよね 要は「ぼくのかんがえたさいきょうのなにか」を常に探している

ぼくのかんがえたさいきょうのアイドルこと齋藤飛鳥

ある目的に沿って最適に生きたらこう生きることになる

そのルートから外れたと感じた瞬間に萎える,どうでもよくなる

この考えは改めた方がいいなぁと感じることが増えてきました.というのも当たり前ですが世の中自分の思い通りにならないことの方が(自分も含めて,本当に)多いのに,思い通りになる前提で生きているのは逆に最適化できていないからです

収まるところに収まっていると考えられるようにしたいなぁと

具体的な問題として

休日の朝に10時に目が覚めて,もう午前はいいやと思って昼くらいまでダラダラしていたら14時10分になり,キリが悪いから15時から頑張ろうと思っていたら16時位になり,まだ今日は10時間もあるし,夕飯が食べ終わるまでダラダラしていてもいいかと思っていたら20時くらいになってもう今日は終わりだなぁ,自己嫌悪,早く にたい

みたいな日があるのでこれをどうにかしたのです

毎秒を大事に生きたい(至言)

脳科学的にはやる気なんてものは人の作り出した言い訳,虚構らしい2ので虚構をぶっ壊す

虚構もぶっ壊していけ

雑談:想像力が豊か

以下は自分に向けた戯言です

想像力が豊かな人間を高く評価している人がいるとしたら,それは間違いなんじゃないかなと

例えば勉強の得意でない中学生にちょっと長い英文,高校生にちょっと長い古文を読ませるとわかります

英文,古文が読めない学生は文章が読めていないので勝手に単語から話の流れを文章を想像します

つまり僕の考えでは,想像力というのはどなたも豊かです.そして(多くの人の)想像力には意味がなくて,知識がない場合はその立派な想像の羽で見当違いの方向の飛んでいってしまうということです

想像の羽を広げて「ググればええねん」

基本的に現代でもてはやされている創造性, creativityは想像力の延長線上にあると考えますが,両者の決定的な違いは新規性の有無です

もちろん,猿がタイピングをしていたらシェークスピアの戯曲を書き上げる...3なんてことも有りえますが,多くの場合車輪の再発明に終わります たまに猿(or 天才)の奇跡を一般化して勉強はいらないと言いたがる人を(ごくたまに)見かけるのですが,天才か猿なので凡人は勉強をするのが一番確実性が高いです

想像力が豊かな人間が創造性のある人間になるには知識が必要です

もちろん人間には常にイドラ4が付きまとうので,それを意識した上で学ばなければ結局猿の奇跡を待つしかありませんが

来週までの目標

今週は課題関連の目標が多い(?)

来週の信号処理の試験が終わって,学科の期末レポートの内容が決まったらインターンに備えて色々知識を入れないと行けないし,それと並行してこちらの大学の期末試験もあるので未来の自分は頑張れ!

  • 個人的なやつ
    • 毎日ABCのD問題を最低1問やる
  • 大関
    • 信号処理の過去問をある年度の分終わらせる
    • I実験のレポートを終わらせる(日本時間の8/1=カリフォルニア時間7/31締切)
    • 教授にレポートに関してメールを送る
  • こっち関連

難しく考えたら負けかなと思っている

難しく考えたら負けかなと思っている

tags: 情報

再帰関数難しく考えていないですか?

皆さんこんにちは.留学先でもピカチュウのTシャツを着て目立っていますピカチュウです(\not=不協和音)

どちらかと言ったらエキセントリック

東京は涼しいと聞いていますが,サンフランシスコの夏も一日の寒暖差が激しく上着が手放せません1 まぁそんなことはどうでもいいんですけど,今回は再帰関数に関して記事を書こうと思います

というのも,現地で再帰関数がよくわからない!というプログラミングを始めたての方がいるからです

教える前に記事にして一回まとめておこうというわけです

ゆるゆるに再帰関数の

  1. 再帰的定義(再帰関数は再帰関数で定義されている)
  2. 停止性(簡単になっているか,有限回で処理が終わるか)

を説明して,そこまで再帰関数が難しくないんじゃないかなと思ってもらえるような記事にしたいと思います

再帰的定義

再帰関数という名前の通り,再帰的定義を考えてみましょう

以下のPythonで書かれたコードを見てください

def fib(n)
    if n < 2:
        return n
    else:
        return fib(n-1) + fib(n-2)

ここで出てくるfibという関数は以下のように定義されたフィボナッチ数列の第n項を取り出すものです

$$ fib(n) = \begin{cases} 0 & (n=0) \\ 1 & (n=1) \\ fib(n-1) \cdot fib(n-2) & (otherwise) \end{cases} $$

fibという関数はfibという関数によって定義されていますね

これが再帰的定義で,自身で自身を定義していることが再帰関数の特徴です

そして,この再帰的定義は見てわかるように,最初の引数nを小さくしたn-1n-2が使われています

後で,このことを考えるので頭の片隅においておいてください

停止性

???「お前のものは俺のもの.俺のものも俺のもの」

これはおそらく日本で一番有名なトートロジー2が使われた文章ですね(論理学の文脈で使っているわけではないので悪しからず) 「これも再帰関数?」と考えられそうな気もしますが違います

そもそも関数じゃないというのもありますが,その最も大きな差は停止性の有無です

またPythonのコードを見てみましょう

def fib(n)
    if n < 2:
        return n
    else:
        return fib(n-1) + fib(n-2)

ここではif < 2という部分でしっかりと関数が終了する条件が書かれています.

再帰的定義によってfibの引数であるnが小さくなり,最終的にn < 2で終了する, つまり有限回でこの関数が終了するように定義されています

一方&ャイ%ンのセリフでは「お前のもの」が「俺のもの」にはなりますが,「俺のもの」の定義が「俺のもの」なので一生に定義が完了しません

再帰関数がどんな感じなのかわかってくれましたか?

原作を見たら意味が全く違っていた...

分割統治法

問題を分割し,解決することを分割統治法と言います

再帰関数は分割統治法を使った関数です(もちろん有限回でおわらないのも再帰関数ですが,ある問題を解く再帰関数は必ずこのようになっている必要があります)

実際に関数が再帰的に使え,停止性がはっきりしているような問題に対してに使ってましょう

文字列をひっくり返して実感

文字を反転させる...

いろいろやり方はあると思いますが,

def inv(str):
    if str == "":
        return ""
    else:
        return str[-1] + inv(str[:-1])

ここでは以下のように考えることで実装しています

  1. 再帰的定義:答えとなる文字列は<すでに反転された文字列> + <反転される文字列の最後の文字>と考えることができます
  2. 停止性:反転させる文字列は徐々に小さくなり,反転させる文字列がなくなったときにこの関数は終わります

このように考えると上のようなコードを簡単に書くことが可能です

(Pythonではstr[::-1]で文字列を反転することができます.あくまで例のためです)

実際に問題を解く

「具体例が少なすぎてわかりません!」と言う人,すみません!

そんな方におすすめなサイトにLeetCodeというものがあります

データ構造とアルゴリズムを勉強・実践するのにはぴったりなサイトでこのページ再帰関数に関する情報,問題がまとまっているので実際に手を動かして身につけたいという人は是非楽しんでください

再帰関数が簡単だと思えるようになってくれたら嬉しいです

再帰関数を難しく考えたら負けだと思っている

米国(短期)留学週記~三週~

米国(短期)留学週記~三週~

tags: 米国(短期)留学週記

無限に競技プログラミングをしていた...

こちらでは離散数学アルゴリズムの授業を取っているのですが,そこで非常にアルゴリズムが大事という話をされて(それはそう),自分に実装力がないというのもわかっていたので無限に競技プログラミングの問題を解いていた気がします?(いうほどでもないですけど)

返却された課題の点数が低くてガン萎えしていたのもあり,現実逃避も兼ねてやっていました(笑えない)

逆張りオタク

競技プログラミング自体は,学科でやっている人が多すぎて,やる気を失っていたのですがこっちではやっている人がいないしやはり流石に水色でないままはまずいだろということでやる量が増えました

ただ,個人的に思うこととしてAtCoder競技プログラミングというより数学という側面が強すぎて(特に僕のやっていたABCのC問題までは),やったはいいものの...という風に感じました

AOJやLeetCodeの方がデータ構造やアルゴリズムを聞いてくる問題が多いのでそちらをメインにやっていこうと思います(自分ならこれから始める人にはそちらを勧めると思う)

結局どの程度やったのか

ABCのC問題までと,ARCのA問題までを埋めました

見ての通り,自分は基本的に虚無だろうがなんだろうが下から埋めるというこだわり(?)があるようです

これからはABCのD問題を埋めていこうかなと思います(ARCのB問題と被っていないものを)

数学が弱いので相対的にはD問題の方が合っているような気がします(けどどうなんでしょう?)

蟻本もそのうち読もうと思うんですが,アルゴリズムの授業を受けてからにしようかなとか思っています

来週までの目標

他の人が毎週自分がやっていることを確認しているのを見て,なかなか面白いなぁと思ったので便乗します

ただ思うのですけど,こういうのって大体絶対にできない気がする(ガンバリマース)

  • 個人的なやつ
    • OCaml本を読み終える(3/4くらいまで読んだ)
    • 毎日ABCのD問題を最低1問やる(LeetCode,AOJの問題を合わせて3問以上やる)
    • コンピュータアーキテクチャの教科書を読み終える(3章くらいまで?読んだ)
  • 大関
    • 信号処理工学の過去問を一応やる
    • I実験のレポートを作成する
  • こっち関連
    • 金曜日までのこっちの宿題を水曜日までに終わらせる
    • アルゴリズムの中間試験が2週間後なので,復習をする
    • 課題をしっかりやる(2度目)

余談

実はEEICの授業が情報系を標榜している割には情報系のものが薄いなぁと思い,授業サイトを作っていました

ただ,"Google Sites"で作ろうとすると,簡単なもの(簡易的なHPなど?)は楽なのですが,授業サイトのようなディレクトリ構造が複雑な(?)ものだとかえって時間がかかりそうでやめました

最終的には学科の人間で編集できるように,Vue.jsで作ろうとしているのですが...(このクソ忙しいときに覚えることが多すぎる...) 誰か詳しい人に助けてほしいです...

授業サイトとか言っていますが自分がこっちで学んでいることのまとめや有名な教科書のまとめに過ぎないのであまりでかい口は叩けないです()

米国(短期)留学週記~二週~

tags: 米国(短期)留学週記

地獄の週だった...

課題ばっかやってました...

東大のコンピュータアーキテクチャの課題と機械学習の課題,それに加えてこっちの離散数学アルゴリズムの課題があったのであわあわしていました...(この週は本当にずっと課題をしていた

土日は遊ぼう!と思ったのですが,Mountain Viewに行ってもGoogleに知り合いがいないと中が見られなかったりして大して楽しくないよ〜と先に行ったこっちの知り合いに聞いたのでやめておきました(今は知り合いのツテがないか模索中)

TODO

課題が多かったと言ってもそれは日米の課題を合わせての話!今週からは日本からの課題はほぼなくなるので楽です

毎週,CS関連の離散数学の本とアルゴリズムの本を事前課題として読んで,授業の宿題をやっていればいいので「心理的には」非常に楽です

残った東大の課題は以下のような感じです

東大の課題

  • 実験

    • 電気系の実験を先にやり,I実験は後日実施
  • アルゴリズム

    • 期末試験の代替レポート
  • コンピュータアーキテクチャ

  • 信号処理工学

    • 遠隔での期末試験
  • is統計的機械学習

    • 元からレポートのみ(なお後半から難しく再履しそう())
  • eeic統計的機械学習

    • 代替レポート(7月末に連絡)
  • ネットワーク工学概論

    • レポート
  • ハードウェア設計論

    • 後日試験をする(確か?)

土日

課題も金曜日までだったので,土日はのんびり自分の勉強を自習室でしていました

こっちの自習室は24時間開いているものがあり,そこで1時くらいまで勉強しているのが日課です

東大と違って高低差もなく,寮,食堂,自習室が違いので非常に快適です

インターンにも行くのでそれ関連の勉強もしながら,こっちの勉強,東大の課題に向けた勉強も頑張りたいと思います(課題ばかりで書くことが本当にない)

物価

思い出したので書きます

土曜日にルームメイトと一緒に,こちらの韓国料理屋(Tofu house?)に行ったのですが,ただのビビンバが20ドルもしてびっくりしました...

ラーメンも食べようと思うのですが(最近二郎系の進出したらしい),ここまで高いと外食は週一が限界だなと思いました

しかも,ここはStanfordの周りの住宅街の方なのでベイエリアの物価は...

地価がもっともバブルと聞いたので,住むのは何倍なのだろうか...

ITバブルを感じる話でした

AtCoderテスト自動化スクリプト

tags: 情報

競プロのテストめんどくさいなぁ

以前makeを使った方法を書きましたがこれでもすべてのテストを調べるのは面倒

と思ったので調べたら次のような良いツールが有りました(AtCoder専用ですが)

競技プログラミングのための補助ツールを作った

AtCoderのテストができるツールを$ sudo pip3 install online-judge-toolsでインストールできるますよということが書いてあります

これをこのまま使うのも面倒なので,シェルスクリプトを探したところこの記事に当たりました

ただ,エイリアスの説明がなかったのと,このままだと自分の環境に使えなかったので次のようにエイリアスを設定し,書き換えたという話です

コード

.
|--abc
|   |- 133a.cpp
|
|--arc
|   |-001a.cpp
|
|--agc
    |-001a.cpp

ABCの際は次のように書いています

#!/bin/bash
problemname=$1
contest="abc"
oj dl "https://${contest}${problemname:0:3}.contest.atcoder.jp/tasks/${contest}${problemname:0:3}_${problemname:3}"
g++ -Wall -std=c++14 ./$1.cpp
oj test
rm -f a.out
rm -rf test

エイリアス~/.bashsrc

alias cptest="./cptest"

と書くだけ

実際に使ってみる

まずはcptest.shに権限を与えます

$ chmod 777 ./cptest.sh

実際のテストは次のように行います.非常に簡単です

$ cptest 133a

出力結果です

[x] GET: https://pypi.org/pypi/online-judge-tools/json
[x] 200 OK
[!] update available: 6.2.1 -> 6.5.0
[*] run: $ pip3 install -U online-judge-tools
[*] see: https://github.com/kmyk/online-judge-tools/blob/master/CHANGELOG.md
[x] problem recognized: AtCoderProblem.from_url('https://atcoder.jp/contests/abc133/tasks/abc133_a'): https://abc133.contest.atcoder.jp/tasks/abc133_a
[x] GET: https://atcoder.jp/contests/abc133/tasks/abc133_a
[x] 200 OK
[*] skipped due to language: current one is lang-ja, not lang-en: Sample Input 1 
[*] skipped due to language: current one is lang-ja, not lang-en: Sample Output 1 
[*] skipped due to language: current one is lang-ja, not lang-en: Sample Input 2 
[*] skipped due to language: current one is lang-ja, not lang-en: Sample Output 2 
[*] skipped due to language: current one is lang-ja, not lang-en: Sample Input 3 
[*] skipped due to language: current one is lang-ja, not lang-en: Sample Output 3 
[x] save cookie to: /Users/diohabara/Library/Application Support/online-judge-tools/cookie.jar
[x] append history to: /Users/diohabara/Library/Caches/online-judge-tools/download-history.jsonl

[*] sample 0
[x] input: sample-1
4 2 9

[+] saved to: test/sample-1.in
[x] output: sample-1
8

[+] saved to: test/sample-1.out

[*] sample 1
[x] input: sample-2
4 2 7

[+] saved to: test/sample-2.in
[x] output: sample-2
7

[+] saved to: test/sample-2.out

[*] sample 2
[x] input: sample-3
4 2 8

[+] saved to: test/sample-3.in
[x] output: sample-3
8

[+] saved to: test/sample-3.out
[!] update available: 6.2.1 -> 6.5.0
[*] run: $ pip3 install -U online-judge-tools
[*] see: https://github.com/kmyk/online-judge-tools/blob/master/CHANGELOG.md
[*] 3 cases found

[*] sample-1
[x] time: 0.009526 sec
[+] AC

[*] sample-2
[x] time: 0.008854 sec
[+] AC

[*] sample-3
[x] time: 0.008949 sec
[+] AC

[x] slowest: 0.009526 sec  (for sample-1)
[+] test success: 3 cases

ちなみに

同じ寮の人間が東大のミスターコンテストに出ているので是非投票してあげてください

"ENTRY 03 赤尾将希"と書いてある人です

https://mrcolle.com/tokyo2019/vote