// phonecodes / map characters to integers, setup setup:{D@:p:=C::#:'D::digit'W;W@:p;C?:;P::=:'D;H::_hash'D::D@'P[;;0]} digit:{M[1;M[0]?/:_dv[(_ci@[!256;65+!26;+;32])@_ic x;"\""]]} M:("ejnqrwxdsyftamcivbkulopghz";"01112223334455666777888999") / phonecodes codes:{x,/:match[1;":";x _dvl"/-"]} match:{[b;m;n]:[~#n;,m;#r:,/find[m;n]'[D;W;C;P;H];r;b;_f[0;m," ",*n;1_ n];r]} find:{[m;n;d;w;c;p;h]:[c>#n;();(#d)>i:(d;h)?c#n;,/w[p i]{m," ",x,y}/:\:match[1;"";c _ n];()]} / test phone numbers N:("112" "5624-82" "4824" "0721/608-4067" "10/783--5" "1078-913-5" "381482" "04824") / word list W:("an" "blau" "Bo\"" "Boot" "bo\"s" "da" "Fee" "fern" "Fest" "fort" "je" "jemand" "mir" "Mix" "Mixer" "Name" "neu" "o\"d" "Ort" "so" "Tor" "Torf" "Wasser") / run setup[] `0:,/codes'N \ / w1000 data (1000 phone numbers, 75000 words), 2.2 seconds 300mhz pentium 2 \cd phone W:0:"w.txt" N:0:"n.txt" O:0:"o.txt" setup[] \t R:,/codes'N \ / test results 5624-82: mir Tor 5624-82: Mix Tor 4824: fort 4824: Tor 4 4824: Torf 10/783--5: je Bo" da 10/783--5: je bo"s 5 10/783--5: neu o"d 5 381482: so 1 Tor 04824: 0 fort 04824: 0 Tor 4 04824: 0 Torf / slow version #1, uses _sm: M:{@[_n;`$',/x;:;&#:'x]}("e";"jnq";"rwx";"dsy";"ft";"am";"civ";"bku";"lop";"ghz") map:{1!"*",,/$M@`$'x} lc:(_ci@[!256;65+!26;+;32])@_ic nq:_dv[;"\""] D:(map nq lc@)'W codes:{x,/:match[1;":";x _dvl"/-"]} match:{[b;p;n]:[~#n;,p;#r:,/{match[1;p," ",W x;(-1+#D x)_ n]}'initial n;r;b;match[0;p," ",*n;1_ n];r]} initial:{[n]k@&n _sm/:D k:&D[;0]=*n} // slow version #2, uses _ss M:{@[_n;`$',/x;:;&#:'x]}("e";"jnq";"rwx";"dsy";"ft";"am";"civ";"bku";"lop";"ghz") map:{,/$M@`$'x} lc:(_ci@[!256;65+!26;+;32])@_ic nq:_dv[;"\""] C:#:'D:(map nq lc@)'W codes:{ o@:i:&0<#:'o:n _ss/:D k:&~C>#n:x _dvl"/-" i@:&#:'o;i@:j:#n;();(#d)>i:(d;h)?c#n;match[1;p," ",w i;c _ n];()]} // slow version #4, uses ~\: M:{@[_n;`$',/x;:;&#:'x]}("e";"jnq";"rwx";"dsy";"ft";"am";"civ";"bku";"lop";"ghz") setup:{D@:p:=C::#:'D::{,/$M@`$'_dv[(_ci@[!256;65+!26;+;32])@_ic x;"\""]}'W;W@:p;C?:} codes:{x,/:match[1;":";x _dvl"/-"]} match:{[b;p;n]:[~#n;,p;#r:,/find[p;n]'[C;D;W];r;b;_f[0;p," ",*n;1_ n];r]} find:{[p;n;c;d;w]:[c>#n;();#i:&d~\:c#n;,/{match[1;p," ",x;c _ n]}'w i;()]}