Что нового

Подмена букв в тексте

Пост номер 7 был отмечен как лучший ответ.

Delima6

Новичок
Сообщения
5
Репутация
0
Всем привет!
Хочу сделать такую штуку.

Выводим :
MsgBox(48, 'Всем привет. Я Хочу пиво')

у меня уже есть некоторая переменная $lLetter которая принимает значение рандомно 50%/50% "e" либо "E" (маленькая либо заглавная)

Как сделать так - что бы какой бы я текст не писал- моя буква "e" всегда заменялась автоматически на переменную $lLetter

и я получал своеобразный автоматический стиль текста :
"ВсЕм привет. Я хочу пиво. CEгодня ВечЕром. ЕееЕЕЕЕеее"

Как это сделать:

e = $lLetter
или как =)?
 

joiner

Модератор
Локальный модератор
Сообщения
3 035
Репутация
503
Код:
HotKeySet('{ESC}', '_stop')
Local $Form1 = GUICreate("Form1", 450, 176, 552, 236)
Local $Label1 = GUICtrlCreateLabel("", 32, 40, 400, 25)
GUISetState()
Local $aChar[2] = ['е', 'Е']
Local $LT = 'Вс\м прив\т. Я хочу пива. С\годня в\ч\ром. \\\\\\\'
Local $aRp = StringSplit($LT, '\', 3)
Local $sLB = '', $nR
While 1
    Sleep(1000)
    $sLB = ''
    For $i = 0 To UBound($aRp) - 1
        $nR = Random(0, 1, 1)
        $sLB &= $aRp[$i] & $aChar[$nR]
    Next
    GUICtrlSetData($Label1, $sLB)
WEnd

Func _stop()
    Exit
EndFunc   ;==>_stop
 
Автор
D

Delima6

Новичок
Сообщения
5
Репутация
0
Код:
HotKeySet('{ESC}', '_stop')
Local $Form1 = GUICreate("Form1", 450, 176, 552, 236)
Local $Label1 = GUICtrlCreateLabel("", 32, 40, 400, 25)
GUISetState()
Local $aChar[2] = ['е', 'Е']
Local $LT = 'Вс\м прив\т. Я хочу пива. С\годня в\ч\ром. \\\\\\\'
Local $aRp = StringSplit($LT, '\', 3)
Local $sLB = '', $nR
While 1
    Sleep(1000)
    $sLB = ''
    For $i = 0 To UBound($aRp) - 1
        $nR = Random(0, 1, 1)
        $sLB &= $aRp[$i] & $aChar[$nR]
    Next
    GUICtrlSetData($Label1, $sLB)
WEnd

Func _stop()
    Exit
EndFunc   ;==>_stop
Cпасибо большое вам за помощь.
Но тут получается ... вы немножко подругому решили задачу. Я бы хотел внутри кода писать обычным текстом разные текстовые месседжи... Не применяя "/"
- Писать как обычно через "e".
А Потом- при запуске скрипта- что бы в MsgBox все мои "e" подменились на рандомное значение.
То есть - где-то в начале когда задать что все "e" подменяем на переменную которая включает в себя один вариант из двух (50%/50%)

А тут получается мне надо самому менять все "e" на "/"
 

Tempo

Скриптер
Сообщения
502
Репутация
148
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
GUICreate("Пример", 400, 200)
GUICtrlCreateLabel("Текст:", 5, 5, 390, 20, $SS_CENTERIMAGE)
Global $g_idInpText = GUICtrlCreateInput("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее", 5, 25, 390, 20)
GUICtrlCreateLabel("Буквы для замены:", 5, 45, 390, 20, $SS_CENTERIMAGE)
Global $g_idInpRepl = GUICtrlCreateInput("е", 5, 65, 390, 20)
Global $g_idLblRet = GUICtrlCreateLabel("", 0, 90, 400, 110, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUISetState()
AdlibRegister(_Demonstration)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _Demonstration()
    GUICtrlSetData($g_idLblRet, _SetMyTextStyle(GUICtrlRead($g_idInpText), GUICtrlRead($g_idInpRepl)))
EndFunc   ;==>_Demonstration

Func _SetMyTextStyle($sText, $sChars)
    Local $aChars = StringSplit($sChars, ""), $aChar[2], $aSplit
    For $i = 1 To $aChars[0]
        $aChar[0] = StringLower($aChars[$i])
        $aChar[1] = StringUpper($aChars[$i])
        $aSplit = StringSplit($sText, $aChar[0] & $aChar[1])
        For $j = 2 To $aSplit[0]
            $aSplit[1] &= $aChar[Random(0, 1, 1)] & $aSplit[$j]
        Next
        $sText = $aSplit[1]
    Next
    Return $sText
EndFunc   ;==>_SetMyTextStyle
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3 035
Репутация
503
Код:
HotKeySet('{ESC}', '_stop')
Local $Form1 = GUICreate('Form1', 470, 140, 192, 124)
Local $Input1 = GUICtrlCreateInput('Текст перевода степени', 32, 32, 369, 21)
Local $Label1 = GUICtrlCreateLabel('', 24, 80, 372, 17)
GUISetState()
Local $aChar[2] = ['е', 'Е']
Local $sLB = '', $nR, $LT = '', $aRp
While 1
    Sleep(1000)
    $LT = GUICtrlRead($Input1)
    $aRp = StringSplit($LT, 'еЕ')
    If @error Then ContinueLoop
    $sLB = ''
    For $i = 1 To UBound($aRp) - 1
        $nR = Random(0, 1, 1)
        $sLB &= $aRp[$i] & $aChar[$nR]
    Next
    GUICtrlSetData($Label1, StringTrimRight($sLB, 1))
WEnd

Func _stop()
    Exit
EndFunc   ;==>_stop
 
Последнее редактирование:
Автор
D

Delima6

Новичок
Сообщения
5
Репутация
0
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
GUICreate("Пример", 400, 200)
GUICtrlCreateLabel("Текст:", 5, 5, 390, 20, $SS_CENTERIMAGE)
Global $g_idInpText = GUICtrlCreateInput("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее", 5, 25, 390, 20)
GUICtrlCreateLabel("Буквы для замены:", 5, 45, 390, 20, $SS_CENTERIMAGE)
Global $g_idInpRepl = GUICtrlCreateInput("е", 5, 65, 390, 20)
Global $g_idLblRet = GUICtrlCreateLabel("", 0, 90, 400, 110, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUISetState()
AdlibRegister(_Demonstration)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _Demonstration()
    GUICtrlSetData($g_idLblRet, _SetMyTextStyle(GUICtrlRead($g_idInpText), GUICtrlRead($g_idInpRepl)))
EndFunc   ;==>_Demonstration

Func _SetMyTextStyle($sText, $sChars)
    Local $aChars = StringSplit($sChars, ""), $aChar[2], $aSplit
    For $i = 1 To $aChars[0]
        $aChar[0] = StringLower($aChars[$i])
        $aChar[1] = StringUpper($aChars[$i])
        $aSplit = StringSplit($sText, $aChar[0] & $aChar[1])
        For $j = 2 To $aSplit[0]
            $aSplit[1] &= $aChar[Random(0, 1, 1)] & $aSplit[$j]
        Next
        $sText = $aSplit[1]
    Next
    Return $sText
EndFunc   ;==>_SetMyTextStyle
Cпасибо!
А как быть в том случае, если я хочу вывести куда-нибудь свое сообщение через
send("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее")

Например - для того что бы записать это сообщение в другой текстовый файл или запостить в форму?
Сообщение автоматически объединено:

Код:
HotKeySet('{ESC}', '_stop')
Local $Form1 = GUICreate('Form1', 470, 140, 192, 124)
Local $Input1 = GUICtrlCreateInput('Текст перевода степени', 32, 32, 369, 21)
Local $Label1 = GUICtrlCreateLabel('', 24, 80, 372, 17)
GUISetState()
Local $aChar[2] = ['е', 'Е']
Local $sLB = '', $nR, $LT = '', $aRp
While 1
    Sleep(1000)
    $LT = GUICtrlRead($Input1)
    $aRp = StringSplit($LT, 'еЕ')
    If @error Then ContinueLoop
    $sLB = ''
    For $i = 1 To UBound($aRp) - 1
        $nR = Random(0, 1, 1)
        $sLB &= $aRp[$i] & $aChar[$nR]
    Next
    GUICtrlSetData($Label1, StringTrimRight($sLB, 1))
WEnd

Func _stop()
    Exit
EndFunc   ;==>_stop
Cпасибо!
А если не нужно создавать Gui ?
- если я хочу вывести куда-нибудь свое сообщение через
send("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее")

Например - для того что бы записать это сообщение в другой текстовый файл или запостить в форму?
 

Tempo

Скриптер
Сообщения
502
Репутация
148
А как быть в том случае, если я хочу вывести куда-нибудь свое сообщение через
send("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее")
Функции

Код:
;~ AutoIt Version: 3.3.14.5
Sleep(2000)
Send(_SetMyTextStyle("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее", "е"))

Func _SetMyTextStyle($sText, $sChars)
    Local $aChars = StringSplit($sChars, ""), $aChar[2], $aSplit
    For $i = 1 To $aChars[0]
        $aChar[0] = StringLower($aChars[$i])
        $aChar[1] = StringUpper($aChars[$i])
        $aSplit = StringSplit($sText, $aChar[0] & $aChar[1])
        For $j = 2 To $aSplit[0]
            $aSplit[1] &= $aChar[Random(0, 1, 1)] & $aSplit[$j]
        Next
        $sText = $aSplit[1]
    Next
    Return $sText
EndFunc   ;==>_SetMyTextStyle
 
Последнее редактирование:
Автор
D

Delima6

Новичок
Сообщения
5
Репутация
0
Функции

Код:
;~ AutoIt Version: 3.3.14.5
Sleep(2000)
Send(_SetMyTextStyle("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее", "е"))

Func _SetMyTextStyle($sText, $sChars)
    Local $aChars = StringSplit($sChars, ""), $aChar[2], $aSplit
    For $i = 1 To $aChars[0]
        $aChar[0] = StringLower($aChars[$i])
        $aChar[1] = StringUpper($aChars[$i])
        $aSplit = StringSplit($sText, $aChar[0] & $aChar[1])
        For $j = 2 To $aSplit[0]
            $aSplit[1] &= $aChar[Random(0, 1, 1)] & $aSplit[$j]
        Next
        $sText = $aSplit[1]
    Next
    Return $sText
EndFunc   ;==>_SetMyTextStyle
Спасибо!
Сообщение автоматически объединено:

Функции

Код:
;~ AutoIt Version: 3.3.14.5
Sleep(2000)
Send(_SetMyTextStyle("Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее", "е"))

Func _SetMyTextStyle($sText, $sChars)
    Local $aChars = StringSplit($sChars, ""), $aChar[2], $aSplit
    For $i = 1 To $aChars[0]
        $aChar[0] = StringLower($aChars[$i])
        $aChar[1] = StringUpper($aChars[$i])
        $aSplit = StringSplit($sText, $aChar[0] & $aChar[1])
        For $j = 2 To $aSplit[0]
            $aSplit[1] &= $aChar[Random(0, 1, 1)] & $aSplit[$j]
        Next
        $sText = $aSplit[1]
    Next
    Return $sText
EndFunc   ;==>_SetMyTextStyle
Добрый день. Прошу прощения за мою надоедливость.

Я просто переделываю ваш скрипт немного под другую задачу. Пытаюсь все буквы "i" заменить на "1" а все буквы "а" заменить на "@"
Вобщем хочу не регистр букв менять, а подменять по несколько букв сразу в предложении... :

Вот код который я начал делать, но притормозил из-за нехватки знаний (Точнее их полного отсутствия в программировании =)))))))

