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

Problem 11


与えられたデータをテキストファイルにしてそれを読みましょう。

@echo off

for /F %%s in (%1) do echo %%s
08
49
81
…

実は、%%sには1行そのままではなくスペースとタブで区切られた最初のトークンが格納されます。文字列全体を格納するにはオプションで区切り文字をなくせばよいです。delims=で区切り文字を指定できますが、ここでは何も指定しないことで区切らないようにします。

for /F "delims=" %%s in (%1) do echo %%s
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
…

では、これらの文字列をスペースで区切ることにしましょう。

for /F "delims=" %%s in (%1) do (
    call :split %%s b
)
exit /b 0

:split
    echo %1
    rem splitの実装
    exit /b 0
08
49
81
…

ん?

:split
    echo %1 %2
08 02
49 49
81 49
…

引数になるときに勝手に区切られるんですね。コマンドラインがそうだから。
こういうときは引数を引用符で囲むと意図どおりになります。

for /F "delims=" %%s in (%1) do (
    call :split "%%s" b
)
exit /b 0

:split
    echo %~1
    rem splitの実装
    exit /b 0
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
…

変数に~をつけると引用符を取り除いてくれます。