バッチファイルでProject Euler(1)

最近、バッチファイルでコーディングする機会があって、バッチファイルでもがんばれば意外とできるのではと思ったので、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%