Показать сообщение отдельно
  #9  
Старый 02.08.2012, 21:51
Аватар для @Rafa3L
@Rafa3L @Rafa3L вне форума
Начинающий
 
Регистрация: 09.11.2011
Адрес: Москва
Сообщения: 144
Версия Delphi: XE2
Репутация: 11216
По умолчанию

С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=0i<arr.lengthi++)
        
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=0i<txt.lengthi++) {
        
MText += codes[symbols_str.indexOf(txt.charAt(i))]+'0';
    }
    
//Обрабатываем злосчастный SOS
    
MText '211120'+MText+'21112';
    for (var 
i=0i<special_codes_normal.lengthi++) {
        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=0i<MText.lengthi++) {
        
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=0i<txt.lengthi++) {MText += codes[symbols_str.indexOf(txt.charAt(i))]+'0';} 
Вызывая кучу подпрограмм, преобразовывая стринг в инт и обратно.
А что? Чтобы быстрее работало.

А дальше последовательность вида 2211211221212112
преобразовываем в точки и тире
PHP код:
for (var i=0i<MText.lengthi++) {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;

И все.
__________________
Помогаю платно.
Помогаю иногда бесплатно.
Ответить с цитированием