89 lines
1.8 KiB
Batchfile
89 lines
1.8 KiB
Batchfile
@echo off
|
|
setlocal enabledelayedexpansion
|
|
|
|
set target=M E T H I N K S @ I T @ I S @ L I K E @ A @ W E A S E L
|
|
set chars=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z @
|
|
|
|
set tempcount=0
|
|
for %%i in (%target%) do (
|
|
set /a tempcount+=1
|
|
set target!tempcount!=%%i
|
|
)
|
|
call:parent
|
|
|
|
echo %target%
|
|
echo --------------------------------------------------------
|
|
|
|
:loop
|
|
call:fitness parent
|
|
set currentfit=%errorlevel%
|
|
if %currentfit%==28 goto end
|
|
echo %parent% - %currentfit% [%attempts%]
|
|
set attempts=0
|
|
|
|
:innerloop
|
|
set /a attempts+=1
|
|
title Attemps - %attempts%
|
|
call:mutate %parent%
|
|
call:fitness tempparent
|
|
set newfit=%errorlevel%
|
|
if %newfit% gtr %currentfit% (
|
|
set tempcount=0
|
|
set "parent="
|
|
for %%i in (%tempparent%) do (
|
|
set /a tempcount+=1
|
|
set parent!tempcount!=%%i
|
|
set parent=!parent! %%i
|
|
)
|
|
goto loop
|
|
)
|
|
goto innerloop
|
|
|
|
:end
|
|
echo %parent% - %currentfit% [%attempts%]
|
|
echo Done.
|
|
exit /b
|
|
|
|
:parent
|
|
set "parent="
|
|
for /l %%i in (1,1,28) do (
|
|
set /a charchosen=!random! %% 27 + 1
|
|
set tempcount=0
|
|
for %%j in (%chars%) do (
|
|
set /a tempcount+=1
|
|
if !charchosen!==!tempcount! (
|
|
set parent%%i=%%j
|
|
set parent=!parent! %%j
|
|
)
|
|
)
|
|
)
|
|
exit /b
|
|
|
|
:fitness
|
|
set fitness=0
|
|
set array=%1
|
|
for /l %%i in (1,1,28) do if !%array%%%i!==!target%%i! set /a fitness+=1
|
|
exit /b %fitness%
|
|
|
|
:mutate
|
|
set tempcount=0
|
|
set returnarray=tempparent
|
|
set "%returnarray%="
|
|
for %%i in (%*) do (
|
|
set /a tempcount+=1
|
|
set %returnarray%!tempcount!=%%i
|
|
set %returnarray%=!%returnarray%! %%i
|
|
)
|
|
set /a tomutate=%random% %% 28 + 1
|
|
set /a mutateto=%random% %% 27 + 1
|
|
set tempcount=0
|
|
for %%i in (%chars%) do (
|
|
set /a tempcount+=1
|
|
if %mutateto%==!tempcount! (
|
|
set %returnarray%!tomutate!=%%i
|
|
)
|
|
)
|
|
set "%returnarray%="
|
|
for /l %%i in (1,1,28) do set %returnarray%=!%returnarray%! !%returnarray%%%i!
|
|
exit /b
|