SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

Добро пожаловать в форум, Guest  >>  Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик  Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Пятничная задача - числовая пирамида   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31706
Здравствуйте, сегодня пятница, не правда ли ? :-)

Хочу предложить вашему вниманию на мой взгляд интересную задачку.
Она состоит из двуч частей : предварительной и основной.

Первая часть отношения к Ораклу не имеет.
Вот числовая пирамида

1
11
21
1211
111221
312211
13112221
1113213211
31131211131221

Найдите закономерность и напишите ну еще пару рядов...

2. Постройте числовую пирамиду с помощью программы на Оракл.

Задача относительно известна, поэтому кто знает решение, может сразу переходить
к программе, по возможности его пока не сообщая,
остальные ищут и догадываются (если не знаешь, то ИМХО совсем непросто)
Кто "честно" :-) догадывается , тот сообщает решение и переходим к программированию.
На первую часть, ну давайте отпустим час времени, а потом я расскажу, если никто не
догадался.

Вторая задача тоже непростая.
Открою секрет : готового решения я не подготовил, хотя идея решения есть.
Надеюсь, что вы не будете за это в обиде - ну во всяком случае решение первой
задачи я знаю точно

Поехали :-)
25 янв 08, 11:33    [5202170] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
Madness
Member

Откуда: Москва
Сообщений: 648
Ну, первая часть простая вроде:

1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
11131221133112132113212221

Я угадал? :)
25 янв 08, 11:40    [5202237] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31706
Madness
Ну, первая часть простая вроде:

1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
11131221133112132113212221

Я угадал? :)


Молодец, Madness !!!
ЗдОрово ! Я слышал, что некоторые взглянув на последовательность, сразу догадываются
об искомом. Ну , объясните пожалуйста как первый победитель алгоритм и пойдем писать запросы :-)
25 янв 08, 11:43    [5202285] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
Madness
Member

Откуда: Москва
Сообщений: 648
dmidek
объясните пожалуйста как первый победитель алгоритм и пойдем писать запросы :-)
Закономерность на лицо :) Читаем ряд слева направо или справа налево (кому как нравится) и заменяем в нем одинаковые (идущие подряд) цифры на их количество + саму цифру, т.е. 111 => 31, 22 => 22, 33=>23 и т.д. Оно?
25 янв 08, 11:47    [5202322] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31706
Madness
dmidek
объясните пожалуйста как первый победитель алгоритм и пойдем писать запросы :-)
Закономерность на лицо :) Читаем ряд слева направо или справа налево (кому как нравится) и заменяем в нем одинаковые (идущие подряд) цифры на их количество + саму цифру, т.е. 111 => 31, 22 => 22, 33=>23 и т.д. Оно?


Да конечно, спасибо.
Это такой своеобразный метод архивации больших повторяющихся данных...
25 янв 08, 11:51    [5202351] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
ps
Member

Откуда:
Сообщений: 417
Ты же её уже загадывал - Только на ПТ.
25 янв 08, 11:53    [5202375] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
test_2008
Member

Откуда: Москва
Сообщений: 1134
Из "1211" по вашей логике должно получится "112121" а в пирамиде "111221"

Или чего то недопонял ?
25 янв 08, 11:57    [5202409] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
test_2008
Member

Откуда: Москва
Сообщений: 1134
А всё туплю сорри "111221"
25 янв 08, 11:58    [5202424] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31706
ps
Ты же её уже загадывал - Только на ПТ.


Тише, тише
Ну так форум другой же. Тем более есть вторая половина...
25 янв 08, 11:59    [5202433] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
RA\/EN
Member

Откуда:
Сообщений: 3317
dmidek

Поехали :-)


create or replace function next_str(ins in varchar2) return varchar2 is
  Result varchar2(4000);
BEGIN
  WITH q AS (
  SELECT ins AS s
    FROM dual)
  SELECT replace(max(sys_connect_by_path(n||ss,',')),',','')
    INTO RESULT
    FROM (SELECT ss,
                 lvl-nvl(lag(lvl,1) over (ORDER BY lvl),0) n,
                 row_number() over (ORDER BY lvl) rn
            FROM (SELECT lead(ss,1) over (ORDER BY lvl) lss,
                         ss,
                         lvl
                    FROM (SELECT LEVEL lvl,
                                 substr(s,LEVEL,1) ss
                            FROM q
                           CONNECT BY LEVEL <= length(s))) 
           WHERE nvl(lss,ss+1) <> ss)
   START WITH rn<2
   CONNECT BY rn = PRIOR rn+1;
  return(Result);
