Author Topic: Помогите со скриптом на капчу  (Read 5307 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите со скриптом на капчу
« Reply #15 on: June 08, 2017, 11:57:45 AM »
Скрипт сортировки по Y, затем по X (для Y с разницей меньше $limit)

Code: (clickermann) [Select]
LOGCLEAR

// Допустим координаты цифр хранятся в массиве X, Y
//  92,75   // цифра 2
// 100,52   // цифра 5
// 130,50   // цифра 3
STRSEPARATE("92:75:100:52:130:50", ":", $corr)

// Какие это цифры в другом массиве (в том же порядке)
STRSEPARATE("2:5:3", ":", $num)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


SUB(LOG_ARR) //=================================================================
    //LOGWRITE("Размер массива: ", ARRSIZE($corr))
    FOR($INARR=0, $INARR < ARRSIZE($corr), 2)
        LOGWRITE($corr[$INARR], " - ",$corr[$INARR+1])
    END_CYC
    LOGWRITE("Порядок num:  ", $num[0], $num[1], $num[2])
    LOGWRITE(" ")
END_SUB

SUB(sort_x, $st, $en) //========================================================
    //LOGWRITE("$st / $en  ", $st, " / ", $en)
    IF($st ! $en)
        FOR($a=$st, $a < ($en-2), 2)
            $min = $corr[$a]
            $ind = $a
            FOR($b=$a+2, $b < $en, 2)
                IF($corr[$b] < $min)
                    $min = $corr[$b]
                    $ind = $b
                END_IF
            END_CYC
            $X = $corr[$ind]
            $Y = $corr[$ind+1]
            $N = $num[INT($ind/2)]
           
            $corr[$ind] = $corr[$a]
            $corr[$ind+1] = $corr[$a+1]
            $num[INT($ind/2)] = $num[INT($a/2)]
            $corr[$a] = $X
            $corr[$a+1] = $Y
            $num[INT($a/2)] = $N
        END_CYC
    END_IF
END_SUB

//==============================================================================


// сортируем массив по Y, попутно переставляя второй массив чтоб не потерять очерёдность
$len = ARRSIZE($corr)
LOG_ARR()

FOR($a=1, $a < ($len-2), 2)
    $min = $corr[$a]
    $ind = $a
    FOR($b=$a+2, $b < $len, 2)
        IF($corr[$b] < $min)
            $min = $corr[$b]
            $ind = $b
        END_IF
    END_CYC
    $X = $corr[$ind-1]
    $Y = $corr[$ind]
    $N = $num[INT($ind/2)]
    //LOGWRITE("$min = ", $min, "   ", $X, " - ", $Y)
   
    $corr[$ind-1] = $corr[$a-1]
    $corr[$ind] = $corr[$a]
    $num[INT($ind/2)] = $num[INT($a/2)]
    $corr[$a-1] = $X
    $corr[$a] = $Y
    $num[INT($a/2)] = $N
END_CYC

LOG_ARR()

// сортируем по X, пары с одинаковым Y (в пределах 10)
$limit = 10
$start = 0
$end = 0
$old = $corr[1]
FOR($i=3, $i < ($len-2), 2)
    IF(($corr[$i] - $old) < $limit)
        $old = $corr[$i]
        $end = $i + 1
    ELSE
        sort_x($start, $end)
        $start = $i + 1
        $end = $i + 1
    END_IF
END_CYC
sort_x($start, $end)

LOG_ARR()

HALT

Лог:
Code: [Select]
11:55:50 92 - 75
11:55:50 100 - 52
11:55:50 130 - 50
11:55:50 Порядок num:  253
11:55:50 
11:55:50 130 - 50
11:55:50 100 - 52
11:55:50 92 - 75
11:55:50 Порядок num:  352
11:55:50 
11:55:50 100 - 52
11:55:50 130 - 50
11:55:50 92 - 75
11:55:50 Порядок num:  532
11:55:50