LoginSignup
0
0

More than 5 years have passed since last update.

第12回 シェル芸勉強会

Posted at

一年くらい前にバッチファイルで解いたものがでてきたので、供養のため載せておきます。(コメントや解説はありません。)

上田ブログ
http://blog.ueda.asia/?p=3535

2014-08-02.bat
@echo off

set SELF=%~n0
set HELP=Usage: %SELF% NUMBER
set HOME=%~dps0
set HOME=%HOME:~0,-1%

setlocal enabledelayedexpansion
  :: 位置パラメーターを確認
  if "%~1" == "" (
    echo %HELP% >&2
    exit /b 1
  )
  :: 値が数値か確認
  (echo %~1) | findstr /r "[^0-9]." > NUL
  if %ERRORLEVEL% equ 0 (
    echo %HELP% >&2
    exit /b 1
  )

  :: 位置パラメーターを取得
  set n=%~1

  :: 値が範囲内か確認(Q1からQ8まで)
  if %n% lss 1 (
    echo %SELF%: illegal value: use 1-8 >&2
    exit /b 1
  )
  if %n% gtr 8 (
    echo %SELF%: illegal value: use 1-8 >&2
    exit /b 1
  )

  :: 作業フォルダーを作成
  set CWD=%HOME%\A%n%
  md %CWD%

  :: テストを実行
  call :A%n% %CWD%
  if %ERRORLEVEL% neq 0 (
    echo %SELF%: script abended: A%n% >&2
    exit /b 1
  )

  :: 作業フォルダーを削除
  cd %CWD%\..
  rd /s /q %CWD%
endlocal
goto :EOF

:A1
setlocal enabledelayedexpansion
  set CWD=%~1

  set i=21
  set m=1
  set n=%i%

  for /l %%i in (1, 1, %i%) do (
    set t=
    for /l %%j in (1, 1, %i%) do (
      if %%j equ !m! (
        set t=!t!x
      ) else if %%j equ !n! (
        set t=!t!x
      ) else (
        set t=!t! 
      )
    )
    echo !t!
    set /a m+=1
    set /a n-=1
  )
endlocal
goto :EOF

:A2
setlocal enabledelayedexpansion
  set CWD=%~1

  set s=たけやぶ

  set i=0
  set t=
  :A2.BOL
    set c=!s:~%i%,1!
  if not "%c%" == "" (
    set t=%t%%c%
    set /a i+=1
    goto A2.BOL
  )
  set /a i-=1

  set /a i-=1
  for /l %%i in (%i%, -1, 0) do (
    set t=!t!!s:~%%i,1!
  )

  echo %t%
endlocal
goto :EOF

