powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задача: Красное и черное
25 сообщений из 176, страница 5 из 8
Пятничная задача: Красное и черное
    #40019754
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Что-то я не видел.
Первым линейный перебор опубликовал господин graycode и без всяких SMJ.

22233043
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019767
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это на PL/SQL.

Я про это: 22232233

Контекст:
,>линейным перебором можно обойтись только в PL/SQL
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019770
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кажется, я уже решал обе такие задачки, сходу только вспомнить и найти не смог, но нашёл чуть более сложный вариант усложненной задачки: https://stackoverflow.com/questions/64137899/flatten-list-of-ranges-to-single-result-range-set
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019772
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,


Мне эта видится проще,тут N слоев одиночных заплаток, перебор комбинаций меньше.

Соответственно и решение короче. Но задачка тоже классная, я попробую решить не глядя в ссылку.

А задачи про двухмерные заплатки никто не публиковал?

Например:
Каждая строка задаёт х1,х2,у1,у2 координаты покрашенного прямоугольника. Определить:
- площадь покрашенной поверхности
- максимальный полностью закрашенный прямоугольник
- максимальное число слоев на поверхности
- площадь поверхности содержащая ровно N слоев краски

Для супер одаренных:
- наибольший полностью закрашенный круг (центр и радиус)

Это монохромная версия. Можно добавить цвета..
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019774
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
Кажется, я уже решал обе такие задачки, сходу только вспомнить и найти не смог, но нашёл чуть более сложный вариант усложненной задачки: https://stackoverflow.com/questions/64137899/flatten-list-of-ranges-to-single-result-range-set


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t(lvl,x1,x2) as (
select 1,10,11 from dual union all
select 2,10,12 from dual union all
select 3, 8,13 from dual union all
select 4, 9,14 from dual union all
select 5, 3,15 from dual union all
select 6, 4,16 from dual union all
select 7, 5,17 from dual
)
select * from (
  select lvl, x1, nvl(lag(x1) over (order by lvl),x2) x2 from t union all
  select lvl, lag(x2) over (order by lvl) x1, x2 from t
) where x1 < x2 order by x1
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019775
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитал решения по ссылке, народ явно легких путей не ищет.

"Simplicate, and add lightness" (c)
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019780
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL

А задачи про двухмерные заплатки никто не публиковал?

Например:
Каждая строка задаёт х1,х2,у1,у2 координаты покрашенного прямоугольника. Определить:
- площадь покрашенной поверхности
- максимальный полностью закрашенный прямоугольник
- максимальное число слоев на поверхности
- площадь поверхности содержащая ровно N слоев краски

Для супер одаренных:
- наибольший полностью закрашенный круг (центр и радиус)

Это монохромная версия. Можно добавить цвета..


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- порядок не задан, краска одинаковая
-- x,y - координаты границ а не номера колонок, 
-- т.е. 5-5 это пустой отрезок, а не один интервал
with t(x1,x2,y1,y2) as (
select 1, 5, 3, 5 from dual union all
select 2, 6, 2, 4 from dual union all
select 1, 7, 3, 6 from dual union all
select 4, 8, 2, 3 from dual union all
select 5, 6, 4, 9 from dual union all
select 5, 9, 2, 6 from dual union all
select 7, 8, 5, 7 from dual
)
select ...



С фотошопом я не дружу, поэтому иллюстрация в ASCII:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	1  2  3  4  5  6  7  8
2	   $  $  $  $  $  $  $
3	$  $  $  $  $  $  $  $
4	$  $  $  $  $  $  $  $
5	$  $  $  $  $  $  $  $
6	            $     $   
7	            $         
8	            $         

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
xx as (
select level x from dual where level >= (select min(x1) from t) 
connect by level < (select max(x2) from t) 
),
yy as (
select level y from dual where level >= (select min(y1) from t) 
connect by level < (select max(y2) from t) 
)
select null "row", (select listagg(x,'  ') within group (order by x) from xx) "columns"
  from dual union all
select y, (select listagg(decode(
   (select count(*) from t where x>=x1 and x<x2 and y>=y1 and y<y2),0,' ','$')
           ,'  ') within group (order by x) from xx) 
  from yy 

...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019902
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
А задачи про двухмерные заплатки никто не публиковал?

