CMD/BAT
only. It accepts three arguments: the name
of a variable to store the resulting string, the multiplier
(number of time the input string should be repeated), and the input
string.
From the point of view of the computational complexity theory this algorithm is optimal (
O(n) = log2(n)
, where n
is a string's multiplier) because it duplicates an interim result until n
. Let's consider this algorithm closer:
Given: S - the input string N - multiplier // Handle non-empty strings and at least one time if N <= 0 or S == '' return '' end if // Initialize -- estimate the length of the string R = S K = strlen(R) // Initialize -- counters L = 1 N = N - 1 // Repeat for the positive N while N > 0 // Remainder -- Find a substring, append to the resulting string and stop the loop if N <= L then M = N * K Q = substr(R, -M) R = R + Q break end if // Duplicate a string N = N - L R = R + R end while return RAnd there is implementation of this algorithm using CMD/BAT features only. The actual version of this routine can be found by the following link -- libs::strings at cmd-bat.
:: Repeats the INPUT string MULTIPLIER times :: :: @usage call :str_repeat NAME MULTIPLIER INPUT :: :: @param name :: @param number :: @param string :str_repeat setlocal enabledelayedexpansion set R= set N= set /a N=%~2 2>nul if not defined N goto str_repeat_break if %N% leq 0 goto str_repeat_break set R=%~3 if not defined R goto str_repeat_break call :str_len K "%R%" set /a L=1 set /a N=%N%-1 :str_repeat_continue if %N% leq 0 goto str_repeat_break if %N% leq %L% ( set /a M=%N% * %K% call :str_repeat_remainder set R=%R%!Q! goto str_repeat_break ) set /a N=%N% - %L% set R=%R%%R% set /a L*=2 goto str_repeat_continue :str_repeat_break endlocal && set %~1=%R% exit /b 0 :str_repeat_remainder set Q=!R:~-%M%! goto :EOF
No comments:
Post a Comment