:A3
setlocal enabledelayedexpansion
  set CWD=%~1

  (echo Invoke-WebRequest http://ja.wikipedia.org/wiki/%%E5%%8D%%97%%E6%%AD%%A6%%E7%%B7%%9A -OutFile %CWD%\%SELF%.tmp) | powershell -Command -

  start /min /wait cmd /c chcp 65001 ^& ^(set /p x="" ^< NUL ^& cmd /u /c type %CWD%\%SELF%.tmp^) ^> %CWD%\%SELF%.65001.tmp
  start /min /wait cmd /c chcp 932 ^& cmd /c type %CWD%\%SELF%.65001.tmp ^> %CWD%\%SELF%.932.tmp

  findstr /b "<th" %CWD%\%SELF%.932.tmp | findstr /l "style=\"width:1em;\"" > %CWD%\%SELF%.tmp
  for /f "tokens=2 delims=<>" %%i in (%CWD%\%SELF%.tmp) do (
    echo %%i
  )

  del %CWD%\*.tmp > NUL 2>&1
endlocal
goto :EOF

:A4
setlocal enabledelayedexpansion
  set CWD=%~1

  (
    echo 鹿児島県
    echo 青森県
    echo 大阪府
    echo 群馬県
  ) > %CWD%\A4.txt

  (echo Invoke-WebRequest http://elze.tanosii.net/d/kenmei.htm -OutFile %CWD%\%SELF%.tmp) | powershell -Command -

  for /f "tokens=3 delims=<>(" %%i in ('findstr /r "[都道府県]" %CWD%\%SELF%.tmp ^| find "   <TD>" ^| findstr /g:%CWD%\A4.txt') do (
    echo %%i
  )

  del %CWD%\A4.txt %CWD%\%SELF%.tmp > NUL 2>&1
endlocal
goto :EOF

:A5
setlocal enabledelayedexpansion
  set CWD=%~1

  (
    echo A 31 1234 -42 4
    echo B 10 31.1 -34 94
  ) > %CWD%\A5.txt

  setlocal disabledelayedexpansion
  (
    echo @if ^(0^) == ^(0^) echo off
    echo cscript.exe //nologo //e:JScript "%%~f0"
    echo goto :EOF
    echo @end
    echo var l = new Array^(^);
    echo while ^(!WScript.StdIn.AtEndOfStream^) l.push^(WScript.StdIn.ReadLine^(^)^);
    echo l.sort^(function ^(a, b^) { return parseInt^(a, 10^) - parseInt^(b, 10^); }^);
    echo for ^(var i in l^) WScript.StdOut.WriteLine^(l[i]^);
  ) > %CWD%\sort.bat
  endlocal

  for /f "tokens=1,*" %%m in (%CWD%\A5.txt) do (
    set t=%%m 
    copy NUL %CWD%\A5.tmp > NUL
    for %%i in (%%n) do (
      (echo %%i) >> %CWD%\A5.tmp
    )
    call %CWD%\sort.bat < %CWD%\A5.tmp > %CWD%\%SELF%.tmp
    for /f "" %%i in (%CWD%\%SELF%.tmp) do (
      set t=!t!%%i 
    )
    echo !t!
  )

  del %CWD%\sort.bat %CWD%\*.txt %CWD%\%SELF%.tmp > NUL 2>&1
endlocal
goto :EOF

:A6
setlocal enabledelayedexpansion
  set CWD=%~1

  (
    echo 5
    echo 3
    echo 4
    echo 10
    echo 2
  ) > %CWD%\A6.txt

  for /f "" %%i in (%CWD%\A6.txt) do (
    rem FIXME
    if %%i lss 10 (
      set i=%%i 
    ) else (
      set i=%%i
    )
    set t= !i! 
    rem FIXME
    for /l %%j in (1, 1, 20) do (
      if %%j leq %%i (
        set t=!t!*
      ) else (
        set t=!t! 
      )
    )
    echo !t!
  )

  del %CWD%\A6.txt > NUL 2>&1
endlocal
goto :EOF

:A7
setlocal enabledelayedexpansion
  set CWD=%~1

  call :A6 "%CWD%" > %CWD%\A7.txt

  rem FIXME
  for /l %%i in (0, 1, 20) do (
    set t=^|
    for /f "tokens=*" %%j in (%CWD%\A7.txt) do (
      set s=%%j
      set c=!s:~%%i,1! 
      if "!c!" == "" (
        set t=!t! 
      ) else (
        set t=!t! !c!
      )
    )
    echo !t!^|
  )

  del %CWD%\A7.txt > NUL 2>&1
endlocal
goto :EOF

:A8
setlocal enabledelayedexpansion
  set CWD=%~1

  (
    echo A-B 1-2
    echo B-A 3-1
    echo C-A 1-0
    echo B-C 5-4
    echo C-B 2-1
  ) > %CWD%\A8.txt

  copy NUL %CWD%\%SELF%.tmp > NUL
  for /f "tokens=*" %%i in (%CWD%\A8.txt) do (
    set i=%%i
    for /f "tokens=1,2,3,4 delims= " %%a in ("!i:-= !") do (
      (
      if %%c gtr %%d (
        echo %%aW
        echo %%bL
      ) else (
        echo %%aL
        echo %%bW
      )
      ) >> %CWD%\%SELF%.tmp
    )
  )

  sort %CWD%\%SELF%.tmp > %CWD%\%SELF%.1.tmp
  copy NUL %CWD%\%SELF%.2.tmp > NUL
  for /f "tokens=*" %%i in (%CWD%\%SELF%.1.tmp) do (
    findstr /x /c:"%%i" %CWD%\%SELF%.2.tmp > NUL || (echo %%i) >> %CWD%\%SELF%.2.tmp
  )

  for /f "tokens=*" %%i in (%CWD%\%SELF%.2.tmp) do (
    set t=%%i
    for /f "tokens=3" %%j in ('find /c "%%i" %CWD%\%SELF%.1.tmp') do (
      set r=!t:~1,1!
      if "!r!" == "W" (
        echo !t:~0,1! %%j) else if "!r!" == "L" (
        echo !t:~0,1! %%j) else (
        rem /* NOT REACHED */
      )
    )
  )

  del %CWD%\A8.txt %CWD%\*.tmp > NUL 2>&1
endlocal
goto :EOF

位置パラメーターを指定せずに実行すると

C:\temp>2014-08-02.bat
Usage: 2014-08-02 NUMBER

とヘルプが表示されるので、 1 から 8 までの数字のなかから任意の値を指定して実行してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0