end next_str;

SELECT n+1 AS n, ns
  FROM dual
       MODEL 
       DIMENSION BY (0 n)
       MEASURES (1 m,CAST (NULL AS VARCHAR2(4000)) ns)
       RULES ITERATE (10) (
         m[iteration_number]=CASE WHEN iteration_number <3 THEN 1 
                                  ELSE nvl(m[iteration_number-1],1)+nvl(m[iteration_number-2],1)
                             END,
         ns[iteration_number] = CASE WHEN iteration_number=0 THEN '1' ELSE next_str(ns[iteration_number-1]) END)
NNS
11
211
321
41211
5111221
6312211
713112221
81113213211
931131211131221
1013211311123113112211


P.S. Перед постом ответы не читал.
25 янв 08, 13:53    [5203424] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
RA\/EN
Member

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

         m[iteration_number]=CASE WHEN iteration_number <3 THEN 1 
                                  ELSE nvl(m[iteration_number-1],1)+nvl(m[iteration_number-2],1)
                             END


Упс, это я вспоминал, как MODEL работает
25 янв 08, 13:56    [5203458] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31706
2RA\/EN:
Очень классно, таким образом (MODEL+FUNCTION) две составные части, которые мне в обдумывании очень мешали : получение следующего элемента последовательности с одной
стороны и обеспечение итерационности с другой, сводятся воедино.

Мне очень понравилось.
Интересно, будут ли еще какие нибудь подходы ?
25 янв 08, 14:00    [5203491] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 12497
Madness
dmidek
объясните пожалуйста как первый победитель алгоритм и пойдем писать запросы :-)
Закономерность на лицо :) Читаем ряд слева направо или справа налево (кому как нравится) и заменяем в нем одинаковые (идущие подряд) цифры на их количество + саму цифру, т.е. 111 => 31, 22 => 22, 33=>23 и т.д. Оно?

Мнемонически правило звучит так:
1 читаем: одна-единица - пишем 11
11 читаем: две-единицы - пишем 21
...
31131211131221 -> одна-тройка-две-единицы-одна-тройка... -> 13211311123113112211
25 янв 08, 14:12    [5203589] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
Wadim S
Member

Откуда: Ukraine
Сообщений: 157
вот простой код :)
-- Created on 25.01.2008 by VADIM 
declare 
  -- Local variables here
  i number(32);
  j number(32);
  k number(32);  
  v varchar2(1000);
  vt varchar2(1000);
  vt2 varchar2(1000);  
  vn2 varchar2(1000);  
begin
  -- Test statements here
  v:='1';
  for i in 1..10 loop
    dbms_output.put_line(v);
    vt:=substr(v,1,1);
    vn2:='';
    k:=1;
    for j in 1..length(v) loop
      vt2:=nvl(substr(v,j+1,1),'0');
       if vt2<>vt then
         vt:=to_char(k)||vt;
         vn2:=vn2||vt;
         vt:=vt2;
         k:=1;
      else
         k:=k+1;
      end if;
    end loop;
    v:=vn2;
  end loop;
end;
25 янв 08, 14:18    [5203639] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
dba123
Guest
dmidek
Интересно, будут ли еще какие нибудь подходы ?
plsql
x='1113213211'
y=''
n=1
for j = 1 .. 99
put_line x
 for i = 1 .. length(x)
  if(x(i) == x(i+1) and  x(i+1) is not null)
     n++
  else
    y:=y||n||x(i)
    n :=1
 end loop
  x : =y y := null
 end loop
ограничения put_line
x(i) = substr (x,i,1)
25 янв 08, 14:22    [5203672] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31706
Чистый pl/sql - ну да, это понятный подход.

2dba123: Вы все таки уж слишком псевдокодно :-)
25 янв 08, 14:28    [5203714] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
Madness
Member

