C#|どう書く?org必ず解ける迷路2

 グッと高速化。初めてStack<T>なるものを使ってみました。再帰で書くときの履歴に便利ねぇと思いながら書いたら、あっさりとスタックオーバーフローorz起こしたんでループで書き直しました。

 一度再帰で書いたのを最小限の変更でループに直してるので多少エレガントじゃない部分があると思います。

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

 C#って何も考えずに楽して書いたら遅いけど、パフォーマンスを意識して書けばC++と遜色ないんですね。

C#|どう書く?org コラッツ・角谷の問題

こんなことをして、

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

さらにC++のコードのC#への移植に挑戦しました。

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

VC#のエディタにC++のコードをペーストしてエラーを潰すだけです。(そんなんでいいのか…)

WisdomSoftのC++入門読んでおいて良かったです。殆ど頭に入ってませんが…。

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; //終わったら結果を記入
    }
  }
}