Tunnustan heti, että ongelmani liittyy Project Eulerin tehtävään 11.
Vaaka- ja pystysuorat onnistuivat varsin kivuttomasti, mutta nuo diagonaalit tuottavat tuskaa.
Allaoleva viritelmä onnistuu tuon käymään läpi taulukon "lävistäjän", mutta tuosta eteenpäin en onnistu ajattelemaan. Pikkuisen jos saisi vinkkejä miten tätä pitäisi ajatella.
<?php /** * Define variables */ $grid = array(array(08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 08), array(49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00), array(81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65), array(52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 68, 56, 01, 32, 56, 71, 37, 02, 36, 91), array(22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80), array(24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50), array(32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70), array(67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 94, 39, 63, 08, 40, 91, 66, 49, 94, 21), array(24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72), array(21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95), array(78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 03, 80, 04, 62, 16, 14, 09, 53, 56, 92), array(16, 39, 05, 42, 96, 35, 31, 47, 55, 58, 88, 24, 00, 17, 54, 24, 36, 29, 85, 57), array(86, 56, 00, 48, 35, 71, 89, 07, 05, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58), array(19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 04, 89, 55, 40), array(04, 52, 08, 83, 97, 35, 99, 16, 07, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66), array(88, 36, 68, 87, 57, 62, 20, 72, 03, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69), array(04, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 08, 46, 29, 32, 40, 62, 76, 36), array(20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16), array(20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54), array(01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48)); $limit = 4; $combinations = array(); $combination = 0; /** * Get diagonals right */ $column = 0; $counter = 1; for ($row = 0; $row < 20; $row++) { $combinations[$combination][] = $grid[$row][$column]; $column++; if ( $counter % $limit == 0 ) { $combination++; $row -= $limit - 1; $column -= $limit - 1; } $counter++; } print_r($combinations); ?>
Diagonaalit voi käydä läpi ylhäältä alas tälläisellä for-loopilla:
for ($i = 0; $i<=$p; $i++) { $foo = $grid[$row+$i][$col+$i]; }
Tuo sitten for-looppiin joka käy läpi rivit ja sarakkeet väliltä 1 .. (20 - $p). Alhaalta ylös diagonaaleja mennessä tietty sitten vähennetään $i lisäämisen sijaan, ja käydään läpi sarakkeet ja rivit $p .. 20.
Yksi vaihtoehto on shiftata diagonaalit samoille pystysuorille:
08, 02, 22, 97, 38 08, 02, 22, 97, 38, 00, 00, 00, 00 49, 49, 99, 40, 17 00, 49, 49, 99, 40, 17, 00, 00, 00 81, 49, 31, 73, 55 ==> 00, 00, 81, 49, 31, 73, 55, 00, 00 52, 70, 95, 23, 04 00, 00, 00, 52, 70, 95, 23, 04, 00 22, 31, 16, 71, 51 00, 00, 00, 00, 22, 31, 16, 71, 51 ja 00, 00, 00, 00, 08, 02, 22, 97, 38 00, 00, 00, 49, 49, 99, 40, 17, 00 00, 00, 81, 49, 31, 73, 55, 00, 00 00, 52, 70, 95, 23, 04, 00, 00, 00 22, 31, 16, 71, 51, 00, 00, 00, 00
Tässä vielä yksi ehdotus: Käy läpi vasemman reunan ja yläreunan luvut ja aloita niistä jokaisesta oikealle alas suuntautuva lävistäjä. Vastaavasti käy läpi oikean reunan ja yläreunan luvut ja aloita niistä jokaisesta vasemmalle alas suuntautuva lävistäjä. Lävistäjän loppumisen tietää siitä, että vaaka- tai pystykoordinaatti joutuu ruudukon ulkopuolelle.
Jes, kiitokset kaikille. Oikea vastaus löytyi ja taas opin jotain. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.