Откуда: Москва
Сообщений: 648
andrey_anonymous
Madness
dmidek

Мнемонически правило звучит так:
1 читаем: одна-единица - пишем 11
11 читаем: две-единицы - пишем 21
...
31131211131221 -> одна-тройка-две-единицы-одна-тройка... -> 13211311123113112211
Вне всяких сомнений :)
25 янв 08, 14:37    [5203771] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
RA\/EN
Member

Откуда:
Сообщений: 3317
Можно и без функции (см. поле NSR и предикат ns=nsr).
SELECT * FROM (
SELECT n+1 AS n, ns,nsr
  FROM dual
       MODEL 
       DIMENSION BY (0 n)
       MEASURES (1 m,CAST (NULL AS VARCHAR2(4000)) ns,CAST (NULL AS VARCHAR2(4000)) nsr)
       RULES ITERATE (28) (
         ns[iteration_number] = CASE WHEN iteration_number=0 THEN '1' 
                                ELSE next_str(ns[iteration_number-1]) END,
         nsr[iteration_number] = CASE WHEN iteration_number=0 THEN '1' 
                                 ELSE  translate(
                                         replace(replace(replace(
                                           replace(replace(replace(
                                             replace(replace(replace(nsr[iteration_number-1],
                                                '111','CA'),'222','CB'),'333','CC'),
                                             '11','BA'),'22','BB'),'33','BC'),
                                           '1','AA'),'2','AB'),'3','AC'),
                                         'ABC','123') END
                               )
                               ) WHERE ns=nsr
25 янв 08, 14:58    [5203915] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 555
dmidek
2RA\/EN:
Очень классно, таким образом (MODEL+FUNCTION) две составные части, которые мне в обдумывании очень мешали : получение следующего элемента последовательности с одной
стороны и обеспечение итерационности с другой, сводятся воедино.

Мне очень понравилось.
Интересно, будут ли еще какие нибудь подходы ?


Такое вот накракозябрил (может Волдер придет, поправит, я на моделях как и Raven, вспоминаю долго ;-)
with t as (
 select level n from dual connect by level <= 10
)
select n,q
from t
model
dimension by (n)
measures (cast('' as varchar2(4000)) s,cast('' as varchar2(4000)) q)
rules iterate (1000)
(
 q[any] order by n=nvl(s[cv()-1],1),
 s[any] order by n= s[cv()]||
 length(regexp_substr(nvl(s[cv()-1],'1'),'(\d)\1*',1,iteration_number+1))||
 substr(regexp_substr(nvl(s[cv()-1],'1'),'(\d)\1*',1,iteration_number+1),1,1)
)

Best regards

Maxim
25 янв 08, 14:58    [5203923] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
Богдан Гоцкий
Member

Откуда: Львов
Сообщений: 441
А давайте письками помериимся (PL\SQL против T-SQL) :-)
T-SQL, 3GHz проц, первые 40 записей за 14 сек выводит
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=518632#5203927
25 янв 08, 15:02    [5203948] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
ps
Member

Откуда:
Сообщений: 417
Вариант - чистый PL/SQL (без примесей SQL). Просто и надёжно.
SQL> CREATE or REPLACE Procedure piramida(
  2   pZifra  number,
  3   pShag   number
  4   ) is
  5   nr varchar2(100) := to_char(pZifra);
  6   nr2 varchar2(100);
  7   zif varchar2(1);
  8   zif_n varchar2(1);
  9   TYPE tRec is RECORD (
 10     anz pls_integer
 11    ,num varchar2(1)
 12   );
 13   TYPE tTab is table of tRec index by binary_integer;
 14   lTab tTab;
 15   idx binary_integer := 0;
 16  BEGIN
 17   dbms_output.put_line(to_char(nr));
 18   FOR i in 1..pShag LOOP
 19    FOR j in 1..length(nr) LOOP
 20     zif_n := substr(nr,j,1);
 21     if idx = 0 or zif is null or zif != zif_n then
 22      idx := idx + 1;
 23      lTab(idx).anz := 1;
 24      lTab(idx).num := zif_n;
 25      zif := zif_n;
 26     else
 27      lTab(idx).anz := lTab(idx).anz + 1;
 28     end if;
 29    END LOOP;
 30    nr2 := '';
 31    FOR k in 1..idx LOOP
 32     nr2 := nr2 || to_char(lTab(k).anz) || lTab(k).num;
 33    END LOOP;
 34    dbms_output.put_line(nr2);
 35    nr := nr2;
 36    lTab.delete;
 37    idx := 0;
 38   END LOOP;
 39  END;
 40  /