Одну букву у меня получилось подменить...а с несколькими буквами не знаю как....
Код:
sleep (5000)
Send(_SetMyTextStyle("iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaaaaaaaaaaaaaaaaaaaaaa", "i","1","a","@"))
Func _SetMyTextStyle($sText, $iSimp, $1Simp, $aSimp, $wSimp)
    ;1--------------------------------------------------------
    Local $NewiSimp = StringSplit($iSimp, ""), $NewiSimpBukva[2], $cSplit
 Local $New1Simp = StringSplit($1Simp, ""), $New1SimpBukva[2], $cSplit
    ;2--------------------------------------------------------
    Local $NewaSimp = StringSplit($aSimp, ""), $NewaSimpBukva[2], $aSplit
 Local $NewwSimp = StringSplit($wSimp, ""), $NewwSimpBukva[2], $aSplit
  ;3#########################################################
For $i = 1 To $NewiSimp[0]
        $NewiSimpBukva[0] = $NewiSimp[$i]
        $NewiSimpBukva[1] = $New1Simp[$i]

$cSplit = StringSplit($sText, $NewiSimpBukva[0] & $NewiSimpBukva[1])
        For $j = 2 To $cSplit[0]
            $cSplit[1] &= $NewiSimpBukva[Random(0, 1, 1)] & $cSplit[$j]
        Next

