75 lines
2.0 KiB
Smalltalk
75 lines
2.0 KiB
Smalltalk
"1. simple approach"
|
|
rot13 := [ :string |
|
|
string collect: [ :each | | index |
|
|
index := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
indexOf: each ifAbsent: [ 0 ]. "Smalltalk uses 1-based indexing"
|
|
index isZero
|
|
ifTrue: [ each ]
|
|
ifFalse: [ 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM' at:
|
|
index ] ] ].
|
|
|
|
(rot13 value: 'Test123') printNl "gives 'Grfg123'"
|
|
|
|
"2. extending built-in classes"
|
|
Character extend [
|
|
+ inc [
|
|
(inc isKindOf: Character)
|
|
ifTrue: [
|
|
^ ( Character value: ((self asInteger) + (inc asInteger)) )
|
|
] ifFalse: [
|
|
^ ( Character value: ((self asInteger) + inc) )
|
|
]
|
|
]
|
|
- inc [
|
|
^ ( self + (inc asInteger negated) )
|
|
]
|
|
trFrom: map1 to: map2 [
|
|
(map1 includes: self) ifTrue: [
|
|
^ map2 at: (map1 indexOf: self)
|
|
] ifFalse: [ ^self ]
|
|
]
|
|
].
|
|
|
|
String extend [
|
|
rot: num [ |s|
|
|
s := String new.
|
|
self do: [ :c |
|
|
((c asLowercase) between: $a and: $z)
|
|
ifTrue: [ |c1|
|
|
c1 := ( $a + ((((c asLowercase) - $a + num) asInteger) rem:26)).
|
|
(c isLowercase) ifFalse: [ c1 := c1 asUppercase ].
|
|
s := s, (c1 asString)
|
|
]
|
|
ifFalse: [
|
|
s := s, (c asString)
|
|
]
|
|
].
|
|
^s
|
|
]
|
|
].
|
|
|
|
('abcdefghijklmnopqrstuvwxyz123!' rot: 13) displayNl.
|
|
(('abcdefghijklmnopqrstuvwxyz123!' rot: 13) rot: 13) displayNl.
|
|
|
|
|
|
|
|
"2. using a 'translation'. Not very idiomatic Smalltalk code"
|
|
rotThirteen := [ :s | |m1 m2 r|
|
|
r := String new.
|
|
m1 := OrderedCollection new.
|
|
0 to: 25 do: [ :i | m1 add: ($a + i) ].
|
|
m2 := OrderedCollection new.
|
|
0 to: 25 do: [ :i | m2 add: ($a + ((i+13) rem: 26)) ].
|
|
s do: [ :c |
|
|
(c between: $a and: $z) | (c between: $A and: $Z)
|
|
ifTrue: [ | a |
|
|
a := (c asLowercase) trFrom: m1 to: m2.
|
|
(c isUppercase) ifTrue: [ a := a asUppercase ].
|
|
r := r, (a asString)]
|
|
ifFalse: [ r := r, (c asString) ]
|
|
].
|
|
r
|
|
].
|
|
|
|
(rotThirteen value: 'abcdefghijklmnopqrstuvwxyz123!') displayNl.
|