C Sharpens you up

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

コーディング課題・5ℓと3ℓのバケツで4ℓの水を用意する問題

CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな

5リットルのバケツ(A)と3リットルのバケツ(B)だけ使って4リットルの水を測れと言われたら

  1. Aを満タンにする
  2. Aから注げるだけBに注いで、終わったらBの水は捨てる(Aに2リットルたまった)
  3. AからBに2リットルの水を移す
  4. Aを満タンにする
  5. AからBに注げるだけ注ぐと、Aに残るのは4リットル

これで最短手筋でしょうかね!?

はい、これを解くプログラムを書いてください。
問題は

バケツ容量はx, y(整数)
目標量はz(整数)

で与えられます。

許される操作は

  • どちらかを満タンにする
  • どちらかを空にする
  • 一方から他方へ注げるだけ注ぐ

のどれかです。

問題に対する結果として、

  • 手筋があるなら、操作を順序通りに返してください(操作を表現する形式はお任せします)。ただし最短のものです。
  • 手筋がないなら、空の結果を返してください。

例題の(5,3,4)に対しては

A.full
A.pour(B)
B.empty
A.pour(B)
A.full
A.pour(B)

という形の結果を出すということです。

応用問題

「なんのひねりもない*1幅優先探索じゃないの」と思った方、あなたは上位5%に入るエンジニアです。
そんなあなたに応用問題。

SQL SELECT文一本で解いてください。x,y,zにあたる数字は埋め込んでしまってかまいません。

*1:ひねっていないわけではなくて意地悪要素もあるんですがね。経路としてノード列でなくエッジ列を答えさせているところとか、解なし判定が必要なところとか。

SQL Serverでも論理削除と一意性制約を両立

一意性(UNIQUE)制約はNULLでない値に対してだけ効く、そう思っていた頃が私にもありました…
SQL ServerはNULLも一意性制約の対象になります。NULLになっている行が複数あると重複だと判定されます。SQL-92の規格書をあたってみると、これは完全な規格違反なんですけどね。

A unique constraint is satisfied if and only if no two rows in a table have the same non-null values in the unique columns.

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

つまりSQL Serverじゃ以前解説した

が使えないってことです。

でも大丈夫。
SQL Serverはインデックスフィルタで他製品のUNIQUE制約と同じ振る舞いを実現できます。

続きを読む

Intellisenseが解析あきらめるコードもあるんです

納涼!ほんとにあった怖いコード(by CodeIQ×はてな)

ある夏体験した悪夢のようなコーディングの話です。

そのソフトは、もともと1本のプログラムでクライアントとしてもサーバとしても機能するという作りになっていました。

そのソフトに転機が訪れます。
サーバ・クライアントを別々のプログラムに分離することに、さらにはサーバ側はWindowsサービス(UNIXで言うところのデーモン)とUIプログラムに分離することに、つまり都合3本のプログラムに分けることになったのです。

続きを読む

エクスプローラから一発でコマンドプロンプトやPlay!プロンプトを開く

Windowsでコマンドライン操作が必要なとき、わざわざスタートメニューからコマンドプロンプトを探して起動しておられる方はまさかおられませんな。

基本操作【フォルダをSHIFT右クリック】→【コマンドウィンドウをここで開く】
f:id:Sampo:20130719122037p:plain
はもちろんのこと皆様使っておられるだろうというのは前提として…

もっと簡単な方法。

アドレスバーにcmdと打ち込む

これでエクスプローラで開いているフォルダをカレントディレクトリにしてコマンドウィンドウが開きます。

アドレスバーにplayと打ち込む

Play!をインストールしてPATHが張られているなら、これでPlay!プロンプトも一発起動です。

WindowsのmklinkコマンドとUNIXのlnコマンドは引数が逆

Windowsでシンボリックリンクを作るときは

mklink 【作るリンク】 【実ファイルパス】

で、UNIXシンボリックリンクを作るときは

ln -s 【実ファイルパス】 【作るリンク】

なので引数の順番が逆ですご注意*1

あと、mklinkでは/Hをつければハードリンクで、デフォルトならシンボリックリンクですが、lnでは逆、-sをつけたらシンボリックリンクでデフォルトならハードリンクとなります。

さらに、Windowsではファイルのシンボリックリンクとディレクトリのシンボリックリンクが区別されています。ディレクトリへのリンクは/Dオプションを付けて

mklink /D 【作るリンク】 【実ディレクトリパス】

です。ディレクトリ相手に/Dを付け忘れてファイルシンボリックリンクを作ってしまうと何の役にも立たないおもしろリンクができるのでご注意。

そのディレクトリ相手のリンクについてはWindows2000以降で使える「ジャンクション」とVista以降で使える「シンボリックリンク」があったりして、まあmklinkコマンド使ってる時点でVista以降のユーザーだってことなんですがディレクトリ共有のときとか面倒なので違いを覚えてお…くのは無理ですね。毎回ぐぐっていただければと思います。

*1:lnで順番間違えると意外な場所におもしろリンクが作られるのでお試しください。

SQL製品別・XORと同値の書き方

SQLにブール型が定義されたのはSQL99と比較的最近のことなので、ブール型への対応にはまだばらつきがあります。

XOR(両辺の論理式のうち、片方だけが成立する)や同値(両辺の論理式が、ともに成立かともに不成立)という条件式を書きたいとき、ブール型に対応するOraclePostgreSQLでは簡単です。

(a=0) = (b IS NULL)
(c<d) <> (e<f)

のように、=, <>演算子がそのまま同値とXORを意味します。

SQL Serverの場合、論理式の真偽とBIT型とはまた別なので、=, <>演算子というわけにいきません。なんと条件式はAND, OR, NOT演算子だけで書き下ろさねばなりません。

(a=0 AND b IS NULL) OR (NOT a=0 AND NOT b IS NULL)
(NOT c<d AND e<f) OR (c<d AND NOT e<f)

MySQLXORだけ持っています。では同値をどう書くか?

(a=0) XOR NOT (b IS NULL)
(c<d) XOR (e<f)

NOTと組み合わせることで実現できます。

Windowsの巨大フォルダコピーが遅くていらつく? だったらコマンドラインで

Windowsの巨大フォルダコピーが遅いのには、コピーに取りかかる前にフォルダ構造を分析する手間も含まれています。いいから何も考えずコピーしてくれというときにはこれが本当にいらつく。

コマンドラインで何も考えずにコピーしてもらいましょう。

xcopy コピーしたいフォルダ コピー先 /E

/Eオプションは「サブフォルダを再帰的に、空フォルダも含めて」の意味です。隠しファイルもコピーしてほしいんだけどとかシンボリックリンク含んでるんですがとか暗号化がサポートされてなくて失敗するとかのときは/?オプションでヘルプ読んでください。

巨大フォルダの削除も同じように開始前のフォルダ構造解析で時間がかかっています。だからコマンドラインでこう。

rd /S 対象フォルダ

/Sは「サブフォルダを再帰的に」の意味です。

削除しようとすると

ディレクトリが空ではありません。
プロセスはファイルにアクセスできません。別のプロセスが使用中です。

なんてエラーが出て中途半端に終わることがあります。
表示の通り、なにかプロセスがファイルをつかんでしまっている可能性はあるのですが、単に再実行するだけで今度は完了することもあるので再実行してみる価値はあります。