Gray code: Difference between revisions

Content added Content deleted
(→‎{{header|Ursala}}: Added VBScript)
m (→‎{{header|Batch File}}: less code, but slower (TnT))
Line 549: Line 549:
<lang dos>:: Gray Code Task from Rosetta Code
<lang dos>:: Gray Code Task from Rosetta Code
:: Batch File Implementation
:: Batch File Implementation

@echo off
@echo off
rem -------------- define batch file macros with parameters appended
rem -------------- define batch file macros with parameters appended
Line 562: Line 562:
rem note: if natnum is negative, then !outputvar! is empty
rem note: if natnum is negative, then !outputvar! is empty
set tobinary=for %%# in (1 2) do if %%#==2 ( %\n%
set tobinary=for %%# in (1 2) do if %%#==2 ( %\n%
for /f "tokens=1,2,3" %%a in ("!args!") do (set "natnum=%%a"^&set "bitlength=%%b"^&set "outputvar=%%c") %\n%
for /f "tokens=1,2,3" %%a in ("!args!") do ( %\n%
set "natnum=%%a"^&set "bitlength=%%b"^&set "outputvar=%%c") %\n%
set "!outputvar!=" %\n%
set "!outputvar!=" %\n%
if !natnum! geq 0 ( %\n%
if !natnum! geq 0 ( %\n%
Line 574: Line 575:
) else set args=
) else set args=


goto :main-thing %== jump to the main thing ==%
rem gray code encoder up to bit #(!bitlength!-1)
rem -------------- usual "call" sections
rem argument: binary bitlength outputvar
rem the sad disadvantage of using these is that they are slow (TnT)
rem note: MSB is bit #0
set encoder=for %%# in (1 2) do if %%#==2 ( %\n%
for /f "tokens=1,2,3" %%a in ("!args!") do (set "binary=%%a"^&set "bitlength=%%b"^&set "outputvar=%%c") %\n%
if "!binary!" neq "" ( %\n%
set "!outputvar!=!binary:~0,1!" %\n%
set /a "lastidx=!bitlength!-1" %\n%
for /l %%m in (1,1,!lastidx!) do ( %\n%
set /a "previdx=%%m-1" %\n%
for %%x in (!previdx!) do set /a "newbit=!binary:~%%m,1!^^!binary:~%%x,1!" %\n%
for %%v in (!outputvar!) do set "!outputvar!=!%%v!!newbit!" %\n%
) %\n%
) %\n%
) else set args=


rem gray code decoder up to bit #(!bitlength!-1)
rem gray code encoder
rem argument: gray bitlength outputvar
rem argument: natnum outputvar
:encoder
rem note: MSB is bit #0
set /a "%~2=%~1^(%~1>>1)"
set decoder=for %%# in (1 2) do if %%#==2 ( %\n%
goto :eof
for /f "tokens=1,2,3" %%a in ("!args!") do (set "gray=%%a"^&set "bitlength=%%b"^&set "outputvar=%%c") %\n%

if "!gray!" neq "" ( %\n%
rem gray code decoder
set "!outputvar!=!gray:~0,1!" %\n%
rem argument: natnum outputvar
set /a "lastidx=!bitlength!-1" %\n%
:decoder
for /l %%m in (1,1,!lastidx!) do ( %\n%
set /a "previdx=%%m-1" %\n%
set "inp=%~1" & set "%~2=0"
:while-loop-1
for /f "tokens=1,2" %%x in ("!previdx! !outputvar!") do set /a "newbit=!gray:~%%m,1!^^!%%y:~%%x,1!" %\n%
if %inp% gtr 0 (
for %%v in (!outputvar!) do set "!outputvar!=!%%v!!newbit!" %\n%
) %\n%
set /a "%~2^=%inp%, inp>>=1"
goto while-loop-1
) %\n%
)
) else set args=
goto :eof


rem -------------- main thing
rem -------------- main thing
:main-thing
setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
echo(# -^> bin -^> enc -^> dec
echo(# -^> bin -^> enc -^> dec
for /l %%n in (0,1,31) do (
for /l %%n in (0,1,31) do (
%tobinary% %%n 5 bin
%tobinary% %%n 5 bin
%encoder% !bin! 5 enc
call :encoder "%%n" "enc"
%decoder% !enc! 5 dec
%tobinary% !enc! 5 gray
echo(%%n -^> !bin! -^> !enc! -^> !dec!
call :decoder "!enc!" "dec"
%tobinary% !dec! 5 rebin
echo(%%n -^> !bin! -^> !gray! -^> !rebin!
)
)
exit /b 0</lang>
exit /b 0</lang>