challenge データの整列

(x, y) の座標情報を以下の2種類の方法で整列する機能を実現してください。

  • (x, y) の辞書順(まず x で昇順に整列して、x が同じデータに対して y で昇順に整列する)
  • (0, 0) からの距離の昇順

データの表現方法はタプルなり構造体/オブジェクトなり各自で適当に選んで下さい。

Posted feedbacks - PHP

PHPをOtherとして投稿してしまいました。すいません。


# php test.php 
(0, 0)
(1, 1)
(2, 0)
(2, 1)
(3, 1)
(3, 2)
(3, 3)
 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
42
43
44
45
46
<?php
function sortXY($arrXY) {
    $arrSort = array();
    foreach ( $arrXY as $XY ) {
        $key = $XY[0];
        if(!isset($arrSort[$key])) {
            $arrSort[$key] = array($XY);
        } else {
            $pos = count($arrSort[$key]);
            foreach ( $arrSort[$key] as $i=>$sameX ) {
                if($XY[1] < $sameX[1]) {
                    $pos = $i;
                    break;
                }
            }
            array_splice($arrSort[$key], $pos, 0, array($XY));
        }
    }

    ksort($arrSort);

    $arrResult = array();
    foreach ( $arrSort as $arrTmp ) {
        foreach ( $arrTmp as $XY ) {
            $arrResult[] = $XY;
        }
    }

    return $arrResult;
}

$arrXY = array(
    array(0, 0),
    array(3, 1),
    array(2, 1),
    array(2, 0),
    array(1, 1),
    array(3, 3),
    array(3, 2),
);

$arrAscXY = sortXY($arrXY);
foreach($arrAscXY as $XY) {
    echo '('.join($XY, ', ').")\n";
}
?>

# php test.php 
(x, y) 昇順:
(0, 0)
(1, 0)
(1, 1)
(2, 1)
(2, 2)
(2, 9)
(3, 1)
(3, 2)
(3, 3)

(0, 0) からの距離の昇順:
(0, 0) distance=0
(1, 0) distance=1
(1, 1) distance=1.41
(2, 1) distance=2.24
(2, 2) distance=2.83
(3, 1) distance=3.16
(3, 2) distance=3.61
(3, 3) distance=4.24
(2, 9) distance=9.22
 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
function sortXY($arrXY, $byDistance = false) {
    $arrSort = array();
    foreach ( $arrXY as $XY ) {
        $key = $byDistance ? $XY[0]*$XY[0] + $XY[1]*$XY[1] : $XY[0];
        if(!isset($arrSort[$key])) {
            $arrSort[$key] = array($XY);
        } else {
            $pos = count($arrSort[$key]);
            foreach ( $arrSort[$key] as $i=>$sameX ) {
                if($XY[1] < $sameX[1]) {
                    $pos = $i;
                    break;
                }
            }
            array_splice($arrSort[$key], $pos, 0, array($XY));
        }
    }

    ksort($arrSort);

    $arrResult = array();
    foreach ( $arrSort as $arrTmp ) {
        foreach ( $arrTmp as $XY ) {
            $arrResult[] = $XY;
        }
    }

    return $arrResult;
}


$arrXY = array(
    array(0, 0),
    array(3, 1),
    array(2, 9),
    array(2, 1),
    array(2, 2),
    array(1, 0),
    array(1, 1),
    array(3, 3),
    array(3, 2),
);

$arrAscXY = sortXY($arrXY);
echo "(x, y) 昇順:\n";
foreach($arrAscXY as $XY) {
    list($X, $Y) = $XY;
    echo "($X, $Y)\n";
}
echo "\n(0, 0) からの距離の昇順:\n";
$arrAscDist = sortXY($arrXY, true);
foreach($arrAscDist as $XY) {
    list($X, $Y) = $XY;
    echo "($X, $Y) distance=". round(sqrt($X*$X + $Y*$Y), 2). "\n";
}
?>

Index

Feed

Other

Link

Pathtraq

loading...