【東大文系数学】「361個の碁石」問題の簡単な解答

東大文系数学(2001)第4問 

 白石180個と黒石181個の合わせて361個の碁石が横に一列に並んでいる。碁石がどのように並んでいても、次の条件を満たす黒の碁石が少なくとも1つあることを示せ。
 その黒の碁石とそれより右にある碁石をすべて除くと、残りは白石と黒石が同数となる。ただし、碁石が1つも残らない場合も同数とみなす。

↓解答(※初見の人用)

少し雑な解答

左から1つ目の碁石が黒石ならOK。白石の場合を考える。「左からn個の黒石の数ー左からn個の白石の数」をf(n)と置く。このとき、f(1)=-1、f(361)=1である。fは1ずつしか変化しないので、f(m)=0であり、f(m)=1となるようなmが存在する■

上より丁寧な解答

一番左の碁石が黒石ならOK。一番左の碁石が白石の場合を考える。「左からn個の黒石の数ー左からn個の白石の数」をf(n)と置く。fは1ずつしか変化しないので、f(1)=-1、f(361)=1より、f(m)=0となるmが存在する。f(m)=0となるmの中で、f(m+1)=1となるものが存在しなければ、f(361)=1となることに反する。よって、f(m)=0、f(m+1)=1となるようなmが存在する■

【数学】フーリエ変換の意味を知る

ディラックのデルタ関数の定義

任意の関数fとの内積<δ,f>がf(0)になる超関数δのこと。

ディラックのデルタ関数のイメージ

普通の関数っぽく例えるなら、x=0で∞、それ以外では0であり、全体の積分が1となるようなもの。

別の言葉で言えば、x=0に100%集まった確率分布。

用途から見れば、x=0での値を取り出す関数(のようなもの)。

※超関数は簡単にいえば「分布」です。

フーリエ変換

fのフーリエ変換は、fをe^iwxという形の無限和で表したときの、係数の分布と大きさを表すものです。

∫[-∞→∞]f(x)e^(-2πiξx)dxとフーリエ変換を定義すれば、

sinxのフーリエ変換は、(i/2)δ(ξ-1/2π)+(-i/2)δ(ξ+1/2π)となります。

これは、fのe^(-2πiξx)という形の無限和表示において、ξ=1/2πのときの係数がi/2、ξ=-1/2πのときの係数が-i/2であることを意味します。

言い換えると、f(x)=(i/2)e^(-ix)+(-i/2)e^(ix)と表せるということです。

∫[-∞→∞]f(x)e^(-iξx)dxとフーリエ変換を定義すれば、

cosxのフーリエ変換は、(1/2)δ(ξ-1)+(1/2)δ(ξ+1)となります。

これは、fのe^(-iξx)という形の無限和表示において、ξ=1のときの係数が1/2、ξ=-1のときの係数が1/2であることを意味します。

言い換えると、f(x)=(1/2)e^(-ix)+(1/2)e^(ix)と表せるということです。

フーリエ変換の計算例

1のフーリエ変換は、δ(ξ)

↓他の例

http://zakii.la.coocan.jp/fourie/12_miscellaneous.htm

フーリエ変換の捕捉

フーリエ変換の途中式は書いていませんが、割と大変です。

フーリエ変換の定義式は、流派によって少し違う(e^(-2πiξx)かe^(-iξx))こともありますが、本質的には同じです。上記のように、δ関数の引数が少し変わるだけで、本質的に表す意味は同じです。

上記のように、フーリエ変換は関数ではない超関数になることもあります。

【Unity】Visual Studioとの統合が上手くいかないとき

導入

Visual Studioとの統合で上手くいかない箇所をまとめました。

統合が出来ているか確認する方法

以下の通りだと、統合が正しく出来ています。

  • Visual StudioのRunボタン(緑色の▶)の右にある文字列が、「アタッチ」ではなく、「Unityにアタッチ」になっている
  • gaと打つと、GameObjectという予測変換が出てくる
  • 関数の上に、「Unityメッセージ〇個の参照」という文字が表示される

①基本的な問題

基本的には、以下の動画を見て下さい。

重要なポイントは、

  • Visual Studio Installerで、「Unityによるゲーム開発」をインストールすること
  • Preferences>External Tool>External Script Editorで、「Visual Studio」を選択すること

また、動画では、再インストールすれば絶対治ると言っていますが、そんなこと無かったです。自分の場合は、②で上手くいきました。

②強制的に読み込ませる

Preferences>External ToolのExternal Script EditorをVisual Studioにした後、下に沢山のチェックボックスが現れます。デフォルトでは、2箇所だけチェックが入っていると思いますが、これをとりあえず全部チェックします。

その後、Regenerate Project filesというボタンを押します。

