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

Problem 22


この問題は、ファイルを読み込むのが難しいです。どうやらデフォルトでは一度に8192バイト以上は読めないようです。

for /F %%s in (names.txt) do (
    echo %%s
)

適当な文字で区切って少しずつ読めば長い文字列でも読めます。例えばZで区切って、その31項目目を表示するには、

for /F "delims=Z tokens=31" %%s in (names.txt) do (
    echo %%s
)

ただ、これも31項目までしか取れないらしく、最後までは読めません。仕方がないので、カンマの代わりに改行を入れてそれを読むようにしました。
また、ソートをしなければならなりませんが、sortコマンドを使ってその結果を使うことにしました。

for /F "usebackq" %%s in (`sort names2.txt`) do (
    …
)

このように"usebackq"を使うとコマンドの出力を読めるようになります。
スコアにするときは、sA = 1, sB = 2という変数を作っておくと簡単です。

@echo off

setlocal enabledelayedexpansion
call :dict s 1 ABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a s = 0
set /a k = 1
for /F "usebackq" %%s in (`sort names2.txt`) do (
    call :score %%~s
    set /a s += !ERRORLEVEL! * !k!
    set /a k += 1
)
echo %s%
exit /b 0

:dict
    if "%3" == "" exit /b 0
    set /a k = %2
    set str=%3
    set /a %1%str:~0,1% = %k%
    set /a k += 1
    call :dict %1 %k% %str:~1%
    exit /b 0

:score
    setlocal
    if "%1" == "" exit /b 0
    set str=%1
    set /a s = "s%str:~0,1%"
    call :score %str:~1%
    set /a s += %ERRORLEVEL%
    exit /b %s%