среда, 28 сентября 2011 г.

Brain exercise или Тренеровка для мозга

Один мой знакомый
прислал как то мне такой на первый взгляд бредовый текст:

94НН03 С006Щ3НN3 П0К4ЗЫ8437,
К4КN3 У9N8N73ЛЬНЫ3 83ЩN М0Ж37 93Л47Ь Н4Ш Р4ЗУМ! 8П3Ч47ЛЯЮЩN3 83ЩN! СН4Ч4Л4 Э70 6ЫЛ0 7РУ9Н0, Н0 С3ЙЧ4С Н4 Э70Й С7Р0К3 84Ш Р4ЗУМ ЧN7437
Э70 4870М47NЧ3СКN, Н3 З49УМЫ84ЯСЬ 06 Э70М. Г0Р9NСЬ. ЛNШЬ
0ПР393Л3ННЫ3 ЛЮ9N М0ГУ7 ПР0ЧN747Ь Э70.

Прочитав (точнее пробежав глазами) до конца эти крякозяблики, недолго
мучаясь, я облегчил себе задачу чтения и перевода в этот «цифрусский»
текст  кодом на C++: 
#include "stdafx.h"//для VC++

#include <iostream>
#include <fstream>

#include <map>

#include <algorithm>
#include <string>

using namespace std;

int main ( int argc, char *argv[] )

{

/*SignText for Russian words

(C) O. Halzov
2011-09-27

Конвертация между русским текстом и «знакорусским» :)

Русский текст=РУССКNЙ 73КC7

Для тренировки мозга и шутки ради.

Пример:

Читаем текст из файла и конвертируем его в
числотекст на экран:

SignText.exe E erussian.txt

Читаем числотекст из файла и конвертируем
его в русский текст на экран:

SignText.exe D drussian.txt*/

setlocale(0,"");//Дабы VC++ понял русский, а мы поняли его.

if (argc<=2){

cout<<"Please input 2 parameters: [E|D] - encode|decode
text and ['filename']!"
<<endl;

cout<<"Получишь не АБВГД, а 468Г9 :)"<<endl;

return 0;

}


std::map <char, char>
dec_list;//decode list

std::map <char, char>
enc_list;//encode list

string
strOut;

string strIn;

//Списки замены,наверняка можно обойтись одним, но пока некогда копать:

dec_list['4'] = 'А'; dec_list['7'] = 'Т'; dec_list['N'] = 'И'; dec_list['8'] = 'В';

dec_list['9'] = 'Д'; dec_list['6'] = 'Б'; dec_list['3'] = 'Е'; dec_list['0'] = 'О';

enc_list['А'] = '4'; enc_list['Т'] = '7'; enc_list['И'] = 'N'; enc_list['В'] = '8';

enc_list['Д'] = '9'; enc_list['Б'] = '6'; enc_list['Е'] = '3'; enc_list['О'] = '0';


ifstream b_file
(argv[2]);

while (!b_file.eof() ) {

b_file>>
strIn;

if (strOut.length()>0)

{

strOut=strOut
+ ' ' + strIn;

}

else

{

strOut=strIn;

}

}

b_file.close();

map<char, char>::iterator
pos;

using
std::replace;

//Работаем только с верхним регистром для улучшения читабельности:

transform(strOut.begin(),
strOut.end(),strOut.begin(), ::toupper);

if (*argv[1] == 'E'){

for (pos=enc_list.begin();
pos!=enc_list.end();++pos){

replace(strOut.begin(), strOut.end(), pos->first, pos->second);

}

}

if (*argv[1] == 'D'){

for (pos=dec_list.begin();
pos!=dec_list.end();++pos){

replace(strOut.begin(), strOut.end(), pos->first, pos->second);

}

}

//Результат на экран:

cout<< strOut << endl;

}

четверг, 28 апреля 2011 г.

5-16 lines of useful JavaScript code


//GetShortName("Smith James Alex")="Smith J. A."
//GetShortName("Иванов Иван Петрович")="Иванов И. П."
//GetShortName("Иванов Иван")="Иванов И. ."
function GetShortName(strString){
    var strNew='';
    var arrStr;
    strString=strString+' ';
    arrStr=strString.split(' ');
    strNew=arrStr[0] + ' ' + arrStr[1].substring(0,1) + '. ' + arrStr[2].substring(0) + '.'
    return strNew;
}
function GetParam(strParameters, strParamNum, strDelimeter){
    //Get a parameter from parameter string: 'param1;param2;'
    //O. Halzov
    var strNew='';
    var arrStr;
    strParameters+=strDelimeter;
    arrStr=strParameters.split(strDelimeter);
    return arrStr[strParamNum-1];
}
function GetParseValue(strParameters, strParamName, strDelimeter) {
    //Get a parameter value from parameters string: 'param1=p1;param2=P2;'
    //O. Halzov
    var strNewParam = '';
    var intIdx = 0;
    intIdx = strParameters.indexOf(strParamName);
    if (intIdx >= 0) {
        strNewParam = strParameters.substring(intIdx, strParameters.length);
        strNewParam = GetParam(strNewParam, 1, strDelimeter) + '=';
        strNewParam = GetParam(strNewParam, 2, '=');
        if (strNewParam.length > 0) {
            strNewParam = Trim(strNewParam);
        }
        else strNewParam = '';
    }
    else strNewParam = '';
    return strNewParam;
}