更にその後、Visual Studioを開くと、ファイル変更の検出という名前のポップアップが出てくるので、再読み込みを選択します。

このようにすると、正しく読み込まれ、統合が上手くいきます。

③一部のクラスだけ読み込まれない

EditdorGUILayout、Selection、EditorWindow等の、エディタ上で動作するクラスが読み込まれず、赤線が表示されることがあります。

この問題は、該当ファイルをAssets/Editorというフォルダに配置すると治ります。

Assets/Editorは、Assets/Resourcesと同じような特殊フォルダで、エディタ用のスクリプトを配置するフォルダになっています。

④特殊フォルダ間の参照が出来ない

Assets/EditorとAssets/Editor以外のコードは、自動的にプロジェクトが分離されます。これにより、Assets/Editor内のコードから、Assets/Editor外にあるクラスを使おうとしても、クラスが存在しないというエラーが発生することがあります。

この問題は、ソリューションエクスプローラー(右側のウィンドウ)のプロジェクト(Assembly-CSharp.Player)を右クリックして、全ての依存関係ツリーの読み込みを選択して、全てのファイルを読み込むことで治ります。

【Unity】VSCode(Cursor)のシンタックスハイライトを修正する方法

状況

  • VSCodeもしくはCursorを使って、Unityのコードを書いている。
  • VSCodeを開いた直後やリロード直後に一瞬(もしくは数十秒)だけ良い感じのシンタックスハイライトが表示されるが、その後、色がおかしくなる。
  • Vector3などのUnity関連のクラスや自作クラスに正しい色が付かない。

原因の概要

UnityとVSCode(Cursor)との開発環境の統合が上手くいっていない。

解決策(VSCodeの場合)

下の動画のように、Unityのパッケージマネージャーで、

https://github.com/needle-mirror/com.unity.ide.visualstudio.gitを指定してインストールします。

その後、Unityを再起動すると、VSCodeでシンタックスハイライトが正常になります。

解決策(Cursorの場合)

この動画のように、Unityのパッケージマネージャーで、https://github.com/boxqkrtm/com.unity.ide.cursor.gitを指定してインストールします。

その後、Unityを再起動すると、Cursorでシンタックスハイライトが正常になります。

※boxqkrtm/com.unity.ide.cursorとneedle-mirror/com.unity.ide.visualstudioは、対象の開発環境が違うだけで内容は同じです。

【ブラウザゲーム】Fishing Days

操作方法

(PC・スマホ両対応)

クリック or タップ:浮きを投げる。浮きを引っ張る。

遊び方

浮きを投げて、魚を待ちます。浮きをよーく観察して、魚が来ていそうなら浮きを引っ張ります。魚が引っかかったら連打で岸まで寄せます。

【javascript】async、awaitの正確な仕様を理解する

前提知識

Microtask queueMacrotask queueー非同期処理が格納されるキュー。setTimeoutはMacrotask、Promiseのコールバック関数はMicrotask queueである。

・処理の優先順位は、コールスタックに入れられた関数>Microtask queue>Macrotask queue。コールスタックが空になったとき、Microtask queueが呼ばれ、その両方が空になったとき、Macrotask queueが呼ばれる。

・要するに、大まかに言うと、処理の順番は、「非同期じゃないコード」→「Microtask queueに入れられた関数(キュー入れられた順)」→「Macrotask queueに入れられた関数(キューに入れられた順)」である。(途中で優先度の高い処理が追加されると前に戻る)

仕様① awaitが読み込まれたときの挙動

・awaitの行に差し掛かった時、awaitの右に書かれた処理を実行した後、async関数を中断し、async関数を「Microtask queue」に入れる。

以下はコード例。

async function hello()
{
    console.log("hello")
    var b = await 1
    console.log("hello"+b)
}

console.log("start")
hello()
console.log("end")

上を実行すると、start→hello→end→hello1の順でログが出力される。

仕様② async関数の返り値

・async関数の返り値Promiseオブジェクト。

・async内の処理が終わっていない場合は、stateが「Pending」であるPromiseを返す。

・async内の処理が終わっている場合は、stateが「Fulfilled」であるPromiseを返す。

returnは関数の返り値とはならない。返り値は常にPromiseオブジェクトで、その中にreturnの結果が保存される。

以下はコード例。

async function hello()
{
    var b = await 1
    console.log("resume!")
    return b
}

a = hello()
console.log(a)

window.setTimeout(() => {
    console.log(a)
}, 1000)

上を実行すると、stateが「Pending」であるPromiseオブジェクトが出力された後、「resume!」が出力され、1秒後にstateが「Fulfilled」であるPromiseオブジェクトが出力される。

仕様③ 実行順序に気を付ける

・実は、仕様②で書いたコードのsetTimeoutの秒数を0にしても、結果は同じです。

・何故なら、「Microtask queue」→「Macrotask queue」の順に実行されるからです。

【ブラウザゲーム】ローグサバイバー

操作方法

A/W/D/Sー移動

R/Spaceーリセット(ゲームオーバー時)

・落ちている剣に近づくと武器を交換できます。

・右上のアイコンは剣に付与された追加効果を表します。

ゲームの概要

ヴァンサバライク+ローグ要素。

ただ生き残るゲームです。ゴール的なものはありません。

【javascript】厄介なビット演算の仕様を完全に理解する

導入

かなり厄介なので、正確な動きをかいておきます。

前提知識

・javascriptでは、数の型はNumberのみ。整数も小数も関係なくNumber型。

・Number型は、倍精度浮動点小数点数型であり、IEEE 754という規格が使われている。

・C#でいえばdouble。

・Number型の整数の精度は53bit。つまり、-2**53+1以上2**53-1以下の整数は正確に表記できる。(例えば、2*53+1のbit表記は2**53と同じ。)

・int32のbit表記には、補数表現が使われている。

javascriptのビット演算

ビット演算を行うときのみ、int32として扱われる。(>>>を含む計算は、uint32として計算されます。)

ビット演算が終了すると、int32(またはuint32)から通常のNumber型に戻る

Number→intへの変換

①小数の場合は、近い整数に変換される。

②整数x を ((x % 2**32)+2**32) % 2**32に変換する。簡単に言えば、mod 2**32において等しい、0以上2**32-1の整数に変換する。

③その整数の2進数表記をint32とみなす。(演算が>>>の場合はuint32としてみなす。)

int32→Numberへの変換

・int32における整数nの値は、そのまま、Number型におけるnに変換される。

(bit表記は変わるが、数の世界では変化なし。)

整理

・>>>が含まれない場合、-2**31以上2**31-1以下の整数は、ビット演算の前と後では変化しない。

・-2**31-1以下の場合や2**31以上の整数の場合、値は変化する。

整数の精度に注意

-2**53以下の整数と2**53以上の整数を扱う場合、意図していない値になるので注意。

例えば、(2**53+1)^0は、上の変換通りに計算すると、変換後は1になりそうですが、実際は0になります。これは、2**53+1のbit表記が2**53である為です。

・-2*31^0は、-2**31 mod 2**32 = 2**31より2**31に変換され、これを2進数を表すと、100…00(32bit)になる。これをint32で解釈すると-2**31となるので、計算終了後はNumber型の-2**31になる。

・2**31^0は2進数で表すと、100…00(32bit)になる。これをint32で解釈すると、-2**31となるので、計算終了後はNumber型の-2**31になる。

・-2**31^0は、-2**31-1 mod 2**32=2**31-1より2**31-1に変換され、これを2進数で表すと、01111…1111(32bit)になる。これをint32で解釈すると、2**31-1となるので、計算終了後はNumber型の2**31-1になる。

・-1^0は、2**32-1に変換され、これを2進数で表すと、111…111(32bit)になる。これをint32で解釈すると、-1となるので、計算終了後はNumber型の-1になる。

・(2**31^0) + (2**31^0)は、-2**32になる。

参考文献

↓ かなり分かりやすいjavascriptの数値型に関する記事です。

https://qiita.com/uhyo/items/f9abb94bcc0374d7ed23

【javascript】サイト上で音を鳴らす方法【2024年】

導入

2018年、Googleのポリシーが変更になり、javascriptでただAudioオブジェクトを作って、play()を呼ぶだけでは、音を鳴らすことができなくなりました。

様々なサイトで、すでに無効になった上記の方法が紹介されていて、2018年以降の方法を紹介しているサイトがあまりなかったので、ここに方法を書いておきます。

方法

①ユーザーにサイトをクリックをさせる。

②AudioContextオブジェクトのresume()を呼ぶ。

③その後に音を鳴らす。

(①と②は逆でも良いです。)

コード例

const atx = new AudioContext();
atx.resume();
const snd = new Audio("オーディオファイルへのパス.mp3");
document.addEventListener("click",() => {
     snd.currentTime = 0;
     snd.play();
})

上のコードは、クリックすると音が鳴るコードです。

currentTime = 0は、再生場所を設定しています。再生場所を元に戻さないと、連続再生しても、前の音が終わるまで次の音が鳴りません。

また、AudioContextのstateというプロパティで「音声が許可されたかどうか」が確認できます。stateが「running」の場合は許可あり、「suspended」の場合は許可なし、です。

ブラウザゲームを作る場合は、ミュートをデフォルトの設定するか、クリックするとゲームが始まるように設計すると良さそうです。

参考文献

https://developer.chrome.com/blog/autoplay