C#|System.Windows.Formsを使わないWindowsアプリ

 ふと、System.Windows.Formsを参照せずにWin32APIのみでウィンドウズアプリ作れないかな?と思いました。

 メッセージボックスを表示する辺りまでは余裕で出来たのですが、ウィンドウを表示してメインループを回すまでは出来ませんでした。ギブアップです。

 Win32APIとC#の型の対応がさっぱりわけわかめです。MSDN漁ってもまとまった資料は見付かりません。プラットフォームSDKのヘッダファイルを見れば簡単に分かるらしいのですが、先日ハードディスクの容量節約の為にVC++ Express Editionもろともアンインスコしちゃいました。

 4時間程格闘して、

『Win32API使うなら素直にC++で書いた方が楽そう』

と思いました。でも、C++って何でこんなにも主流なんでしょう?低水準に近いCを無理やり抽象化してオブジェクト指向にした様な強い違和感があります。

 入門サイトを読んで、書いてあることは理解出来るのですが、じゃぁ書けるか?と言ったら絶対無理です。C++でウィンドウズアプリをゴリゴリと書ける人の脳内を覗いてみたいです。

 そうそう、Win32APIを片っ端からDllImportしまくった.NETのクラスライブラリとかあったら欲しいです。

C#|どう書く?org あみだくじ その後

 http://blogs.dion.ne.jp/anis7742/#6558930で書いたコードにプラス評価が付いているのに気付きました。

初の+です。-2貰って凹んでいたところの+評価は嬉しいです。

 エレガントに書けた

http://ja.doukaku.org/comment/4699/

じゃ無くて、冗談で書いた

こっちがプラス評価を受けるのというのが面白いです。

 どう書く?orgではコードの綺麗さや処理効率よりもアイディアや意外性に価値観を見出す人が多いのでしょうか。

C#|どう書く?org小町算2

 http://ja.doukaku.org/comment/4753/

 思ったより速度が出ていたので満足でしたが、真っ赤です。具体的に何処がマイナスなのか、マイナス評価した人の意図は分かりませんが、元々嫌な匂いプンプンなコードなので、そりゃマイナスだよなぁと思いました。

 foreachの8重ネストはもっと何とか出来そうです。

 命名規則が滅茶苦茶で意味不明です。英語が弱いので、いっそのこと日本語使った方が良かったでしょうか。

 最初はDecimal型で計算してましたが、解の数が100個しかありませんでした。次にDouble型にしてみて、101個になったので投稿しました。

 簡単なコードを書いて差分を抽出したら

1/2/3*456+7+8+9

でした。自分で10年振りに分数の計算をしました。計算結果は間違いなく100です。でも、Double型で偶々100になっただけでしょうから、自作Evalメソッドの改良が必要でしょう。

 僕には言語以外に勉強しなければいけないことがあるのだろうと思いました。

C#|どう書く?org あみだくじ3

 問題文に

>”このあみだくじをたどって”(中略)結果を表示させる

>プログラムを作ってください。

とあるのだから、ちゃんとあみだくじを辿るコードを書くべきだと気付きました。

//http://ja.doukaku.org/103/ 投稿用
using System;
using System.Collections.Generic;
class Program2 {
  static void Main(string[] args) {
    string amidaStr = @"A B C D E

-
- -
- -
- -

|-| | | |";
    List<char> amida = new List<char>();
    //あみだをPlayerが解釈できる形式に変換
    foreach(string line in amidaStr.Split(new char[] { '\n' })) {
      amida.Add(line.ToCharArray());
    }
    amida.Add(new char[amida[0].Length]);//Playlerが回答を記入する欄
    //Player生成
    for(int i = 0; i < amida[0].Length; i = i + 2) {
      new Player(i, amida);
    }
    //出力
    foreach(char[] line in amida) {
      Console.WriteLine(line);
    }
    Console.ReadLine();
  }
}
class Player {
  public Player(int start,List<char[]> amida) {
    Play(start, 1, amida, amida[0][start]);   
  }
  private void Play(int x,int y, List<char[]> amida, char name){
    if(amida[y][x] == '|') { //あみだが終わっていなければ
      if(x >= 2 && amida[y][x - 1] == '-') {
        Play(x - 2, y + 1, amida, name); //左に移動して進む
      } else if(x <= amida[0].Length - 3 && amida[y][x + 1] == '-') {
        Play(x + 2, y + 1, amida, name); //右に移動して進む
      } else {
        Play(x, y + 1, amida, name); //移動せずに下に進む
      }
    } else {
      amida[y][x] = name; //終わったら結果を記入
    }
  }
}

C#|どう書く?org あみだくじ2

 ざっくりと最適化しました。ちょっと自信あります。我ながらエレガントに書けたと思います。

//http://ja.doukaku.org/103/ 投稿用
using System;
using System.Collections.Generic;
class Program {
  static void Main(string[] args) {
    Amida(@"A B C D E
-
- -
- -
- -
|-| | | |");     Console.ReadLine();   }   static void Amida(string amidaText) {     List<string> temp = new List<string>(amidaText.Split(new char[] { '\n' }));     List<char> lastLine = new List<char>(temp[0].ToCharArray());     foreach(string line in temp) {       Console.WriteLine(line);       for(int i = 1; i < line.Length; i = i + 2) {         if(line[i] == '-'){           lastLine.Reverse(i - 1, 3);         }       }     }     Console.WriteLine(lastLine.ToArray());   } }

C#|どう書く?org あみだくじ

 どう書く?orgのお題、あみだくじへの投稿用に書きました。もっとエレガントに書ける気がしますが、これで行きます。

//http://ja.doukaku.org/103/ 投稿用
using System;
using System.Collections.Generic;
class Program {
  static void Main(string[] args) {
    Amida(@"A B C D E
-
- -
- -
- -
|-| | | |");     Console.ReadLine();   }   static void Amida(string amidaText) {     string amidaTemp = amidaText.Split(new char{'\n'});     List<char> amidaRows = new List<char>();     amidaRows.Add(amidaTemp[0].ToCharArray());     for(int i = 1; i < amidaTemp.Length; i++) {       amidaRows.Add(amidaTemp[i].ToCharArray());       for(int j = 0; j < amidaTemp[i].Length; j = j + 2) {         if(j > 0 && amidaTemp[i][j - 1] == '-') {           char tmp;           tmp = amidaRows[0][j];           amidaRows[0][j] = amidaRows[0][j - 2];           amidaRows[0][j - 2] = tmp;         }       }     }     amidaRows.Add(amidaRows[0]);     amidaRows.RemoveAt(0);     amidaRows.Insert(0, amidaTemp[0].ToCharArray());     foreach(char[] line in amidaRows) {       Console.WriteLine(line);     }   } }

青い道路は自転車専用、東京・世田谷でレーン実験

 たまには自転車ネタでも書こうと思います。

青い道路は自転車専用、東京・世田谷でレーン実験

車道に自転車レーンを設置する社会実験だそうです。これが定着すれば、日本での交通手段としての自転車の可能性はぐんと広がるでしょう。

 ただ、レーンの幅が45センチというのは狭いです。歩道を走ることが出来る自転車の基準のひとつである普通自転車の車幅は、60センチ以下です。45センチだと大半の自転車はハミ出ます。きっと頭が弱い人が決めたのでしょう。普段から全く自転車に乗らない人でも簡単に分かることだと思います。

 しかもこの自転車レーンが、道交法で言う自転車道と解釈されれば、幅45センチ以上60センチ以下の自転車は走るところが無くなります。

 どちらにしろ、いくら道路に小細工しても人が変わらなきゃ意味がありません。一番大切で効果的なのは教育だと思うのですが、行政にその気は無いようです。

C#|どう書く?org正整数のゲーデル数化?

 どう書く?orgのお題正整数のゲーデル数化?への投稿用に書きました。

 既に投稿されているSiroKuroさんのコードのc – ‘0’ってところに萌えつつ、こういうときにIEnumeratorを使うと効率がいいのね~と勉強になりつつ、こんな感じで書いてみました。

 分かりやすく書いたつもりがかえって意図が伝わりにくくなってる気がします。

 参考としてリンクされいるWikiを見ても、ゲーデル数というものがが何なのかさっぱり理解出来ませんが、お題に示されているように書いてみました。

//http://ja.doukaku.org/100/ 投稿用
using System;
using System.Collections.Generic;
class Program {
  static void Main(string[] args) {
    Console.WriteLine(goedel(9));
    Console.WriteLine(goedel(81));
    Console.WriteLine(goedel(230));
    Console.ReadLine();
  }
  static double goedel(int n) {
    string tmpStr = n.ToString();
    double r = 1;
    List<double> prime = new List<double>(new double[] { 2 });
    for(int i = 3; ; i += 2) {
      bool isPrime = true;
      for(int j = 3; j < i; j++) {
        if(i % j == 0) {
          isPrime = false;
          break;
        }
      }
      if(isPrime) prime.Add(i);
      if(prime.Count >= tmpStr.Length) break;
    }
    for(int i = 0; i < tmpStr.Length; i++) {
      r *= Math.Pow(prime[i], (double.Parse(tmpStr[i].ToString())));
    }
    return r;
  }
}