$sText = $cSplit[1]

Next

Return $sText

EndFunc   ;==>_SetMyTextStyle
 
Последнее редактирование:

Tempo

Скриптер
Сообщения
502
Репутация
148
Код:
;~ AutoIt Version: 3.3.14.5
Sleep(5000)
Send(_SetMyTextStyle(";iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiаааааааааааааааааааааааааааааааа. Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее", "i1|а@|еЕ"))

Func _SetMyTextStyle($sText, $sChars)
    Local $aChars = StringSplit($sChars, "|"), $aChar, $aSplit
    For $i = 1 To $aChars[0]
        $aChar = StringSplit($aChars[$i], "")
        $aSplit = StringSplit($sText, $aChars[$i])
        For $j = 2 To $aSplit[0]
            $aSplit[1] &= $aChar[Random(1, $aChar[0], 1)] & $aSplit[$j]
        Next
        $sText = $aSplit[1]
    Next
    Return $sText
EndFunc   ;==>_SetMyTextStyle


Замена должна работать в обе стороны? Или 1 и @ должны оставаться неизменными?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 238
Репутация
1 123
Вот такой вариант. Скрипт работает в фоне и "на лету" заменяет символы независимо от того, печатаете вы их вручную или оправляете через Send/ControlSend.
Скрипт запускается на паузе, Ctrl+F1 переключает паузу. Символы можно добавлять в Switch по аналогии с текущими. Коды смотреть в справке к функции _IsPressed().
Для работы с окнами, имеющими права администратора, скрипту также нужны права администратора
Код:
#RequireAdmin

