Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Птянциа, ондако...  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Фокус многим известный, но все же... Вдруг кому-то еще понравится.

Иоднга мжоно и пштотиуь - вот нпиаемрр, онжддаы лтеом, преед опстокум, впмсинол я, что двано уже хтоел рааиевтозль српкитик, ктроыой пекзоавыат вот эотт фкоус. Пхжоое, при нктеыроох улвсяиох, мы мжоем втмсроианипь (да оынбчо так и пиосрдохит!) солва пчоти как иргефилоы, цлсентоо. Тут вот ндвенао впмсинол об эотм...

declare
  txt varchar2(2000) := 'Иногда можно и пошутить - вот например, однажды летом, '||
                        'перед отпуском, вспомнил я, что давно уже хотел реализовать '||
                        'скриптик, который показывает вот этот фокус. Похоже, при некоторых '||
                        'условиях, мы можем воспринимать (да обычно так и происходит!) слова почти как иероглифы, целостно. '||
                        'Тут вот недавно вспомнил об этом...';
                      
  pos number := 1;
  pre_pos number := 1;
  cnt number := 1;
  word varchar2(100);
  
  function mix_word(i_word in varchar2) return varchar2 is
    res varchar2(100):= i_word;
    tbl dbms_sql.Varchar2_Table;
    j number;
    tmp_res varchar2(100);
    cur number;
  begin
    if length(i_word) > 3 then
      for i in 2..length(i_word)-1 loop
        dbms_random.seed(to_char(sysdate,'ddmmyyyyhh24miss'));
        j:= TRUNC(dbms_random.value*100);
        while tbl.exists(j) loop
          j:= TRUNC(dbms_random.value*100);
        end loop;        
        tbl(j):=substr(i_word,i,1);
      end loop;
      cur := tbl.first;
      while cur is not null loop
        tmp_res := tmp_res || tbl(cur);
        cur := tbl.next(cur);
      end loop;
      tmp_res := substr(i_word,1,1)||tmp_res||substr(i_word,-1);
      res := tmp_res;    
    end if;      
    return res;
  end;

begin
  txt := replace(txt,',',' ,');
  txt := replace(txt,'?',' ?');  
  txt := replace(txt,'!',' !');  
  txt := replace(txt,'.',' .');
  txt := replace(txt,':',' :');
  txt := replace(txt,'-',' -');  
  txt := txt || ' ';
  while pos > 0 loop
    cnt := cnt + 1;
    pre_pos := pos;
    pos := instr(txt,' ',pre_pos + 1, 1);
    exit when pos = 0;
    word := ltrim(substr(txt,pre_pos, pos - pre_pos));
    word := mix_word(word);
    if word not like '%,%' 
      and word not like '%.%'
      and word not like '%:%'
      and word not like '%?%'      
      and word not like '%!%'      
    then 
      dbms_output.put(' ');     
    end if;
    dbms_output.put(word);    
    exit when cnt > 100;  -- ограничиваем длину
  end loop;
  dbms_output.put_line('');  
end;
1 фев 08, 20:03    [5235279]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
Elic
Member

Откуда:
Сообщений: 29976
Ты черезчур рандомизировал. Когда буквы уходят дальше, чем на 3 позиции, эффект не проявляется, особенно на длинных словах.
1 фев 08, 20:09    [5235294]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Пожалуй, ты прав...
Иногда, действительно, надо подумать, прежде чем поймешь. В примерер, который меня привлек, как-то легче читалось. Будет время - усовершенствуем!
1 фев 08, 20:12    [5235304]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54369
Деев И.
Пожалуй, ты прав...
Иногда, действительно, надо подумать, прежде чем поймешь. В примерер, который меня привлек, как-то легче читалось. Будет время - усовершенствуем!
Подгонка теста под требуемый результат?
2 фев 08, 09:52    [5235999]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
Я тоже уже потчи как цеылй год все сориблася нпаитась подобуню херонтнеь, да руки не додохлии...
Ну раз уж полша ткаая пяькна, то пералдагю ссбовннеое севежоржеднное реешине на SQL.
З.Ы. Вдиимо, wm_conact вхидот в чилсо "сатднратынх с токче зерния пянтчиынх здаач" фнукицй,
потэмоу буду поьлвозать его, ибо сркчувиать дерево влом.
with q as (select 'Я тоже уже почти как целый год все собирался написать подобную хренотень, да руки не доходили...
Ну раз уж пошла такая пьянка, то предлагаю собсвенное свежерожденное решение на SQL.
З.Ы. Видимо, wm_concat входит в число "стандартных с точке зрения пятничных задач" функций,
поэтому буду пользовать его, ибо скручивать дерево влом.' s  from dual),
     qp as (select substr(s,level,1) ss, level lvl from q connect by level <= length(s)),
     qpl as (
         select ss,lvl,
                (sum(case 
                      when regexp_like(ss,'[[:alpha:]]') 
                       then 0 
                      else 
                       length(q.s)*4 
                     end) over (order by lvl))/length(q.s) grp
           from qp,q),
     qg as (select ss,lvl,
                   case when nvl(lag(grp,1) over (order by lvl),-1) <> grp 
                        then grp-2
                        else case when nvl(lag(grp,2) over (order by lvl),-1) <> grp 
                                  then grp-1
                                  else case when nvl(lead(grp,1) over (order by lvl),-1) <> grp 
                                            then grp+1
                                            else grp
                                       end
                             end
                   end grp
              from qpl)
select replace(regexp_replace(wm_concat(ss),'(,)([^,])','\2'),',,',',') shuffle
  from (select ss,lvl,grp,
               case when mod(lvl,2)=0 then lvl+1.7*sign(dbms_random.value(-1,1)) else lvl end nord
          from qg
         order by grp,nord)
3 фев 08, 17:33    [5237912]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
RA\/EN
...

С токай коквоцной тжое нхолпео пстеачулоя:
...
select replace(regexp_replace(wm_concat(ss),'(,)([^,])','\2'),',,',',') shuffle
  from (select ss,lvl,grp
          from qg
         order by grp,-lvl)

Или с вот тикам вот оокначнеим, чотбы дннилые свола не снатливосиь ссвоем уж небодутичоымеами:
...
         order by grp,trunc(lvl/4),-lvl)
3 фев 08, 18:06    [5237956]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
RA\/EN
RA\/EN
...

С токай коквоцной тжое нхолпео пстеачулоя:
...
select replace(regexp_replace(wm_concat(ss),'(,)([^,])','\2'),',,',',') shuffle
  from (select ss,lvl,grp
          from qg
         order by grp,-lvl)

Или с вот тикам вот оокначнеим, чотбы дннилые свола не снатливосиь ссвоем уж небодутичоымеами:
...
         order by grp,trunc(lvl/4),-lvl)

фигасе)))))))))............даже у меня так не получается ...;)))
3 фев 08, 18:12    [5237969]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
RAVEN, ай-я-яй, молодец!!!
Мне даже в голову не пришло, что можно так вот, select'ом это сделать... Круто!
4 фев 08, 09:47    [5238970]     Ответить | Цитировать Сообщить модератору
 Re: Птянциа, ондако...  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54369
Х.Дрейпер. Зпс нйд в бблтк
Примерно в это же время из их громоздкого алфавита были выброшены почти все гласные буквы (например: из их грмздкг лфвт бл вбршн пчти вс глсн бкв), однако основной целью этой реформы было ускорить процесс чтения, и это отразилось на объеме "кнг" (новое правописание), только косвенно уменьшив его на одну треть. Капля в море.

http://litera-d.ahaha.ru/05/Dreiper/dreiper_zps_nid_v_bbltk.htm
4 фев 08, 11:51    [5239890]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить