LINUX.ORG.RU

алгоритм?


0

0

Здравствуйте.

Никак не составлю алгоритмик. Задачка такая:

есть список номеров по АТС'ам в виде

нач.номер, конечный номер, АТС

например

11-00-00, 11-99-99, АТС 11

11-00-00, 11-09-99, АТС 110

11-10-00, 11-39-99, АТС 118

12-30-00, 12-39-99, АТС 123

12-36-18, 12-39-17, АТС 234

005, -, АТС 1

006, -, АТС 1

11-09-25, -, АТС Орг. 1

11-09-26, -, АТС Орг. 1

Надо сгенерить список экстеншенов -- префиксов (без тире), однозначно определяющих данную АТС, они могут быть уточняющими -- в случае, если префикс некоего номера совпадает с несколькими префиксами, то он "выигрывает" префикс с бОльшей длиной, т.е. список для данного случая:

005, АТС 1

006, АТС 1

11, АТС 11

110, АТС 110

110925, АТС Орг. 1

110926, АТС Орг. 1

111, АТС 118

112, АТС 118

113, АТС 118

123, АТС 123

123618, АТС 234

123619, АТС 234

12362, АТС 234

12363, АТС 234

12364, АТС 234

12365, АТС 234

12366, АТС 234

12367, АТС 234

12368, АТС 234

12369, АТС 234

1237, АТС 234

1238, АТС 234

12390, АТС 234

123910, АТС 234

123911, АТС 234

123912, АТС 234

123913, АТС 234

123914, АТС 234

123915, АТС 234

123916, АТС 234

123917, АТС 234

И, соответственно, звонок с номера 12-27-14 был с АТС 234, а с номера 12-31-18 -- с АТС 123. Совсем труба с диапазонами, начинающимися и/или заканчивающимися на некратных 10 номерах...

Боян, что-то такое было на тестировании для поступления на работу в одной конторе.

krum
()
Ответ на: комментарий от berrywizard

ты не сформулировал задачу толком. Если речь о нахождении просто хоть какого-то набора префиксов, то это как бы в лоб решается. Другое дело если ты хочешь оптимизировать таблицу -- то есть "вытаскивать наверх" какие-то АТС -- сокращать им префикс. Но тогда ты не сформулировал по какому критерию ты эту таблицу хочешь оптимизировать.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

ммм... тут вроде никакой оптимизации не нужно -- надо для списка диапазонов номеров сгенерить список префиксов для однозначного включения произвольного номера в диапазон, сравнив только префиксы. при этом, если существуют несколько префиксов, под которые этот номер подпадает, использовать для идентификации АТС более длинный префикс из подходящих (два одинаковых префикса быть не может, т.е. могут быть префиксы "37" (АТС 37) + "374" (АТС ООО R&K) + "3742" (АТС УО ПК МСТИ), но не может быть "33" (АТС 33) + "3345" (АТС СА КП) + "3345" (АТС ОПМ)).

я застрял на том, что диапазон может начинаться с произвольной цифры, в т.ч. с последней -- 31-00-00..31-09-99, 31-10-00..31-19-99, *31-23-46..31-28-45*.

мощность диапазона я нахожу (1/10/100/1000/... номеров), если нумерация начинается на границе мощности -- всё легко, а вот если она начинается с левого номера -- тут надо расписывать префиксы по возрастающей, и у меня пока не получается это алгоритмизовать. в приведённом выше списке последний диапазон надо расписать как "312346 312347 312348 312349 31235 31236 31237 31238 31239 3124 3125 3126 3127 31280 31281 31282 31283 312840 312841 312842 312843 312844 312845". так вот *как*?

berrywizard ★★★★★
() автор топика
Ответ на: комментарий от berrywizard

ну вот на шелле:

dump_table()
{
    (
        if test -z "$1"; then
            return
        fi
        A=${1%[0-9]}
        B=${2%[0-9]}
        if test $A = $B; then
            if expr "$1" : "[0-9]*0$" > /dev/null && expr "$2" : "[0-9]*9$" > /dev/null; then
                echo $A
            else
                seq $1 $2
            fi
            return
        fi
        if expr "$1" : "[0-9]*0$" > /dev/null; then
            dump_table $A $((B-1))
            dump_table ${B}0 $2
        else
            seq $1 ${A}9
            dump_table $((A+1))0 $2
        fi
    )
}




$ dump_table 312346 312845
312346
312347
312348
312349
31235
31236
31237
31238
31239
3124
3125
3126
3127
31280
31281
31282
31283
312840
312841
312842
312843
312844
312845

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

зачёт! я что-то смутно вроде этого думал, но мозги ничего внятного не выдавали -- надо в отпуск.

berrywizard ★★★★★
() автор топика
Ответ на: комментарий от dilmah

так лучше:

dump_table()
{
    (
        if test -z "$1"; then
            return
        fi
        A=${1%[0-9]}
        B=${2%[0-9]}
        if test $A = $B; then
            if expr "$1" : "[0-9]*0$" > /dev/null && expr "$2" : "[0-9]*9$" > /dev/null; then
                echo $A
            else
                seq $1 $2
            fi
            return
        fi
        if expr "$1" : "[0-9]*0$" > /dev/null; then
            if expr "$2" : "[0-9]*9$" > /dev/null; then
                dump_table $A $B
            else
                dump_table $A $((B-1))
                dump_table ${B}0 $2
            fi
        else
            seq $1 ${A}9
            dump_table $((A+1))0 $2
        fi
    )
}

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.