[PHP] genereren numerieke spiraal

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Hallo,

Ik zit met het volgende, ik wil met PHP numeriek een spiraal maken (betere uitleg weet ik ook niet :X)
Komt er op neer dat het volgende de output moet zijn: http://xini.org/data/got/spiral.html
Nummering werkt zich naar binnen.

Maar ik zie zo niet hoe ik dit kan uitrekenen, met een formulie oid?

.


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Je begint gewoon met een tweedimensionale array om de getallen in op te slaan, initieel zijn ze allemaal 0.

Je houdt een cursor bij van de plek binnen deze array waar het volgende getal neergezet moet worden, deze bestaat uit een x en y coordinaat, en de richting waar je op dit moment naartoe gaat.
Initieel staat deze cursor linksboven in de array, met de richting rechts.

Elke stap verplaats je de cursor 1 positie in die richting, tenzij je a) buiten de grenzen van de array zou lopen, of b) het element in de array op die plek al in gebruik is. In dat geval kies je de volgende van de 4 richtingen (rechts -> beneden -> links -> boven -> rechts -> ... ) en kijk je of je daar je volgende getal neer kan zetten.

Als het na 4 keer van richting wisselen nog niet is gelukt dan betekent dat dat de array helemaal gevuld is.

Succes!

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Wat wil je uitrekenen dan? Het is domweg een kwestie van een 2d array vullen....

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
ok, uitrekenen

maar de manier van vullen, de eerste lijn is gewoon 1 - 7, maar dan verder...

.


Acties:
  • 0 Henk 'm!

  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Zie de reply van MrBucket
Iets als:
Richting = rechts
Als volgende ruimte is vrij
waarde neerzetten
Anders
richting = onder

Enz.
Dit is met een paar code regels te doen.

Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Ok, duidelijk.

Heb het nu voor elkaar met volgende code:

PHP:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php

    // example
    $a = array(
        array( 1 , 2 , 3 , 4 , 5 , 6 , 7 ),
        array( 24, 25, 26, 27, 28, 29, 8 ),
        array( 23, 40, 41, 42, 43, 30, 9 ),
        array( 22, 39, 48, 49, 44, 31, 10),
        array( 21, 38, 47, 46, 45, 32, 11),
        array( 20, 37, 36, 35, 34, 33, 12),
        array( 19, 18, 17, 16, 15, 14, 13));
        
    $total = 49;
    $root = 7;
    
    $y = 0;
    $x = 0;
    
    $move = 'right';
    
    $b = array();
    
    for( $i = 1; $i <= $total; $i++ ) {
        
        calc($i);
    }
    
    echo '<pre>';
    print_r($b);
    echo '</pre>';
    
    function calc( $i ) {

        global $b,$x,$y,$move,$total,$root;
    
        if( ( ! isset( $b[$y][$x] ) ) && ( $y < $root ) && ( $x < $root ) ) { // first
            
            $b[$y][$x] = $i;
            
        } else {
            
            // move
            
            if( $move == 'right' ) {
                
                if( ( ! isset( $b[$y][$x+1 ) ) && ( ($x+1) < $root) ) {
                    
                    $b[$y][$x+1] = $i;
                    
                    $x = $x+1;
                    
                } else {
                    
                    $move = 'down';
                    
                    calc($i);
                    
                }
                
            } elseif( $move == 'down' ) {
                
                if( ( ! isset( $b[$y+1][$x] ) ) && ( ($y+1) < $root)  ) {
                    
                    $b[$y+1][$x] = $i;
                    
                    $y = $y+1;
                    
                } else {
                    
                    $move = 'left';
                    
                    calc($i);
                    
                }
                
            } elseif( $move == 'left' ) {
                
                if( ( ! isset( $b[$y][$x-1] ) ) && ( ! $x < -1)  ) {
                    
                    $b[$y][$x-1] = $i;
                    
                    $x = $x-1;
                    
                } else {
                    
                    $move = 'up';
                    
                    calc($i);
                    
                }
                
            } elseif( $move == 'up' ) {
                
                if( ( ! isset( $b[$y-1][$x] ) ) && ( ! $y < -1) ) {
                    
                    $b[$y-1][$x] = $i;
                    
                    $y = $y-1;
                    
                } else {
                    
                    $move = 'right';
                    
                    calc($i);
                    
                }
                
            }
            
        }        
        
    }
    
?>
KoW schreef op zondag 11 maart 2007 @ 00:48:
...

Enz.
Dit is met een paar code regels te doen.
Gezien dit niet 'een paar code regels' zijn, ben ik erg benieuwd hoe jij het ziet O-)

