Сoвременные веяния программирования это конечно круто, но они сопутсвовали появлению целого поколения говнокодеров...
Как-то на днях нужно было мне написать на морзянке пару слов...
Чтобы не писать самому программу зашел в гугл и набрал "морзе онлайн".
На первом сверху сайте перевел что нужно.
На этом бы все и закончилось.
Но мне стало интересно, а как они реализовали решение задачи.
http://live.mephist.ru/show/morze/
Летопись МИФИ - Московский инженерно-физический институт
И вот вытащил саму функцию:
PHP код:
var symbols = new Array('а','б','в','г','д','е','ё', 'ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ь','ъ','ы','э','ю','я','1','2','3','4','5','6','7','8','9','0','.',',','/','?','!',';','-',':','\'','"','_', ' ','@','a','b','w','g','d','e','v','z','i','j','k','l','m','n','o','p','r','s','t','u','f','h','c','q','x','y');
var codes = new Array('12','2111','122','221','211','1','1','1112','2211','11','1222','212','1211','22','21','222','1221','121','111','2','112','1121','1111','2121','2221','2222','2212','2112','2112','2122','11211','1122','1212','12222','11222','11122','11112','11111','21111','22111','22211','22221','22222','111111','121212','21121','112211','221122','21212','211112','222111','122221','121121','112212', '21112','122121','12','2111','122','221','211','1','1112','2211','11','1222','212','1211','22','21','222','1221','121','111','2','112','1121','1111','2121','2212','2112','2122');
var special_words = new Array('sos');
var special_codes_normal = new Array('11102220111');
var special_codes_correct = new Array('111222111');
var lang_symbols;
var lang_codes;
var lang_set = new Array('ru','en');
var symbols_str = symbols.join('');
function CodeArray2String(arr) {
var output = '';
for (var i=0; i<arr.length; i++)
output += String.fromCharCode(arr[i]);
return output;
}
var morze_display = new Array(32,183,8211);
var morze_str = CodeArray2String(morze_display);
var dash_symbols = new Array(95,45,8211,8212);
var dash_str = CodeArray2String(dash_symbols);
var dot_symbols = new Array(46,183,42,8226);
var dot_str = CodeArray2String(dot_symbols);
var current_text = '';
var current_mdisplay = '';
var current_morze = '';
function ConvertN2M(txt) {
if (txt.length>0) {
CheckNormal(document.getElementById('NormalText'));
var MText = '';
var MDisplay = '';
if (txt.lastIndexOf(' ') == txt.length-1)
txt = txt.substr(0,txt.length-1);
for (var i=0; i<txt.length; i++) {
MText += codes[symbols_str.indexOf(txt.charAt(i))]+'0';
}
//Обрабатываем злосчастный SOS
MText = '211120'+MText+'21112';
for (var i=0; i<special_codes_normal.length; i++) {
var sReg = new RegExp('211120'+special_codes_normal[i]+'021112','g');
MText = MText.replace(sReg,'211120'+special_codes_correct[i]+'021112');
}
MText = MText.substr(6,MText.length-11);
current_morze = MText;
for (var i=0; i<MText.length; i++) {
MDisplay += String.fromCharCode(morze_display[parseInt(MText.charAt(i),10)]);
}
document.getElementById('MorzeText').value = MDisplay;
current_mdisplay = MDisplay;
SoundShow();
}
}
Разбирать код не советую, ибо чревато раком мозга.
Краткая суть реализации.
Есть 2 таблицы
var symbols = new Array('а','б','в','г','д',....
алфавит
var codes = new Array('12','2111','122','221','211','1','1','1112' ,'2211','11'
собственно код
А где точки и тире спросите вы?
А вот они спрятаны:
var morze_display = new Array(32,183,8211);
пробел, . , -
Потом кодируем
PHP код:
for (var i=0; i<txt.length; i++) {MText += codes[symbols_str.indexOf(txt.charAt(i))]+'0';}
Вызывая кучу подпрограмм, преобразовывая стринг в инт и обратно.
А что? Чтобы быстрее работало.
А дальше последовательность вида 2211211221212112
преобразовываем в точки и тире
PHP код:
for (var i=0; i<MText.length; i++) {MDisplay += String.fromCharCode(morze_display[parseInt(MText.charAt(i),10)]);}
Ага, парсер. Мало, нужно было еще регулярные выражения прикрутить.
В чем же ошибка автора:
Он не полностью следует современным веяниям.
Нужно:
- Кнопки лайк фесбука.
- Возможность оправлять вконтакт.
- Обязательно заходить через АйХрень.
- Обязательная кнопка - поделится с друзьями.
- Обязательное отображение координат, чтобы сидя в туалете поезда Пенза-Копейск среди ночи постить код морзе в Твиттер.
Пример того как из простого сделать сложное.
Delphi
Есть несколько вариантов более менее человеческой реализации.
Код:
const
morzetabl:array[0..255] of string[10]=('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',
'_···_ ','__··__ ','·_··_· ','','','','','','_·__·_ ','_·__·_ ','','','·_·_·_ ',
'_····_ ','······ ','_··_· ','_____ ','·____ ','··___ ','···__ ','····_ ','····· ',
'_···· ','__··· ','___·· ','____· ','___··· ','_·_·_· ','','','','··__·· ',
'·__·_· ','·_ ','_··· ','_·_· ','_·· ','· ','··_· ','__· ','···· ','·· ','·___ ',
'_·_ ','·_·· ','__ ','_· ','___ ','·__· ','__·_ ','·_· ','··· ','_ ','··_ ',
'···_ ','·__ ','_··_ ','_·__ ','__·· ','','','','','','·____· ','·_ ','_··· ',
'_·_· ','_·· ','· ','··_· ','__· ','···· ','·· ','·___ ','_·_ ','·_·· ','__ ','_· ',
'___ ','·__· ','__·_ ','·_· ','··· ','_ ','··_ ','···_ ','·__ ','_··_ ','_·__ ',
'__·· ','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',
'','','','·_ ','_··· ','·__ ','__· ','_·· ','· ','···_ ','__·· ','·· ','·___ ','_·_ ',
'·_·· ','__ ','_· ','___ ','·__· ','·_· ','··· ','_ ','··_ ','··_· ','···· ','_·_· ',
'___· ','____ ','__·_ ','__·__ ','_·__ ','_··_ ','··_·· ','··__ ','·_·_ ',
'·_ ','_··· ','·__ ','__· ','_·· ','· ','···_ ','__·· ','·· ','·___ ','_·_ ','·_·· ',
'__ ','_· ','___ ','·__· ','·_· ','··· ','_ ','··_ ','··_· ','···· ','_·_· ','___· ',
'____ ','__·_ ','__·__ ','_·__ ','_··_ ','··_·· ','··__ ','·_·_ ');
procedure TForm1.Button1Click(Sender: TObject);
var
i,n:integer;
s,r:string;
begin
s:=edit1.Text;
n:=length(s);
r:='';
for i:=1 to n do
r:=r+morzetabl[ord(s[i])];
label1.Caption:=r;
end;
И все.
__________________
Помогаю платно.
Помогаю иногда бесплатно.
|