Показать сообщение отдельно
Старый 21.02.2007, 18:29   #10
Chrono Syndrome
 
Сообщений: n/a
Re: Простенький программерский конкурс...

Все, ребята, встречайте победителя ...
#MemorySize = 2 - 1
Global Dim Memory.B(#MemorySize)
Procedure Interpret(Buffer.S)
Define I, Ptr, Mode, Level, *EndAddress = @Buffer + Len(Buffer) - 1
Enumeration
#Normal : #Skip : #ReverseSkip
EndEnumeration
For I = @Buffer To *EndAddress
Select PeekB(I)
Case '+' : If Mode = #Normal : Memory(Ptr) + 1 : EndIf
Case '-' : If Mode = #Normal : Memory(Ptr) - 1 : EndIf
Case '>' : If Mode = #Normal : Ptr + 1
If Ptr > #MemorySize : Ptr = 0 : EndIf
EndIf
Case '<' : If Mode = #Normal : Ptr - 1
If Ptr < 0 : Ptr = #MemorySize : EndIf
EndIf
Case '[' : Select Mode
Case #Normal : If Memory(Ptr) = 0 : Mode = #Skip : EndIf
Case #Skip : Level + 1
Case #ReverseSkip 
If Level = 0 : Mode = #Normal : Else : Level - 1 : EndIf
EndSelect
Case ']' : Select Mode
Case #Normal : If Memory(Ptr) <> 0 : Mode = #ReverseSkip : EndIf
Case #Skip 
If Level = 0 : Mode = #Normal : Else : Level - 1 : EndIf
Case #ReverseSkip : Level + 1
EndSelect
EndSelect
If Mode = #ReverseSkip 
If I = *Buffer : Break : Else : I - 2 : EndIf
EndIf
Next I
EndProcedure
; -=-=-=-=-=-=-=-=-=-=-=-=-
Procedure Toggle(A)
Memory(0) = A
Interpret(">[-]<[[-]>]+")
ProcedureReturn Memory(0)
EndProcedure
P.S. Пока писала эту хрень, в голове родился еще один вариантик (поскромнее, конечно =)) ...
: Toggle
>R 0 1 R>
IF DROP ELSE NIP THEN
;
 
Ответить с цитированием