Обновить

Комментарии 18

Реально интересно было этим заниматься?
Конечно. В начале просто захотелось одним sql решить задачку, а после пары неудачных попыток это было уже делом принципа.
А теперь напишем генератор этого запроса на brainfuck… Не, на whitespace!
Блять, вот поэтому много кто и не использует хранимые процедуры, для сохранения нервных клеток :))
Тут ни одной хранимой процедуры вообще-то…
Поздравляю! Вы решили студенческую/олимпиадную (как угодно) задачку!
К сожалению, или к счастью, программисты очень часто заморачиваются на решение подобных задач, не знаю для разминки мозга или просто повыпендриваться перед коллегами, которые на такие задачи забивают.
Лично я перешел на решение задач по физике за 9-й класс, потому что сын моего начальника перешел в 9-й класс (
Велосипеды позволяют думать в новом направлении, из чего может появиться необычное и крутое.
А вам работу пора менять.
Ничего не имел против, к таким задачам отношусь уважительно, поскольку сам иногда их решаю или принимаю участие в решении.
На счет работы либо я вас не правильно понимаю, либо вы меня не правильно поняли. Теперь вместо олимпиадных задач по программированию мы с начальником разминаем мозги, решая занятные задачки по физике, попукивая оставшимися школьными знаниями )
Прочитав, пришел к выводу, что вы делаете домашнюю работу за сына начальника по указанию. Извиняюсь.
Кстати довольно забавно получается выдавливать из себя школьный курс физики )
Одно дело, когда я, к примеру, — школьник и мои знания свежи, тем более эти знания мне выдают довольно-таки последовательно и могу задачу решить довольно быстро, зная контекст и пройденный накануне материал; или если я — программист, и решаю замысловатую задачку, опираясь на свой текущий «скил» программирования.
Совсем другое дело когда я понимаю суть задачки по физике, и у меня в голове портрет моего школьного учителя с кислой миной и какая-то каша остаточных знаний, которая выливается на листок бумаги в виде коряво-написанных формул, в следствии атрофии почерка. И тут, когда я захожу в тупик, — в голове проскакивают давно забытые понятия, на подобии «фронта волны» или «скалярного произведения векторов», и вот эти проблески разума — самая приятная вещь, по ощущениям сравнимая с убитым оленем, потому, что я осознаю что разум то остался и не атрофировался из-за рутиной работы.
Простите… как именно вы попукиваете школьными знаниями?
Как как… представьте, человеческий мозг, который хранит все приобретенные знаний где-то глубоко, среди этих знаний лежат школьные формулы и аксиомы. Так вот их не получается извлечь из головы как по «запросу» SELECT, а «всплывают» они внезапно… со звуком пууу…
Интересный пост, прикольная задача..
Решения пока не смотрел. Жду когда(если) появится свободное время, зудит попробовать решить самому, а потом сравнить.
Спасибо
Получилось чуть компактнее. Не знаю, на сколько правильно, может какие -то кейсы не учел и не верно отработю

Вкратце суть решения.
1) разматываю строку
2) для каждой строки считаю глубину вложенности скобки по критерию открыавющая/закрывающая
3) делаю селфджойн по глубине, к закрыающим скобкам подтягиваю их открывающие
4) сверяю кооректность открыающей/закрывающей пары
5) суммирую вложенные ошибки для диапазонов
6) дальше чисто оформительское — отфильтровываю диапазоны содержащие в себе ошибки, ранжирую по длине диапазона, вывожу фаворита в ранге, подтягиваю исходную строку, чтобы выкусить от туда фрагмент.
запрос
with brackets as(select '[[]])[([[]][[(]])]' b 
                 from dual
 )
 ,pivot as (select ord
                   ,br
                   ,decode(br,')',-1,']',-1,'(',1,'[',1) direction
                   ,sum(decode(br,')',-1,']',-1,'(',1,'[',1)) over (order by ord) depth
              from (
                  select level ord,substr(b,level,1) br
                  from brackets connect by level <= length(b)
              )
 )
select from_pos
       ,to_pos
       ,substr(b,from_pos,to_pos-from_pos+1) data
from (
    select s.*
           ,dense_rank() over (order by from_pos-to_pos) d_rank
    from (
      select s.*
           ,sum(error) over (order by to_pos range between to_pos-from_pos preceding and current row) errors
      from (
      select p1.ord to_pos
             ,max(p2.ord) from_pos
             ,decode(translate(max(p1.br),'])','[('),max(p2.br)  keep (dense_rank last order by p2.ord),0,1) error
      from pivot p1
      inner join pivot p2 on p1.depth = p2.depth -1 and p2.ord < p1.ord and p2.direction = 1 and p1.direction = -1
      group by p1.ord
      )s
    )s 
    where errors = 0
)s,brackets
where s.d_rank = 1;


результат
  FROM_POS     TO_POS DATA
---------- ---------- ------------------
         1          4 [[]]
         8         11 [[]]

Для такой строчки [[]][[]]
у меня выводится [[]][[]],
а у вас разматывается до 2х подстрок: [[]] и [[]]
Да, сосредоточившись на вложенностях, упустил что отсутствие вложений вовсе тоже не нарушает логики
Извращенец =)
Спасибо (=
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации