tobe-tobe vol.4

毎週恒例とも言うべき、東京Basic Technology勉強会vol.4行ってきました。
今回は「ハノイの塔」。講師は主催者のkwappaさんです。
個人的には梵天の塔といったほうが通じる。


わからない人にわからないように説明すると、
64枚が解けたときに世界が崩壊するアレです。

実装してみた

まあ、せっかく聞いたのだから自分で組んでみないと理解もできないだろうし早速組んでみた。
リハビリ兼ねてJava

import java.util.Stack;

public class Hanoi {
  private static Stack<Integer> from_t = new Stack<Integer>();
  private static Stack<Integer> to_t = new Stack<Integer>();
  private static Stack<Integer> tmp_t = new Stack<Integer>();

  private static int tower; // 塔の高さ
  private static int times = 0; // 移動回数

  /**
   * ハノイの塔プログラム
   *
   * @param args[0] 塔の高さ
   */
  public static void main(String[] args) {
    // 塔の高さを決定
    if(args.length > 0){
      tower = Integer.parseInt(args[0]);
    }
    if (tower <= 0) tower = 5;
    // 初期状態
    for (int i = tower; i > 0; i--) {
      from_t.add(i);
    }
    // 移動実行
    ido(from_t, to_t, tmp_t, from_t.size());
  }

  /**
   * from から to へ移動を行う.
   *
   * @param from 移動元
   * @param to 移動先
   * @param tmp テンポラリ
   * @param cnt 移動させる枚数
   */
  public static void ido(Stack<Integer> from, Stack<Integer> to, Stack<Integer> tmp, int cnt) {
    // 1枚のときはfromからtoに動かす
    if(cnt == 1){
      to.push(from.pop());
      staPrint();
    }else{
      // from - 1枚をtmpに動かす
      ido(from, tmp, to, cnt - 1);
      // fromからtoに動かす
      ido(from, to, tmp, 1);
      // tmpからtoへ
      ido(tmp, to, from, cnt - 1);
    }
  }


  /**
   * 状態出力
   */
  public static void staPrint() {
    times++;
    System.out.print("----------------------------\n");
    System.out.print(times+"回目\n");
    System.out.print("A:"+from_t+"\n");
    System.out.print("B:"+tmp_t+"\n");
    System.out.print("C:"+to_t+"\n");
  }
}

Stackクラスなんて使ったことなかったので、使ってみた。
ロジック自体はありがちな感じになったと思う。
Java経験ある人から見るとヘタれソースな気がする。

Hanoimania! がすごい!

sendmailでも解法がある!なんて聞いたから、どんなものかと見てみたけど、さっぱりsendmailわかんない……
個人的な一番のヒットはping(ICMP)かなぁ〜。結果出力方法がイカしてた。

FizzBuzz

勉強会でちょっと話にあったのでFizzBuzzもちょっとやってみ・・・
と思ったけど、思いついたロジックそのままでいけたのであまり楽しくなかった。
どうもFizzBuzzはコードの綺麗さが勝負らしい。