Egy este egy régi füzetre bukkantál, amely tele volt rejtélyes firkákkal, mintha valaki megszállottan üldözött volna egy ötletet. Az egyik oldalon egyetlen kérdés tűnt ki: Vajon minden szám megtalálja az útját az 1-ig? A kérdés valamihez kapcsolódott, amit Collatz-sejtésnek neveznek: egy rejtvényhez, amely évtizedek óta zavarba hozza a gondolkodókat.
A szabályok megtévesztően egyszerűek voltak. Válassz egy tetszőleges pozitív egész számot.
Ezután ismételd meg ezeket a lépéseket az eredménnyel, és folytasd így a végtelenségig.
Kíváncsian a 12-es számot választottad ki próbaként, és elkezdted az utat:
12 ➜ 6 ➜ 3 ➜ 10 ➜ 5 ➜ 16 ➜ 8 ➜ 4 ➜ 2 ➜ 1
A második számtól (6) számolva 9 lépés kellett az 1 eléréséhez, és valahányszor újra alkalmaztad a szabályokat, a szám folyton változott. Eleinte a sorozat kiszámíthatatlannak tűnt, fel-le és mindenfelé ugrált. A sejtés mégis azt állítja, hogy bármelyik számmal is kezded, mindig az 1-nél kötsz ki.
Lenyűgöző volt, ugyanakkor zavarba ejtő is. Miért tűnik úgy, hogy ez mindig működik? Lehet olyan szám, ahol a folyamat megakad, örökké ismétlődik, vagy a végtelenbe szökik? A füzet azt sugallta, hogy ennek megoldása valami mélyreható dologra világíthat rá, és ezzel együtt hírnév, vagyon és hely a történelemben vár arra, aki fel tudja oldani a titkait.
Adott egy pozitív egész szám, add vissza az 1 eléréséhez szükséges lépések számát a Collatz-sejtés szabályai szerint.
Néha szükség van arra, hogy kivételt dobj. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely jelzi, mi a hiba forrása. Ez olvashatóbbá teszi a kódot, és sokat segít a hibakeresésben. Ha tudod, hogy a hibaforrás egy adott típusú lesz, dönthetsz úgy, hogy a beépített hibatípusok egyikét dobod, de ilyenkor is adj meg beszédes üzenetet.
A Collatz-sejtés csak a szigorúan pozitív egészekkel foglalkozik, ezért ez a feladat elvárja, hogy a raise utasítás segítségével ValueError-t dobj a megoldásodban, ha a megadott érték nulla vagy negatív egész. A tesztek csak akkor lesznek sikeresek, ha raise-eled a exception-t, és üzenetet is fűzöl hozzá.
Ha egy ValueError-t üzenettel együtt szeretnél dobni, az üzenetet az exception típus argumentumaként add meg:
# example when argument is zero or a negative integer
raise ValueError("Only positive integers are allowed")
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.