<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: повторить строку несколько раз]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=4128</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4128&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: повторить строку несколько раз».]]></description>
		<lastBuildDate>Wed, 27 Jan 2010 23:11:32 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[CMD/BAT: повторить строку несколько раз]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=32650#p32650</link>
			<description><![CDATA[<p>Самая простая реализация алгоритма - (N - 1) раз склеить исходную строку с самой собой, чтобы получить новую строку содержащую N копий исходной (сложность алгоритма - <strong>O(n) = n</strong>). Однако этот алгоритм простой и неоптимальный с точки зрения скорости выполнения, существует более оптимальный, хотя и чуть более сложный алгоритм. Суть его -- удвоение строки. То есть сложность алгоритма порядка <strong>O(n) = log2(n)</strong>. Давайте рассмотрим его подробнее: <br /></p><div class="quotebox"><blockquote><p>Дано:<br />S - строка <br />N - умножитель, то есть сколько раз строку S повторить в результирующей строке</p><p>// Только непустые строки и не менее одного раза<br />if N &lt;= 0 or S == &#039;&#039;<br />&nbsp; &nbsp; return &#039;&#039;<br />end if</p><p>// Инициализация -- вычисление длины исходной строки<br />R = S<br />K = strlen(R)</p><p>// Инициализация -- счетчики<br />L = 1<br />N = N - 1</p><p>// Повторять пока счетчик не обнулится<br />while N &lt;= 0<br />&nbsp; &nbsp; // Остаток -- найти оставшуюся подстроку, добавить к результирующей и завершить<br />&nbsp; &nbsp; if N &lt;= L then<br />&nbsp; &nbsp; &nbsp; &nbsp; M = N * K<br />&nbsp; &nbsp; &nbsp; &nbsp; Q = substr(R, -M)<br />&nbsp; &nbsp; &nbsp; &nbsp; R = R + Q<br />&nbsp; &nbsp; &nbsp; &nbsp; break<br />&nbsp; &nbsp; end if</p><p>&nbsp; &nbsp; // Удвоение строки<br />&nbsp; &nbsp; N = N - L<br />&nbsp; &nbsp; R = R + R<br />end while</p><p>return R</p></blockquote></div><p>Хотя язык и средства обработки строк не дотягивают до возможностей полноценного языка высокого уровня, тем не менее я озадачился -- а можно ли в пакетных скриптах реализовать этот алгоритм. Оказывается можно. Хотя возникла небольшая сложность, но и она была преодолена. Необходимое замечание - я не видел, чтобы этот алгоритм был часто востребован в пакетных скриптах, меня больше интересовала сама возможность реализации. Если кому-то это может пригодиться, я буду рад. <br /><a href="http://with-love-from-siberia.blogspot.com/2010/01/cmdbat-repeat-string-multiple-times.html">CMD/BAT: Repeat a string multiple times</a><br /></p><div class="codebox"><pre><code>:: Повторить MULTIPLIER раз строку INPUT 
::
:: @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&gt;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 &quot;%R%&quot;

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_part
    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 &amp;&amp; set %~1=%R%
exit /b 0

:str_repeat_part
set Q=!R:~-%M%!
goto :EOF</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Wed, 27 Jan 2010 23:11:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=32650#p32650</guid>
		</item>
	</channel>
</rss>
