True. The underlying problem is that the algorithm itself is language specific.
I do not know how to implement a consistent version of this mechanism for German, for example. The problem with German is that ß does not have an "upper case" variant. So rotation of lower case letters in german would have to be different from rotation for upper case letter. Perhaps that's acceptable? If it makes sense to apply the same rotation to cycles of differing lengths, here's a version which works for the arbitrary cases involving unicode characters which J can handle. NB. n: boxed character sequences to be rotated (must not overlap) NB. m: how much to rotate them rottN=: 2 :0 D=. m (|. ; 3 u: ])&.> boxopen n {&(; (0{::[)`(1{::[)`]}&.>/ D,<u:i.2^16)@(3&u:) ) 5 rottN '0123456789' '123' 678 ;/a.{~65 97+/i.26 +--------------------------+--------------------------+ |ABCDEFGHIJKLMNOPQRSTUVWXYZ|abcdefghijklmnopqrstuvwxyz| +--------------------------+--------------------------+ 13 rottN (;/a.{~65 97+/i.26) 'testing' grfgvat 13 rottN (;/a.{~65 97+/i.26)^:2 'testing' testing Or, using character selectors instead of character sequences (and living with unicode character ordering): 13 rottN ((#L:0~ lc;uc) u:i.2^16) 'prófaþetta með íslenzkum stöfunum æÆöðÐþÞ' But it's up to you to define lc and uc FYI, -- Raul 2011/12/23 Björn Helgason <gos...@gmail.com>: > This is only english > > _1 rottn 1 rottn 'testing' > testing > > Does not work with my alpha > > _1 rottn 1 rottn 'prófaþetta með íslenzkum stöfunum æÆöðÐþÞ' > prófaþetta með Ãslenzkum stöfunum æÆöðà þÞ > 3 u: 'prófaþetta með íslenzkum stöfunum æÆöðÐþÞ' > 112 114 195 179 102 97 195 190 101 116 116 97 32 109 101 195 176 32 > 195 173 115 108 101 110 122 107 117 109 32 115 116 195 182 102 117 110 > 117 109 32 195 166 195 134 195 182 195 176 195 144 195 190 195 158 > > 3 u: 7 u: 'prófaþetta með íslenzkum stöfunum æÆöðÐþÞ' > 112 114 243 102 97 254 101 116 116 97 32 109 101 240 32 237 115 108 > 101 110 122 107 117 109 32 115 116 246 102 117 110 117 109 32 230 198 > 246 240 208 254 222 > # 3 u: 'prófaþetta með íslenzkum stöfunum æÆöðÐþÞ' > 53 > # 3 u: 7 u: 'prófaþetta með íslenzkum stöfunum æÆöðÐþÞ' > 41 > 8 u: 4 u: 3 u: 7 u: 'prófaþetta með íslenzkum stöfunum æÆöðÐþÞ' > prófaþetta með íslenzkum stöfunum æÆöðÐþÞ > > # 3 u: 7 u: 'aábcðdeéfghiíjklmnoópqrstuúvwxyýzþæö' > 36 > # 3 u: 7 u: 'AÁBCÐDEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ' > 36 > > > > 2011/12/23 Raul Miller <rauldmil...@gmail.com> > >> Here's another variation: >> >> rotn=: 1 :'{&((65 97 +/~ i.26) m&|.@[`[`]} i.256)&.(a.&i.)' >> >> 1 rotn 'testing' >> uftujoh >> 13 rotn 'testing' >> grfgvat >> 13 rotn 13 rotn 'testing' >> testing >> _1 rotn 1 rotn 'testing' >> testing >> >> In this expression, each arbitrary constant is used only once: >> >> 26: letters in the alphabet >> 65: 'A' >> 97: 'a' >> 256: the number of character codes >> >> I could replace 256 with #a. but I do not think that adds any clarity. >> >> That said... >> rottn=: 1 :'{&((65 97 +/~ i.26) m&|.@u:@[`[`]} a.)&(3&u:)' >> >> -- >> Raul >> On Fri, Dec 23, 2011 at 11:27 AM, Raul Miller <rauldmil...@gmail.com> >> wrote: >> > Wait, bad idea... that rot13 only works because 13 is a factor of 26. >> > >> > Instead (and this is a fast bug fix, I have not thought much about >> > more elegant forms, though several paths for rephrasing come to mind): >> > >> > rotN=: 1 :'{&((65 97 +/ m |. i.26) ((65 97 +/i.26)}) i.256)&.(a.&i.)' >> > >> > -- >> > Raul >> > >> > On Fri, Dec 23, 2011 at 11:21 AM, Raul Miller <rauldmil...@gmail.com> >> wrote: >> >> Here's what I use for rot13: >> >> >> >> rot13=: {&((65 97+/~i.2 13) |.@[} i.256)&.(a.&i.) >> >> >> >> If I wanted to generalize that, I would probably go with: >> >> >> >> rotN=: 1 :'rot13=: {&((65 97+/~i.2,m) |.@[} i.256)&.(a.&i.)' >> >> >> >> 13 rotN 'testing' >> >> grfgvat >> >> 13 rotN rot13 'testing' >> >> testing >> >> >> >> -- >> >> Raul >> >> >> >> On Fri, Dec 23, 2011 at 11:00 AM, Lorenzo Costanzia di Costigliole >> >> <lorenzo.costan...@gmail.com> wrote: >> >>> NB. What is the most elegant way to rotate uppercase >> >>> NB. and lowercase letters by n? ("rotation cipher") >> >>> >> >>> c2n=: a.&i. >> >>> >> >>> lc=: >&96 *. <&123 >> >>> uc=: >&64 *. <& 91 >> >>> >> >>> s=: 'Btggn Rwgxhibph 2011 id iwt Y-Egdvgpbbxcv bpxaxcv axhi!' >> >>> >> >>> >> >>> >> >>> NB. I came up with those, but I think there’s still room for >> improvement >> >>> NB. (Isn't there something in the J-Phrases?) >> >>> >> >>> NB. uppercase -> 2, lowercase -> 1, else -> 0 >> >>> cl=: +:@uc + lc >> >>> cl`(] , ([: 26&| +&n)&.(-&97) ,: ([: 26&| +&n)&.(-&65))}&.c2n s >> >>> >> >>> ((] + ] ]`([: 26&| n + ])@.((0~:[)"0) [ - ]) (97&*@lc + 65&*@uc))&.c2n >> s >> >>> >> >>> NB. Enumerate all possibilities >> >>> |: ((] + ] (26 # ])`([: 26&| (i.26) + ])@.((0 ~: [)"0) [ - ]) (97&*@lc >> >>> + 65&*@uc))&.c2n s >> >>> >> >>> NB. Thanks! >> >>> ---------------------------------------------------------------------- >> >>> For information about J forums see http://www.jsoftware.com/forums.htm >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm >> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm