Dann hast du zwischendrin irgendwelche Zeichen kaputt gemacht.
Hier nochmal als eine Zeile. Damit müsste es gehen.
iiiiiiiOIIIiiiOddddOIiiiODDDDDDDDddOIIIIIIIiiiOIOiODDDDDDDDddddOIIIIIIiiiiiiiiiOiiiiOiiiiiODDDDDDDddddddddOIIIIIIIiiiiiOiOdddddddOiiiiOiiiiiOdddddddddOIiiiODDDDDDDDddOIIIIIiiOIiiiiiiiOIiiiiiiiiiOddddODDDDDDDDddddOIIIIIIIIIOdddddOdddODDDDDDDDddOIIIiiiiiiiOIIIiiiiiiOiiiiiOiiiiiOiODdOiiiiOOiiiiiiiiOdddddddOdddddddODDDDDdddddddODddddOIIIIiiiiiOIIOIiODDDDDDDddddddOIIIIIIIIiiiODddddddOiiiiiOdddddddOIIODddddddOiiiiiiiiiODDDDDDDddddddddOIIIIIIIiiiiiiiiiODdddODDDDDDddddddOIIIIIIiiiiiiiiiOIiiiiODDDDDDDDdddOIIIIIIIiiiiiOiODdOIiiiiiOOiiiiODDddOO
Dauert bei mir nur 5,3 Sekunden.
(mit dem anderen Interpreter 2,7 ms)
Hier ist mal der Encoder. Er beinhaltet aber zurzeit noch keine Optimierungen.
Er geht immer linear auf sein Ziel zu mit den jeweils größt möglichen Schritten.
r und R werden noch nicht verwendet.
"Encoder"
Func _Asc2Ido($s)
[/autoit] [autoit][/autoit] [autoit]Local $Kl = 97
Local $Gr = 65
Local $iLen = StringLen($s)
Local $iMid, $sOut = '', $iNr = 65, $iDif
For $i = 1 To $iLen Step 1
$iMid = Asc(StringMid($s, $i, 1)) ; Asc Code des Zeichens.
$iDif = $iMid - $iNr
;~ ConsoleWrite($iMid)
[/autoit] [autoit][/autoit] [autoit]If Not $iDif Then
$sOut &= 'O'
ContinueLoop
EndIf
If $iDif > 0 Then ; Zeichen liegt oberhalb
[/autoit] [autoit][/autoit] [autoit]While Not (Int($iDif/10) = 0)
$iNr += 10
$sOut &= 'I'
$iDif = $iMid - $iNr
WEnd
While Not ($iDif = 0)
$iNr += 1
$sOut &= 'i'
$iDif = $iMid - $iNr
WEnd
Else ; Zeichen liegt unterhalb
[/autoit] [autoit][/autoit] [autoit]While Not (Int($iDif/10) = 0)
$iNr -= 10
$sOut &= 'D'
$iDif = $iMid - $iNr
WEnd
While Not ($iDif = 0)
$iNr -= 1
$sOut &= 'd'
$iDif = $iMid - $iNr
WEnd
EndIf
[/autoit] [autoit][/autoit] [autoit]$sOut &= 'O'
[/autoit] [autoit][/autoit] [autoit]Next
[/autoit] [autoit][/autoit] [autoit]Return $sOut
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit]Das Umwandeln dauert ca. 1ms und ist damit (noch) wesentlich schneller als das Interpretieren.
Edit:
Hab den Interpreter nochmal verbessert. Er packt das Interpretieren jetzt auch in 1ms.
Das Problem lag darin, dass man in der langen Berechnung keinen Abbruch hat, sobald ein Ereignis zutrifft.
Daher ist Switch um einiges schneller. Ein Zeichen kann nämlich nur eine Bedingung erfüllen.
Aber wozu einfach, wenn es auch kompliziert geht^^
"Interpreter"
Func _Ido2Asc($s)
Local $n = 65, $o = ''
For $i = 1 To StringLen($s) Step 1
Switch Asc(StringMid($s, $i, 1))
Case 105
$n += 1
Case 73
$n += 10
Case 100
$n -= 1
case 68
$n -= 10
Case 82
$n = 65
Case 114
$n = 114
Case 111
$o &= Chr($n)
Case 79
$o &= Chr($n)
EndSwitch
Next
Return $o
EndFunc ;==>_Ido2Asc