Приходилось как-то на проекте внедрения внезапно под вечер решать задачку вида "сделать из списка (с историей изменения) префиксов телефонных зон двумерную карту для быстрого определения корректной зоны вызова по параметрам (вызываемый номер, дата соединения)".
Не rocket science, хотя пару-тройку часов из жизни выкинул.
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019905
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Почитал решения по ссылке, народ явно легких путей не ищет.

"Simplicate, and add lightness" (c)

А ты подставь данные из ссылки и сравни результат, ты решал какую то другую задачу.
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019967
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Жаль, критерий трудно определить объективно.

У меня получилось так.


должно быть две строки?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
with t (x1, x2, c, flag) as
(
              select 10, 30, 'blue', 'src' from dual
union all select 20, 30, 'red', 'tgt' from dual
union all select 31, 35, 'red', 'tgt' from dual
)
,p as (
select * from (
  select x, flag, decode(z,'X1',c,'-') c, z
    from (select x1, x2+1 x2, c, flag from t) tt
 unpivot (x for z in (x1,x2))) 
 pivot (max(c) for flag in ('src' s,'tgt' t))
),
q as (
select x x1, lead(x) over (order by x) -1 x2, c from (
  select x, c, lag(c) over (order by x) cp from (
    select x, decode(s,'-',t,s) c from (
      select x,
             last_value(s ignore nulls) over (order by x) s,
             last_value(t ignore nulls) over (order by x) t
        from p
      )
    )
  )
 where c != nvl(cp,' ')
)
select x1,x2,c from q
 where x1 <= x2  
/

SQL> /

        X1         X2 C
---------- ---------- ----
        10         30 blue



.....
stax
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019978
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
Собственно мой вариант таков.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select *
  from
(
select x1,
       nvl(decode(src_active, 1, src_c), decode(tgt_active, 1, tgt_c)) result
  from (select x1,
               sum(decode(flag, 'src', sign)) over(order by x1, type) src_active,
               sum(decode(flag, 'tgt', sign)) over(order by x1, type) tgt_active,
               last_value(decode(flag, 'src', c) ignore nulls) over(order by x1, type) src_c,
               last_value(decode(flag, 'tgt', c) ignore nulls) over(order by x1, type) tgt_c
          from (select c,
                       flag,
                       type,
                       x + decode(type, 'X2', 1, 0) x1,
                       decode(type, 'X1', 1, 'X2', -1) sign
                  from t unpivot(x for type in(x1, x2)))) t
)
match_recognize
(
  order by x1
  measures
    first(x.x1) x1,
    next(x.x1) - 1 x2,
    x.result result
  pattern (x+)
  define
    x as first(nvl(result, '~')) = nvl(result, '~') and next(x1) is not null
)

MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON + WINDOW SORT + UNPIVOT

При попытке решить однопроходно с match recognize упираешься в то, что "активный" цвет для текущей группы определяется по всему набору а match recognize не позволяет заглядывать в предыдущие группы.



Код: plsql
1.
2.
3.
4.
5.
with t (x1, x2, c, flag) as
(
              select 20, 30, 'red', 'src' from dual
union all select 20, 30, 'red', 'tgt' from dual
)



Код: plaintext
1.
2.
3.
4.
5.
X1	X2	RESULT
20	30	red
31	30	 - 
Download CSV
2 rows selected.

.....
stax
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019979
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
должно быть две строки?

Да.
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019982
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
.....

Всех замочил)))

PS: для проверки используйте PL/SQL вариант 22233043 ))
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019985
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
должно быть две строки?
Да. Ну ты мастер тестирования!
Можешь использовать мой запрос, там верно возвращает.

Я в его решении поправил один баг, получается есть еще (странно что это не всплыло в моём чудо тесте)
Кобанчег
Мелкий баг - decode(s,'-',t,s) может быть null если диапазоны начинаются с target.


Fix
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with p as (
select * from (
  select x, flag, decode(z,'X1',c,'-') c--, z
    from (select x1, x2+1 x2, c, flag from t) tt
 unpivot (x for z in (x1,x2))) 
 pivot (max(c) for flag in ('src' s,'tgt' t))
),
q as (
select x x1, lead(x) over (order by x) -1 x2, c from (
  select x, c, lag(c) over (order by x) cp from (
    select x, decode(nvl(s,'-'),'-',t,s) c from (
      select x,
             last_value(s ignore nulls) over (order by x) s,
             last_value(t ignore nulls) over (order by x) t
        from p
      )
    )
  )
 where c != nvl(cp,' ')
)
select sum(x1*x2) hash from q
 where x1 <= x2;
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019986
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