.


Acties:
  • 0 Henk 'm!

  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Mijn php ervaring is 0.0, maar ik zal een poging doen.

Het idee zit hem in het net andersom interpreteren. Je kijkt niet waar je nu een item neerzet, maar je kijkt waar je straks naar toe wilt.

Maar goed, de code:
PHP:
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
58
59
60
61
62
63
64
65
66
67
68
<?php 

    // example 
    $a = array( 
        array( 1 , 2 , 3 , 4 , 5 , 6 , 7 ), 
        array( 24, 25, 26, 27, 28, 29, 8 ), 
        array( 23, 40, 41, 42, 43, 30, 9 ), 
        array( 22, 39, 48, 49, 44, 31, 10), 
        array( 21, 38, 47, 46, 45, 32, 11), 
        array( 20, 37, 36, 35, 34, 33, 12), 
        array( 19, 18, 17, 16, 15, 14, 13)); 
         
    $total = 49; 
    $root = 7; 
     
    $y = 0; // horizontal 
    $x = 0; // vertical 
     
    $moveX = 1;
    $moveY = 0;
     
    $b = array(); 
     
    for( $i = 1; $i <= $total; $i++ ) { 
         
        calc($i); 
    } 
     
    echo '<pre>'; 
    print_r($b); 
    echo '</pre>'; 
     
    function calc($i) { 

        global $b,$x,$y,$moveX,$moveY,$root; 

        $b[$y][$x] = $i; 

        if( (! isset($b[$y+$MoveY][$x+$moveX])) && (($x+$moveX) < $root) && (($y+$moveY) < $root)) && (! ($x+$moveX) < -1) && (! ($y+$moveY) < -1) { 
             
            $x = $x+$moveX; 
            $y = $y+$moveY; 
             
        } elseif( $moveX == 1 ) { // Right => Down
             
            $moveX = 0; 
            $moveY = 1; 
             
        } elseif( $moveY == 1 ) { // Down => Left
             
            $moveX = -1; 
            $moveY = 0; 
             
        } elseif( $moveX == -1 ) { // Left => Up
             
            $moveX = 0; 
            $moveY = -1; 
             
        } elseif( $moveY == -1 ) { // Up => Right
             
            $moveX = 1; 
            $moveY = 0; 
             
        } 
         
    } 
     
?>

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Niet zo moeilijk doen met richtingen, seriously..

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$rib     = 7;
$counter = 1;

for($i = $rib; $i > 0; --$i) {
  for($index = ($rib - $i); $index < $i; $index++) 
    $array[$index][$rib - $i] = $counter++;

  for($index = ($rib - $i) +1; $index < $i; $index++)
    $array[$i - 1][$index] = $counter++;
    
  for($index = $i-1; $index > ($rib - $i); --$index)
    $array[$index-1][$i-1] = $counter++;    

  for($index = $i-2; $index > ($rib - $i); $index--) 
    $array[$rib-$i][$index] = $counter++; 
}

echo "<br><br>";

for($i = 0; $i < $rib; $i++) {
  for($j = 0; $j < $rib; $j++)  
    echo $array[$j][$i]." ";
  echo "<br>";
}


Beetje geklooi met indici, had een foutje gemaakt met x en y omdraaien, maar there you go. 14 regels om de array te vullen, dat noem ik ook wel maar een paar regels.. ;)

Voorbeeld: http://www.fragfrog.nl/nutwork/grid.php?rib=20

[ Voor 5% gewijzigd door FragFrog op 11-03-2007 13:06 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Die is nog korter inderdaad.
Pagina: 1