Egy Smart Game Format formátumú string értelmezése.
Az SGF egy szabványos formátum táblajáték-fájlok, különösen a go tárolására.
Az SGF meglehetősen egyszerű formátum. Egy SGF-fájl általában egyetlen, csomópontokból álló fát tartalmaz, ahol minden csomópont egy tulajdonságlista. A tulajdonságlista kulcs-érték párokat tartalmaz; egy kulcs csak egyszer szerepelhet, de több értéke is lehet.
A feladatban egy SGF stringet kell értelmezned, és a tulajdonságokból álló fastruktúrát kell visszaadnod.
Egy SGF-fájl így nézhet ki:
(;FF[4]C[root]SZ[19];B[aa];W[ab])
Ez egy három csomópontból álló fa:
Amint elképzelheted, egy SGF-fájl sok egyetlen gyermekkel rendelkező csomópontot tartalmaz, ezért van rá egy rövidített jelölés.
Az SGF a játék változatait is képes kódolni. A go játékosai sokat lépkednek vissza az elemzéseik során (próbáljuk meg ezt, nem működik, próbáljuk meg azt), és az SGF támogatja a játéksorozatok változatait. Például:
(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))
Itt a gyökércsomópontnak két változata van. Az első (amely a konvenció szerint azt jelöli, ami valóban lejátszódik) az, ahol a fekete az 1-1 pontra lép. A feketének a tanára küldte el ezt a fájlt, aki rámutatott egy ésszerűbb lépésre a gyökércsomópont második gyermekében: B[dd] (4-4 pont, egy nagyon szabványos nyitás a sarok megszerzésére).
Egy kulcshoz több érték is tartozhat. Például:
(;FF[4];AB[aa][ab][ba])
Itt az AB (fekete hozzáadása) arra szolgál, hogy három fekete követ adjon a táblához.
Minden tulajdonságérték az SGF Text típus lesz. Semmilyen más értéktípust nem kell megvalósítanod. Bár elolvashatod a Text típus teljes dokumentációját, az alábbiakban összefoglaljuk a fontos pontokat:
\ után állnak, egyébként sortörésként maradnak meg.\ az escape-karakter.
Minden nem whitespace-karakter, amely egy \ után áll, változatlanul bekerül.
Minden whitespace-karakter, amely egy \ után áll, a fenti szabályokat követi.
Ne feledd, hogy az SGF-nek nincs escape-szekvenciája olyan whitespace-karakterekhez, mint a \t vagy a \n.Vigyázz, ne keverd össze a következő kettőt:
A stringliterálokban lévő escape-szekvenciákat a programozási nyelv értelmezője már feldolgozhatta, mielőtt azokat átadnák az SGF-értelmezőnek.
Az SGF-nek (és általában az értelmezésnek) van még néhány bonyolultsága, amelyeket nagyrészt figyelmen kívül hagyhatsz. Feltételezheted, hogy a bemenet UTF-8 kódolású, és hogy a tesztek nem tartalmaznak charset tulajdonságot, szóval emiatt ne aggódj. Továbbá feltételezheted, hogy minden sortörés unix stílusú (\n, a tesztekben nem lesz \r vagy \r\n), és hogy a tesztekben nem lesz opcionális whitespace a tulajdonságok, csomópontok stb. között.
Néha szükség lehet arra, hogy kivételt dobj. Ilyenkor mindig adj meg egy beszédes hibaüzenetet, amely megmutatja, mi a hiba forrása. Ettől olvashatóbb lesz a kódod, és sokat segít a hibakeresésben. Ha tudod, hogy a hiba forrása egy bizonyos típusú, választhatod azt is, hogy a beépített hibatípusok egyikét dobod, de ilyenkor is adj meg beszédes üzenetet.
Ennél a feladatnál a raise utasítással kell „dobnod” egy ValueError-t, ha a bemenetből hiányoznak a megfelelő elválasztók, ha nem csupa nagybetűs, ha nem alkot csomópontokból álló fát, vagy ha egyáltalán nem alkot fát. A tesztek csak akkor futnak át, ha raise-eled az exception-t, és üzenetet is fűzöl hozzá.
Ha üzenettel együtt szeretnél ValueError-t dobni, írd az üzenetet az exception típus argumentumaként:
# if the tree properties as given do not have proper delimiters.
raise ValueError("properties without delimiter")
# if the tree properties as given are not all in uppercase.
raise ValueError("property must be in uppercase")
# if the input does not form a tree, or is empty.
raise ValueError("tree missing")
# if the input is a tree without any nodes.
raise ValueError("tree with no nodes")
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.