у НеофитSQL-а одна, косяк

Ваш вариант не тестировал (что-то лень обьекты создавать)

если дойдут руки, заменю pipe на dbms_output и мож потестю

.....
stax
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019988
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег
странно что это не всплыло в моём чудо тесте

Тестовые данные не покрывают много кейсов, а генератор на производительность вообще вырожденный и возможно это одна из причин удивительных результатов теста на производительность[/quot]
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019992
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Здесь тот же вариант, только в исполнении в виде пакета 22233388
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40019999
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
возможно это одна из причин
Наша песня хороша начинай сначала.
Я вчера уже поверил в твою адекватность когда ты признал что PL/SQL и SQL приверно одного уровня по производителности.
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40020002
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег

Можешь использовать мой запрос, там верно возвращает.



для unpivot + pivot + lead сдаюсь

поспешил
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SQL> ed
Wrote file afiedt.buf

  1  with t (x1, x2, c, flag) as
  2  (
  3                select 10, 30, 'blue', 'src' from dual
  4  union all select 20, 30, 'red', 'tgt' from dual
  5  union all select 31, 35, 'red', 'tgt' from dual
  6  )
  7  ,p as (
  8  select * from (
  9    select x, flag, decode(z,'X1',c,'-') c, z
 10      from (select x1, x2+1 x2, c, flag from t) tt
 11   unpivot (x for z in (x1,x2)))
 12   pivot (max(c) for flag in ('src' s,'tgt' t))
 13  ),
 14  q as (
 15  select x x1, lead(x) over (order by x) -1 x2, c from (
 16    select x, c, lag(c) over (order by x) cp from (
 17      select x, decode(s,'-',t,s) c from (
 18        select x,
 19               last_value(s ignore nulls) over (order by x) s,
 20               last_value(t ignore nulls) over (order by x) t
 21          from p
 22        )
 23      )
 24    )
 25   where c != nvl(cp,' ')
 26  )
 27  select x1,x2,c from q
 28*  where x1 <= x2
SQL> /

        X1         X2 C
---------- ---------- ----
        10         30 blue

SQL>




зі
match_recognize с ошибкой

зы
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40020003
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег,

Причина мне не совсем понятна, я убрал фактор сортировки, т.е. сортировок нет, просто прогоняется набор исходных данных через функцию, в функции только дерево условий, по идее должно быть быстрее, оно и быстрее но совсем незначительно, можешь объяснить причину?
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40020005
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
Причина мне не совсем понятна, я убрал фактор сортировки, т.е. сортировок нет
Код: plsql
1.
open c_refcur_t for select * from t order by x1;

?
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40020006
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег,

IOT, pk по всем полям начиная с x1))
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40020010
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

Ну тогда смотри куда уходит время в dbms_hprof + dbms_sqltune.report_sql_monitor

Может что-то еще можно выжать из твоего подхода, но практической ценности для меня не несет.
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40020017
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
для unpivot + pivot + lead сдаюсь

поспешил
Ты fix тут увидел?
22234679

В моём сортировку в аналитике надо сделать идентичной с MR.
Код: plsql
1.
over(order by x1/*, type*/)
...
Рейтинг: 0 / 0
Пятничная задача: Красное и черное
    #40020018
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
Stax,

Здесь тот же вариант, только в исполнении в виде пакета 22233388


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> create or replace package dropme_pkg as
  2      type res_rec_t is record (x1 t.x1%type, x2 t.x2%type, res t.c%type);
  3      type res_tab_t is table of res_rec_t;
  4      type refcur_t is ref cursor return t%rowtype;
  5      function f_superimpose return res_tab_t pipelined;
  6  end dropme_pkg;
  7  /

Package created.

...
104  end dropme_pkg;
105  /

Warning: Package Body created with compilation errors.

SQL> show err
Errors for PACKAGE BODY DROPME_PKG:

LINE/COL ERROR
-------- -----------------------------------------------------------------
16/9     PL/SQL: Statement ignored
16/18    PLS-00222: no function with name 'RES_REC_T' exists in this scope
SQL> l 16
 16*         l_res := res_rec_t(l_src.x1, l_src.x2, l_src.c);
SQL>



.....
stax
...
Рейтинг: 0 / 0
25 сообщений из 176, страница 5 из 8
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задача: Красное и черное
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]