#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet("^{F1}", "Pause")

OnAutoItExitRegister("Quit")

$Pause = True

$hStub_KeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
$hMod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hMod)

While Sleep(111)
WEnd

Func KeyProc($nCode, $wParam, $lParam)
  Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
  If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
  If Not $Pause And $wParam = $WM_KEYDOWN And _WinAPI_GetKeyboardLayout(WinGetHandle("")) = 0x04090409 Then
    Switch DllStructGetData($tKEYHOOKS, "vkCode")
      Case 0x49 ; i
        Return -1 * Send("1")
      Case 0x41 ; a
        Return -1 * Send("@")
    EndSwitch
  EndIf
  Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func Quit()
  _WinAPI_UnhookWindowsHookEx($hHook)
  DllCallbackFree($hStub_KeyProc)
EndFunc

Func Pause()
  $Pause = Not $Pause
EndFunc
 
Последнее редактирование:
Автор
D

Delima6

Новичок
Сообщения
5
Репутация
0
Код:
;~ AutoIt Version: 3.3.14.5
Sleep(5000)
Send(_SetMyTextStyle(";iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiаааааааааааааааааааааааааааааааа. Всем привет. Я хочу пиво. Сегодня Вечером. ееееееееее", "i1|а@|еЕ"))

Func _SetMyTextStyle($sText, $sChars)
    Local $aChars = StringSplit($sChars, "|"), $aChar, $aSplit
    For $i = 1 To $aChars[0]
        $aChar = StringSplit($aChars[$i], "")
        $aSplit = StringSplit($sText, $aChars[$i])
        For $j = 2 To $aSplit[0]
            $aSplit[1] &= $aChar[Random(1, $aChar[0], 1)] & $aSplit[$j]
        Next
        $sText = $aSplit[1]
    Next
    Return $sText
EndFunc   ;==>_SetMyTextStyle


Замена должна работать в обе стороны? Или 1 и @ должны оставаться неизменными?
Спасибо. Рабочий.
Нет, задача разовой подмены.
Сообщение автоматически объединено:

Вот такой вариант. Скрипт работает в фоне и "на лету" заменяет символы независимо от того, печатаете вы их вручную или оправляете через Send/ControlSend.
Скрипт запускается на паузе, Ctrl+F1 переключает паузу. Символы можно добавлять в Switch по аналогии с текущими. Коды смотреть в справке к функции _IsPressed().
Для работы с окнами, имеющими права администратора, скрипту также нужны права администратора
Код:
#RequireAdmin

#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet("^{F1}", "Pause")

OnAutoItExitRegister("Quit")

$Pause = True

$hStub_KeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
$hMod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hMod)

While Sleep(111)
WEnd

Func KeyProc($nCode, $wParam, $lParam)
  Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
  If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
  If Not $Pause And $wParam = $WM_KEYDOWN And _WinAPI_GetKeyboardLayout(WinGetHandle("")) = 0x04090409 Then
    Switch DllStructGetData($tKEYHOOKS, "vkCode")
      Case 0x49 ; i
        Return -1 * Send("1")
      Case 0x41 ; a
        Return -1 * Send("@")
    EndSwitch
  EndIf
  Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func Quit()
  _WinAPI_UnhookWindowsHookEx($hHook)
  DllCallbackFree($hStub_KeyProc)
EndFunc

Func Pause()
  $Pause = Not $Pause
EndFunc
Cпасибо.
Правда он делает тотальную подмену - а не выборочно. Но, - все равно очень крутой скрипт.
 
Верх