ΠΠΈΠ½Π°ΡΠΎΡΠΎ Π»Π΅ΡΠΎ ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π² Π²ΠΎ
ΠΠ°ΠΊΠΎ ΡΡΠ΅ΡΠ½ΠΈΠΊ Π½Π° Google Summer of Code 2019, Π½Π°ΠΏΡΠ°Π²ΠΈΠ² ΠΏΡΠΎΠ΅ΠΊΡ Π²ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌ Π·Π° ΠΌΠΎΡΠ°ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ Π·Π° Π±ΠΈΠΏΠ°ΡΡΠΈΡΠ΅Ρ Π²ΠΎ Π₯Π°ΡΠΊΠ΅Π». ΠΠ°ΠΊΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°ΡΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅, Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΡΡΠΈΠ» ΠΌΠΈ ΠΎΠ΄Π·Π΅Π΄Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΠΎΠ²ΡΠΎΡΡΠ²Π°ΡΠ° ΠΈ Π±Π°ΡΠ°ΡΠ΅ Π΄ΠΎΡΡΠ° ΡΠ°Π±ΠΎΡΠ°. ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΡΠ΅ ΡΠ΅ΡΠΈΠ² Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΡΠΎ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΎΡΠΈ Π½Π° ΠΌΠΎΠ½Π°Π΄ΠΈ.
ΠΠ·ΡΠ°Π²Π°
ΠΠ°Ρ ΡΠ΅ Π²ΠΈΠΊΠ°ΠΌ ΠΠ°ΡΠΈΠ»ΠΈΡ ΠΠ»ΡΠ΅ΡΠΎΠ², ΡΡΡΠ΄Π΅Π½Ρ ΡΡΠΌ ΡΠ΅ΡΠ²ΡΡΠ° Π³ΠΎΠ΄ΠΈΠ½Π° Π²ΠΎ Π‘Π°Π½ΠΊΡ ΠΠ΅ΡΠ΅ΡΠ±ΡΡΠ³ HSE. ΠΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ Π²ΠΎ Π±Π»ΠΎΠ³ΠΎΡ Π½Π°ΠΏΠΈΡΠ°Π²
ΠΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ
ΠΏΡΠ΅Π΄Π³ΠΎΠ²ΠΎΡΠΎΡ
Π‘ΡΡΠ΄Π΅Π½ΡΠΈΡΠ΅ ΠΊΠΎΠΈ ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π°Ρ Π²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠΈΠ»Π½ΠΎ ΡΠ΅ ΠΎΡ
ΡΠ°Π±ΡΡΠ²Π°Π°Ρ Π΄Π° Π±Π»ΠΎΠ³ΠΈΡΠ°Π°Ρ. ΠΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΡΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π·Π° Π±Π»ΠΎΠ³ΠΎΡ
ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ ΡΠΎ Π΄ΠΎΡΠΈΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅ Π·Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄ ΠΌΠΎΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ° (Π½Π° Π°Π½Π³Π»ΠΈΡΠΊΠΈ)
ΠΠ²ΠΎΡ ΠΏΠΎΡΡ Π΅ Π½Π°ΠΌΠ΅Π½Π΅Ρ Π΄Π° Π³ΠΎ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΎΡ ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈ Π²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅, ΠΈΠ°ΠΊΠΎ ΡΠ΅ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ΅ΡΠ°ΠΌ Π½Π° ΡΠΈΡΠ΅ ΡΠΏΠΎΡΡΠ΅Π±Π΅Π½ΠΈ ΡΠ΅ΡΠΌΠΈΠ½ΠΈ ΠΊΠΎΠ³Π° ΡΠ΅ Π΄ΠΎΡΠ΄Π΅ Π²ΡΠ΅ΠΌΠ΅.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΈ Π·Π° Π΄Π²ΠΎΡΡΡΠ°Π½ΠΎΡΡ
ΠΠ»Π³ΠΎΡΠΈΡΠ°ΠΌ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ Π·Π° Π±ΠΈΠΏΠ°ΡΡΠΈΡΠ΅Ρ ΠΎΠ±ΠΈΡΠ½ΠΎ ΡΠ΅ Π΄Π°Π²Π° Π²ΠΎ ΠΊΡΡΡΠΎΡ Π·Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ ΠΊΠ°ΠΊΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΡΠ΅ Π³ΡΠ°ΡΠΈΡΠΊΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ. ΠΠ΅Π³ΠΎΠ²Π°ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π΅ ΡΠ°ΡΠ½Π°: ΠΏΡΠ²ΠΎ Π½Π΅ΠΊΠ°ΠΊΠΎ ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ΅ΠΌΠΈΡΠ° Π²ΠΎ Π»Π΅Π²ΠΈΠΎΡ ΠΈΠ»ΠΈ Π΄Π΅ΡΠ½ΠΈΠΎΡ Π΄Π΅Π», Π° ΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ΅ Π½Π°ΡΠ΄Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ΅Π½ ΡΠ°Π±, ΡΠ²ΡΠ΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π³ΡΠ°ΡΠΈΠΊΠΎΡ Π½Π΅ Π΅ Π±ΠΈΠΏΠ°ΡΡΠΈΡΠ΅Π½.
ΠΠ°Π»ΠΊΡ ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ: ΠΏΡΠ²ΠΎ ΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ Π½Π΅ΠΊΠΎΠ΅ ΡΠ΅ΠΌΠ΅ Π²ΠΎ Π»Π΅Π²ΠΈΠΎΡ Π΄Π΅Π». ΠΡΠΈΠ³Π»Π΅Π΄Π½ΠΎ, ΡΠΈΡΠ΅ ΡΠΎΡΠ΅Π΄ΠΈ Π½Π° ΠΎΠ²Π° ΡΠ΅ΠΌΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π»Π΅ΠΆΠ°Ρ Π²ΠΎ Π΄Π΅ΡΠ½ΠΈΠΎΡ Π»ΠΎΠ±ΡΡ. ΠΠΎΠ½Π°ΡΠ°ΠΌΡ, ΡΠΈΡΠ΅ ΡΠΎΡΠ΅Π΄ΠΈ Π½Π° ΡΠΎΡΠ΅Π΄ΠΈΡΠ΅ Π½Π° ΠΎΠ²Π° ΡΠ΅ΠΌΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π»Π΅ΠΆΠ°Ρ Π²ΠΎ Π»Π΅Π²ΠΈΠΎΡ Π»ΠΎΠ±ΡΡ ΠΈΡΠ½. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π°ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΡΠ²Π°ΠΌΠ΅ Π°ΠΊΡΠΈΠΈ Π½Π° ΡΠ΅ΠΌΠΈΡΠ° ΡΓ¨ Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΓ¨ ΡΡΡΠ΅ ΠΈΠΌΠ° ΡΠ΅ΠΌΠΈΡΠ° Π²ΠΎ ΠΏΠΎΠ²ΡΠ·Π°Π½Π°ΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π½Π° ΡΠ΅ΠΌΠ΅ΡΠΎ ΡΠΎ ΠΊΠΎΡΠ° Π·Π°ΠΏΠΎΡΠ½Π°Π²ΠΌΠ΅ ΠΈ Π½Π° ΠΊΠΎΠΈ Π½Π΅ ΡΠΌΠ΅ Π΄ΠΎΠ΄Π΅Π»ΠΈΠ»Π΅ ΡΠΎΡΠ΅Π΄ΠΈ. ΠΠΎΡΠΎΠ° Π³ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΠ²Π°ΠΌΠ΅ ΠΎΠ²Π° Π΄Π΅ΡΡΡΠ²ΠΎ Π·Π° ΡΠΈΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ.
ΠΠΊΠΎ ΠΏΠΎΡΡΠΎΠΈ ΡΠ°Π± ΠΏΠΎΠΌΠ΅ΡΡ ΡΠ΅ΠΌΠΈΡΠ°ΡΠ° ΡΡΠΎ ΡΠΏΠ°ΡΠ°Π°Ρ Π²ΠΎ ΠΈΡΡΠ°ΡΠ° ΠΏΠ°ΡΡΠΈΡΠΈΡΠ°, Π½Π΅ Π΅ ΡΠ΅ΡΠΊΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ Π½Π΅ΠΏΠ°ΡΠ΅Π½ ΡΠΈΠΊΠ»ΡΡ Π²ΠΎ Π³ΡΠ°ΡΠΈΠΊΠΎΡ, ΡΡΠΎ Π΅ Π½Π°ΡΠΈΡΠΎΠΊΠΎ ΠΏΠΎΠ·Π½Π°ΡΠΎ (ΠΈ ΡΠΎΡΠ΅ΠΌΠ° ΠΎΡΠΈΠ³Π»Π΅Π΄Π½ΠΎ) Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎ Π±ΠΈΠΏΠ°ΡΡΠΈΡΠ½ΠΈΠΎΡ Π³ΡΠ°Ρ. ΠΠΎ ΡΠΏΡΠΎΡΠΈΠ²Π½ΠΎ, ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½Π° ΠΏΠ°ΡΡΠΈΡΠΈΡΠ°, ΡΡΠΎ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π³ΡΠ°ΡΠΈΠΊΠΎΡ Π΅ Π±ΠΈΠΏΠ°ΡΡΠΈΡ.
ΠΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ, ΠΎΠ²ΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅
Π’Π°ΠΊΠ°, Π΄ΠΎΡΠ΄ΠΎΠ²ΠΌΠ΅ Π΄ΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΠ΅ΠΌΠ°. ΠΠΈ ΠΏΠΎΠΌΠΈΠ½ΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΠΌΠΈΡΠ°ΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΎΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠ²ΠΎ Π΄Π»Π°Π±ΠΎΡΠΈΠ½Π° ΠΈ ΠΈΠΌ Π΄ΠΎΠ΄Π΅Π»ΡΠ²Π°ΠΌΠ΅ Π°ΠΊΡΠΈΠΈ, ΠΌΠ΅Π½ΡΠ²Π°ΡΡΠΈ Π³ΠΎ Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠΏΠΎΠ΄Π΅Π»ΡΠ²Π°ΡΠ΅ΡΠΎ Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΠ΅ Π΄Π²ΠΈΠΆΠΈΠΌΠ΅ ΠΏΠΎ ΡΠ°Π±ΠΎΡ. ΠΠΊΠΎ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΠΈΠΌΠ΅ ΡΠ΄Π΅Π» Π½Π° ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠ΅ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° Π΄ΠΎΠ΄Π΅Π»Π΅Π½ Π΄Π΅Π», ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π³ΡΠ°ΡΠΈΠΊΠΎΡ Π½Π΅ Π΅ Π±ΠΈΠΏΠ°ΡΡΠΈΡΠ΅Π½. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΡ ΠΊΠΎΠ³Π° Π½Π° ΡΠΈΡΠ΅ ΡΠ΅ΠΌΠΈΡΠ° ΠΈΠΌ Π΅ Π΄ΠΎΠ΄Π΅Π»Π΅Π½ Π΄Π΅Π» ΠΈ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ ΡΠΈΡΠ΅ ΡΠ°Π±ΠΎΠ²ΠΈ, ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΠ±ΡΠ° ΠΏΠ°ΡΡΠΈΡΠΈΡΠ°.
Π§ΠΈΡΡΠΎΡΠ° Π½Π° ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅
ΠΠΎ Π₯Π°ΡΠΊΠ΅Π» ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠΈΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈ ΡΠ΅ ΡΠΈΡΡΠΈ. ΠΠ΅ΡΡΡΠΎΠ°, Π°ΠΊΠΎ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π±Π΅ΡΠ΅ ΡΠ°ΠΊΠ°, Π½Π΅ΠΌΠ°ΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ Π½Π°ΡΠΈΠ½ Π΄Π° ΠΈΡΠΏΠ΅ΡΠ°ΡΠΈΠΌΠ΅ Π½ΠΈΡΡΠΎ Π½Π° Π΅ΠΊΡΠ°Π½ΠΎΡ. ΠΠΎΠΎΠΏΡΡΠΎ, ΡΠΈΡΡ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅ ΡΠ΅ ΡΠΎΠ»ΠΊΡ ΠΌΡΠ·Π»ΠΈΠ²ΠΈ ΡΡΠΎ Π½Π΅ΠΌΠ° Π½ΠΈΡΡ Π΅Π΄Π½Π° ΡΠΈΡΡΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ° Π½Π΅ΡΡΠΎ. Π‘ΠΈΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π°Π°Ρ Π²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π½Π΅ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΏΡΠΈΠ½ΡΠ΄Π΅Π½ΠΈ "Π½Π΅ΡΠΈΡΡ" ΠΌΠΎΠ½Π°Π΄Π° IO.
ΠΠΎΠ½Π°Π΄ΠΈΡΠ΅ ΡΠ΅ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π°Ρ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅ ΡΠΎ Π΅ΡΠ΅ΠΊΡΠΈ Π²ΠΎ Π₯Π°ΡΠΊΠ΅Π». ΠΠ±ΡΠ°ΡΠ½ΡΠ²Π°ΡΠ΅ΡΠΎ ΠΊΠ°ΠΊΠΎ ΡΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Ρ Π΅ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΎΠΏΡΠ΅Π³ΠΎΡ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ. ΠΠΎΠ±Π°Ρ ΠΈ ΡΠ°ΡΠ΅Π½ ΠΎΠΏΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ° Π½Π° Π°Π½Π³Π»ΠΈΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ
ΠΠ²Π΄Π΅ ΡΠ°ΠΊΠ°ΠΌ Π΄Π° ΠΈΡΡΠ°ΠΊΠ½Π°ΠΌ Π΄Π΅ΠΊΠ° Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ IO, ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π°Ρ ΠΏΡΠ΅ΠΊΡ ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅Ρ ΠΌΠ°Π³ΠΈΡΠ°, ΡΠΊΠΎΡΠΎ ΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΡΠΎΡΡΠ²Π΅Ρ ΠΈ ΡΠΈΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈ Π²ΠΎ Π½ΠΈΠ² ΡΠ΅ ΡΠΈΡΡΠΈ.
ΠΠΌΠ° ΠΌΠ½ΠΎΠ³Ρ Π΅ΡΠ΅ΠΊΡΠΈ ΠΈ ΡΠ΅ΠΊΠΎΡ ΠΈΠΌΠ° ΡΠ²ΠΎΡΠ° ΠΌΠΎΠ½Π°Π΄Π°. ΠΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠΈΠ»Π½Π° ΠΈ ΡΠ±Π°Π²Π° ΡΠ΅ΠΎΡΠΈΡΠ°: ΡΠΈΡΠ΅ ΠΌΠΎΠ½Π°Π΄ΠΈ Π³ΠΎ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°Π°Ρ ΠΈΡΡΠΈΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ. ΠΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈ:
- ΠΠ»ΠΈ ea Π΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠ° ΠΊΠΎΡΠ° Π²ΡΠ°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ a ΠΈΠ»ΠΈ ΡΡΠ»Π° ΠΈΡΠΊΠ»ΡΡΠΎΠΊ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ e. ΠΠ΄Π½Π΅ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ²Π°Π° ΠΌΠΎΠ½Π°Π΄Π° Π΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ»ΠΈΡΠ½ΠΎ Π½Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ ΡΠΎ ΠΈΡΠΊΠ»ΡΡΠΎΡΠΈ Π²ΠΎ ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΡΠ΅ ΡΠ°Π·ΠΈΡΠΈ: Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°ΡΠ°Ρ ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ°Ρ. ΠΠ»Π°Π²Π½Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° Π΅ Π²ΠΎ ΡΠΎΠ° ΡΡΠΎ ΠΌΠΎΠ½Π°Π΄Π°ΡΠ° Π΅ ΡΠ΅Π»ΠΎΡΠ½ΠΎ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° Π²ΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π²ΠΎ Π₯Π°ΡΠΊΠ΅Π», Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΡΠ΅ ΡΠ°Π·ΠΈΡΠΈ ΠΎΠ±ΠΈΡΠ½ΠΎ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ.
- Π‘ΠΎΡΡΠΎΡΠ±Π°ΡΠ° sa Π΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠ° ΠΊΠΎΡΠ° Π²ΡΠ°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ a ΠΈ ΠΈΠΌΠ° ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΠΎΡΡΠΎΡΠ±Π° ΠΎΠ΄ ΡΠΈΠΏΠΎΡ s.
- ΠΠΎΠΆΠ΅Π±ΠΈ Π°. ΠΠΎΠ½Π°Π΄Π°ΡΠ° ΠΠΎΠΆΠ΅Π±ΠΈ ΠΈΠ·ΡΠ°Π·ΡΠ²Π° ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°ΡΠ΅ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΊΠΈΠ½Π΅ Π²ΠΎ ΡΠ΅ΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΡΠΎ Π²ΡΠ°ΡΠ°ΡΠ΅ Π½Π° ΠΠΈΡΡΠΎ. Π‘Π΅ΠΏΠ°ΠΊ, ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΊΠ»Π°ΡΠ°ΡΠ° MonadPlus Π·Π° ΡΠΈΠΏΠΎΡ Maybe, ΠΊΠΎΡΠ° Π³ΠΎ ΠΈΠ·ΡΠ°Π·ΡΠ²Π° ΡΠΏΡΠΎΡΠΈΠ²Π½ΠΈΠΎΡ Π΅ΡΠ΅ΠΊΡ: ΡΠΎΠ° Π΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠ° ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΊΠΈΠ½Π΅ Π²ΠΎ ΡΠ΅ΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΡΠΎ Π²ΡΠ°ΡΠ°ΡΠ΅ Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ.
ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ
ΠΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΡΠΈΠΏΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΡΠ°ΡΠΈΠΊ a ΠΈ Bigraph ab, ΠΎΠ΄ ΠΊΠΎΠΈ ΠΏΡΠ²ΠΈΠΎΡ ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π° Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΈ ΡΠΎ ΡΠ΅ΠΌΠΈΡΠ° ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈ ΡΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ a, Π° Π²ΡΠΎΡΠΈΠΎΡ ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π° Π±ΠΈΠΏΠ°ΡΡΠΈΡΠ½ΠΈ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΈ ΡΠΎ ΡΠ΅ΠΌΠΈΡΠ° ΠΎΠ΄ Π»Π΅Π²Π°ΡΠ° ΡΡΡΠ°Π½Π° ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈ ΡΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ a ΠΈ Π΄Π΅ΡΠ½ΠΎ. - ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈ ΡΠ΅ΠΌΠΈΡΠ° ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈ ΡΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ b.
ΠΠ²Π° Π½Π΅ ΡΠ΅ ΡΠΈΠΏΠΎΠ²ΠΈ ΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΠ»Π³Π°. ΠΠ»Π³Π° Π½Π΅ΠΌΠ° ΠΏΡΠ΅ΡΡΡΠ°Π²Π° Π·Π° Π½Π΅Π½Π°ΡΠΎΡΠ΅Π½ΠΈ Π±ΠΈΠΏΠ°ΡΡΠΈΡΠ½ΠΈ Π³ΡΠ°ΡΠΈΡΠΈ. ΠΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΠ² Π²Π°ΠΊΠ²ΠΈΡΠ΅ ΡΠΈΠΏΠΎΠ²ΠΈ Π·Π° ΡΠ°ΡΠ½ΠΎΡΡ.
ΠΠ΅ Π½ΠΈ ΡΡΠ΅Π±Π°Π°Ρ ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΠΎΡΠΏΠΈΡΠΈ:
-- Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΎΡΠ΅Π΄Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ.
neighbours :: Ord a => a -> Graph a -> [a]
-- ΠΠΎΡΡΡΠΎΠΈΡΡ Π΄Π²ΡΠ΄ΠΎΠ»ΡΠ½ΡΠΉ Π³ΡΠ°Ρ ΠΏΠΎ Π³ΡΠ°ΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ
-- Π²ΡΠ΄Π°ΡΡΠ΅ΠΉ Π΅Ρ Π΄ΠΎΠ»Ρ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠΊΡ Π² Π½ΠΎΠ²ΠΎΠΉ Π΄ΠΎΠ»Π΅, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ½ΡΠ΅ ΡΡΠ±ΡΠ°.
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c)
-> Graph a
-> Bigraph b c
-- Π‘ΠΏΠΈΡΠΎΠΊ Π²Π΅ΡΡΠΈΠ½ Π² Π³ΡΠ°ΡΠ΅
vertexList :: Ord a => Graph a -> [a]
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°ΡΡ, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
type OddCycle a = [a]
detectParts :: Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
ΠΠ΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π΄Π΅ΠΊΠ° Π°ΠΊΠΎ ΠΏΡΠΈ ΠΏΡΠ²ΠΎΡΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° Π΄Π»Π°Π±ΠΎΡΠΈΠ½Π° Π½Π°ΡΠ΄ΠΎΠ²ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ΅Π½ ΡΠ°Π±, Π½Π΅ΠΏΠ°ΡΠ½ΠΈΠΎΡ ΡΠΈΠΊΠ»ΡΡ Π»Π΅ΠΆΠΈ Π½Π° Π²ΡΠ²ΠΎΡ Π½Π° ΡΠ΅ΠΊΡΡΠ·ΠΈΠ²Π½ΠΈΠΎΡ ΠΎΡΠ°ΠΊ. Π’Π°ΠΊΠ°, Π·Π° Π΄Π° Π³ΠΎ Π²ΡΠ°ΡΠΈΠΌΠ΅, ΡΡΠ΅Π±Π° Π΄Π° ΠΎΡΡΠ΅ΡΠ΅ΠΌΠ΅ ΡΓ¨, ΠΎΠ΄ ΡΠ΅ΠΊΡΡΠ·ΠΈΠ²Π½ΠΈΠΎΡ ΠΎΡΠ°ΠΊ Π΄ΠΎ ΠΏΡΠ²ΠΎΡΠΎ ΠΏΠΎΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΡΠ΅ΠΌΠ΅.
ΠΠΈΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ Π΄Π»Π°Π±ΠΈΠ½ΡΠΊΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΎΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ Π½Π° Π°ΡΠΎΡΠΈΡΠ°ΡΠΈΠ²Π½Π° Π½ΠΈΠ·Π° ΠΎΠ΄ Π±ΡΠΎΠ΅Π²ΠΈ Π½Π° Π°ΠΊΡΠΈΠΈ Π·Π° ΡΠ΅ΠΊΠΎΠ΅ ΡΠ΅ΠΌΠ΅. ΠΠ°Π³Π°ΡΠΈΠ½ΠΎΡ Π·Π° ΡΠ΅ΠΊΡΡΠ·ΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ ΡΠ΅ ΠΎΠ΄ΡΠΆΡΠ²Π° ΠΏΡΠ΅ΠΊΡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΊΠ»Π°ΡΠ°ΡΠ° Functor Π½Π° ΠΌΠΎΠ½Π°Π΄Π°ΡΠ° ΡΡΠΎ ΡΠ° ΠΈΠ·Π±ΡΠ°Π²ΠΌΠ΅: ΡΠ΅ ΡΡΠ΅Π±Π° ΡΠ°ΠΌΠΎ Π΄Π° Π³ΠΈ ΡΡΠ°Π²ΠΈΠΌΠ΅ ΡΠΈΡΠ΅ ΡΠ΅ΠΌΠΈΡΠ° ΠΎΠ΄ ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° Π²ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ Π²ΡΠ°ΡΠ΅Π½ ΠΎΠ΄ ΡΠ΅ΠΊΡΡΠ·ΠΈΠ²Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°.
ΠΠΎΡΠ°ΡΠ° ΠΏΡΠ²Π° ΠΈΠ΄Π΅ΡΠ° Π±Π΅ΡΠ΅ Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠ°ΠΌ ΠΌΠΎΠ½Π°Π΄Π°ΡΠ° ΠΠ»ΠΈ, ΠΊΠΎΡΠ° ΡΠ΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° Π³ΠΈ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π° ΡΠΎΠΊΠΌΡ Π΅ΡΠ΅ΠΊΡΠΈΡΠ΅ ΡΡΠΎ Π½ΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ. ΠΡΠ²Π°ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΡΡΠΎ ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π² Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π±Π»ΠΈΡΠΊΡ Π΄ΠΎ ΠΎΠ²Π°Π° ΠΎΠΏΡΠΈΡΠ°. ΠΡΡΡΠ½ΠΎΡΡ, ΠΈΠΌΠ°Π² ΠΏΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π²ΠΎ Π΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈ Π½Π° ΠΊΡΠ°ΡΠΎΡ ΡΠ΅ ΡΠ΅ΡΠΈΠ² Π½Π° Π΄ΡΡΠ³Π°.
ΠΡΠ²ΠΎ, ΡΡΠ΅Π±Π° Π΄Π° ΠΎΠ΄ΡΠΆΡΠ²Π°ΠΌΠ΅ Π°ΡΠΎΡΠΈΡΠ°ΡΠΈΠ²Π½Π° Π½ΠΈΠ·Π° Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ Π½Π° Π°ΠΊΡΠΈΠΈ - ΠΎΠ²Π° Π΅ Π½Π΅ΡΡΠΎ Π·Π° Π΄ΡΠΆΠ°Π²Π°ΡΠ°. ΠΡΠΎΡΠΎ, ΡΡΠ΅Π±Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΡΠ΅ΠΌΠ΅ ΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΠΎΡΠΊΡΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ. ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ»ΠΈ Monad Π·Π° ΠΈΠ»ΠΈ, ΠΈΠ»ΠΈ MonadPlus Π·Π° ΠΠΎΠΆΠ΅Π±ΠΈ. ΠΠ»Π°Π²Π½Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° Π΅ Π²ΠΎ ΡΠΎΠ° ΡΡΠΎ ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΡΠ°ΡΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π°ΠΊΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠ°ΡΠ° Π½Π΅ Π΅ ΠΏΡΠ΅ΠΊΠΈΠ½Π°ΡΠ°, Π° ΠΠΎΠΆΠ΅Π±ΠΈ Π²ΡΠ°ΡΠ° ΡΠ°ΠΌΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΎΠ²Π° Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ. ΠΠΈΠ΄Π΅ΡΡΠΈ Π½Π΅ Π½ΠΈ ΡΡΠ΅Π±Π° ΠΏΠΎΡΠ΅Π±Π½Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π·Π° ΡΡΠΏΠ΅Ρ
(ΡΠ°Π° Π΅ Π²Π΅ΡΠ΅ Π·Π°ΡΡΠ²Π°Π½Π° Π²ΠΎ State), ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ ΠΠΎΠΆΠ΅Π±ΠΈ. Π Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΡ ΠΊΠΎΠ³Π° ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΡΠΏΠΎΠΈΠΌΠ΅ Π΅ΡΠ΅ΠΊΡΠΈΡΠ΅ Π½Π° Π΄Π²Π΅ ΠΌΠΎΠ½Π°Π΄ΠΈ, ΡΠΈΠ΅ ΠΈΠ·Π»Π΅Π³ΡΠ²Π°Π°Ρ
ΠΠΎΡΡΠΎ ΠΈΠ·Π±ΡΠ°Π² ΡΠΎΠ»ΠΊΡ ΡΠ»ΠΎΠΆΠ΅Π½ ΡΠΈΠΏ? ΠΠ²Π΅ ΠΏΡΠΈΡΠΈΠ½ΠΈ. ΠΡΠ²ΠΎ, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° ΠΊΠ°ΠΊΠΎ ΠΌΠ½ΠΎΠ³Ρ ΡΠ»ΠΈΡΠ½Π° Π½Π° ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ². ΠΡΠΎΡΠΎ, ΡΡΠ΅Π±Π° Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°ΠΌΠ΅ ΡΠΎ ΠΏΠΎΠ²ΡΠ°ΡΠ½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π²ΠΎ ΡΠ»ΡΡΠ°Ρ Π½Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ ΠΊΠΎΠ³Π° ΡΠ΅ Π²ΡΠ°ΡΠ°ΠΌΠ΅ ΠΎΠ΄ ΡΠ΅ΠΊΡΡΠ·ΠΈΡΠ° Π·Π° Π΄Π° ΡΠ° Π²ΡΠ°ΡΠΈΠΌΠ΅ Π½Π΅ΠΏΠ°ΡΠ½Π°ΡΠ° ΡΠ°ΠΌΠΊΠ°, ΡΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π²ΠΎ ΠΌΠΎΠ½Π°Π΄Π°ΡΠ° ΠΠΎΠΆΠ΅Π±ΠΈ.
Π’Π°ΠΊΠ° ΡΠ° Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ ΠΎΠ²Π°Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°.
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}
data Part = LeftPart | RightPart
otherPart :: Part -> Part
otherPart LeftPart = RightPart
otherPart RightPart = LeftPart
type PartMap a = Map.Map a Part
type OddCycle a = [a]
toEither :: Ord a => PartMap a -> a -> Either a a
toEither m v = case fromJust (v `Map.lookup` m) of
LeftPart -> Left v
RightPart -> Right v
type PartMonad a = MaybeT (State (PartMap a)) [a]
detectParts :: forall a. Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
detectParts g = case runState (runMaybeT dfs) Map.empty of
(Just c, _) -> Left $ oddCycle c
(Nothing, m) -> Right $ toBipartiteWith (toEither m) g
where
inVertex :: Part -> a -> PartMonad a
inVertex p v = ((:) v) <$> do modify $ Map.insert v p
let q = otherPart p
msum [ onEdge q u | u <- neigbours v g ]
{-# INLINE onEdge #-}
onEdge :: Part -> a -> PartMonad a
onEdge p v = do m <- get
case v `Map.lookup` m of
Nothing -> inVertex p v
Just q -> do guard (q /= p)
return [v]
processVertex :: a -> PartMonad a
processVertex v = do m <- get
guard (v `Map.notMember` m)
inVertex LeftPart v
dfs :: PartMonad a
dfs = msum [ processVertex v | v <- vertexList g ]
oddCycle :: [a] -> [a]
oddCycle c = tail (dropWhile ((/=) last c) c)
ΠΠ»ΠΎΠΊΠΎΡ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π΅ ΡΠ°Π΄ΡΠΎΡΠΎ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ. ΠΠ΅ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° ΠΎΠ±ΡΠ°ΡΠ½Π°ΠΌ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π²Π½Π°ΡΡΠ΅.
- inVertex Π΅ Π΄Π΅Π» ΠΎΠ΄ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π·Π° ΠΏΡΠ² ΠΏΠ°Ρ Π²ΠΎ Π΄Π»Π°Π±ΠΎΡΠΈΠ½Π° ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π³ΠΎ ΠΏΠΎΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΏΡΠ² ΠΏΠ°Ρ. ΠΠ²Π΄Π΅ Π΄ΠΎΠ΄Π΅Π»ΡΠ²Π°ΠΌΠ΅ Π±ΡΠΎΡ Π·Π° ΡΠΏΠΎΠ΄Π΅Π»ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΈ Π³ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ onEdge Π½Π° ΡΠΈΡΠ΅ ΡΠΎΡΠ΅Π΄ΠΈ. ΠΠ²Π° Π΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠ΅ΡΡΠΎΡΠΎ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π³ΠΎ Π²ΡΠ°ΡΠ°ΠΌΠ΅ ΡΡΠ΅ΠΊΠΎΡ Π½Π° ΠΏΠΎΠ²ΠΈΡΠΈ: Π°ΠΊΠΎ msum Π²ΡΠ°ΡΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡ, Π³ΠΎ ΡΡΡΠΊΠ°ΠΌΠ΅ ΡΠ΅ΠΌΠ΅ΡΠΎ v ΡΠ°ΠΌΡ.
- oneEdge Π΅ Π΄Π΅Π»ΠΎΡ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π³ΠΎ ΠΏΠΎΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠ°Π±ΠΎΡ. Π‘Π΅ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° Π΄Π²Π°ΠΏΠ°ΡΠΈ Π·Π° ΡΠ΅ΠΊΠΎΡ ΡΠ°Π±. ΠΠ²Π΄Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΎΠ΄ Π΄ΡΡΠ³Π°ΡΠ° ΡΡΡΠ°Π½Π° Π΅ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΎ, Π° Π°ΠΊΠΎ Π½Π΅ Π΅ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΎ. ΠΠΊΠΎ Π΅ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΎ, ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ ΡΠ°Π±ΠΎΡ Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ΅Π½. ΠΠΊΠΎ Π΅ ΡΠ°ΠΊΠ°, ΡΠ° Π²ΡΠ°ΡΠ°ΠΌΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° - ΡΠ°ΠΌΠΈΠΎΡ Π²ΡΠ² Π½Π° ΡΠ΅ΠΊΡΡΠ·ΠΈΠ²Π½ΠΈΠΎΡ ΠΎΡΠ°ΠΊ, ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΡΠ΅ΠΌΠΈΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π°Ρ ΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΏΠΎ Π²ΡΠ°ΡΠ°ΡΠ΅ΡΠΎ.
- processVertex ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π·Π° ΡΠ΅ΠΊΠΎΠ΅ ΡΠ΅ΠΌΠ΅ Π΄Π°Π»ΠΈ Π΅ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΎ ΠΈ ΡΠ°Π±ΠΎΡΠΈ Π²ΠΎ Vertex Π½Π° Π½Π΅Π³ΠΎ Π°ΠΊΠΎ Π½Π΅.
- dfs ΡΠ°Π±ΠΎΡΠΈ processVertex Π½Π° ΡΠΈΡΠ΅ ΡΠ΅ΠΌΠΈΡΠ°.
Π’ΠΎΠ° Π΅ ΡΠ΅.
ΠΡΡΠΎΡΠΈΡΠ° Π½Π° Π·Π±ΠΎΡΠΎΡ INLINE
ΠΠ±ΠΎΡΠΎΡ INLINE Π½Π΅ Π±Π΅ΡΠ΅ Π²ΠΎ ΠΏΡΠ²Π°ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ; ΡΠΎΡ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ ΠΏΠΎΠ΄ΠΎΡΠ½Π°. ΠΠΎΠ³Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° Π½Π°ΡΠ΄Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°, ΠΎΡΠΊΡΠΈΠ² Π΄Π΅ΠΊΠ° Π½Π΅-INLINE Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ±Π°Π²Π½Π° Π½Π° Π½Π΅ΠΊΠΎΠΈ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΈ. ΠΠΌΠ°ΡΡΠΈ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ ΠΈΡΡΠΎ, ΠΎΠ²Π° ΠΌΠ½ΠΎΠ³Ρ ΠΌΠ΅ ΠΈΠ·Π½Π΅Π½Π°Π΄ΠΈ. Π£ΡΡΠ΅ ΠΏΠΎΡΡΠ΄Π½ΠΎ, Π½Π° Π΄ΡΡΠ³Π° ΠΌΠ°ΡΠΈΠ½Π° ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° GHC Π½Π΅ΠΌΠ°ΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡΠ΅Π»Π½Π° ΡΠ°Π·Π»ΠΈΠΊΠ°.
ΠΡΠΊΠ°ΠΊΠΎ ΠΏΠΎΠΌΠΈΠ½Π°Π² Π΅Π΄Π½Π° Π½Π΅Π΄Π΅Π»Π° ΡΠΈΡΠ°ΡΡΠΈ Π³ΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ Π½Π° GHC Core, ΡΡΠΏΠ΅Π°Π² Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΡΠ°Π²Π°ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ Π΅Π΄Π½Π° Π»ΠΈΠ½ΠΈΡΠ° Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ½Π° INLINE. ΠΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠΌΠ΅ΡΡ GHC 8.4.4 ΠΈ GHC 8.6.5, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΠΎΡ ΠΏΡΠ΅ΡΡΠ°Π½Π° Π΄Π° Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ° ΡΠ°ΠΌ.
ΠΠ΅ ΠΎΡΠ΅ΠΊΡΠ²Π°Π² Π΄Π° Π½Π°ΠΈΠ΄Π°ΠΌ Π½Π° ΡΠ°ΠΊΠ²Π° Π½Π΅ΡΠΈΡΡΠΎΡΠΈΡΠ° Π²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅ΡΠΎ Π₯Π°ΡΠΊΠ΅Π». Π‘Π΅ΠΏΠ°ΠΊ, Π΄ΡΡΠΈ ΠΈ Π΄Π΅Π½Π΅Ρ, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ½Π΅ΠΊΠΎΠ³Π°Ρ ΠΏΡΠ°Π²Π°Ρ Π³ΡΠ΅ΡΠΊΠΈ ΠΈ Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π΅ Π΄Π° ΠΈΠΌ Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΠΎΠ²Π΅ΡΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ²Π΄Π΅ Π·Π½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π²ΠΌΠ΅ΡΠ½Π°ΡΠ° Π·Π°ΡΠΎΠ° ΡΡΠΎ Π΅ Π²ΠΌΠ΅ΡΠ½Π°ΡΠ° Π²ΠΎ ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ°, ΠΈ ΠΎΠ²Π° Π΅ ΠΏΡΠΈΡΠΈΠ½Π° Π΄Π° ΠΌΡ Π΄Π°Π΄Π΅ΠΌΠ΅ Π½Π°Π²Π΅ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ.
Π¨ΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠΈ ΡΠ»Π΅Π΄Π½ΠΎ?
ΠΠΎΡΠΎΠ° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π² Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π₯ΠΎΠΏΠΊΡΠΎΡΡ-ΠΠ°ΡΠΏ ΡΠΎ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈ ΠΈ ΡΠΎΠ° Π±Π΅ΡΠ΅ ΠΊΡΠ°ΡΠΎΡ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Google Summer of Code, ΡΡΠ΅ΠΊΠ½Π°Π² ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ Π²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅, ΡΡΠΎ Π½Π΅ ΡΠ°ΠΌΠΎ ΡΡΠΎ ΠΌΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π° Π΄Π° Π΄ΠΎΠ±ΠΈΡΠ°ΠΌ ΡΡΠ°ΠΆΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ»ΠΈΡΠ°ΡΠ° ΠΠ°Π½Π΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π»Π΅ΡΠΎ (Π½Π΅ ΡΡΠΌ ΡΠΈΠ³ΡΡΠ΅Π½ ΠΊΠΎΠ»ΠΊΡ ΠΎΠ²Π° ΠΌΠ΅ΡΡΠΎ Π΅ ΠΏΠΎΠ·Π½Π°ΡΠΎ Π΄ΡΡΠΈ ΠΈ ΠΌΠ΅ΡΡ ΡΠΏΠ°ΡΠ΅Π½Π°ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ° Π½Π° Π₯Π°Π±Ρ, Π½ΠΎ ΡΠΎΠ° Π΅ Π΅Π΄Π½ΠΎ ΠΎΠ΄ ΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π»Π΅ΡΡΠ²Π°ΡΠ΅ Π·Π° Π΄Π° ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ Π²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅), Π½ΠΎ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠ΅ Π²ΠΎΠ²Π΅Π΄Π΅ Π²ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΈΠΎΡ ΡΠ²Π΅Ρ Π½Π° ΠΏΡΠΈΠΌΠ΅Π½Π° Π½Π° ΠΎΠ²Π°Π° ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ° Π²ΠΎ ΠΏΡΠ°ΠΊΡΠ°, Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΎΠ΄ ΠΌΠΎΠ΅ΡΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ Π²ΠΎ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ ΡΠ°Π·ΠΈΡΠΈ.
ΠΠ·Π²ΠΎΡ: www.habr.com