Prozedur wurde angelegt.

SQL> exec piramida(1,9);
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211

PL/SQL-Prozedur wurde erfolgreich abgeschlossen.
25 янв 08, 15:13    [5204026] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 555
Maxim Demenko



Если бы она еще и считала правильно, было бы вообще здорово ;-(((

Best regards

Maxim
25 янв 08, 15:14    [5204034] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
RA\/EN
Member

Откуда:
Сообщений: 3317
RA\/EN
Можно и без функции (см. поле NSR и предикат ns=nsr).

Это потому, что:
41 => *1111* => (a: 11+11 = не моджет быть, было ба 21, b: N1+11+1* =  не может быть, было бы (N+1)1)
42 => *2222* => (a: 22+22 = 2222 = 42 = нет (рекурсия)
43 => *3333* => (a: 33+33 = не может быть, было бы 63, b: N3+33+3* = не можеть быть, было бы (N+3)3
25 янв 08, 15:15    [5204041] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
dmidek
Member

Откуда: Киев -> Дортмунд
Сообщений: 31706
RA\/EN
RA\/EN
Можно и без функции (см. поле NSR и предикат ns=nsr).

Это потому, что:
41 => *1111* => (a: 11+11 = не моджет быть, было ба 21, b: N1+11+1* =  не может быть, было бы (N+1)1)
42 => *2222* => (a: 22+22 = 2222 = 42 = нет (рекурсия)
43 => *3333* => (a: 33+33 = не может быть, было бы 63, b: N3+33+3* = не можеть быть, было бы (N+3)3


Я понял - понял, старт с единицы дал тебе возможность ограничить число
комбинаций. Красивое решение, но конечно ограниченное относительно начального
значения последовательности :-)
25 янв 08, 15:19    [5204076] Ответить | Цитировать    Сообщить модератору

 Re: Пятничная задача - числовая пирамида   [new]
RA\/EN
Member

Откуда:
Сообщений: 3317
Богдан Гоцкий
А давайте письками помериимся (PL\SQL против T-SQL) :-)
T-SQL, 3GHz проц, первые 40 записей за 14 сек выводит
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=518632#5203927

Давай, меремся:
SQL> set serveroutput on 
SQL> set timing on
SQL> exec dbms_output.enable(1e6);
 
PL/SQL procedure successfully completed
 
Executed in 0,01 seconds
 
SQL> 
SQL> declare
  2    c CLOB := '1';
  3  begin
  4    FOR i IN 1..40 LOOP
  5      c:=
  6      replace(replace(replace(
  7       replace(replace(replace(
  8         replace(replace(replace(
  9           replace(replace(replace(c,
 10              '111','CA'),'222','CB'),'333','CC'),
 11           '11','BA'),'22','BB'),'33','BC'),
 12         '1','AA'),'2','AB'),'3','AC'),
 13       'A','1'),'B','2'),'C','3');
 14      dbms_output.put_line('['||i||']');
 15      FOR j IN 0..trunc(length(c)/4000)
 16      LOOP
 17        dbms_output.put_line(substr(c,j*4000,4000));
 18      END LOOP;
 19    END LOOP;
 20  end;
 21  /
 
[1]
11
[2]
21
[3]
1211
[4]
111221
[5]
312211
[6]
13112221
... lines skipped ...
[40]
111312211312111322212...
... lines skipped ...
...322212311222122132113213221123
 
PL/SQL procedure successfully completed
 
Executed in 0,221 seconds
 
SQL> 
В данном случае длина обратно пропроциональна времени, т.е. у меня в 63 раза длиннее
25 янв 08, 15:38    [5204219] Ответить | Цитировать    Сообщить модератору

Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить
Generated time: 187ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010