忍者ブログ
おそらく活動状況とか、他愛もないこととか書きます。 μ崎みのりの気ままで気まぐれなブログです。 作曲とか、ゲーム製作なんかしてます。
[1]  [2]  [3]  [4]  [5]  [6
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

今日のgoogleが論理演算になっていたのでふと物思いにふけってしましました。

普通、論理値といえば真(true)または偽(false)のみを取る値です。
プログラミングだとboolとかBooleanとかで定義されてるアレですね。

…で、この論理値には二項演算があります。ANDとかORとかのあれです。
ふたつの入力XとYに対して出力をどのように制御するかのパターンを考えると、
AND・OR・XOR・NAND・NORなどの代表的なものから、含意とかYに関係なくXを返すとか特殊なパターンなども全部合わせて16通り(2^2^2)になります。

……で。.NETにはnull許容型があるわけで。
bool型のnull許容はtrue・falseに加えてnullも取りうる三値論理になるわけですね。
bool?型は他のNullable<T>と違って&・ | などの二項演算が特別扱いされ、三値論理演算になっています。
こちらもANDやORなどは分かりやすい挙動ですが、じゃぁこの演算子が全部で何パターンあるかを数えてみると…。
3^3^3なので19683通りに増えます。
さすがにこれを列挙するのは至難の業ですね…。
累乗が2回出てくるので爆発的に組み合わせは増えていきますね。
もちろんオペランドを入れ替えただけだったり、NANDやNORのような全体を否定するだけだったりのパターンを考慮すると数は減りますが……。
その数え上げすら結構面倒なので省略します(笑)が、それでも1/4くらいにしかならないはず…。
PR
一様多面体を表示してぐりぐり動かせるソフトを作っているのですが、
どうしても大二重斜方20・12面体がうまく球面四角形から作れません。

そもそもワイソフ記号「 | 5/2 3/2 5/3 3」から球面四角形を作ろうとすると、
内角の和が360°になって平面の普通の四角形になっちゃうのですが……。

そこにどんなトリックが隠されているのか、探しても探しても見付からず。
ワイソフ構成プログラム自体は球面四角形にも対応して、一応それっぽい物は表示できますが
正しい大二重斜方20・12面体にはどうやってもたどり着けません。

変形面が中心を通っているから普通の方法では作れないのでしょうか…?
転職して以前より忙しくなったにもかかわらず、
複数のプロジェクトを同時に進めているのでなかなかサイト更新まで手が回りませんでした。
大丈夫です、私は生きてます。

どちらにせよVisual Studio2015が正式リリースされるまではプログラミングを本格的にするつもりはなかったのですが、そうこうしているうちに概案とか外側だけコーディングとかを広く浅く進めてしまったためにリリース後も大変なことになっています。

今私が作っているものは、
●このサイトの運用の自作システム化(進捗50%)
●.NET4.6対応の新ゲームフレームワーク(進捗70%)
●フラクタル図形で遊ぶソフト(進捗95%)
●一様多面体を球面三角形をこねこねして表示するソフト(進捗5%)
の4つです。

当然ながら、イラストやデザインがないため製作に携わるのは私1人
相方ともしばらく連絡とっていません。どうしてこうなった……。

今後はあまりゲームを作っている時間はなさそうなので、理論がしっかりしていればわりとすぐできる数学関連のソフトをいくつか公開していく予定です。
それよりもまず新サイト運用システムを完成させることになるかと思います…。
あぁ…じゃぁ何のためにゲームフレームワークを作っているのか…。
公式の仕様書に載ってる面白い記述について。

C#5.0で追加されたasync / await はコンテキストキーワードなので、
特定の部分以外では普通に識別子として使えます。
で、このうちasyncのほうはメソッド宣言の直前でのみキーワードになるため、
タイトルのようなメソッドを宣言してもエラーにならないというお話。

using async = System.Threading.Tasks.Task;
using await = System.Threading.Tasks.Task;

class Async
{
     async async async(async async) => await async;
     async await await(await await) => await @await;
}


不思議なことに(?)このコードは何のエラーもなくコンパイルできます。
色分けで大体どう解釈されてるか分かりますよね。
5つのasyncは左からキーワード、型、メソッド名、型、引数名と解釈されています。
残念ながらawaitを識別子に使う場合はメソッド内で引数を参照する際に@awaitと書く必要がありますが、それでも同じ単語が4種類の意味で使われているのは圧巻(?)ですね。

ちなみにasync / await の他だと、var・yieldや全てのクエリキーワード等がコンテキストキーワードなので、
yield return yield;
とか、
var from = from var in yield select var;
といった(無意味に読みにくい)記述が可能です。

ただし、これらの単語がコンテキストキーワードなのは飽くまでも互換性のためなので、
新しくコードを書く場合は識別子に使わないのが普通でしょうね。
私は結構若い頃(小学生時代)からC#に触れていて、
言語がバージョンアップする度にその情報を追いかけて見ています。
そのため、恐らく普通の人よりはC#の言語仕様に詳しいと自負しています。

……自負しているはずなんですが。
ちょっとした省略の仕様とかで最近知らなかったものを見つけたのでメモ。

①配列初期化子の簡略化
一番古いタイプの省略記法を知りませんでした。
C#3.0で追加された型推論タイプは知ってたのに……。

// 普通の配列初期化子
int[] array1 = new int[] { 0, 1, 2, 3, 4 };
// 暗黙に型指定された配列初期化子(C#3.0以降)
int[] array2 = new[] { 0, 1, 2, 3, 4 };
// 知らなかったシンタックス。配列型変数の宣言と同時に初期化する場合のみ有効。
int[] array3 = { 0, 1, 2, 3, 4 };


②オブジェクト / コレクション初期化子の簡略化
ちょっとしたことなんですが、コンストラクタに引数がなければ括弧を省略できるんですね…。

var list = new List<int> { 0, 1, 2, 3, 4 };
var point = new Point { X = 10, Y = 20 };


コンストラクタなのに括弧がないと少し気持ち悪く感じます。
ただ、オブジェクト初期化子を使って初期化する時ってコンストラクタに引数がない場合が
多いので、括弧を省略することで「オブジェクト初期化子使ってますよ!」のアピールにはなるんじゃないかなーとは思います。
使えるものは使うスタンスなので、気付いたからには積極的に省略しますよ。
個人的に、C#は冗長に書くより短く書いた方が吉な言語だと思ってますので。
忍者ブログ [PR]