最近、バッチファイルでコーディングする機会があって、バッチファイルでもがんばれば意外とできるのではと思ったので、Project Eulerを解いてみることにしました。
バッチファイルについては、最初はバッチメモを参考にしました。あとは、コマンドラインでset /?とかif /?とか打って読みましょう。
バッチファイルの超基礎
バッチファイルはテキストファイルで、そこにMS-DOSのコマンドやらを並べておいて順次実行させるものです。そのためにバッチファイルと呼びます。例えば、こんな感じです。
@echo off
rem このようにremを使うとコメントになる
rem はてな記法にバッチファイルはないらしい
rem // こうしておいてC++ということにすれば色が変わるはず
copy a.txt a1.txt
copy a.txt a2.txt
拡張子は.batです。実行するにはファイルをダブルクリックする方法もありますが、ふつうはコマンドプロンプトを立ち上げて、そこで
>test.bat
などとバッチファイルのファイル名を入力します。.batは省略可能です。
環境変数
変数は環境変数を使います。そのシェル(コマンドプロンプト)でのみ有効になります。
設定は、
set a=1
とします。
set a = 1
とすると、恐らく意図どおりになりません。このあと、
rem // echoで標準出力。
echo %a %
とすると、
1
と出力されます。環境変数は%ではさんで参照するので、aの後ろにスペースをつけたものが環境変数になっていて、その値が1の前にスペースをつけたもの、ということになります。基本的に、setコマンドの=の前後にスペースを入れてはいけません。
演算
set /aで整数の演算ができます。
set /a n = 1 + 1 echo %n%
2
このように/aをつけたときはスペースを自由に入れられます。演算ができるのは整数のみです。32ビット符号つき整数のようです。恐らくCとほぼ同じ演算ができます。例えば、
set /a n = 0x7fffffff echo %n% set /a n += 1 echo %n%
とすると、
2147483647 -2147483648
と出力されます。
これでProblem 1が解けます。和の公式を用いると次のようになります。
@echo off set /a N = 1000 set /a n3 = (%N% - 1) / 3 set /a s3 = %n3% * (%n3% + 1) / 2 * 3 set /a n5 = (%N% - 1) / 5 set /a s5 = %n5% * (%n5% + 1) / 2 * 5 set /a n15 = (%N% - 1) / 15 set /a s15 = %n15% * (%n15% + 1) / 2 * 15 set /a s = %s3% + %s5% - %s15% echo %s%