ユーザ用ツール

サイト用ツール


いろんな言語でハノイの塔

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
いろんな言語でハノイの塔 [2025/06/03 05:47] – [Tiny BASIC] arakiいろんな言語でハノイの塔 [2025/06/03 05:51] (現在) – [Batch (Cmd.exe)] araki
行 131: 行 131:
 これを回避するために'':NORMALIZE''という関数を用意して、文字列''08''および''09''は、数値に置きかえるように処理している。 これを回避するために'':NORMALIZE''という関数を用意して、文字列''08''および''09''は、数値に置きかえるように処理している。
  
-<code hanoi.bat>+<code dos>
 @echo off @echo off
  
行 206: 行 206:
 === 実行結果 === === 実行結果 ===
 PowerShell版と同じ環境で実行したが、恐ろしく遅い。 PowerShell版と同じ環境で実行したが、恐ろしく遅い。
-<code command>+<code dos>
 C:\Users\araki\Documents>Hanoi -n 4 C:\Users\araki\Documents>Hanoi -n 4
 Disc 1 moved from 1 to 3 Disc 1 moved from 1 to 3
行 651: 行 651:
 コードにはコメントをつけてあります。 コードにはコメントをつけてあります。
 引数はなんとなくそんな感じになるように処理していますが、適当なので、あまり追求しないでください。 引数はなんとなくそんな感じになるように処理していますが、適当なので、あまり追求しないでください。
-<code bas>+<code rtl>
 #!/usr/bin/env rvtlw #!/usr/bin/env rvtlw
 1000 !=^GETARG       : Set Number of Discs 1000 !=^GETARG       : Set Number of Discs
行 741: 行 741:
 ''Hanoi''のインスタンスを作る際に円盤の枚数を宣言します。 ''Hanoi''のインスタンスを作る際に円盤の枚数を宣言します。
 あとは、''$hanoi->do;''とするだけで、処理を行います。 あとは、''$hanoi->do;''とするだけで、処理を行います。
-<code>+<code perl>
 #!/usr/bin/perl -w #!/usr/bin/perl -w
  
行 800: 行 800:
 </code> </code>
 === 実行結果 === === 実行結果 ===
-<code>+<code bash>
 araki@chive[125]% time ./hanoi.pl -n 4 araki@chive[125]% time ./hanoi.pl -n 4
 Disc 1 moved from 1 to 3 Disc 1 moved from 1 to 3
行 834: 行 834:
 特にひねりもなく、普通に実装してあります。 特にひねりもなく、普通に実装してあります。
 特筆するべきこともないかと思います。 特筆するべきこともないかと思います。
-<code>+<code ruby>
 #!/usr/bin/env ruby #!/usr/bin/env ruby
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
行 869: 行 869:
 </code> </code>
 === 実行結果 === === 実行結果 ===
-<code>+<code bash>
 araki@chive[131]% time ./hanoi.rb -n 4 araki@chive[131]% time ./hanoi.rb -n 4
 Disc 1 moved from 1 to 3 Disc 1 moved from 1 to 3
行 905: 行 905:
 ''if __name__ == '__main__':''で、''hanoi.py''をスクリプトとして起動した場合にのみ有効となるコードが記述されています。 ''if __name__ == '__main__':''で、''hanoi.py''をスクリプトとして起動した場合にのみ有効となるコードが記述されています。
 つまり、クラスライブラリとそれに付随するサンプル、あるいはテストコードをひとまとめにしておくことも出来るのはなかなかに便利だと思います。 つまり、クラスライブラリとそれに付随するサンプル、あるいはテストコードをひとまとめにしておくことも出来るのはなかなかに便利だと思います。
-<code>+<code python>
 #!/usr/bin/env python #!/usr/bin/env python
  
行 939: 行 939:
 </code> </code>
 === 実行結果 === === 実行結果 ===
-<code>+<code bash>
 araki@chive[146]% time ./hanoi.py -n 4 araki@chive[146]% time ./hanoi.py -n 4
 Disc 1 moved from 1 to 3 Disc 1 moved from 1 to 3
