domingo, 29 de junho de 2008

Embaralhando palavras

Squeak Outro dia o Walter estava falando sobre um comportamento irregular da implementação de expressões regulares em Python, especificamente o token \b.

Havia uma brincadeira em Ruby com regex que seleciona cada palavra em uma frase e embaralha a ordem das letras, mantendo a primeira e a última em seus lugares.

Para separar as palavras e os elementos de espaçamento entre elas, usava-se uma regex com \b. Resolvi fazer a brincadeira em Smalltalk, mas descobri que o token também não funciona, portanto precisei fazer uma expressão que representasse cada bloco: ((\w+)|(\W+)).

Para reproduzir essa brincadeira, usando Squeak, primeiro usando o System Browser crie um método shaked na categoria copying da classe String:
shaked
| aux fst i lst temp |

(self size <= 3) ifTrue: [ ↑ self copy ].

fst := (self byteAt: 1) asCharacter asString.
lst := (self byteAt: self size) asCharacter asString.
aux := self copyFrom: 2 to: self size - 1.
temp := Array new: aux size factorial.

i := 0.
aux permutationsDo: [ :s |
i := i + 1.
temp at: i put: (fst, s, lst).
].

↑ temp at: temp size atRandom.


Agora, em um workspace, execute o seguinte código:
| phr |

" Esta é a frase a ser embaralhada "
phr := 'Kodumaro: as sombras da programação'.

Transcript open.
phr regex: '((\w+)|(\W+))' matchesDo: [ :s |
Transcript show: s shaked.
].

Transcript cr.


Selecione tudo (M-a) e execute (M-d).

[]'s
Cacilhas, La Batalema
blog comments powered by Disqus