|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
RomanBanan, В лоб: если левых скобок больше чем правых, то убираем число скобок равное разнице (в твоем примере это две скобки) и строим все возможные комбинации. Потом проверяем полученные строки на корректность. Код: 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.
В запросе надо допилить логику в permute и rec когда правых больше левых, я думаю ты справишься. Не делать же за тебя лабу полностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 16:02 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
RomanBanan, так? ............/´¯/)..............(\¯`\...... ...... ............/....//..............\\....\........... .........../....//................\\....\.......... ....../´¯/..../´¯\............/¯` ....\¯`\..... ..././.../..../..../.|_....._|.\....\....\...\.\.. (.(....(....(..../.)..).....(..(.\....)....)....).) .\................\/.../....\...\/................/ ..\................. /........\................../. ....\..............(............)............../... ......\.............\.........../............./.... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 16:15 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
vladimir74, допустим, а почему тогда нет такого варианта ответа? () Потому что в задании нужно найти последовательности максимальной длины. Вообще для строки посложнее '((())(()' ответ будет: (())() ((())) А для строки '((()()((())(()' : ()()(())() (())((())) ((())())() ((())(())) ((()()())) (())(())() ((()()))() ()()((())) (()()())() (()()(())) Осталось только понять на глаз все ли верны эти ответы или может какого не хватает))) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 16:17 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
dbms_photoshop, Да этот код вдвое компактнее моего, но для строки с более глубокой вложенностью это не работает например '((()()((())(()' ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 16:26 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
RomanBanandbms_photoshop, Да этот код вдвое компактнее моего, но для строки с более глубокой вложенностью это не работает например '((()()((())(()' Код: 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. 39. 40. 41.
Ну константу можно ж додуматься убрать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 16:35 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
dbms_photoshopRomanBanandbms_photoshop, Да этот код вдвое компактнее моего, но для строки с более глубокой вложенностью это не работает например '((()()((())(()' Код: 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.
Ну константу можно ж додуматься убрать. Дельта неправильно считается, неучитываются вырожденные случаи: '))((' ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 16:41 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
kernA [src oracle] SQL> with t(str) as (select '((()()((())(()' from dual) Дельта неправильно считается, неучитываются вырожденные случаи: '))((' with t(str) as (select regexp_replace(')(()()((())(((','^\)*','') from dual) *Убираем незначимые ')' из начала строки ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 17:00 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
kernAДельта неправильно считается, неучитываются вырожденные случаи: '))(('dbms_photoshopВ лоб: если левых скобок больше чем правых, то убираем число скобок равное разнице (в твоем примере это две скобки) и строим все возможные комбинации. Потом проверяем полученные строки на корректность.Что имено из двух предложений осталось непонятным? Если число скобок равно - просто генерация вариантов не происходит и на корректность проверяется исходная строка, а не сгенерированные. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 17:43 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
kernAУбираем Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 17:49 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
dbms_photoshopkernAДельта неправильно считается, неучитываются вырожденные случаи: '))(('dbms_photoshopВ лоб: если левых скобок больше чем правых, то убираем число скобок равное разнице (в твоем примере это две скобки) и строим все возможные комбинации. Потом проверяем полученные строки на корректность.Что имено из двух предложений осталось непонятным? Если число скобок равно - просто генерация вариантов не происходит и на корректность проверяется исходная строка, а не сгенерированные. У тебя предполагается, что максимальная длина это кол-во совпадений ')','(' Например, delta = least(length(replace(str, ')')) , length(replace(str, '(')) ) В случае, когда скобки не соответствуют синтаксису(например, ')' стоят вначале, уровень (iter = (select delta from permute where rownum = 1)), должен быть изначально меньше(тк у тебя не будет комбинаций) Код: plsql 1.
Как вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 18:03 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
kernAУ тебя предполагаетсяТы ничего не понял. Хотя если просто хочется поговорить - это в ПТ. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 18:20 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
в пт не очень интересно разговаривать ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 19:27 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
Ozornitca, так ведь пятничная задача же сама искала. Конечно, кривовато, но... Вот вам чучело. Ругайте: clear screen; WITH t1 AS--исходные данные ( SELECT '(()(()(()' src FROM dual ) , t11 AS ( SELECT replace(rtrim(replace( replace(ltrim(replace(src, ')', ' ')), ' ', ')') , '(', ' ')), ' ', '(') src--и сразу их почистим от левака FROM t1 ) , t2 AS --разбивка на строки с символом скобки ( SELECT SUBSTR(src,LEVEL,1) scb ,ROWNUM RN FROM t11 CONNECT BY LEVEL <= LENGTH(src) ) ,t3 AS --вычисляем количество левых и правых скобок ( SELECT SUM(CASE WHEN scb='(' THEN 1 ELSE 0 END) scbR ,SUM(CASE WHEN scb=')' THEN 1 ELSE 0 END) scbL FROM t2 ) , t4 AS--находим минимум ( SELECT CASE WHEN scbR < scbL THEN scbR ELSE scbL END scbMin FROM t3 ) ,t5 AS --все нужные правые и левые скобки ( SELECT '(' scb ,ROWNUM RN FROM t4 CONNECT BY LEVEL <= t4.scbMin*2 UNION ALL SELECT ')' scb ,ROWNUM RN FROM t4 CONNECT BY LEVEL <= t4.scbMin*2 ) , t6 AS --И получаем все варианты скобок! Тут волшебство и магия. Вжух! ( SELECT REPLACE(sys_connect_by_path(scb, ' '),' ','') as res ,SUBSTR(sys_connect_by_path(scb, '.*\'),1) as res2 from t5 where connect_by_isleaf = 1 start with rn = 1 connect by rn = prior rn + 1 ) ,t7 AS --теперь осталось вычистить ненужные... ( SELECT t6.res txt , t6.res2 , scbMin , rownum RN FROM t6, t4 WHERE LENGTH(replace(t6.res,'(','')) = t4.scbMin--левых скобок нужное кол-во AND LENGTH(replace(t6.res,')','')) = t4.scbMin --правых скобок нужное кол-во AND SUBSTR(t6.res, 1,1)='(' --начинается с левой скобки AND SUBSTR(t6.res, -1,1)=')' --заканчивается правой скобкой ) ,t8 AS --просто счетчик. Без него не получилось ( SELECT LEVEL RN FROM t4 CONNECT BY LEVEL <= scbMin*2 ) , t9 AS --плохие скобки, фу ( SELECT t7.RN FROM t7, t8 WHERE NVL(LENGTH(REPLACE(SUBSTR(t7.Txt, 1, t8.RN),')','')),0) - NVL(LENGTH(REPLACE(SUBSTR(t7.Txt, 1, t8.RN),'(','')),0) < 0 ) ,t10 AS ( SELECT t7.TXT, t7.SCBMIN, t7.RN, (SELECT src FROM t1) src, t7.res2 FROM t7 WHERE t7.RN NOT IN (SELECT rn FROM t9) ) SELECT txt, src, res2, REGEXP_REPLACE(src, res2,'*') ss FROM t10 WHERE REGEXP_LIKE(src, res2) ; ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2017, 23:47 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
RomanBananДля произвольной строки, состоящей из открывающих и закрывающих скобок написать запрос для вывода всех слов максимальной длины, представляющих правильные скобочные записи.Если решать задачу без "всех", то получается достаточно компактно. Можно переформулировать: убрать из исходного выражения минимальное число скобок так, чтоб оно стало корректным. Код: 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.
Для общего случая надо делать более хитрый перебор чем было у меня в заготовке, но неохота заморачиваться на SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2017, 01:36 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
dbms_photoshopТы ничего не понял. dbms_photoshopДля общего случая надо делать более хитрый перебор чем было у меня в заготовке, но неохота заморачиваться на SQL. Я тебе об этом и говорю, что сначала нужно определить максимальное кол-во совпадения "правильных" скобок("()"), а затем по этому кол-ву выводить все варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2017, 09:21 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
kernA, А, понял. Ты не из тех, кто пишет решения, ты советчик, оценщик... и провайдер "полезных" ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2017, 12:23 |
|
Какие есть идеи? Нужна помощь в вариантах решения задачи.
|
|||
---|---|---|---|
#18+
dbms_photoshopkernA, А, понял. Ты не из тех, кто пишет решения, ты советчик, оценщик... и провайдер "полезных" ссылок. наверное, да. Сначала спроектирую вариант, а потом делаю. В данном случае, я не вижу эффективного запроса в sql, который не будет колбасить одни и те же данные по несколько раз и который выведет результат без построения дерева( не доверяю я ему при кол-ве символов от 1000) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2017, 14:47 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1881678]: |
0ms |
get settings: |
19ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
9ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 279ms |
total: | 433ms |
0 / 0 |