読者です 読者をやめる 読者になる 読者になる

C Sharpens you up

http://qiita.com/yuba に移しつつあります

ちょまど問題の算数的解法を改善=14手

算数

昨日の http://cs.hatenablog.jp/entry/2014/06/18/174157 には出題者の名前からちょまど問題という名前が付いたようです。

16手というのは算数的解法で、数学的にはまだまだ先があるのですが、ともかく算数的には16手が最短かと思っていましたが、まだまだ改善の余地がありましたね。14手になります。

解法のアイディア

  1. まず3回の試行で正解の分布を知る。正解を多く含む順に上位の選択肢2つ(A,Bと名付ける)と下位の選択肢2つが決まる。
  2. 9回の試行で、問9までについて正解がAかBか下位かがわかる。下位が正解の問題は最大4問。
  3. 2択問題が最大で4問なら、それらは2回の試行で正解がわかる。
  4. 問10の答は正解の分布から差し引きでわかる。

3 + 9 + 2 = 14手。

4択10問テストの正解探索回数=最大16回(破られた)

算数

本日twitter上でエンジニアの間で話題になった問題。

4択問題10問のテストを全部埋めて提出すると正解数がわかります。
何回提出すればすべての正解を知ることができますか。

10問すべての正解は、最大16回の試行で知ることができます。
(2014-06-20追記:これは算数の範囲内での答なのですが、算数の範囲内でもさらに改善できました。14手です。 http://cs.hatenablog.jp/entry/2014/06/20/132605

続きを読む

PostgreSQLでは識別子に大文字を使ってはいけない

タイトルの通り、PostgreSQLではテーブル名、カラム名など識別子に英大文字を使うべきではありません。

続きを読む

DBの自動連番がロールバックしても戻らない理由

SQL

DBの主キーカラムに自動連番(MySQLならAUTO_INCREMENTSQL ServerならIDENTITYOraclePostgreSQLならシーケンス)を設定していると、基本的には連続した数字が付番されていくのですが、行削除もしていないのに抜け番が発生する場合があります。

などの場合です。

特にトランザクションロールバックは、DB全体の変更をなかったことにするはずなのに連番だけは進んだまま戻らないということで、知らないと違和感があるものです。

続きを読む

返す値を一時変数に受けるよりはtry-finally

Java

余計な一時変数というのはなるたけ作りたくないものですが、例えばJavaでこんなコード書いちゃうことあるじゃないですか。

static T poll() {
  Integer result = array[top];                   // (1)
  if (++top >= array.length) top -= array.length;// (2)
  return result;
}

メソッドの戻り値が決まる(1)のが処理完了(2)より前というパターン。Delphiなら無縁な手間なんです*1が、C系の言語だとメソッド抜けるときまで戻り値を一時変数に受けておかないといけません。

こんな無意味な一時変数美しくありませんね。どこか行ってほしいですね。そして幸い、Javaにはそのための道具があります。try-finallyです。

*1:処理のどの段階ででも、関数名と同名の変数に代入しておいた値が抜けたときに戻り値になります。

続きを読む

AngularjsがHaxeから扱えない理由

Haxe

AngularjsはJavascript(以下JS)でリッチクライアントを書くためのMVCフレームワークです。JS MVCフレームワークはいま混戦状態で決定版はどれといいにくい状態ですが、確実に三強の一角ぐらいは占めていますね。

Angularjsについてもう少し知りたい場合はこちらのプレゼンテーションなどを。

さてそのJSは、今となっては人手でコーディングするには生産性が低すぎるから別のもっと良い言語からコンパイルして生成するようにしようぜという流れになっており、その「別のもっと良い言語」のことはAltJSと総称します。Haxe(ヘックス)はその代表格、その他にもCoffeeScript、TypeScript、Dart、JSXなどいろいろ個性ある言語がひしめいています。

当然、Angularjsを使ったアプリケーション開発でも、コード部分はJSでなくAltJSで書きたくないですかというのは当然の欲求で、実際にAltJSの採用例は多く、AngularJSと組み合わせるのに人気なのがTypeScriptです。TypeScriptはJSにクラスと静的型付けを盛り込んで正常進化させたと表現すべき言語でJSコードに上位互換性があり、なによりコンパイル結果として出力されるJSコードが素直で既存JSライブラリとも連携を取りやすいという利点があります。だから人気はうなずける。

でもHaxeもすごい言語。JSにクラスと静的型付けを盛り込んで(というよりはそういう位置づけのActionScriptを)正常進化させたものという点ではTypeScriptと似ているけど、Haxeは型体系がやばい。美しい。Enumが列挙体の枠をはるかに超えて代数的データ型になってしまっているって何言ってるのかわからないと思うので「Haxe Enum」でぐぐって検索結果の最初の10サイトを読んでみてくださいおもしろいから。

そのHaxeでAngulrajsの開発はちょっと無理

その美しいHaxeでクライアント開発したいな、Angularjsの開発できないかなと「Haxe Angularjs」でぐぐってみると全然これが引っかからないのですね。おかしい誰もやっていないなんてわけがないのに。

Haxeはちょっと前までは「出力されるJSコードが独自性強すぎてJSコード資産にならない(既存JSライブラリとも連携しづらい)」と言われていました。しかしHaxe 3.0になってからの出力コードは素直そのものでTypeScriptにも引けを取っておらず、これがAngularjsとの連携を阻んでいるということはありえません。

仕方ない、自分で書いてみるかと書き始めてみて、Angularjsを利用できない理由を理解しました。そうここまでが前振り。

Haxeはキーワードに$の文字を使えない

Angularjsはメソッド名や引数名に$の文字を多用していますが、これがHaxeのプログラム中で使えない文字なのです。HaxeはJSコードを出力するとき@:exposeアノテーションによってクラス名だけは別名出力させることが可能ですが、この@:exposeアノテーションはクラスにしか使えず、メソッド名だとか引数名だとかには適用不可能です。

引数名に関してはAngularjs側にも
http://js.studio-kingdom.com/angularjs/guide/di#1
$injectアノテーションという引数名変更に追従する仕組みがあるのですが、名前通りこの$injectというプロパティがすでに$の文字を含んでいたりして、やはりHaxeからは記述できません。結果として、$injectアノテーションの埋め込みをJSでべた書きすることになります。

引数だけでこれなのに各メソッドの名前もやはり問題となると… 使えませんねこれはとなるわけです。