понедельник, 11 апреля 2011 г.

T-SQL tips

Если нужен простой вариант хранения значений переменных в одной строке одного поля с разделителями без применения XML: MyDate=01.02.2010 ; Test=3; MyStringValue=This is a test!;
Лично мне это пригодилось при хранении нескольких настроек в одном поле, таким образом я избежал парсинга XML и не понадобилось бесконтрольно добавлять поля разного типа.
Создаем 2 функции [dbo].[fnSysGetParam] и [dbo].[fnSysGetParamValue].
Смотри пример в описании [dbo].[fnSysGetParamValue].

CREATE FUNCTION [dbo].[fnSysGetParam]
    (@nvcInput nvarchar(500),
    @intParamNum int,
    @nvcDelimeter nvarchar(3))
RETURNS nvarchar(255)
AS
BEGIN
DECLARE @intI int,
                @intJ int,
                @intK    int,
                @nvcP    nvarchar(100),
                @nvcReturn nvarchar(255)
SET @intI =0
SET @intJ =0
SET @intK    =0
SET @nvcP    =''
SET @nvcReturn =''

IF (@nvcInput = '') OR (@intParamNum<1) OR (@intParamNum>LEN(@nvcInput)) OR (@nvcDelimeter='')
    SET @nvcReturn = ''
ELSE
    BEGIN
        SET @intI=1
        WHILE @intI <= Len(@nvcInput)
        BEGIN
            IF UPPER(SUBSTRING(@nvcInput,@intI,LEN(@nvcDelimeter)))=UPPER(@nvcDelimeter)
            BEGIN
                IF @nvcDelimeter=' '
                BEGIN
                    SET @intK = @intI + 1
                    WHILE (@intK<=LEN(@nvcInput)) AND (UPPER(SUBSTRING(@nvcInput,@intK,LEN(@nvcDelimeter))) = UPPER(@nvcDelimeter))
                        SET @intK = @intK + 1
                    CONTINUE
                    SET @intI = @intK - 1
                END
                SET @intJ = @intJ + 1
        If @intJ = @intParamNum
            SET @nvcReturn = @nvcP
            END
        ELSE
        BEGIN
        IF (@intJ = @intParamNum - 1)
            BEGIN
            If @intJ = 0
                SET @nvcP = @nvcP + SUBSTRING(@nvcInput, @intI, 1)
            Else
                SET @nvcP = @nvcP + SUBSTRING(@nvcInput, @intI + Len(@nvcDelimeter) - 1, 1)
            END
        END
        SET @intI=@intI+1
        CONTINUE
        END

    END
    If @intJ = 0
                SET @nvcReturn = @nvcInput
RETURN @nvcReturn
END
GO
CREATE FUNCTION [dbo].[fnSysGetParamValue]
    (@nvcInput nvarchar(500),--строка оригинал
    @nvcParamName nvarchar(100),--название параметра в строке
    @nvcDelim nvarchar(1)) --символ конца параметра
RETURNS nvarchar(255)
AS
--Возвращает значение параметра из текстовой строки 'MyVar=10;'
--Пример: select dbo.fnSysGetParamValue('MyDate=01.02.2010 ;Test=3; MyFlag = 10','MyDate',';')
--Результат: 01.02.2010
BEGIN
    DECLARE @nvcNewParam nvarchar(100)
    SET @nvcNewParam = SUBSTRING(@nvcInput,CHARINDEX(@nvcParamName,@nvcInput),LEN(@nvcInput))
    IF PATINDEX('%'+@nvcParamName+'%',@nvcNewParam)>0
    BEGIN
        SET @nvcNewParam = dbo.fnSysGetParam(@nvcNewParam,1,@nvcDelim) + '='
        SET @nvcNewParam = RTRIM(LTRIM(dbo.fnSysGetParam(@nvcNewParam,2,'=')))
    END
    ELSE
        SET @nvcNewParam = ''

    RETURN ISNULL(@nvcNewParam,'')
END
GO