行 973: 行 973:
 このため再帰呼び出しの際に ''n = discs - 1''のようにして、減算を1回にしている他の言語と違って、呼び出しの度に''`expr ${1} - 1`''して、ローカル変数を避けています。 このため再帰呼び出しの際に ''n = discs - 1''のようにして、減算を1回にしている他の言語と違って、呼び出しの度に''`expr ${1} - 1`''して、ローカル変数を避けています。
  
-<code>+<code bash>
 #!/usr/bin/env bash #!/usr/bin/env bash
  
行 1004: 行 1004:
 </code> </code>
 === 実行結果 === === 実行結果 ===
-<code>+<code bash>
 araki@chive[152]% time ./hanoi.bash -n 4 araki@chive[152]% time ./hanoi.bash -n 4
 Disc 1 moved from 1 to 3 Disc 1 moved from 1 to 3
行 1028: 行 1028:
 awkは、AT&Tのベル研で、エイホ、ワインバーガ、カーニハンの三人により開発された、CSV形式のデータなどの処理に特化したスクリプト言語である。 awkは、AT&Tのベル研で、エイホ、ワインバーガ、カーニハンの三人により開発された、CSV形式のデータなどの処理に特化したスクリプト言語である。
 一行野郎などと言われるように、本来は、単機能を実装したコマンドを、パイプでつないで、複雑な処理を実現するのが主な使い方であり、コードそのものをコマンドラインにタイプしてしまい、わざわざスクリプトファイルにしたりしないことも多い。 一行野郎などと言われるように、本来は、単機能を実装したコマンドを、パイプでつないで、複雑な処理を実現するのが主な使い方であり、コードそのものをコマンドラインにタイプしてしまい、わざわざスクリプトファイルにしたりしないことも多い。
-<code>+<code bash>
 $ cat resul.txt | awk '{print $2;}' | sed -e "s/^(.*)$/'\1'/" $ cat resul.txt | awk '{print $2;}' | sed -e "s/^(.*)$/'\1'/"
 </code> </code>
行 1038: 行 1038:
 === コード === === コード ===
 普通の関数型言語の側面もあるので、そのまま、ストレートに実装してある。 普通の関数型言語の側面もあるので、そのまま、ストレートに実装してある。
-<code>+<code awk>
 #!/usr/bin/awk -f #!/usr/bin/awk -f
 function hanoi(n, a, b, c) function hanoi(n, a, b, c)
行 1067: 行 1067:
 </code> </code>
 === 実行結果 === === 実行結果 ===
-<code>+<code bash>
 araki@chive[157]% time ./hanoi.awk -n 4 araki@chive[157]% time ./hanoi.awk -n 4
 Disc 1 moved from 1 to 3 Disc 1 moved from 1 to 3
行 1098: 行 1098:
 コマンドラインの引数をとるために flagを、表示の加工用に fmtモジュールを利用している以外は、コード内で完結している。 コマンドラインの引数をとるために flagを、表示の加工用に fmtモジュールを利用している以外は、コード内で完結している。
  
-<code>+<code go>
 package main package main
  
行 1145: 行 1145:
 === 実行結果 === === 実行結果 ===
  
-<code>+<code bash>
 araki@cherry:~/work/Hanoi$ time ./hanoigo -n 4 araki@cherry:~/work/Hanoi$ time ./hanoigo -n 4
 Disc 1 moved from 1 to 3. Disc 1 moved from 1 to 3.
行 1181: 行 1181:
 また、ガベージコレクションによる動的なメモリ管理ではなく、静的な管理が中心となる。 また、ガベージコレクションによる動的なメモリ管理ではなく、静的な管理が中心となる。
  
-<code>+<code rust>
 use getopts::Options; use getopts::Options;
 use std::process; use std::process;
行 1230: 行 1230:
 </code> </code>
 === 実行結果 === === 実行結果 ===
-<code>+<code bash>
 araki@cherry:~/work/Hanoi/hanoi$ time target/debug/hanoi -n 4 araki@cherry:~/work/Hanoi/hanoi$ time target/debug/hanoi -n 4
 Disc 1 moved from 1 to 3 Disc 1 moved from 1 to 3
いろんな言語でハノイの塔.1748929657.txt.gz · 最終更新: by araki