Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointiputka: Putkaposti 46: Peltotutkimus

Sivun loppuun

Antti Laaksonen [10.04.2011 13:51:19]

#

Tässä tulee uusi putkaposti:

https://www.ohjelmointiputka.net/postit/tehtava.php?tunnus=petu

Chiman [10.04.2011 15:11:57]

#

Esim. OpenOffice.orgin Draw:lla voi kätevästi sommitella eri kokoisia neliöitä mahdollisimman tiiviiseen kasaan. Snap to grid auttaa.

Ja jottei ohjelmointipalstan tehtävä mene paheksuttavasti täysin ilman koodausta, voi tehdä pienen skriptin auttamaan pinta-alan laskemisessa:

Python, suorakulmiossa tiukasti vierekkäin palikat ABCD, allekkain BF:

>>> sivut = dict(zip('ABCDEFGHIJ', range(10, 0, -1)))
>>> def ala(s, t):
...     return sum(sivut[k] for k in s) * sum(sivut[k] for k in t)
...
>>> ala('ABCD', 'BF')
476

Antti Laaksonen [10.04.2011 17:37:03]

#

Ratkaisuja on tullut jo kiitettävää tahtia. Onko joku varma siitä, että nykyinen ratkaisu on optimaalinen?

Metabolix [10.04.2011 18:25:44]

#

Jos joku kokee seuraavan perustelun kovasti spoilaavaksi, jättäköön lukematta. Tiedot voi joka tapauksessa todeta kokeellisesti.

Neliöiden yhteispinta-ala on 385, ja suurimman neliön takia alle 10 ruudun sivunpituus ei tule kyseeseen. Riittää siis tutkia tapaukset, joissa lyhyempi sivu on 10–20 ruutua. (Jos lyhyempi sivu on 21, tuloskin on vähintään 441.)

Eri pituuksille voi helposti muodostaa varmoja alarajoja. Esimerkiksi lyhyemmän sivun pituuden ollessa 14 joudutaan laittamaan neliöt 10, 9, 8 ja 7 peräkkäin, koska mitkä tahansa näistä rinnakkain olisivat jo yli 14 ruutua. Pitkä sivu on siis ainakin 34 ja lopputulos siten ainakin 476. Sama päättely soveltuu muihinkin tapauksiin, joskin tapauksissa 17–20 täytyy miettiä vähän myös rinnakkaisia neliöitä.

lyhyt sivupitkä sivutulos
1045 = 10 + 9 + 8 + 7 + 6 + 5450
1140 = 10 + 9 + 8 + 7 + 6440
1234 = 10 + 9 + 8 + 7408
1334 = 10 + 9 + 8 + 7442
1434 = 10 + 9 + 8 + 7476
1527 = 10 + 9 + 8405
1627 = 10 + 9 + 8432
1724 = 10 + 8 + 6408
1824 = 10 + 9 + 5432
1923 = 10 + 7 + 6437
2023 = 10 + 7 + 6460

Parannusta ei siis ole luvassa.

Päärynämies [10.04.2011 18:49:58]

#

Tuli pitkästä aikaa ratkaistua Putkaposti ja se olikin kovin helppo.

Lisäksi kanssa päättelin, ettei parempaa ratkaisua ole olemassa, tosin hieman eri tavalla kuin Metabolix.

Grez [10.04.2011 19:01:08]

#

Metabolix: Tossa sun taulukossa on virhe 12 leveyden kohdalla. Siinäkin pitäisi olla + 6

Metabolix [10.04.2011 19:21:21]

#

Grez, taulukon ei ole tarkoituskaan antaa parasta mahdollista tulosta vaan jokin optimistinen arvio, jonka perusteella voidaan todeta, että nykyistä tulosta ei voi parantaa. Tuossa kohti peli on jo menetetty, joten kuutosta ei tarvitse edes ajatella.

Grez [10.04.2011 19:44:48]

#

Jaa, luulin että siinä oli listattu edellisessä kappaleessa kuvaamasi logiikan mukaiset tapaukset.

Metabolix [10.04.2011 20:17:12]

#

Logiikkahan on aivan sama, vaikka kaikkia siitä johdettavia päätelmiä ei lueteltaisi. Vai väitätkö, että kyseisessä tapauksessa ei jouduta laittamaan neliöitä 10, 9, 8 ja 7 mainitulla tavalla mainitusta syystä? :)

Grez [10.04.2011 20:19:18]

#

Mielesätni siinä joudutaan laittamaan neliöt 10, 9, 8, 7 ja 6 peräkkäin, koska mitkä tahansa näistä olisivat rinnakkain jo yli 12 ruutua.

Metabolix [10.04.2011 20:20:39]

#

Ja minusta silloin on jo jouduttu laittamaan myös neliöt 10, 9, 8 ja 7 peräkkäin, koska mitkä tahansa näistäkin olisivat rinnakkain jo yli 12 ruutua.

Ajattele nyt professoriparkaa, joka joutuu kaivamaan ylimääräisen 36 neliön pellon, ennen kuin huomaa virheensä.

Grez [10.04.2011 20:21:44]

#

Toki, mutta miksi sitten esimerkiksi tuossa 11 kohdassa on laitettu se kuutonenkin mukaan?

Siis ei tässä mitään ongelmaa sinänsä ole. Kuten sanoin, niin ymmärsin aluksi väärin mitä siinä taulukossa haettiin. Luulin että siinä haettiin ilmeisiä alarajoja. Ymmärsin jo että siinä haetaankin mitä vaan perusteltavissa olevaa yli 405 menevää vähimmäismäärää.

Eli siis 408 on riittävän hyvä "alaraja", vaikka onkin annetun esimerkin perusteella selvää, että alle 480 ei ole mahdollinen.

Metabolix [10.04.2011 20:23:41]

#

Koska (10 + 9 + 8 + 7) * 11 = 374, jolloin ei ole vielä todistettu, etteikö tästä saataisi väännettyä uutta ennätysratkaisua. Tarkoitus on siis listata vähimmäismäärä neliöitä, joiden jälkeen selvästi nähdään, että uutta ennätystä ei tule. Tätähän Antti kysyi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta