Pokus o vytvoření giga kurzu propojeného grafem https://ksp.vsq.cz/grafik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2584 lines
117 KiB

  1. {
  2. "tasks": [
  3. {
  4. "id": "26-Z1-1",
  5. "type": "open-data",
  6. "comment": "Kevin a magnety - triviální, lineární průchod pole",
  7. "requires": [
  8. "kucharka-zakladni-reprezentace-dat"
  9. ],
  10. "title": "Kevin a magnety",
  11. "position": [
  12. -475.45594787597656,
  13. 552.3078842163086
  14. ],
  15. "taskReference": "26-Z1-1",
  16. "points": 8
  17. },
  18. {
  19. "id": "26-Z1-2",
  20. "type": "open-data",
  21. "comment": "Piškvorky - detekce vítězství v piškvorkách, procházení 2D pole v různych směrech",
  22. "requires": [
  23. "26-Z4-3"
  24. ],
  25. "position": [
  26. -1980.3810119628906,
  27. -886.6939468383789
  28. ],
  29. "taskReference": "26-Z1-2",
  30. "title": "Piškvorky",
  31. "hidden": true,
  32. "points": 10
  33. },
  34. {
  35. "id": "26-Z1-3",
  36. "type": "open-data",
  37. "comment": "Zamilovaný dopis - triviální, procházení stringů po znacích a kontrola podmínek",
  38. "requires": [
  39. "label-retezce",
  40. "30-Z1-3"
  41. ],
  42. "position": [
  43. -254.43450927734375,
  44. 1299.0439147949219
  45. ],
  46. "taskReference": "26-Z1-3",
  47. "title": "Zamilovaný dopis",
  48. "hidden": false,
  49. "points": 10
  50. },
  51. {
  52. "id": "26-Z1-4",
  53. "type": "open-data",
  54. "comment": "Hroch v jezeře - BFS či jiné prohledávání, počítání velikosti komponent v 2D poli, ",
  55. "requires": [
  56. "label-grafy",
  57. "26-Z4-4"
  58. ],
  59. "position": [
  60. -923.5020141601562,
  61. 1551.3793830871582
  62. ],
  63. "taskReference": "26-Z1-4",
  64. "title": "Hroch v jezeře",
  65. "hidden": false,
  66. "points": 12
  67. },
  68. {
  69. "id": "26-Z2-1",
  70. "type": "open-data",
  71. "comment": "Had z domina - triviální, linerání průchod pole a počítání, na kolika místech platí podmínka, vyžaduje práci se dvojicemi",
  72. "requires": [
  73. "label-1d-pole",
  74. "kucharka-zakladni-pole"
  75. ],
  76. "position": [
  77. -230.18401336669922,
  78. 773.8297576904297
  79. ],
  80. "taskReference": "26-Z2-1",
  81. "title": "Had z domina",
  82. "points": 8
  83. },
  84. {
  85. "id": "26-Z2-2",
  86. "type": "open-data",
  87. "comment": "SADO - triviální, procházení celých čísel v intervalu a kontrola podmínky",
  88. "requires": [
  89. "kucharka-zakladni-algoritmus"
  90. ],
  91. "position": [
  92. -427.0237350463867,
  93. 385.39715576171875
  94. ],
  95. "taskReference": "26-Z2-2",
  96. "title": "SADO",
  97. "hidden": false,
  98. "points": 10
  99. },
  100. {
  101. "id": "26-Z2-3",
  102. "type": "open-data",
  103. "comment": "Šifrovaná zpráva - práce s řetězci, hledání mapování mezi písmenky (substitučka) a validace, že jinde substitučka funguje",
  104. "requires": [
  105. "label-retezce",
  106. "26-Z1-3"
  107. ],
  108. "position": [
  109. -354.69641876220703,
  110. 1346.3564147949219
  111. ],
  112. "taskReference": "26-Z2-3",
  113. "title": "Šifrovaná zpráva",
  114. "hidden": false,
  115. "points": 10
  116. },
  117. {
  118. "id": "26-Z2-4",
  119. "type": "open-data",
  120. "comment": "Životně důležitá úloha - dostanu pole čísel, potřebuju v něm najít pravidelně se opakující výskyty hodnot, relativně složitá práce s poli, dvojcemi apod.",
  121. "requires": [
  122. "26-Z2-1"
  123. ],
  124. "title": "Životně důležitá úloha",
  125. "position": [
  126. -151.34776544570923,
  127. 917.8198776245117
  128. ],
  129. "taskReference": "26-Z2-4",
  130. "points": 12
  131. },
  132. {
  133. "id": "26-Z3-1",
  134. "type": "open-data",
  135. "comment": "Zámky labyrintu - hromada ifů, vhodné možná na code review, hledání čísla z trojice takového, že je trojice aritmetrická posloupnost",
  136. "requires": [],
  137. "position": [
  138. 1205.6161193847656,
  139. 327.53318786621094
  140. ],
  141. "taskReference": "26-Z3-1",
  142. "title": "Zámky labyrintu",
  143. "hidden": true,
  144. "points": 8
  145. },
  146. {
  147. "id": "26-Z3-2",
  148. "type": "open-data",
  149. "comment": "Čarodějova šifra - šifrování mřížkou, práce se stringy, rotace matice, vhodné na code review?, docela hard",
  150. "requires": [
  151. "29-Z3-2"
  152. ],
  153. "position": [
  154. -567.4507141113281,
  155. 1441.9199829101562
  156. ],
  157. "taskReference": "26-Z3-2",
  158. "title": "Čarodějova šifra",
  159. "hidden": false,
  160. "points": 10
  161. },
  162. {
  163. "id": "26-Z3-3",
  164. "type": "open-data",
  165. "comment": "Hádanka - triky s dělitelností devíti a rozkladem čísel, docela hard teorie",
  166. "requires": [],
  167. "position": [
  168. 1244.6161193847656,
  169. 406.53318786621094
  170. ],
  171. "taskReference": "26-Z3-3",
  172. "title": "Hádanka",
  173. "hidden": true,
  174. "points": 10
  175. },
  176. {
  177. "id": "26-Z3-4",
  178. "type": "open-data",
  179. "comment": "Tvar labyrintu - nejdelší cesta ve stromě, graf",
  180. "requires": [
  181. "kucharka-zakladni-stromy"
  182. ],
  183. "position": [
  184. -1069.7008056640625,
  185. 1410.7956008911133
  186. ],
  187. "taskReference": "26-Z3-4",
  188. "title": "Tvar labyrintu",
  189. "points": 12
  190. },
  191. {
  192. "id": "26-Z4-1",
  193. "type": "open-data",
  194. "comment": "Vražedná čísla- WTF, teorie čísel, hard as fuck, divný",
  195. "requires": [],
  196. "position": [
  197. 1087.2091645675546,
  198. 270.43162285670724
  199. ],
  200. "taskReference": "26-Z4-1",
  201. "title": "Vražedná čísla",
  202. "hidden": true,
  203. "points": 8
  204. },
  205. {
  206. "id": "26-Z4-2",
  207. "type": "open-data",
  208. "comment": "Sbírání vajíček - hledení mediánu, musí se to ale vymyslet, nejkratší cesta při chození tam a zpět",
  209. "requires": [],
  210. "position": [
  211. 543.2475501644587,
  212. -786.0833304046971
  213. ],
  214. "taskReference": "26-Z4-2",
  215. "title": "Sbírání vajíček",
  216. "hidden": true,
  217. "points": 10
  218. },
  219. {
  220. "id": "26-Z4-3",
  221. "type": "open-data",
  222. "comment": "Hra Othello - link na 26-Z1-2, procházení 2D pole po různých směrech",
  223. "requires": [
  224. "label-2d-pole"
  225. ],
  226. "title": "Hra Othello",
  227. "position": [
  228. -1922.4027099609375,
  229. -929.747673034668
  230. ],
  231. "taskReference": "26-Z4-3",
  232. "hidden": true,
  233. "points": 10
  234. },
  235. {
  236. "id": "26-Z4-4",
  237. "type": "open-data",
  238. "comment": "Hlídači v labyrintu - policajti hlídající na grafu, konkrétně na stromě, rekurze, technicky asi až DP",
  239. "requires": [
  240. "kucharka-zakladni-stromy"
  241. ],
  242. "position": [
  243. -929.5531616210938,
  244. 1411.2905349731445
  245. ],
  246. "taskReference": "26-Z4-4",
  247. "title": "Hlídači v labyrintu",
  248. "points": 12
  249. },
  250. {
  251. "type": "open-data",
  252. "id": "27-1-4",
  253. "taskReference": "27-1-4",
  254. "requires": [],
  255. "position": [
  256. 2106.817985534668,
  257. 1146.6559019088745
  258. ],
  259. "title": "Head-up display",
  260. "hidden": true,
  261. "points": 10
  262. },
  263. {
  264. "type": "open-data",
  265. "id": "27-2-5",
  266. "taskReference": "27-2-5",
  267. "requires": [],
  268. "position": [
  269. 1217.155632019043,
  270. 1124.5684385299683
  271. ],
  272. "title": "Nejdelší příkaz",
  273. "hidden": true,
  274. "points": 12
  275. },
  276. {
  277. "type": "open-data",
  278. "id": "27-3-5",
  279. "taskReference": "27-3-5",
  280. "requires": [],
  281. "position": [
  282. -1834.666145324707,
  283. -733.8038759231567
  284. ],
  285. "title": "Komprese obrazu",
  286. "hidden": true,
  287. "points": 10
  288. },
  289. {
  290. "type": "open-data",
  291. "id": "27-4-5",
  292. "taskReference": "27-4-5",
  293. "requires": [],
  294. "position": [
  295. 2081.3400802612305,
  296. 790.309832572937
  297. ],
  298. "title": "Večeře pro opraváře",
  299. "hidden": true,
  300. "points": 12
  301. },
  302. {
  303. "type": "open-data",
  304. "id": "27-5-3",
  305. "taskReference": "27-5-3",
  306. "requires": [],
  307. "position": [
  308. 2056.503044128418,
  309. 625.5225400924683
  310. ],
  311. "title": "Čekání na poště",
  312. "hidden": true,
  313. "points": 9
  314. },
  315. {
  316. "type": "open-data",
  317. "id": "27-Z1-1",
  318. "taskReference": "27-Z1-1",
  319. "requires": [
  320. "kucharka-zakladni-reprezentace-dat"
  321. ],
  322. "position": [
  323. -382.19495391845703,
  324. 591.276141166687
  325. ],
  326. "title": "Na zastávce",
  327. "hidden": false,
  328. "points": 8
  329. },
  330. {
  331. "type": "open-data",
  332. "id": "27-Z1-2",
  333. "taskReference": "27-Z1-2",
  334. "requires": [],
  335. "position": [
  336. 1739.7698287963867,
  337. -160.9592409133911
  338. ],
  339. "title": "Kalkulačka",
  340. "comment": "jednoduché načtení vstupu a pak vyhodnocení",
  341. "hidden": true,
  342. "points": 10
  343. },
  344. {
  345. "type": "open-data",
  346. "id": "27-Z1-3",
  347. "taskReference": "27-Z1-3",
  348. "requires": [],
  349. "position": [
  350. 1518.409294128418,
  351. 1245.754168510437
  352. ],
  353. "title": "Slovník T9",
  354. "hidden": true,
  355. "points": 10
  356. },
  357. {
  358. "type": "open-data",
  359. "id": "27-Z1-4",
  360. "taskReference": "27-Z1-4",
  361. "requires": [],
  362. "position": [
  363. 1333.111198425293,
  364. 1194.713885307312
  365. ],
  366. "title": "Lyžař",
  367. "hidden": true,
  368. "points": 12
  369. },
  370. {
  371. "id": "27-Z2-1",
  372. "type": "open-data",
  373. "comment": "Závorky z cereálií - 2 průchody pole, závorky",
  374. "requires": [
  375. "kucharka-zakladni-pole"
  376. ],
  377. "position": [
  378. -330.92587089538574,
  379. 824.1362380981445
  380. ],
  381. "taskReference": "27-Z2-1",
  382. "title": "Závorky z cereálií",
  383. "points": 8
  384. },
  385. {
  386. "type": "open-data",
  387. "id": "27-Z2-2",
  388. "taskReference": "27-Z2-2",
  389. "requires": [],
  390. "position": [
  391. 898.155632019043,
  392. 1242.5684385299683
  393. ],
  394. "title": "Hrnce od Horsta",
  395. "hidden": true,
  396. "points": 10
  397. },
  398. {
  399. "type": "open-data",
  400. "id": "27-Z2-3",
  401. "taskReference": "27-Z2-3",
  402. "requires": [],
  403. "position": [
  404. 807.7896041870117,
  405. 1313.9344053268433
  406. ],
  407. "title": "Nápis na tričku",
  408. "hidden": true,
  409. "points": 10
  410. },
  411. {
  412. "type": "open-data",
  413. "id": "27-Z2-4",
  414. "taskReference": "27-Z2-4",
  415. "requires": [],
  416. "position": [
  417. 1017.155632019043,
  418. 1255.5684385299683
  419. ],
  420. "title": "Hořící auto",
  421. "hidden": true,
  422. "points": 12
  423. },
  424. {
  425. "type": "open-data",
  426. "id": "27-Z3-1",
  427. "taskReference": "27-Z3-1",
  428. "requires": [],
  429. "position": [
  430. 489.8798141479492,
  431. 1566.5902891159058
  432. ],
  433. "title": "Kevin nabíječ, s.r.o.",
  434. "comment": "chyták v posledním vstupu, jinak fakt jednoduchá",
  435. "hidden": true,
  436. "points": 8
  437. },
  438. {
  439. "type": "open-data",
  440. "id": "27-Z3-2",
  441. "taskReference": "27-Z3-2",
  442. "requires": [],
  443. "position": [
  444. 1269.155632019043,
  445. 1015.5684385299683
  446. ],
  447. "title": "Nedej vitagen",
  448. "hidden": true,
  449. "points": 10
  450. },
  451. {
  452. "type": "open-data",
  453. "id": "27-Z3-3",
  454. "taskReference": "27-Z3-3",
  455. "requires": [],
  456. "position": [
  457. -2202.1037907600403,
  458. -397.1529359817505
  459. ],
  460. "title": "Superstromy",
  461. "comment": "třízení pole (info o counting sortu)",
  462. "hidden": true,
  463. "points": 10
  464. },
  465. {
  466. "type": "open-data",
  467. "id": "27-Z3-4",
  468. "taskReference": "27-Z3-4",
  469. "requires": [
  470. "30-Z2-2"
  471. ],
  472. "position": [
  473. -1323.016975402832,
  474. -704.395977973938
  475. ],
  476. "title": "Robo Rally",
  477. "hidden": true,
  478. "points": 12,
  479. "comment": "Navazuje na 30-Z2-2, jediný rozdíl je v otáčení a pohybu vpřed oproti pohybu do čtyř směrů"
  480. },
  481. {
  482. "type": "open-data",
  483. "id": "27-Z4-1",
  484. "taskReference": "27-Z4-1",
  485. "requires": [],
  486. "position": [
  487. 1573.334342956543,
  488. -36.192124366760254
  489. ],
  490. "title": "Záhada Pražského orloje",
  491. "comment": "Euklidův algoritmus, potřeba vymyslet přes matematiku",
  492. "hidden": true,
  493. "points": 8
  494. },
  495. {
  496. "type": "open-data",
  497. "id": "27-Z4-2",
  498. "taskReference": "27-Z4-2",
  499. "requires": [],
  500. "position": [
  501. -1739.9302444458008,
  502. -835.0557069778442
  503. ],
  504. "title": "Unavení u oken",
  505. "hidden": true,
  506. "points": 10
  507. },
  508. {
  509. "type": "open-data",
  510. "id": "27-Z4-3",
  511. "taskReference": "27-Z4-3",
  512. "requires": [],
  513. "position": [
  514. 974.155632019043,
  515. 1158.5684385299683
  516. ],
  517. "title": "Běžkaři v Praze!",
  518. "hidden": true,
  519. "points": 10
  520. },
  521. {
  522. "type": "open-data",
  523. "id": "27-Z4-4",
  524. "taskReference": "27-Z4-4",
  525. "requires": [],
  526. "position": [
  527. 1363.676628112793,
  528. 1480.8441953659058
  529. ],
  530. "title": "Koňské skoky",
  531. "hidden": true,
  532. "points": 12
  533. },
  534. {
  535. "type": "open-data",
  536. "id": "28-1-1",
  537. "taskReference": "28-1-1",
  538. "requires": [
  539. "31-Z3-2"
  540. ],
  541. "position": [
  542. -842.9662780761719,
  543. 2112.172149658203
  544. ],
  545. "title": "Jízda na biomotorce",
  546. "comment": "Prohledávání statového prostoru - hledání cesty v obohacneném grafu",
  547. "hidden": false,
  548. "points": 10
  549. },
  550. {
  551. "type": "open-data",
  552. "id": "28-1-5",
  553. "taskReference": "28-1-5",
  554. "requires": [],
  555. "position": [
  556. 2578.8408203125,
  557. 1227.2563781738281
  558. ],
  559. "title": "Likvidace plísně",
  560. "hidden": true,
  561. "points": 10
  562. },
  563. {
  564. "type": "open-data",
  565. "id": "28-2-5",
  566. "taskReference": "28-2-5",
  567. "requires": [],
  568. "position": [
  569. 2579.950439453125,
  570. 1310.4740905761719
  571. ],
  572. "title": "Hlídání věznice",
  573. "hidden": true,
  574. "points": 10
  575. },
  576. {
  577. "type": "open-data",
  578. "id": "28-3-5",
  579. "taskReference": "28-3-5",
  580. "requires": [],
  581. "position": [
  582. 2434.5966796875,
  583. 1312.6931457519531
  584. ],
  585. "title": "Závaží z fošen",
  586. "hidden": true,
  587. "points": 8
  588. },
  589. {
  590. "type": "open-data",
  591. "id": "28-4-4",
  592. "taskReference": "28-4-4",
  593. "requires": [],
  594. "position": [
  595. 2251.517822265625,
  596. 1337.1037902832031
  597. ],
  598. "title": "Podivuhodný obraz",
  599. "hidden": true,
  600. "points": 12
  601. },
  602. {
  603. "type": "open-data",
  604. "id": "28-5-6",
  605. "taskReference": "28-5-6",
  606. "requires": [],
  607. "position": [
  608. 2071.767333984375,
  609. 1343.7611389160156
  610. ],
  611. "title": "Sloty na iridium",
  612. "hidden": true,
  613. "points": 11
  614. },
  615. {
  616. "id": "28-Z1-1",
  617. "type": "open-data",
  618. "taskReference": "28-Z1-1",
  619. "comment": "triviální, průchod pole",
  620. "requires": [
  621. "26-Z2-2"
  622. ],
  623. "position": [
  624. -584.5371713638306,
  625. 479.4455375671387
  626. ],
  627. "title": "Kevinův leták",
  628. "hidden": false,
  629. "points": 8
  630. },
  631. {
  632. "id": "28-Z1-2",
  633. "type": "open-data",
  634. "taskReference": "28-Z1-2",
  635. "comment": "dělitelnost",
  636. "requires": [],
  637. "position": [
  638. 1741.000244140625,
  639. 39.6094856262207
  640. ],
  641. "title": "Sářina hra",
  642. "hidden": true,
  643. "points": 10
  644. },
  645. {
  646. "id": "28-Z1-3",
  647. "type": "open-data",
  648. "taskReference": "28-Z1-3",
  649. "comment": "dělení a modulení",
  650. "requires": [],
  651. "position": [
  652. 1519.6990966796875,
  653. 37.605228424072266
  654. ],
  655. "title": "Petrovy stromy",
  656. "hidden": true,
  657. "points": 10
  658. },
  659. {
  660. "id": "28-Z1-4",
  661. "type": "open-data",
  662. "taskReference": "28-Z1-4",
  663. "comment": "hledání komponent souvislosti",
  664. "requires": [],
  665. "position": [
  666. -805.9155197143555,
  667. 1901.931526184082
  668. ],
  669. "title": "Zuzčina zvědavost",
  670. "hidden": true,
  671. "points": 12
  672. },
  673. {
  674. "id": "28-Z2-1",
  675. "type": "open-data",
  676. "taskReference": "28-Z2-1",
  677. "comment": "hledání podřetězce",
  678. "requires": [],
  679. "position": [
  680. -189.9454116821289,
  681. 1464.5558776855469
  682. ],
  683. "title": "Před muzeem",
  684. "hidden": false,
  685. "points": 8
  686. },
  687. {
  688. "id": "28-Z2-2",
  689. "type": "open-data",
  690. "taskReference": "28-Z2-2",
  691. "comment": "Collatzova domněnka",
  692. "requires": [],
  693. "position": [
  694. 1401.8692626953125,
  695. -524.0748901367188
  696. ],
  697. "title": "Práce pro Sáru",
  698. "hidden": true,
  699. "points": 10
  700. },
  701. {
  702. "id": "28-Z2-3",
  703. "type": "open-data",
  704. "taskReference": "28-Z2-3",
  705. "comment": "seznam sousedů, hledání kružnic dané velikosti (3)",
  706. "requires": [],
  707. "position": [
  708. 1261.51611328125,
  709. -521.9762878417969
  710. ],
  711. "title": "Byli jsme tři",
  712. "hidden": true,
  713. "points": 10
  714. },
  715. {
  716. "id": "28-Z2-4",
  717. "type": "open-data",
  718. "taskReference": "28-Z2-4",
  719. "comment": "spojový seznam nebo eulerovský tah",
  720. "requires": [
  721. "kucharka-zakladni-spojovy-seznam"
  722. ],
  723. "position": [
  724. -607.6408081054688,
  725. 953.0994148254395
  726. ],
  727. "title": "Rozsypaná turbína",
  728. "points": 12
  729. },
  730. {
  731. "id": "28-Z3-1",
  732. "type": "open-data",
  733. "taskReference": "28-Z3-1",
  734. "comment": "nalezení minima a maxima",
  735. "requires": [],
  736. "position": [
  737. 479.60821533203125,
  738. -825.9333801269531
  739. ],
  740. "title": "Místo oslavy",
  741. "hidden": true,
  742. "points": 8
  743. },
  744. {
  745. "id": "28-Z3-2",
  746. "type": "open-data",
  747. "taskReference": "28-Z3-2",
  748. "comment": "matematika",
  749. "requires": [],
  750. "position": [
  751. 1637.5750732421875,
  752. 40.6045036315918
  753. ],
  754. "title": "Zlomkovník",
  755. "hidden": true,
  756. "points": 10
  757. },
  758. {
  759. "id": "28-Z3-3",
  760. "type": "open-data",
  761. "taskReference": "28-Z3-3",
  762. "comment": "zjednodušení problému??",
  763. "requires": [],
  764. "position": [
  765. 874.887451171875,
  766. -94.75247955322266
  767. ],
  768. "title": "Posloupnost za trest",
  769. "hidden": true,
  770. "points": 10
  771. },
  772. {
  773. "id": "28-Z3-4",
  774. "type": "open-data",
  775. "taskReference": "28-Z3-4",
  776. "comment": "rekurze (není to jednoduché)",
  777. "requires": [],
  778. "position": [
  779. 982.91064453125,
  780. -295.6294708251953
  781. ],
  782. "title": "Zbývající úkoly",
  783. "hidden": true,
  784. "points": 12
  785. },
  786. {
  787. "id": "28-Z4-1",
  788. "type": "open-data",
  789. "taskReference": "28-Z4-1",
  790. "comment": "souřadnice",
  791. "requires": [],
  792. "position": [
  793. 509.86163330078125,
  794. -157.92288208007812
  795. ],
  796. "title": "Půdorys",
  797. "hidden": true,
  798. "points": 8
  799. },
  800. {
  801. "id": "28-Z4-2",
  802. "type": "open-data",
  803. "taskReference": "28-Z4-2",
  804. "comment": "triviální průchod 2D pole",
  805. "requires": [],
  806. "position": [
  807. -1374.1679382324219,
  808. -835.1339645385742
  809. ],
  810. "title": "Vykopávky",
  811. "hidden": true,
  812. "points": 10
  813. },
  814. {
  815. "id": "28-Z4-3",
  816. "type": "open-data",
  817. "taskReference": "28-Z4-3",
  818. "comment": "binární vyhledávání, třídění",
  819. "requires": [
  820. "kucharka-zakladni-binarni-vyhledavani"
  821. ],
  822. "position": [
  823. -1133.7586975097656,
  824. 879.2374420166016
  825. ],
  826. "title": "Mocniny",
  827. "points": 10
  828. },
  829. {
  830. "id": "28-Z4-4",
  831. "type": "open-data",
  832. "taskReference": "28-Z4-4",
  833. "comment": "dynamické programování, práce s čísly",
  834. "requires": [
  835. "kucharka-zakladni-dynamicke-programovani"
  836. ],
  837. "position": [
  838. 475.0968322753906,
  839. 950.3754272460938
  840. ],
  841. "title": "Čtyřková",
  842. "points": 12,
  843. "hidden": false
  844. },
  845. {
  846. "type": "open-data",
  847. "id": "29-1-4",
  848. "taskReference": "29-1-4",
  849. "requires": [],
  850. "position": [
  851. 2426.829833984375,
  852. 1231.6946105957031
  853. ],
  854. "title": "Zběsilý útěk",
  855. "hidden": true,
  856. "points": 10
  857. },
  858. {
  859. "type": "open-data",
  860. "id": "29-2-4",
  861. "taskReference": "29-2-4",
  862. "requires": [],
  863. "position": [
  864. 2267.0517578125,
  865. 1250.5573425292969
  866. ],
  867. "title": "Nejsložitější záhon",
  868. "hidden": true,
  869. "points": 9
  870. },
  871. {
  872. "type": "open-data",
  873. "id": "29-3-1",
  874. "taskReference": "29-3-1",
  875. "requires": [],
  876. "position": [
  877. 2419.062744140625,
  878. 1162.9012756347656
  879. ],
  880. "title": "Verbování",
  881. "hidden": true,
  882. "points": 8
  883. },
  884. {
  885. "type": "open-data",
  886. "id": "29-4-3",
  887. "taskReference": "29-4-3",
  888. "requires": [],
  889. "position": [
  890. 2269.270751953125,
  891. 1179.5448913574219
  892. ],
  893. "title": "Výhružné dopisy",
  894. "hidden": true,
  895. "points": 11
  896. },
  897. {
  898. "type": "open-data",
  899. "id": "29-5-1",
  900. "taskReference": "29-5-1",
  901. "requires": [],
  902. "position": [
  903. 2420.17236328125,
  904. 1096.3271789550781
  905. ],
  906. "title": "Holubí pošta",
  907. "hidden": true,
  908. "points": 10
  909. },
  910. {
  911. "id": "29-Z1-1",
  912. "type": "open-data",
  913. "comment": "Kevinova želva — triviální, průchod po 2D souřadnicích",
  914. "requires": [
  915. "label-zelvy"
  916. ],
  917. "title": "Kevinova želva",
  918. "position": [
  919. 536.0025634765625,
  920. 428.0677185058594
  921. ],
  922. "taskReference": "29-Z1-1",
  923. "hidden": true,
  924. "points": 8
  925. },
  926. {
  927. "id": "29-Z1-2",
  928. "type": "open-data",
  929. "taskReference": "29-Z1-2",
  930. "comment": "Sářiny pamlsky — triviální, výpis přirozených čísel na základě pravidel",
  931. "requires": [
  932. "kucharka-zakladni-algoritmus"
  933. ],
  934. "position": [
  935. -212.3476220369339,
  936. 331.40060806274414
  937. ],
  938. "title": "Sářiny pamlsky",
  939. "points": 10
  940. },
  941. {
  942. "id": "29-Z1-3",
  943. "type": "open-data",
  944. "comment": "Petrova statistika — ne úplně triviální, tvorba histogramu z pole",
  945. "requires": [
  946. "27-Z2-1"
  947. ],
  948. "title": "Petrova statistika",
  949. "position": [
  950. -354.7449789047241,
  951. 905.3906631469727
  952. ],
  953. "taskReference": "29-Z1-3",
  954. "points": 10
  955. },
  956. {
  957. "id": "29-Z1-4",
  958. "type": "open-data",
  959. "comment": "Zuzčin výlet — DFS (topologické pořadí)",
  960. "requires": [
  961. "label-grafy-pracovni-poznamka",
  962. "31-Z3-3"
  963. ],
  964. "position": [
  965. -1133.1459350585938,
  966. 1742.5294723510742
  967. ],
  968. "taskReference": "29-Z1-4",
  969. "title": "Zuzčin výlet",
  970. "hidden": false,
  971. "points": 12
  972. },
  973. {
  974. "id": "29-Z2-1",
  975. "type": "open-data",
  976. "comment": "Krocení zlé želvy — triviální, průchod po 2D souřadnicích, přímo navazuje na 29-Z1-1",
  977. "requires": [
  978. "29-Z1-1"
  979. ],
  980. "position": [
  981. 645.7811584472656,
  982. 485.86309814453125
  983. ],
  984. "taskReference": "29-Z2-1",
  985. "title": "Krocení zlé želvy",
  986. "hidden": true,
  987. "points": 8
  988. },
  989. {
  990. "id": "29-Z2-2",
  991. "type": "open-data",
  992. "taskReference": "29-Z2-2",
  993. "comment": "Sářina volba — spíš triviální, hledání společných vlasností na dvou stejně dlouhých polích",
  994. "requires": [
  995. "kucharka-zakladni-pole"
  996. ],
  997. "position": [
  998. -432.06036376953125,
  999. 788.9981231689453
  1000. ],
  1001. "title": "Sářina volba",
  1002. "points": 10
  1003. },
  1004. {
  1005. "id": "29-Z2-3",
  1006. "type": "open-data",
  1007. "taskReference": "29-Z2-3",
  1008. "comment": "Petr v říši divů — grafy - prohledávání (rozpad na komponenty)",
  1009. "requires": [],
  1010. "position": [
  1011. -964.3838958740234,
  1012. 1915.2156295776367
  1013. ],
  1014. "title": "Petr v říši divů",
  1015. "hidden": true,
  1016. "points": 10
  1017. },
  1018. {
  1019. "id": "29-Z2-4",
  1020. "type": "open-data",
  1021. "taskReference": "29-Z2-4",
  1022. "comment": "Zuzka: Cesta tam a zase zpátky — nejdelší rostoucí podposloupnost splňující podmínku, příběh i vstup připomínají 28-Z4-5",
  1023. "requires": [],
  1024. "position": [
  1025. 347.90077209472656,
  1026. -454.14956760406494
  1027. ],
  1028. "title": "Zuzka: Cesta tam a zase zpátky",
  1029. "hidden": true,
  1030. "points": 12
  1031. },
  1032. {
  1033. "id": "29-Z3-1",
  1034. "type": "open-data",
  1035. "comment": "Želva na dvorku — spíš triviální, netriviální udělat efektivně (ale asi to není třeba pro úspěch), volně navazuje na 29-Z2-1 a 29-Z1-1, průchod po 2D souřadnicích, invalidní příkazy (směrem do překážky) ignorujeme",
  1036. "requires": [
  1037. "26-Z4-3"
  1038. ],
  1039. "position": [
  1040. -1836.4768371582031,
  1041. -877.2572708129883
  1042. ],
  1043. "taskReference": "29-Z3-1",
  1044. "title": "Želva na dvorku",
  1045. "hidden": true,
  1046. "points": 8
  1047. },
  1048. {
  1049. "id": "29-Z3-2",
  1050. "type": "open-data",
  1051. "comment": "Písemka z angličtiny — voser implementovat, easy dřevorubecký řešení, optimálně trie, což na Z IMHO hard",
  1052. "requires": [
  1053. "26-Z2-3",
  1054. "label-retezce"
  1055. ],
  1056. "position": [
  1057. -457.70130920410156,
  1058. 1393.697998046875
  1059. ],
  1060. "taskReference": "29-Z3-2",
  1061. "title": "Písemka z angličtiny",
  1062. "hidden": false,
  1063. "points": 10
  1064. },
  1065. {
  1066. "id": "29-Z3-3",
  1067. "type": "open-data",
  1068. "comment": "Šestková čísla — mega voser implementovat, spíš matematická úloha, převod dešitkových čísel do hacknutých římských",
  1069. "requires": [],
  1070. "position": [
  1071. 1229.6161193847656,
  1072. 274.53318786621094
  1073. ],
  1074. "taskReference": "29-Z3-3",
  1075. "title": "Šestková čísla",
  1076. "hidden": true,
  1077. "points": 10
  1078. },
  1079. {
  1080. "id": "29-Z3-4",
  1081. "type": "open-data",
  1082. "taskReference": "29-Z3-4",
  1083. "comment": "Zdobení stromečku — grafy - prohledávání, hledání kružnice v grafu, zmateně zadané",
  1084. "requires": [
  1085. "31-Z3-3"
  1086. ],
  1087. "position": [
  1088. -783.9841613769531,
  1089. 1703.4959106445312
  1090. ],
  1091. "title": "Zdobení stromečku",
  1092. "hidden": false,
  1093. "points": 12
  1094. },
  1095. {
  1096. "id": "29-Z4-1",
  1097. "type": "open-data",
  1098. "taskReference": "29-Z4-1",
  1099. "comment": "Šíření viru — vopruz načítat vstup, přímočaré kvadratické řešení, trochu důmyslnější optimální, podhodnocená as fuck, šíření viru v grafu",
  1100. "requires": [],
  1101. "position": [
  1102. -695.9651489257812,
  1103. 1745.1685180664062
  1104. ],
  1105. "title": "Šíření viru",
  1106. "hidden": true,
  1107. "points": 8
  1108. },
  1109. {
  1110. "id": "29-Z4-2",
  1111. "type": "open-data",
  1112. "taskReference": "29-Z4-2",
  1113. "comment": "Vybírání atrakcí — ezy hladový řešení, pokud si ho umíte zdůvodnit, což není úplně triviální, máme K lidí, pro každého přípustný interval a K² čísel, které každému chceme přidělit",
  1114. "requires": [
  1115. "kucharka-zakladni-hladovy-algoritmus"
  1116. ],
  1117. "position": [
  1118. -629.13037109375,
  1119. 400.0661315917969
  1120. ],
  1121. "title": "Vybírání atrakcí",
  1122. "points": 10
  1123. },
  1124. {
  1125. "id": "29-Z4-3",
  1126. "type": "open-data",
  1127. "comment": "Želva v akváriu — malej voser, triviální, přímo navazuje na 29-Z2-1 a 29-Z1-1, průchod po 3D souřadnicích",
  1128. "requires": [
  1129. "29-Z1-1",
  1130. "29-Z2-1"
  1131. ],
  1132. "position": [
  1133. 501.77142333984375,
  1134. 503.8365783691406
  1135. ],
  1136. "taskReference": "29-Z4-3",
  1137. "title": "Želva v akváriu",
  1138. "hidden": true,
  1139. "points": 10
  1140. },
  1141. {
  1142. "id": "29-Z4-4",
  1143. "type": "open-data",
  1144. "taskReference": "29-Z4-4",
  1145. "comment": "Hledání součtu — ezy housenka pokud umíte číst, hledání podposloupnosti se součtem co nejbližším zadanému, celé v kladných číslech",
  1146. "requires": [],
  1147. "position": [
  1148. 378.12322998046875,
  1149. -405.99293518066406
  1150. ],
  1151. "title": "Hledání součtu",
  1152. "hidden": true,
  1153. "points": 12
  1154. },
  1155. {
  1156. "type": "open-data",
  1157. "id": "30-1-4",
  1158. "taskReference": "30-1-4",
  1159. "requires": [
  1160. "31-Z3-2"
  1161. ],
  1162. "position": [
  1163. -1071.9327087402344,
  1164. 2107.305938720703
  1165. ],
  1166. "title": "Cesta v bunkru",
  1167. "comment": "Hledání cesty v hilbertově křivce",
  1168. "hidden": false,
  1169. "points": 15
  1170. },
  1171. {
  1172. "type": "open-data",
  1173. "id": "30-2-4",
  1174. "taskReference": "30-2-4",
  1175. "requires": [],
  1176. "position": [
  1177. 2291.462158203125,
  1178. 823.3730773925781
  1179. ],
  1180. "title": "Komprimace",
  1181. "hidden": true,
  1182. "points": 10
  1183. },
  1184. {
  1185. "type": "open-data",
  1186. "id": "30-3-1",
  1187. "taskReference": "30-3-1",
  1188. "requires": [
  1189. "30-Z4-1"
  1190. ],
  1191. "position": [
  1192. 235.2901611328125,
  1193. 944.6101379394531
  1194. ],
  1195. "title": "Vlnění",
  1196. "hidden": false,
  1197. "points": 9
  1198. },
  1199. {
  1200. "type": "open-data",
  1201. "id": "30-4-5",
  1202. "taskReference": "30-4-5",
  1203. "requires": [
  1204. "kucharka-zakladni-dynamicke-programovani"
  1205. ],
  1206. "position": [
  1207. 371.55218505859375,
  1208. 987.8020324707031
  1209. ],
  1210. "title": "Frňákovník",
  1211. "hidden": false,
  1212. "points": 10
  1213. },
  1214. {
  1215. "type": "open-data",
  1216. "id": "30-5-2",
  1217. "taskReference": "30-5-2",
  1218. "requires": [],
  1219. "position": [
  1220. 2432.377685546875,
  1221. 878.8515930175781
  1222. ],
  1223. "title": "Útěk z trezorů",
  1224. "hidden": true,
  1225. "points": 11
  1226. },
  1227. {
  1228. "id": "30-Z1-1",
  1229. "type": "open-data",
  1230. "taskReference": "30-Z1-1",
  1231. "title": "Kevinova nepatnáctka",
  1232. "comment": "Trivka, chození po souřadnicích",
  1233. "requires": [],
  1234. "position": [
  1235. -1438.48486328125,
  1236. -934.1595611572266
  1237. ],
  1238. "hidden": true,
  1239. "points": 8
  1240. },
  1241. {
  1242. "id": "30-Z1-2",
  1243. "type": "open-data",
  1244. "taskReference": "30-Z1-2",
  1245. "title": "Sářiny loutky",
  1246. "comment": "Hladový algoritmus",
  1247. "requires": [
  1248. "kucharka-zakladni-hladovy-algoritmus"
  1249. ],
  1250. "position": [
  1251. -772.8814697265625,
  1252. 394.07132720947266
  1253. ],
  1254. "points": 10
  1255. },
  1256. {
  1257. "id": "30-Z1-3",
  1258. "type": "open-data",
  1259. "taskReference": "30-Z1-3",
  1260. "title": "Petrovo luštění zprávy",
  1261. "comment": "Hledání nejčastějšího výskytu ",
  1262. "requires": [
  1263. "31-Z1-1"
  1264. ],
  1265. "position": [
  1266. -218.60426330566406,
  1267. 1241.7639770507812
  1268. ],
  1269. "hidden": false,
  1270. "points": 10
  1271. },
  1272. {
  1273. "id": "30-Z1-4",
  1274. "type": "open-data",
  1275. "taskReference": "30-Z1-4",
  1276. "title": "Zuzčin projekt",
  1277. "comment": "Sousednost v grafu",
  1278. "requires": [],
  1279. "position": [
  1280. -932.180908203125,
  1281. 1862.528190612793
  1282. ],
  1283. "hidden": true,
  1284. "points": 12
  1285. },
  1286. {
  1287. "id": "30-Z2-1",
  1288. "type": "open-data",
  1289. "taskReference": "30-Z2-1",
  1290. "title": "K-k-koktavý K-K-Kevin",
  1291. "comment": "Trivka, projít string a skippovat duplikáty",
  1292. "requires": [],
  1293. "position": [
  1294. -272.6851043701172,
  1295. 1401.7813110351562
  1296. ],
  1297. "hidden": false,
  1298. "points": 8
  1299. },
  1300. {
  1301. "id": "30-Z2-2",
  1302. "type": "open-data",
  1303. "taskReference": "30-Z2-2",
  1304. "title": "Hřiště pro tarantule",
  1305. "comment": "Chození po souřadnicích, detekce kolizí",
  1306. "requires": [],
  1307. "position": [
  1308. -1363.7678833007812,
  1309. -770.5065765380859
  1310. ],
  1311. "hidden": true,
  1312. "points": 10
  1313. },
  1314. {
  1315. "id": "30-Z2-3",
  1316. "type": "open-data",
  1317. "taskReference": "30-Z2-3",
  1318. "title": "Klonování pavouků",
  1319. "comment": "Sestavení stromu a vypsání cesty do kořene",
  1320. "requires": [
  1321. "kucharka-zakladni-stromy"
  1322. ],
  1323. "position": [
  1324. -1230.7342882156372,
  1325. 1420.6914749145508
  1326. ],
  1327. "points": 10
  1328. },
  1329. {
  1330. "id": "30-Z2-4",
  1331. "type": "open-data",
  1332. "taskReference": "30-Z2-4",
  1333. "title": "Příliš bílý displej",
  1334. "comment": " Práce s 2d polem",
  1335. "requires": [
  1336. "kucharka-zakladni-prefixove-soucty-2d"
  1337. ],
  1338. "position": [
  1339. 174.52989196777344,
  1340. 1170.3487854003906
  1341. ],
  1342. "hidden": false,
  1343. "points": 12
  1344. },
  1345. {
  1346. "id": "30-Z3-1",
  1347. "type": "open-data",
  1348. "taskReference": "30-Z3-1",
  1349. "title": "Rozkolísaná produktivita",
  1350. "comment": " Hledání dvou čísel s co největším rozdílem",
  1351. "requires": [
  1352. "kucharka-zakladni-reprezentace-dat"
  1353. ],
  1354. "position": [
  1355. -263.88038635253906,
  1356. 549.0704807043076
  1357. ],
  1358. "points": 8
  1359. },
  1360. {
  1361. "id": "30-Z3-2",
  1362. "type": "open-data",
  1363. "taskReference": "30-Z3-2",
  1364. "title": "Podlézání Číňanům",
  1365. "comment": "Výroba palindromu",
  1366. "requires": [],
  1367. "position": [
  1368. -381.1106872558594,
  1369. 1466.7915802001953
  1370. ],
  1371. "hidden": false,
  1372. "points": 10
  1373. },
  1374. {
  1375. "id": "30-Z3-3",
  1376. "type": "open-data",
  1377. "taskReference": "30-Z3-3",
  1378. "title": "Teambuilding",
  1379. "comment": "Voser implementovat, hledání klíčů na odemčení dveří",
  1380. "requires": [],
  1381. "position": [
  1382. 1280.2218017578125,
  1383. -275.69879150390625
  1384. ],
  1385. "hidden": true,
  1386. "points": 10
  1387. },
  1388. {
  1389. "id": "30-Z3-4",
  1390. "type": "open-data",
  1391. "taskReference": "30-Z3-4",
  1392. "title": "Korporátní seznamka",
  1393. "comment": "Voser implementovat, doplňování do stringu",
  1394. "requires": [],
  1395. "position": [
  1396. 1161.6162109375,
  1397. -319.74127197265625
  1398. ],
  1399. "hidden": true,
  1400. "points": 12
  1401. },
  1402. {
  1403. "id": "30-Z4-1",
  1404. "type": "open-data",
  1405. "taskReference": "30-Z4-1",
  1406. "title": "Statistika sprintů",
  1407. "comment": " Prefixové součty",
  1408. "requires": [
  1409. "kucharka-zakladni-prefixove-soucty"
  1410. ],
  1411. "position": [
  1412. 124.86744689941406,
  1413. 871.4127044677734
  1414. ],
  1415. "hidden": false,
  1416. "points": 8
  1417. },
  1418. {
  1419. "id": "30-Z4-2",
  1420. "type": "open-data",
  1421. "taskReference": "30-Z4-2",
  1422. "title": "Klíče od tělocvičny",
  1423. "comment": "Provházení bludiště",
  1424. "requires": [],
  1425. "position": [
  1426. -1081.076431274414,
  1427. 1861.8355026245117
  1428. ],
  1429. "hidden": true,
  1430. "points": 10
  1431. },
  1432. {
  1433. "id": "30-Z4-3",
  1434. "type": "open-data",
  1435. "taskReference": "30-Z4-3",
  1436. "title": "Uhlazovací válec",
  1437. "comment": "ProhledávánI grafu",
  1438. "requires": [],
  1439. "position": [
  1440. -782.0938110351562,
  1441. 1844.3579940795898
  1442. ],
  1443. "hidden": true,
  1444. "points": 10
  1445. },
  1446. {
  1447. "id": "30-Z4-4",
  1448. "type": "open-data",
  1449. "taskReference": "30-Z4-4",
  1450. "title": "Ohrazení zahrádky",
  1451. "comment": "Trivka, práce souřadnicemi",
  1452. "requires": [],
  1453. "position": [
  1454. -1496.013168334961,
  1455. -980.4257516860962
  1456. ],
  1457. "hidden": true,
  1458. "points": 12
  1459. },
  1460. {
  1461. "type": "open-data",
  1462. "id": "31-1-1",
  1463. "taskReference": "31-1-1",
  1464. "requires": [
  1465. "28-Z4-4"
  1466. ],
  1467. "position": [
  1468. 467.8053913116455,
  1469. 1042.3714694976807
  1470. ],
  1471. "title": "Karkulčin byznys",
  1472. "hidden": false,
  1473. "points": 12
  1474. },
  1475. {
  1476. "type": "open-data",
  1477. "id": "31-2-4",
  1478. "taskReference": "31-2-4",
  1479. "requires": [],
  1480. "position": [
  1481. 2271.184907913208,
  1482. 947.7135105133057
  1483. ],
  1484. "title": "Továrna na perník",
  1485. "hidden": true,
  1486. "points": 8
  1487. },
  1488. {
  1489. "type": "open-data",
  1490. "id": "31-3-3",
  1491. "taskReference": "31-3-3",
  1492. "requires": [],
  1493. "position": [
  1494. 2253.449312210083,
  1495. 1036.687936782837
  1496. ],
  1497. "title": "Přebírání hrachu",
  1498. "hidden": true,
  1499. "points": 9
  1500. },
  1501. {
  1502. "type": "open-data",
  1503. "id": "31-4-3",
  1504. "taskReference": "31-4-3",
  1505. "requires": [],
  1506. "position": [
  1507. 2268.606294631958,
  1508. 1107.9266452789307
  1509. ],
  1510. "title": "Nejvíc spánku",
  1511. "hidden": true,
  1512. "points": 8
  1513. },
  1514. {
  1515. "type": "open-data",
  1516. "id": "31-5-3",
  1517. "taskReference": "31-5-3",
  1518. "requires": [],
  1519. "position": [
  1520. 2095.814790725708,
  1521. 1282.2340183258057
  1522. ],
  1523. "title": "Kváskový chléb",
  1524. "hidden": true,
  1525. "points": 13
  1526. },
  1527. {
  1528. "id": "31-Z1-1",
  1529. "type": "open-data",
  1530. "requires": [],
  1531. "comment": "úloha s odčítáním času",
  1532. "title": "Zuzka a poník",
  1533. "position": [
  1534. -332.0081024169922,
  1535. 1165.5375747680664
  1536. ],
  1537. "taskReference": "31-Z1-1",
  1538. "hidden": false,
  1539. "points": 8
  1540. },
  1541. {
  1542. "id": "31-Z1-2",
  1543. "type": "open-data",
  1544. "comment": "BFS (šachovnice, custom figurka, nejkratší cesta) ",
  1545. "requires": [
  1546. "label-grafy-pracovni-poznamka",
  1547. "31-Z3-3"
  1548. ],
  1549. "position": [
  1550. -866.1637573242188,
  1551. 1792.397315979004
  1552. ],
  1553. "taskReference": "31-Z1-2",
  1554. "title": "Ukradený jezdec",
  1555. "hidden": false,
  1556. "points": 10
  1557. },
  1558. {
  1559. "id": "31-Z1-3",
  1560. "type": "open-data",
  1561. "taskReference": "31-Z1-3",
  1562. "comment": "průnik N intervalů (3D na kvádrech)",
  1563. "requires": [],
  1564. "position": [
  1565. 954.6195068359375,
  1566. -144.04727935791016
  1567. ],
  1568. "title": "Průnik kvádrů",
  1569. "hidden": true,
  1570. "points": 10
  1571. },
  1572. {
  1573. "id": "31-Z1-4",
  1574. "type": "open-data",
  1575. "comment": "2D pole (až na poslední vstup), hešování (piškvorky) - navazuje na 26-Z1-2",
  1576. "requires": [
  1577. "26-Z1-2"
  1578. ],
  1579. "title": "Piškvorky naslepo",
  1580. "position": [
  1581. -2020.3782958984375,
  1582. -831.6977005004883
  1583. ],
  1584. "taskReference": "31-Z1-4",
  1585. "hidden": true,
  1586. "points": 12
  1587. },
  1588. {
  1589. "id": "31-Z2-1",
  1590. "type": "open-data",
  1591. "taskReference": "31-Z2-1",
  1592. "comment": "hešování (objednávka pizzy po dílcích, ceil(group by typ, sum, / 8)))",
  1593. "requires": [],
  1594. "position": [
  1595. 1182.9420166015625,
  1596. -121.8834228515625
  1597. ],
  1598. "title": "Objednávka pizzy",
  1599. "hidden": true,
  1600. "points": 8
  1601. },
  1602. {
  1603. "id": "31-Z2-2",
  1604. "type": "open-data",
  1605. "taskReference": "31-Z2-2",
  1606. "comment": "2D pole (simulace tetrisu)",
  1607. "requires": [],
  1608. "position": [
  1609. -1404.921630859375,
  1610. -883.254997253418
  1611. ],
  1612. "title": "Tetris bez dozoru",
  1613. "hidden": true,
  1614. "points": 10
  1615. },
  1616. {
  1617. "id": "31-Z2-3",
  1618. "type": "open-data",
  1619. "taskReference": "31-Z2-3",
  1620. "comment": "ňáký šachy, předzpracování, hledání nejbližších věží a střelců in bulk - chce lepší tag",
  1621. "requires": [],
  1622. "position": [
  1623. 851.67236328125,
  1624. 952.2879638671875
  1625. ],
  1626. "title": "Spousta figurek",
  1627. "hidden": true,
  1628. "points": 10
  1629. },
  1630. {
  1631. "id": "31-Z2-4",
  1632. "type": "open-data",
  1633. "taskReference": "31-Z2-4",
  1634. "comment": "hledání periody v desetinném čísle",
  1635. "requires": [],
  1636. "position": [
  1637. 1841.7220458984375,
  1638. 38.87567901611328
  1639. ],
  1640. "title": "Zmatematika",
  1641. "hidden": true,
  1642. "points": 12
  1643. },
  1644. {
  1645. "id": "31-Z3-1",
  1646. "type": "open-data",
  1647. "taskReference": "31-Z3-1",
  1648. "comment": "triviální - zapamatování stringů (vybírání rýmů)",
  1649. "requires": [],
  1650. "position": [
  1651. -162.3399658203125,
  1652. 1347.7179565429688
  1653. ],
  1654. "title": "Tvůrčí krize",
  1655. "hidden": false,
  1656. "points": 8
  1657. },
  1658. {
  1659. "id": "31-Z3-2",
  1660. "type": "open-data",
  1661. "comment": "DFS (hledání cesty v grafu po písmenech)",
  1662. "requires": [
  1663. "label-grafy-pracovni-poznamka",
  1664. "29-Z1-4"
  1665. ],
  1666. "position": [
  1667. -1077.1989135742188,
  1668. 1800.2983932495117
  1669. ],
  1670. "taskReference": "31-Z3-2",
  1671. "title": "Zámek obrazovky",
  1672. "hidden": false,
  1673. "points": 10
  1674. },
  1675. {
  1676. "id": "31-Z3-3",
  1677. "type": "open-data",
  1678. "comment": "barvení bipartitního grafu (hledání partit), na vstupu hrany",
  1679. "requires": [
  1680. "26-Z1-4",
  1681. "label-grafy"
  1682. ],
  1683. "position": [
  1684. -955.0145263671875,
  1685. 1622.0362014770508
  1686. ],
  1687. "taskReference": "31-Z3-3",
  1688. "title": "Stáda hrochů",
  1689. "hidden": false,
  1690. "points": 10
  1691. },
  1692. {
  1693. "id": "31-Z3-4",
  1694. "type": "open-data",
  1695. "taskReference": "31-Z3-4",
  1696. "comment": "geometrie - přihrádky/zametání (vypsat všechny dvojice bodů s vzdáleností max K)",
  1697. "requires": [],
  1698. "position": [
  1699. 828.0521850585938,
  1700. 204.80533599853516
  1701. ],
  1702. "title": "Pohyb termitů",
  1703. "hidden": true,
  1704. "points": 12
  1705. },
  1706. {
  1707. "id": "31-Z4-1",
  1708. "type": "open-data",
  1709. "taskReference": "31-Z4-1",
  1710. "comment": "sort + průchod pole (nejosamělejší bod na přímce)",
  1711. "requires": [],
  1712. "position": [
  1713. -2195.6627292633057,
  1714. -337.2542724609375
  1715. ],
  1716. "title": "Nejosamělejší kamarád",
  1717. "hidden": true,
  1718. "points": 8
  1719. },
  1720. {
  1721. "id": "31-Z4-2",
  1722. "type": "open-data",
  1723. "taskReference": "31-Z4-2",
  1724. "comment": "binární čísla",
  1725. "requires": [],
  1726. "position": [
  1727. 1822.9569702148438,
  1728. -115.60995483398438
  1729. ],
  1730. "title": "Závažíčka na druhou",
  1731. "hidden": true,
  1732. "points": 10
  1733. },
  1734. {
  1735. "type": "open-data",
  1736. "id": "31-Z4-3",
  1737. "taskReference": "31-Z4-3",
  1738. "requires": [],
  1739. "position": [
  1740. 1538.031099319458,
  1741. 801.7519016265869
  1742. ],
  1743. "title": "Probíhání bludištěm",
  1744. "hidden": true,
  1745. "points": 10
  1746. },
  1747. {
  1748. "type": "open-data",
  1749. "id": "31-Z4-4",
  1750. "taskReference": "31-Z4-4",
  1751. "requires": [],
  1752. "position": [
  1753. -1727.5051555633545,
  1754. -771.7367458343506
  1755. ],
  1756. "title": "Ohnivý únik",
  1757. "hidden": true,
  1758. "points": 12
  1759. },
  1760. {
  1761. "type": "open-data",
  1762. "id": "32-1-1",
  1763. "taskReference": "32-1-1",
  1764. "requires": [],
  1765. "position": [
  1766. 2098.499687194824,
  1767. 1213.835223197937
  1768. ],
  1769. "title": "Zkomolené vysílání",
  1770. "hidden": true,
  1771. "points": 9
  1772. },
  1773. {
  1774. "type": "open-data",
  1775. "id": "32-2-2",
  1776. "taskReference": "32-2-2",
  1777. "requires": [],
  1778. "position": [
  1779. 2080.4985275268555,
  1780. 862.9364805221558
  1781. ],
  1782. "title": "Mezihvězdné jízdní řády",
  1783. "hidden": true,
  1784. "points": 12
  1785. },
  1786. {
  1787. "type": "open-data",
  1788. "id": "32-3-1",
  1789. "taskReference": "32-3-1",
  1790. "requires": [],
  1791. "position": [
  1792. 2102.0034103393555,
  1793. 937.4345273971558
  1794. ],
  1795. "title": "Zkrat",
  1796. "hidden": true,
  1797. "points": 12
  1798. },
  1799. {
  1800. "type": "open-data",
  1801. "id": "32-4-4",
  1802. "taskReference": "32-4-4",
  1803. "requires": [],
  1804. "position": [
  1805. 2101.0969161987305,
  1806. 1080.7460508346558
  1807. ],
  1808. "title": "Zpětný signál",
  1809. "hidden": true,
  1810. "points": 10
  1811. },
  1812. {
  1813. "type": "open-data",
  1814. "id": "32-5-5",
  1815. "taskReference": "32-5-5",
  1816. "requires": [],
  1817. "position": [
  1818. 2098.2350997924805,
  1819. 1004.0238218307495
  1820. ],
  1821. "title": "Druhá kostra",
  1822. "hidden": true,
  1823. "points": 14
  1824. },
  1825. {
  1826. "type": "open-data",
  1827. "id": "32-5-6",
  1828. "taskReference": "32-5-6",
  1829. "requires": [],
  1830. "position": [
  1831. 2058.4335861206055,
  1832. 715.0660581588745
  1833. ],
  1834. "title": "Geocaching s odhadem",
  1835. "hidden": true,
  1836. "points": 13
  1837. },
  1838. {
  1839. "type": "open-data",
  1840. "id": "32-Z1-1",
  1841. "taskReference": "32-Z1-1",
  1842. "requires": [],
  1843. "position": [
  1844. 1411.155632019043,
  1845. 1141.5684385299683
  1846. ],
  1847. "title": "Kevin v papírnictví",
  1848. "hidden": true,
  1849. "points": 8
  1850. },
  1851. {
  1852. "type": "open-data",
  1853. "id": "32-Z1-2",
  1854. "taskReference": "32-Z1-2",
  1855. "requires": [],
  1856. "position": [
  1857. 1248.442741394043,
  1858. 1383.991473197937
  1859. ],
  1860. "title": "Chybná účtenka",
  1861. "hidden": true,
  1862. "points": 10
  1863. },
  1864. {
  1865. "type": "open-data",
  1866. "id": "32-Z1-3",
  1867. "taskReference": "32-Z1-3",
  1868. "requires": [],
  1869. "position": [
  1870. 1140.155632019043,
  1871. 1328.5684385299683
  1872. ],
  1873. "title": "Školní knihy",
  1874. "hidden": true,
  1875. "points": 10
  1876. },
  1877. {
  1878. "type": "open-data",
  1879. "id": "32-Z1-4",
  1880. "taskReference": "32-Z1-4",
  1881. "requires": [],
  1882. "position": [
  1883. -1980.3903579711914,
  1884. -747.920407295227
  1885. ],
  1886. "title": "Plánek školy",
  1887. "hidden": true,
  1888. "points": 12
  1889. },
  1890. {
  1891. "type": "open-data",
  1892. "id": "32-Z2-1",
  1893. "taskReference": "32-Z2-1",
  1894. "requires": [],
  1895. "position": [
  1896. 1572.155632019043,
  1897. 1029.5684385299683
  1898. ],
  1899. "title": "Prší",
  1900. "hidden": true,
  1901. "points": 8
  1902. },
  1903. {
  1904. "type": "open-data",
  1905. "id": "32-Z2-2",
  1906. "taskReference": "32-Z2-2",
  1907. "requires": [
  1908. "26-Z2-1"
  1909. ],
  1910. "position": [
  1911. -261.4561767578125,
  1912. 994.5555601119995
  1913. ],
  1914. "title": "Turnaj hada",
  1915. "hidden": false,
  1916. "points": 10,
  1917. "comment": "Dost hustý voser :D"
  1918. },
  1919. {
  1920. "type": "open-data",
  1921. "id": "32-Z2-3",
  1922. "taskReference": "32-Z2-3",
  1923. "requires": [],
  1924. "position": [
  1925. 1686.191276550293,
  1926. 928.291277885437
  1927. ],
  1928. "title": "Panika v chodbě",
  1929. "hidden": true,
  1930. "points": 10
  1931. },
  1932. {
  1933. "type": "open-data",
  1934. "id": "32-Z2-4",
  1935. "taskReference": "32-Z2-4",
  1936. "requires": [],
  1937. "position": [
  1938. 1228.155632019043,
  1939. 733.5684385299683
  1940. ],
  1941. "title": "Opisování v testu",
  1942. "hidden": true,
  1943. "points": 12
  1944. },
  1945. {
  1946. "type": "open-data",
  1947. "id": "32-Z3-1",
  1948. "taskReference": "32-Z3-1",
  1949. "requires": [],
  1950. "position": [
  1951. 1327.155632019043,
  1952. 622.5684385299683
  1953. ],
  1954. "title": "Tiskařský stroj",
  1955. "hidden": true,
  1956. "points": 8
  1957. },
  1958. {
  1959. "type": "open-data",
  1960. "id": "32-Z3-2",
  1961. "taskReference": "32-Z3-2",
  1962. "requires": [],
  1963. "position": [
  1964. -1923.463508605957,
  1965. -680.0054445266724
  1966. ],
  1967. "title": "Sářina omalovánka",
  1968. "hidden": true,
  1969. "points": 10
  1970. },
  1971. {
  1972. "type": "open-data",
  1973. "id": "32-Z3-3",
  1974. "taskReference": "32-Z3-3",
  1975. "requires": [],
  1976. "position": [
  1977. 1255.4586715698242,
  1978. 1507.3838682174683
  1979. ],
  1980. "title": "Akční ceny",
  1981. "hidden": true,
  1982. "points": 10
  1983. },
  1984. {
  1985. "type": "open-data",
  1986. "id": "32-Z3-4",
  1987. "taskReference": "32-Z3-4",
  1988. "requires": [],
  1989. "position": [
  1990. 1671.468864440918,
  1991. 1398.2491025924683
  1992. ],
  1993. "title": "Dálnice",
  1994. "hidden": true,
  1995. "points": 12
  1996. },
  1997. {
  1998. "type": "open-data",
  1999. "id": "32-Z4-1",
  2000. "taskReference": "32-Z4-1",
  2001. "requires": [],
  2002. "position": [
  2003. 1107.155632019043,
  2004. 680.5684385299683
  2005. ],
  2006. "title": "Jednobarevné praní",
  2007. "hidden": true,
  2008. "points": 8
  2009. },
  2010. {
  2011. "type": "open-data",
  2012. "id": "32-Z4-2",
  2013. "taskReference": "32-Z4-2",
  2014. "requires": [],
  2015. "position": [
  2016. 1595.155632019043,
  2017. 1108.5684385299683
  2018. ],
  2019. "title": "Hoří chleba?",
  2020. "hidden": true,
  2021. "points": 10
  2022. },
  2023. {
  2024. "type": "open-data",
  2025. "id": "32-Z4-3",
  2026. "taskReference": "32-Z4-3",
  2027. "requires": [],
  2028. "position": [
  2029. 1420.5522384643555,
  2030. 1229.4311094284058
  2031. ],
  2032. "title": "Esej do bloku",
  2033. "hidden": true,
  2034. "points": 10
  2035. },
  2036. {
  2037. "type": "open-data",
  2038. "id": "32-Z4-4",
  2039. "taskReference": "32-Z4-4",
  2040. "requires": [],
  2041. "position": [
  2042. -1863.650032043457,
  2043. -807.0081300735474
  2044. ],
  2045. "title": "Bomberman uklízí",
  2046. "hidden": true,
  2047. "points": 12
  2048. },
  2049. {
  2050. "type": "open-data",
  2051. "id": "33-Z1-1",
  2052. "taskReference": "33-Z1-1",
  2053. "requires": [
  2054. "28-Z1-1",
  2055. "kucharka-zakladni-fronta-a-zasobnik"
  2056. ],
  2057. "position": [
  2058. -988.1280975341797,
  2059. 1068.0277128219604
  2060. ],
  2061. "title": "Kontrola závorkových programů",
  2062. "hidden": false,
  2063. "points": 8
  2064. },
  2065. {
  2066. "type": "open-data",
  2067. "id": "33-Z1-2",
  2068. "taskReference": "33-Z1-2",
  2069. "requires": [],
  2070. "position": [
  2071. 876.1545333862305,
  2072. 754.659197807312
  2073. ],
  2074. "title": "Sobotní den železnice",
  2075. "hidden": true,
  2076. "points": 10
  2077. },
  2078. {
  2079. "type": "open-data",
  2080. "id": "33-Z1-3",
  2081. "taskReference": "33-Z1-3",
  2082. "requires": [],
  2083. "position": [
  2084. -2137.659980773926,
  2085. -755.8007020950317
  2086. ],
  2087. "title": "Petrův zmatený výlet",
  2088. "hidden": true,
  2089. "points": 12
  2090. },
  2091. {
  2092. "id": "algoritmy",
  2093. "type": "text",
  2094. "comment": "...",
  2095. "requires": [],
  2096. "title": "Algoritmy",
  2097. "htmlContent": "<h2>Algoritmy</h2><p>Každý program je vlastně popis nějakého pracovního postupu. Té samotné myšlence, oddělené od konkrétního způsobu implementace, říkáme <strong>algoritmus</strong>.</p><p>Algoritmy jsou principy, které zůstávají stejné neustále. Algoritmy vymyšlené před 50 lety jsou často stále to nejlepší, co známe. Často i to nejlepší, co je vůbec možné. Proto dává smysl zabývat se studiem samotných algoritmů. Programovací jazyky se mění. Metoda zápisu toho samého algoritmu často také. Ale základní myšlenka je pořád stejná.</p>",
  2098. "position": [
  2099. -698.2805023193359,
  2100. -922.5820579528809
  2101. ],
  2102. "hidden": true
  2103. },
  2104. {
  2105. "id": "data",
  2106. "type": "text",
  2107. "comment": "...",
  2108. "requires": [],
  2109. "title": "Datové struktury",
  2110. "htmlContent": "<p>Ruku v ruce s algoritmy jdou data. Nemít data, tak nemáme co počítat, že?</p><h2>Data v počítači</h2><p>Data, nad kterými v programu pracujeme, ukládáme do paměti. Fyzicky je pamět hodně dlouhá posloupnost jedniček a nul – bitů. To je ale nepraktické a tak bity skupinkujeme do bytů – 8 bitů aneb čísel od 0 do 255.</p><p>Takže paměť je jen hodně číslíček za sebou, jak ale tedy vznikají například obrázky, na které na monitoru koukáme? Jak vlastně můžeme reprezentovat větší čísla než 255? Jednou z možností je například zapisovat si jednotlivé cifry velkého čísla. Ještě pak potřebujeme vědět, kolik jich je, ale tuhle informaci si můžeme uložit například na začátek.</p><p>FIXME obrázek</p><p>Právě jsme si popsali, jak z jednoduchých základních kamenů, posloupnosti malých čísel, postavit něco většího. Něco, čemu vznešeně říkáme datová struktura.</p><h2>Datové struktury</h2><p>Datové struktury popisují, jak reprezentovat nějaké komplexní informace z jednodušších bloků (na nejnižší úrovni z posloupnosti čísel). Velmi blízce souvisí s algoritmy. Mnoho algoritmů by nám bez datových struktur bylo k ničemu a naopak mnoho datových struktur by nedávalo smysl bez algoritmů. My si proto budeme povídat o datových strukturách a algoritmech společně.</p><p>Úlohy, které najdeš dále, se zabývají nějakou datovou strukturou nebo algoritmem. Jsou uspořádány s rostoucí obtížností a může se stát, že pro pochopení složitějších úloh je často potřeba mít vštípené detaily struktury předchozí.</p>",
  2111. "position": [
  2112. -696.7079391479492,
  2113. -876.2786036729813
  2114. ],
  2115. "hidden": true
  2116. },
  2117. {
  2118. "id": "jak-muzu-pomoct",
  2119. "type": "text",
  2120. "comment": "...",
  2121. "requires": [],
  2122. "title": "Jak můžu pomoct?",
  2123. "htmlContent": "<h2>Chci změnit obsah (napojení a umístění úloh, texty, …)</h2><ol><li><strong>Na stránce </strong><a href=\"https://ksp.vsq.cz/\"><strong>https://ksp.vsq.cz/</strong></a><strong> se musíš přihlásit do svého KSPího účtu.</strong> Radši ale varujeme, že přihlášením na web tímto způsobem umožňuješ získat serveru Vaška Šraiera přihlašovací údaje. Vašek slibuje, že přihlašovací údaje nijak nesbírá ani neloguje (taky k čemu by mu jako orgovi byly, že?). Ale ta možnost tu je a měl(a) by jsi o ní vědět.</li><li><strong>Otevři si editor na stránce </strong><a href=\"https://ksp.vsq.cz/editor.html\"><strong>https://ksp.vsq.cz/editor.html</strong></a><strong>. </strong>Tam můžeš cokoliv upravit. Nezapomeň své změny ukládat. Data se ukládají pouze pro Tebe a nikdo jiný dané změny nevidí. Můžeš si i výsledek prohlédnout na normální stránce kurzu. Cokoliv co změníš se Ti změní i tam.</li><li>Až budeš mít hotovo (co nejdřív po tom), <strong>napiš Vaškovi ať Tvé změny aplikuje globálně</strong>. Můžeš na to použít třeba <a href=\"https://discord.gg/AvXdx2X\">KSPí Discord</a> nebo třeba <a href=\"https://ksp.mff.cuni.cz/kontakty/organizatori/\">email</a>.</li></ol><h4>Možné problémy:</h4><ul><li>V průběhu úprav se ti vyresetuje stav. Pokud jsi to nezpůsobil(a) zmáčknutím tlačítka <i>Resetovat aktuální stav</i> v editoru, tak se to dá zachránit. Napiš v takovém případě Vaškovi a on Tvoji verzi obnoví. <strong>Tento způsob rozbití je očekávaný!</strong> Vždy, když někdo aktualizuje zdrojáky projektu, tak se celý server automaticky reinstaluje a Tvé změny se přesunou do záloh.</li></ul><h2>Chci změnit jak věci fungují</h2><ol><li>Libovolné připomínky a nápady nám můžeše poslat <a href=\"mailto:ksp@mff.cuni.cz\">emailem</a> nebo třeba napsat na Discordu.</li><li>Pokud se chceš ponořit do kódu, tak můžeš! Vývoj projektu probíhá veřejně - zdrojový kód najdeš na naší Gitee - <a href=\"https://gitea.ks.matfyz.cz/KSP/graf-uloh\">https://gitea.ks.matfyz.cz/KSP/graf-uloh</a>. Pokud nám chceš pomoct, rádi Ti tam zařídíme přístup.</li></ol><p>&nbsp;</p>",
  2124. "position": [
  2125. 7,
  2126. -105
  2127. ]
  2128. },
  2129. {
  2130. "id": "jak-resit-ulohy",
  2131. "type": "text",
  2132. "requires": [
  2133. "start"
  2134. ],
  2135. "comment": "kecy o tom, jak se může řešit taková úloha",
  2136. "title": "Jak řešit úlohy?",
  2137. "htmlContent": "<h2>FIXME: Mělo by zde být napsáno:</h2><ul><li>obecný návod k tomu, jak se taková open-datovka řeší</li><li>linky na nody o technické stránce řešení úloh</li></ul>",
  2138. "position": [
  2139. -2.4084014892578125,
  2140. 180.22608184814453
  2141. ]
  2142. },
  2143. {
  2144. "id": "KSP-h-ulohy",
  2145. "type": "label",
  2146. "comment": "...",
  2147. "requires": [],
  2148. "title": "KSP-H úlohy",
  2149. "position": [
  2150. 2225.972201347351,
  2151. 625.0823974609375
  2152. ],
  2153. "hidden": true
  2154. },
  2155. {
  2156. "id": "kucharka-zakladni-algoritmus",
  2157. "type": "text",
  2158. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2159. "requires": [
  2160. "jak-resit-ulohy"
  2161. ],
  2162. "title": "Algoritmus",
  2163. "htmlContent": "<h3>Algoritmus a&nbsp;program</h3><p>Pod tajemným slovem <i>algoritmus</i> se skrývá jen jiný výraz pro postup. Můžete si to představit jako příkaz od maminky „Běž do krámu, kup chleba, a&nbsp;když budou mít měkké rohlíky, tak jich vem tucet“. (A jako slušně vychovaní se tedy vydáte do krámu a&nbsp;koupíte tucet chlebů, protože měli měkké rohlíky :-))</p><p>Takovýto příkaz klidně můžeme nazvat algoritmem, ačkoliv to bude asi znít nezvykle&nbsp;– pojem algoritmus se totiž používá hlavně ve světě počítačů. Je to tedy nějaká posloupnost základních příkazů, která řeší nějaký problém. Výběr konkrétního programovacího jazyka rozhoduje o&nbsp;tom, jaké základní příkazy budeme mít k&nbsp;dispozici. Většinou jsou ale skoro stejné.</p><p>Mezi základní příkazy patří:</p><ul><li>Manipulace s&nbsp;daty v&nbsp;paměti (uložení či načtení hodnoty, detailněji v&nbsp;další kapitole).</li><li>Provedení nějakého numerického výpočtu (+,-,*,/).</li><li>Vyhodnocení nějaké konkrétní podmínky a&nbsp;odpovídající větvení programu: <i>Pokud platí A, tak proveď B, jinak proveď C.</i> Přitom B&nbsp;i&nbsp;C mohou být klidně celé <i>bloky kódu</i>, tedy libovolně mnoho dalších základních příkazů.</li><li>Opakování nějakého příkazu: <i>Dokud platí A, dělej B.</i> Takové konstrukci říkáme <i>cyklus</i> a&nbsp;podobně jako u&nbsp;podmínky může být B&nbsp;blok kódu, který se celý opakuje.</li><li>Vstup a&nbsp;výstup programu (typicky vstup od uživatele z&nbsp;klávesnice či načtení vstupu ze souboru; výstup pak může znamenat vypsání výsledku na obrazovku nebo třeba zapsání dat do souboru).</li></ul><p>Z&nbsp;těchto základních stavebních kamenů se skládá každý algoritmus. Programem potom rozumíme realizaci algoritmu v&nbsp;nějakém konkrétním programovacím jazyce.</p><p>U&nbsp;složitějších programů se pak často setkáme s&nbsp;problémem, že budete mít nějakou posloupnost příkazů, která se bude na spoustě míst programu opakovat, což zbytečně prodlužuje a znepřehledňuje kód.</p><p>Řešením tohoto problému je použití <i>funkcí</i>. Funkci si můžeme představit jako nějakou pojmenovanou část programu (s&nbsp;vlastní pamětí), kterou můžeme opakovaně použít tím, že ji v&nbsp;různých částech programu <i>zavoláme</i>. Funkci při zavolání předáme parametry (například seznam čísel), které se dostanou do její vnitřní paměti.</p><p>Funkce pak na základě obdržených parametrů může provádět nějaké operace, při kterých pracuje se svojí vnitřní pamětí (mluvíme o&nbsp;<i>lokální</i> paměti, změny v&nbsp;ní se neprojeví nikde mimo funkci). Na konci nám funkce může vrátit nějaký výsledek. Pokud funkce během svého běhu změní i nějaká data v&nbsp;<i>globální</i> paměti, či provede nějakou globální operaci (například výpis textu na monitor), mluvíme pak o&nbsp;funkci s&nbsp;<i>vedlejšími efekty</i> (neboli side-efekty).</p><p>Konkrétním příkladem může být funkce, která nám spočítá odmocninu ze zadaného čísla. Ta dostane jako svůj parametr číslo, uvnitř si provede nějaký výpočet, o&nbsp;který se jako uživatel funkce nemusíme starat, a&nbsp;jako výstup nám vrátí spočtenou odmocninu.</p>",
  2164. "position": [
  2165. -410.8735809326172,
  2166. 273.27046966552734
  2167. ]
  2168. },
  2169. {
  2170. "id": "kucharka-zakladni-binarni-vyhledavani",
  2171. "type": "text",
  2172. "comment": "...",
  2173. "requires": [
  2174. "kucharka-zakladni-pole"
  2175. ],
  2176. "title": "Rozděl a panuj - binární vyhledávání",
  2177. "htmlContent": "<h3>Rozděl a&nbsp;panuj</h3><p>Jednou ze základních technik je rozdělení složitějšího problému na menší části, které opět můžeme rozdělit na menší a&nbsp;tak dále, dokud se nedostaneme k&nbsp;problémům tak malým, že je už umíme triviálně vyřešit.</p><h4>Binární vyhledávání v&nbsp;poli</h4><p>Představme si, že máme seřazené pole n&nbsp;prvků a&nbsp;chceme zjistit, jestli se v&nbsp;něm nachází prvek s&nbsp;hodnotou&nbsp;k. Určitě můžeme projít celé pole v&nbsp;lineárním čase (tím, že budeme brát jeden prvek za druhým a&nbsp;kontrolovat, zda je roven hodnotě&nbsp;k), ale to je zbytečně pomalé a&nbsp;nevyužívá toho, že máme pole seřazené.</p><p>Můžeme totiž začít s&nbsp;velkým problémem a&nbsp;ten postupně zmenšovat na stále menší a&nbsp;menší. Nejdříve hledáme&nbsp;k v&nbsp;celém poli. Podíváme se na jeho prostřední prvek:</p><ul><li>Pokud je roven&nbsp;k, jsme hotovi.</li><li>Je-li větší než&nbsp;k, víme, že se k&nbsp;musí nacházet nalevo od něj. Můžeme tedy hledat znovu, ale tentokrát se omezit jen na levou polovinu pole.</li><li>Analogicky, je-li menší než&nbsp;k, můžeme hledat jen v&nbsp;pravé polovině.</li></ul><p>Když tímto postupným dělením problémů na menší dojdeme až k&nbsp;poli o&nbsp;velikosti jednoho prvku, stačí tento prvek jenom porovnat, dál už se pole nepokoušíme rozdělovat.</p><p>Jelikož se nám každým krokem problém zmenší na polovinu, maximálně po log n krocích se dostaneme na pole velikosti jedna. Říkáme, že algoritmus má <i>logaritmickou časovou složitost</i>, píšeme O(log n). (Pokud není řečeno jinak, znamená pro nás v&nbsp;informatice značka log <i>dvojkový logaritmus</i>, což je funkce opačná k&nbsp;funkci 2n a&nbsp;roste o&nbsp;hodně pomaleji než funkce lineární. Pro velká&nbsp;n platí: 1 &lt; log n &lt; n a&nbsp;například log 2 = 1, log 8 = 3, log 1024 = 10.)</p><p>Prakticky postup provádíme tak, že si udržujeme levý a&nbsp;pravý okraj aktuálně zpracovávaného úseku a&nbsp;postupně je k&nbsp;sobě přibližujeme.</p><p>FIXME code</p><h4>Další aplikace</h4><p>Další typickou aplikací postupu rozděl a&nbsp;panuj je například třídění posloupnosti pomocí <i>Mergesortu</i>. Ten v&nbsp;základu funguje tak, že každou posloupnost, kterou dostane k&nbsp;setřídění, rozdělí na poloviny a každou z&nbsp;nich setřídí rekurzivním zavoláním sebe sama. Zanořování se zastaví ve chvíli, kdy třídíme posloupnost délky jedna (ta už je z&nbsp;podstaty setříděná). Pak jen v&nbsp;každém kroku ze dvou setříděných menších posloupností vyrobí jejich sléváním setříděnou posloupnost dvojnásobné délky.</p><p>Více se o&nbsp;metodě Rozděl a&nbsp;panuj můžete dozvědět ve stejnojmenné <a href=\"https://ksp.mff.cuni.cz/viz/kucharky/rozdel-a-panuj\">kuchařce</a>.</p>",
  2178. "position": [
  2179. -1055.2265319824219,
  2180. 787.3630638122559
  2181. ]
  2182. },
  2183. {
  2184. "id": "kucharka-zakladni-dynamicke-programovani",
  2185. "type": "text",
  2186. "comment": "...",
  2187. "requires": [
  2188. "kucharka-zakladni-prefixove-soucty"
  2189. ],
  2190. "title": "Dynamické programování",
  2191. "htmlContent": "<h3>Předpočítané mezivýsledky</h3><p>Motivací k&nbsp;této kapitole je následující motto: „Proč počítat něco vícekrát, když nám to stačí spočítat jednou a&nbsp;zapamatovat si to?“.</p><p>Velmi často se totiž setkáváme s&nbsp;tím, že něco počítáme stále dokola. Jako příklad si můžeme připomenout naši rekurzivní implementaci počítání Fibonacciho čísel zmíněnou výše.</p><p>Když se podíváme na výpočet čísla fib(5), vidíme, že pro něj voláme fib(4) a&nbsp;fib(3), fib(4) volá fib(3) a&nbsp;fib(2), fib(3) volá fib(2) a&nbsp;fib(1) a&nbsp;tak dále. Všimli jste si, kolikrát se nám tyhle výpočty opakují? Některá Fibonacciho čísla spočteme totiž zbytečně mnohokrát.</p><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/zakladni_algoritmy-5.png\" alt=\"Strom výpočtu Fibonacciho čísla\"></figure><p>Kdybychom si je namísto opakovaného počítání někde pamatovali, mohli bychom pak odpověď na dotaz na již vypočtené číslo vytáhnout jako králíka z&nbsp;klobouku v&nbsp;konstantním čase. Zavedením jednoho globálního pole, ve kterém si tyto hodnoty pro jednotlivá n budeme pamatovat, nám sníží časovou složitost z&nbsp;O(2n) na pěkných O(n). Takovému postupu se obecně říká <i>dynamické programování</i>.</p><h4>Dynamické programování</h4><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/img/hippo_dynamit.png\" alt=\"Dynamitské programování\"></figure><p>Nejprve uveďme na pravou váhu výraz „dynamické“ v&nbsp;názvu. Nevystihuje tak úplně podstatu této techniky a jeho historické pozadí je celkem složité, avšak dnes je tento název již tak zažitý, že se už pravděpodobně nezmění.</p><p>Slovo „dynamické“ částečně odkazuje na to, že se dynamicky (za běhu programu) postupně staví řešení jednodušších problémů, která jsou následně použita pro řešení složitějších. Jeho hlavní podstatou je tedy ukládání a&nbsp;opětovné použití již jednou vypočtených údajů.</p><p>Hodí se na úlohy, které se dají dělit na podúlohy, které jsou si podobné a&nbsp;mohou se opakovat. Výsledky takovýchto podúloh si poté ukládáme a&nbsp;při dotazu na stejnou podúlohu vrátíme jen uložený výsledek a&nbsp;výpočet již neprovádíme.</p><p>Pro další prohloubení znalostí můžete na našem webu nahlédnout do další kuchařky, tentokrát nesoucí (překvapivě) název <a href=\"https://ksp.mff.cuni.cz/viz/kucharky/dynamicke-programovani\">Dynamické programování</a>.</p>",
  2192. "position": [
  2193. 415.81363677978516,
  2194. 888.2000579833984
  2195. ]
  2196. },
  2197. {
  2198. "id": "kucharka-zakladni-fronta-a-zasobnik",
  2199. "type": "text",
  2200. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2201. "requires": [
  2202. "kucharka-zakladni-spojovy-seznam"
  2203. ],
  2204. "title": "Fronta a zásobník",
  2205. "htmlContent": "<h4>Fronta a zásobník</h4><p>S&nbsp;použitím spojových seznamů (nebo v&nbsp;jednodušším případě dokonce i polí) můžeme zkonstruovat dvě velmi užitečné datové struktury, frontu a zásobník.</p><p><i>Fronta</i> funguje tak, jak si ji asi každý z&nbsp;nás představuje: ten, kdo se do fronty postaví první, také první přijde na řadu. Trochu jinak si ji můžeme představit jako trubku, do které na jedné straně sypeme nějaké věci a na druhé je odebíráme. Anglicky je též nazývaná <i>FIFO</i> (<i>„First In, First Out“</i>).</p><p>Praktickou realizaci uděláme jednoduše spojovým seznamem. Budeme si držet dva ukazatele, jeden na začátek seznamu, druhý na konec. Když se objeví nový prvek, který do fronty budeme chtít vložit, přidáme ho na konec, zatímco při odebírání z&nbsp;fronty využijeme druhého ukazatele a vezmeme prvek ze začátku.</p><p>Druhou velmi podobnou datovou strukturou je <i>zásobník</i>. Jak už ale plyne z&nbsp;anglického názvu <i>LIFO</i> (<i>„Last In, First Out“</i>), funguje spíše jako plný šuplík: Nahoru do něj přidáváme nové prvky, a když chceme nějaký odebrat, vezmeme také zvrchu. To znamená, že první se na řadu dostane naposledy vložený prvek.</p><p>Implementace je velmi obdobná jako u&nbsp;fronty, jen bude ukazatel pouze jeden a&nbsp;bude ukazovat jenom na jeden konec spojového seznamu, konkrétně na poslední prvek.</p>",
  2206. "position": [
  2207. -775.7975082397461,
  2208. 949.1721229553223
  2209. ]
  2210. },
  2211. {
  2212. "id": "kucharka-zakladni-grafy",
  2213. "type": "text",
  2214. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2215. "requires": [
  2216. "28-Z2-4"
  2217. ],
  2218. "title": "Grafy",
  2219. "htmlContent": "<h4>Grafy</h4><p>S&nbsp;nějakými grafy jste se již možná potkali, ale tento pojem je bohužel docela přetěžovaný. Jedním jeho významem jsou „koláčové grafy“ a&nbsp;jiné další diagramy znázorňující nějaký poměr (ať už to jsou výsledky voleb, nebo poměr lidí, kteří sledovali v&nbsp;televizi Večerníček).</p><p>Další význam můžeme nalézt v&nbsp;analytické matematice, kde se potkáme s&nbsp;grafy průběhu nějakých funkcí. My však nemáme na mysli ani jedno z&nbsp;výše zmíněných, teď se budeme bavit o&nbsp;<i>kombinatorických grafech</i>.</p><p>Grafem tedy máme na mysli nějakou množinu objektů, říkejme jim <i>vrcholy</i>, a&nbsp;nějaké vztahy mezi nimi. Tyto vztahy nazýváme <i>hranami</i> a&nbsp;jsou vyjádřené dvojicemi vrcholů, mezi kterými vedou. Ukázku takového grafu vidíme třeba na následujícím obrázku.</p><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/zakladni_algoritmy-3.png\" alt=\"Graf\"></figure><p>Jako praktickou ukázku grafu si můžeme například představit silniční síť nějakého státu: vrcholy budou města a&nbsp;hrany budou silnice, které mezi nimi vedou.</p><p>Občas se můžete setkat s&nbsp;pojmem <i>souvislý</i> graf. Ten znamená jen to, že mezi každými dvěma vrcholy existuje nějaká cesta. Pokud tomu tak není, je graf <i>nesouvislý</i> a&nbsp;dá se rozložit na několik menších grafů, které již souvislé jsou a&nbsp;říká se jim <i>komponenty souvislosti</i>.</p><p>Samotný graf poté můžeme doplnit tím, že si v&nbsp;každém vrcholu nebo na každé hraně budeme pamatovat nějakou hodnotu (například cenu nejlevnějšího benzínu ve městech a&nbsp;délku v&nbsp;kilometrech na silnicích). Pamatování si hodnot ve vrcholech je docela obvyklá technika a nemá speciální název, ale pokud budeme mít graf, který si pamatuje hodnoty na hranách, budeme o&nbsp;něm mluvit jako o&nbsp;<i>ohodnoceném grafu</i>.</p><p>Další možnou úpravou je, že každá hrana povede jen jedním směrem (jednosměrné silnice), takovým grafům říkáme <i>orientované</i> (pokud pak v&nbsp;orientovaném grafu chceme silnici oběma směry, prostě do něj přidáme dvě hrany, jednu v&nbsp;každém směru).</p><p>Poslední, co nám schází k&nbsp;praktickému použití grafů, je naučit se, jak je reprezentovat v&nbsp;počítači. Existuje několik možností (v popisech bude n značit počet vrcholů, m&nbsp;počet hran):</p><ul><li><strong>Seznam sousedů</strong>&nbsp;– vrcholy grafu budeme mít uložené v&nbsp;poli a&nbsp;u&nbsp;každého vrcholu budeme mít (spojový) seznam čísel dalších vrcholů, do kterých z&nbsp;aktuálního vrcholu vede hrana. Zabírá místo O(n+m) a&nbsp;hodí se pro řídké grafy (tedy grafy, kde je m&nbsp;řádově stejné jako&nbsp;n).</li><li><strong>Matice sousednosti</strong>&nbsp;– tabulka n×n, kde na souřadnicích [i,j] je jednička (nebo jiná hodnota, v&nbsp;případě ohodnoceného grafu), pokud z&nbsp;i do j vede hrana, a&nbsp;nula, pokud tam hrana není (u&nbsp;neorientovaných grafů je navíc matice symetrická&nbsp;– je jedno, jestli vezmeme [i,j] nebo [j,i]). Hodí se pro husté grafy, kde m~n2.</li><li><strong>Matice incidence</strong>&nbsp;– řádky reprezentují vrcholy, sloupce hrany. V&nbsp;každém sloupci jsou právě dvě jedničky&nbsp;– indexy vrcholů, mezi kterými hrana vede. Zabírá však O(mn) a její použití bývá dost neohrabané, takže je většinou lepší dát přednost jiné reprezentaci grafu. Je ale dobré o&nbsp;ní vědět.</li></ul><p>Grafy jsou velmi široké téma. Můžeme hledat jejich minimální kostry, můžeme v&nbsp;nich hledat nejkratší cesty či skrze ně pouštět pod tlakem vodu. Více o&nbsp;nich si tedy můžete přečíst v&nbsp;některé z&nbsp;našich specializovaných grafových kuchařek, které odkazujeme z&nbsp;našeho <a href=\"https://ksp.mff.cuni.cz/kucharky/\">kuchařkového rozcestníku</a>.</p>",
  2220. "position": [
  2221. -809.2669906616211,
  2222. 1160.4436988830566
  2223. ]
  2224. },
  2225. {
  2226. "id": "kucharka-zakladni-hladovy-algoritmus",
  2227. "type": "text",
  2228. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2229. "requires": [
  2230. "kucharka-zakladni-algoritmus"
  2231. ],
  2232. "title": "Hladové algoritmy",
  2233. "htmlContent": "<h3>Hladové algoritmy</h3><p>Věřte nebo ne, ale i&nbsp;počítač se někdy cítí hladový. Po namáhavé práci mu můžeme dopřát to potěšení, aby si ukousl co největší kus dat. A&nbsp;ukážeme, že někdy je to i&nbsp;ku prospěchu. Řeč bude o&nbsp;<i>hladových algoritmech</i>.</p><p>Takovými algoritmy rozumíme ty, které hledají řešení celé úlohy po jednotlivých krocích a&nbsp;splňují následující dvě podmínky:</p><ul><li>V&nbsp;každém kroku zvolí lokálně nejlepší řešení.</li><li>Provedené rozhodnutí již nikdy neodvolává (tedy nebacktrackuje).</li></ul><p>Lokálně nejlepší řešení je takové, které v&nbsp;aktuálním kroku vybere tu možnost, která nám na tomto místě nejvíce pomůže (bez jakéhokoliv ohledu na globální stav). Může to být třeba nejvyšší hodnota, nebo nejkratší cesta v&nbsp;grafu.</p><p>Pokud ale od hladového algoritmu chceme, aby nám našel globálně nejlepší řešení, musí naše úloha splnit předpoklad, že si výběrem lokálně nejlepšího řešení nezhoršíme to globální. Tento předpoklad se nedá formulovat obecně a&nbsp;je nutné se nad ním zamyslet zvlášť u&nbsp;každé úlohy.</p><h4>Příklady hladových algoritmů</h4><p>První hladovou úlohou bude (jak jinak) automat na jídlo vracející mince. Automat by měl vracet peníze nazpět tak, aby vrátil daný obnos v&nbsp;co možná nejmenším počtu mincí. Pro náš měnový systém (máme mince hodnot 1, 2, 5, 10, 20 a&nbsp;50 Kč) lze tuto úlohu řešit hladovým algoritmem&nbsp;– v&nbsp;každém kroku algoritmu vrátíme tu největší minci, kterou můžeme (tedy pro vrácení 42 Kč to bude 42 = 20 + 20 +2 Kč).</p><p>Měnové systémy většiny států jsou postavené tak, aby fungovaly takto pěkně, neplatí to ale obecně. Zkusme si vrátit 42 Kč, pokud bychom měli jen mince hodnoty 20, 10 a&nbsp;4 Kč. Správným řešením je 42 = 20 + 10 + 4 + 4 +4 Kč, hladový algoritmus by ale zkusil vrátit 42 = 20 + 20 + … a&nbsp;tady by selhal.</p><p>Dále se velmi často dají hladovým algoritmem řešit nějaké úlohy přidávání nebo odebírání skupin prvků. Typickým příkladem je třeba rozvržení naplánovaných přednášek do učeben. Seřadíme si začátky přednášek podle času a&nbsp;postupně bereme jednu za druhou a&nbsp;umísťujeme je do volných učeben s&nbsp;nejnižším číslem.</p><p>Tím jsme si určitě nic nerozbili, protože v&nbsp;nějaké učebně přednáška být musí. Určitě budeme potřebovat tolik učeben, kolik je maximálně přednášek v&nbsp;jeden čas, a&nbsp;díky tomu si umístěním přednášky do nějaké učebny nezablokujeme místo pro jinou přednášku, jelikož nám vždy zbude dostatek volných učeben.</p><p>Kdybychom ale naopak měli pevně zadaný počet učeben a&nbsp;chtěli jsme do nich umístit co možná nejvíce přednášek, nejedná se již o&nbsp;úlohu řešitelnou hladovým algoritmem, v&nbsp;takovém případě je potřeba zvolit nějaký chytřejší postup.</p>",
  2234. "position": [
  2235. -702.5907173156738,
  2236. 307.6112937927246
  2237. ]
  2238. },
  2239. {
  2240. "id": "kucharka-zakladni-knihovny",
  2241. "type": "text",
  2242. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2243. "requires": [],
  2244. "title": "Knihovny",
  2245. "htmlContent": "<h4>Knihovny</h4><p>Tyto základní struktury už jsou často předpřipravené jako součást určitých <i>knihoven</i> v&nbsp;daném jazyce. Knihovna je většinou sbírka nějakých navzájem souvisejících funkcí, které již někdo sepsal a&nbsp;které si můžeme do našeho programu načíst a&nbsp;používat. Ukázku načtení knihoven můžete vidět například ve výše zmíněném kódu v&nbsp;jazyce&nbsp;C.</p><p>Je ale velmi důležité rozumět tomu, jak knihovní funkce vnitřně fungují. Protože jedině když budeme vědět, co je jak rychlé a&nbsp;efektivní, budeme schopni psát rychlé programy.</p><p>Teď již víme, jak reprezentovat nejzákladnější datové struktury v&nbsp;počítači, ale mohlo by se nám hodit zastavit se ještě chvíli u&nbsp;dalších struktur. Tentokrát je už budeme studovat trochu teoretičtěji.</p>",
  2246. "position": [
  2247. -573.0954666137695,
  2248. -921.101863861084
  2249. ],
  2250. "hidden": true
  2251. },
  2252. {
  2253. "id": "kucharka-zakladni-pole",
  2254. "type": "text",
  2255. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2256. "requires": [
  2257. "26-Z1-1",
  2258. "27-Z1-1",
  2259. "30-Z3-1"
  2260. ],
  2261. "title": "Pole",
  2262. "htmlContent": "<p>První datovou strukturou, kterou si představíme a&nbsp;která se na výše nastíněnou situaci náramně hodí, je <i>pole</i>. To představuje spoustu přihrádek (proměnných) naskládaných v&nbsp;paměti za sebou, ke kterým typicky přistupujeme přes jeden společný název pole a&nbsp;jejich pořadové číslo neboli index (jako NazevPole[0], NazevPole[1], …). (Pozor, ve světě počítačů se velmi často indexuje od nuly, tedy první prvek má v&nbsp;tomto případě index 0.)</p><p>Ve většině základních jazyků je pole jen <i>statické</i>, tedy v&nbsp;okamžiku jeho vytváření musíme počítači říct, jak ho chceme velké. Některé vyšší jazyky ale nabízejí i&nbsp;pole, které se dynamicky zvětšuje, takovou konstrukci si ukážeme ve druhé části kuchařky.</p><p>Abychom nebyli omezeni jen jedním rozměrem, můžeme si klidně vyrobit pole dvourozměrné (případně obecně n-rozměrné). Dvourozměrné pole je vlastně tabulka hodnot, nazýváme ji také někdy <i>matice</i>, a&nbsp;může se nám hodit například při reprezentaci různých map (plán bludiště) nebo, jak uvidíme níže, pro reprezentaci dalších datových struktur.</p><p>U&nbsp;pole již má smysl přemýšlet, jak dlouho bude která operace trvat. Díky tomu, že jsou jednotlivé prvky v&nbsp;poli naskládané pevně za sebou, je snadné spočítat umístění konkrétní přihrádky. Proto když se počítače zeptáme na obsah přihrády pole[42], vrátí nám hodnotu ihned.</p><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/img/hippo_array.png\" alt=\"Pole\"></figure><p>Tomu budeme říkat <i>operace v&nbsp;konstantním čase</i> a&nbsp;budeme značit, že trvá čas&nbsp;O(1). Efektivitu programu totiž nepočítáme v&nbsp;sekundách (protože každý z&nbsp;nás má asi jinak rychlý počítač), ale v&nbsp;počtu základních operací, které musí program řádově vykonat. Více o&nbsp;časové složitosti si můžete přečíst v&nbsp;<a href=\"https://ksp.mff.cuni.cz/viz/kucharky/slozitost\">kuchařce o&nbsp;složitosti</a>, nejdříve však doporučujeme dočíst tuto kuchařku.</p><p>Přidání nového prvku na konec pole také zvládneme v&nbsp;konstantním čase. Problém je přidání nového prvku někam doprostřed (což se nám typicky stane, pokud budeme chtít udržovat hodnoty v&nbsp;poli seřazené a&nbsp;zároveň do něj vkládat nové). V&nbsp;takovém případě se totiž všechny prvky za vkládaným musí posunout o&nbsp;jednu pozici dál, aby se vkládaný prvek vešel na své místo. Taková operace tedy může pro pole délky N (čili pole obsahující N prvků) trvat řádově až N kroků, což zapisujeme jako O(N) a&nbsp;říkáme, že je to vzhledem k&nbsp;N <i>lineární časová složitost</i>.</p><p>To je značná nevýhoda oproti struktuře, kterou si ukážeme za chvíli. Určitě ale pole nezavrhujme. Je to základní datová struktura, která nalezne použití ve spoustě programů, a&nbsp;jak si ve druhé části kuchařky ukážeme, můžeme ho použít třeba k&nbsp;rychlému hledání hodnoty metodou <i>binárního vyhledávání</i>. Nyní ale již slibovaná další datová struktura.</p>",
  2263. "position": [
  2264. -394.2932434082031,
  2265. 688.1417579650879
  2266. ],
  2267. "hidden": false
  2268. },
  2269. {
  2270. "id": "kucharka-zakladni-prefixove-soucty",
  2271. "type": "text",
  2272. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2273. "requires": [
  2274. "kucharka-zakladni-pole"
  2275. ],
  2276. "title": "Prefixové součty",
  2277. "htmlContent": "<h4>Prefixové součty</h4><p>Velmi často se nám hodí si ještě před samotným výpočtem předpočítat a&nbsp;uložit nějaké hodnoty, které poté použijeme.</p><p>Představme si například problém nalezení souvislého úseku s&nbsp;největším součtem v&nbsp;nějaké posloupnosti kladných i&nbsp;záporných čísel. Že to není úplně jednoduchý příklad, si ukažme na následující posloupnosti:</p><p>1,-2,4,5,-1,-5,2,7</p><p>Máme zde dvě ryze kladné souvislé posloupnosti, každou se součtem 9 (4,5 a&nbsp;2,7). Ale přesto je výhodnější vzít i&nbsp;nějaké záporné hodnoty a&nbsp;vytvořit tak souvislou posloupnost o&nbsp;součtu 12 (zkuste ji nalézt).</p><p>Mohlo by nás napadnout, že prostě zkusíme vzít všechny možné začátky a&nbsp;všechny možné konce. To nám dává O(n2) možných posloupností (máme n&nbsp;možných začátků a&nbsp;ke každému z&nbsp;nich řádově n&nbsp;možných konců), pro každou posloupnost si spočteme součet (to zvládneme v&nbsp;O(n)) a&nbsp;budeme si pamatovat ten největší nalezený. Celý náš postup tak trvá O(n3).</p><p>To není pro takhle jednoduchou úlohu zrovna ten nejpěknější čas, zkusme ho zlepšit. Ukážeme si, jak vypočítat součet libovolné posloupnosti v&nbsp;konstantním čase. Celý princip je vlastně až kouzelně jednoduchý, ale zároveň velmi mocný. Na začátku výpočtu si do pomocného pole P stejné délky jako posloupnost na vstupu (té říkejme S) uložíme takzvané <i>prefixové součty:</i> i-tý prefixový součet je součet prvních i+1 prvků&nbsp;S, neboli P[i] = S[0] + S[1] + … + S[i].</p><p>Pro náš ukázkový případ a&nbsp;pro vstupní pole označené S by to dopadlo takto:</p><figure class=\"table\"><table><tbody><tr><td>i</td><td>-1</td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr><tr><td>S[i]</td><td>&nbsp;</td><td>1</td><td>-2</td><td>4</td><td>5</td><td>-1</td><td>-5</td><td>2</td><td>7</td></tr><tr><td>P[i]</td><td>0</td><td>1</td><td>-1</td><td>3</td><td>8</td><td>7</td><td>2</td><td>4</td><td>11</td></tr></tbody></table></figure><p>Pole prefixových součtů umíme získat v&nbsp;linerárním čase&nbsp;– prostě jen od začátku procházíme vstupní pole, počítáme si průběžný součet a&nbsp;ten zapisujeme.</p><p>Součet libovolného úseku a…b pak získáme v&nbsp;konstantním čase jako prefixový součet od začátku do indexu&nbsp;b minus prefixový součet od začátku do indexu&nbsp;a. Zapsáno programově to pak je:</p><p>soucet = P[b] - P[a-1]; To nám umožňuje snížit čas potřebný na řešení této úlohy na O(n2). To je už lepší čas; prozradíme však, že tuto úlohu lze řešit dokonce v&nbsp;lineárním čase, ale to je již nad rámec této kuchařky.</p><h4>&nbsp;</h4>",
  2278. "position": [
  2279. 264.1203804016113,
  2280. 787.7883148193359
  2281. ]
  2282. },
  2283. {
  2284. "id": "kucharka-zakladni-prefixove-soucty-2d",
  2285. "type": "text",
  2286. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2287. "requires": [
  2288. "30-Z4-1"
  2289. ],
  2290. "title": "Dvourozměrné prefixové součty",
  2291. "htmlContent": "<h4>Dvourozměrné prefixové součty</h4><p>Prefixové součty se dají zobecnit i&nbsp;do více rozměrů, ale princip je vždy stejný. Například dvourozměrné prefixové součty u&nbsp;matice fungují tak, že si předpočítáme součty podmatic začínajících levým vrchním políčkem a&nbsp;končící na indexu [x,y].</p><p>Z&nbsp;toho je vidět, že prefixový součet zpravidla obsadí stejně velký prostor jako původní data, v&nbsp;tomto případě tedy budeme mít matici hodnot prefixových součtů končících na zadaných souřadnicích. Jak ale získat součet nějaké podmatice, která se nachází někde „uprostřed“ naší matice?</p><p>Použijeme stejný princip jako u&nbsp;jednorozměrného případu: Přičteme větší část, kterou chceme započítat, a&nbsp;odečteme od ní části, které započítat nechceme. Pro případ podmatice začínající vlevo nahoře na pozici [x,y] a&nbsp;končící napravo dole na [X,Y] to ilustruje následující obrázek:</p><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/zakladni_algoritmy-6.png\" alt=\"Dvourozměrné prefixové součty\"></figure><p>Nejdříve přičteme celý prefixový součet končící na pozici [X,Y]. Tím jsme ale započítali i&nbsp;části A, B a&nbsp;C z&nbsp;obrázku, které započítat nechceme. Tak odečteme prefixové součty končící na indexech [X,y] a&nbsp;[x,Y]. Ale pozor, teď jsme odečetli jednou A+B a&nbsp;jednou A+C, tedy část&nbsp;A (prefixový součet končící na pozici [x,y]) jsme odečetli dvakrát, musíme ji proto ještě jednou přičíst.</p><p>Celý vzorec tedy vypadá takto:</p><p>soucet = P[X,Y] - P[X,y] - P[x,Y] + P[x,y];</p><p>Tento princip přičítání a odečítání se dá zobecnit i&nbsp;pro libovolné vyšší rozměry, ale chce to již trošku představivosti, co se má přičíst a&nbsp;kolikrát. Říká se tomu také <i>princip inkluze a&nbsp;exkluze</i> a&nbsp;najde použití nejen u&nbsp;vícerozměrných prefixových součtů.</p>",
  2292. "position": [
  2293. 170.57422256469727,
  2294. 1063.6810913085938
  2295. ]
  2296. },
  2297. {
  2298. "id": "kucharka-zakladni-reprezentace-dat",
  2299. "type": "text",
  2300. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2301. "requires": [
  2302. "26-Z2-2"
  2303. ],
  2304. "title": "Reprezentace dat",
  2305. "htmlContent": "<h3>Reprezentace dat v&nbsp;počítači</h3><p>Celkem často si v&nbsp;průběhu výpočtu našeho algoritmu potřebujeme pamatovat nějaké hodnoty. K&nbsp;tomu nám programovací jazyky dávají nástroj s&nbsp;názvem <i>proměnná</i>. Ta představuje jakési pojmenované místo v&nbsp;paměti (přihrádku), do kterého si můžeme data ukládat a&nbsp;pak je odtud zase načítat.</p><p>Typickým příkladem může být počítání součtu čísel, která nám uživatel zadá na vstupu. Na začátku nejdříve do nějakého místa v&nbsp;paměti uložíme hodnotu&nbsp;0. Poté postupně, jak nám uživatel zadává čísla, tuto proměnnou pokaždé přečteme, k&nbsp;její hodnotě přičteme nově zadané číslo a&nbsp;výsledek opět uložíme na stejné místo.</p><p>Takovéto použití jedné proměnné je velmi jednoduché (tak jednoduché, že ho takto podrobně do řešení KSPčka nepište, není to potřeba), ale také celkem omezené. Co kdybychom si chtěli pamatovat třeba celou zadanou posloupnost čísel? Mohlo by nám stačit vyrobit si spoustu různě pojmenovaných proměnných, ale nejde to lépe? Jde.</p><p>Jednotlivé proměnné se mohou kombinovat do složitějších konstrukcí, které obecně nazýváme <i>datovými strukturami</i>. Zkusíme si ty nejzákladnější představit.</p>",
  2306. "position": [
  2307. -389.9202308654785,
  2308. 470.58526611328125
  2309. ]
  2310. },
  2311. {
  2312. "id": "kucharka-zakladni-spojovy-seznam",
  2313. "type": "text",
  2314. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2315. "requires": [
  2316. "kucharka-zakladni-pole"
  2317. ],
  2318. "title": "Spojový seznam",
  2319. "htmlContent": "<h4>Spojový seznam a&nbsp;ukazatele</h4><p>Pole jsme měli v&nbsp;paměti určené jenom tím, že počítač věděl, kde je jeho začátek a&nbsp;kolik místa v&nbsp;paměti zabírají jeho prvky. Při dotazování na konkrétní index pak podle indexu a&nbsp;podle velikosti prvků počítač přesně věděl, kam do paměti se má podívat, aby našel námi požadovaný prvek (to vše zvládl v&nbsp;konstantním čase). Jednotlivé prvky si tedy vůbec nemusely pamatovat, kde se nachází jejich sousedi, protože všechny prvky seděly v&nbsp;paměti za sebou.</p><p>Představme si ale teď situaci, kdy by si každý prvek ještě pamatoval pozice sousedů. Pak bychom mohli mít prvky libovolně rozházené v&nbsp;paměti a&nbsp;jen by se na sebe vzájemně odkazovaly (první prvek by tvrdil, že druhý je na pozici X, druhý by tvrdil, že třetí je na pozici Y, a&nbsp;tak dále).</p><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/zakladni_algoritmy-1.png\" alt=\"Spojový seznam\"></figure><p>K&nbsp;lepšímu pochopení tohoto principu je důležité si vysvětlit, co to je <i>ukazatel</i> (nebo také <i>odkaz</i> či anglicky <i>pointer</i>). Každé místo v paměti počítače má své číselné označení, kterému říkáme <i>adresa</i>. Když si vytváříme nějakou pojmenovanou proměnnou, ta se vlastně odkazuje na určité místo v&nbsp;paměti a&nbsp;na tomto místě v&nbsp;paměti je její hodnota.</p><p>Co kdyby ale hodnota proměnné byla adresa nějakého jiného místa v&nbsp;paměti? Pak takové proměnné říkáme <i>pointer</i> a&nbsp;umožňuje nám vytvářet výše popsanou strukturu rozházených prvků v&nbsp;paměti.</p><p><i>Spojový seznam</i> je tedy určený svým prvním prvkem (máme v&nbsp;jedné proměnné pointer na tento prvek, který se často nazývá <i>kořen</i>, protože z&nbsp;něj „vyrůstá“ zbytek struktury) a&nbsp;poté u&nbsp;každého dalšího prvku máme za sebou uloženou hodnotu tohoto prvku a&nbsp;odkaz (pointer) na další prvek. Odkazy mezi prvky mohou být i&nbsp;obousměrné, mohou vést dokola (poslední ukazuje na první) či mohou dokonce tvořit nějakou složitější strukturu (pak to ale již nebude čistý spojový seznam).</p><p>Pokud pointer nemá nikam ukazovat, realizuje se to odkázáním tohoto pointeru na adresu NULL. To skoro doslovně říká „Neukazuji nikam“.</p><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/zakladni_algoritmy-2.png\" alt=\"Obousměrný cyklický spojový seznam\"></figure><p>Co nám takto vystavěná struktura umožňuje v&nbsp;porovnání s&nbsp;polem? Přístup na konkrétní prvek v&nbsp;ní stojí lineárně času, protože ho musíme „odkrokovat“ od prvního prvku (na který máme pointer), tedy musíme udělat až O(N) kroků. Pokud bychom však pointer na daný prvek už nějak měli, samozřejmě na něj můžeme přistoupit v&nbsp;konstantním čase.</p><p>Naopak přidávání prvků na konkrétní místo (i&nbsp;jejich odebírání) máme v&nbsp;podstatě zadarmo a&nbsp;spojový seznam můžeme rozšiřovat, dokud na něj máme v&nbsp;počítači paměť. Ve chvíli, kdy chceme přidat nový prvek za prvek, na který máme pointer, jen šikovně přepojíme ukazatele. Pokud předtím ukazatele vedly A→B, teď povedou A →C →B (a&nbsp;při odebírání naopak).</p>",
  2320. "position": [
  2321. -602.9680938720703,
  2322. 850.3306617736816
  2323. ]
  2324. },
  2325. {
  2326. "id": "kucharka-zakladni-stromy",
  2327. "type": "text",
  2328. "comment": "https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/",
  2329. "requires": [
  2330. "kucharka-zakladni-grafy"
  2331. ],
  2332. "title": "Stromy",
  2333. "htmlContent": "<h4>Stromy</h4><p>Možná si říkáte, co má informatika u&nbsp;všech elektronů společného s&nbsp;lesnictvím? Kupodivu celkem mnoho a&nbsp;bez stromů bychom se v&nbsp;leckterém případě jen těžko obešli. Informatické stromy sice nejsou většinou tak zelené, mají ale, na rozdíl od svých dřevnatých sourozenců, mnoho jiných pěkných vlastností.</p><p>Strom je vlastně speciálním případem souvislého grafu, který neobsahuje žádnou kružnici (cyklus). To znamená, že mezi každými dvěma vrcholy stromu existuje právě jedna cesta.</p><p>Díky této vlastnosti můžeme nějaký zvolený vrchol prohlásit za <i>kořen</i> a&nbsp;strom za něj pomyslně zavěsit (tak, že strom roste od kořene směrem dolů), této operaci se říká <i>zakořenění</i>. Pak můžeme mluvit o&nbsp;tom, že z&nbsp;kořene směrem dolů (informatické stromy mají tradičně kořen nahoře) vyrůstají nějaké <i>podstromy</i>.</p><figure class=\"image\"><img src=\"https://ksp.mff.cuni.cz/kucharky/zakladni-algoritmy/zakladni_algoritmy-4.png\" alt=\"Strom\"></figure><p>Pokud je strom zakořeněný, můžeme v&nbsp;něm mluvit o&nbsp;<i>hloubce</i> každého vrcholu, neboli o&nbsp;jeho vzdálenosti od kořene. Hloubka celého stromu je pak nejdelší ze vzdáleností od kořene k&nbsp;nějakému z&nbsp;<i>listů</i> (tak říkáme vrcholům, které již nemají žádné <i>syny</i>, tedy vrcholy, které by z&nbsp;nich vyrůstaly). Podle hloubky poté můžeme vrcholy stromu uspořádat do jednotlivých <i>hladin</i>.</p><p>Velmi často používáme stromy, které jsou nějak pravidelné. Příkladem jsou třeba <i>binární stromy</i>, které mají v&nbsp;každém vrcholu maximálně dva syny (říkáme jim <i>levý a&nbsp;pravý podstrom</i>). Reprezentovat se dají buď obecně jako každý jiný strom (v&nbsp;každém vrcholu spojový seznam podstromů), nebo velmi pěkně i&nbsp;v&nbsp;poli.</p><p>Stačí si pomyslně doplnit binární strom na <i>úplný</i> (to je takový, který má všechny své hladiny plné) a pak ho od kořene směrem dolů po hladinách očíslovat (kořen dostane číslo nula, jeho synové čísla jedna a dva, další hladina čísla tři až šest, atd.).</p><p>Můžeme si všimnout, že pokud si v&nbsp;takovém očíslování vezmeme jakýkoliv vrchol s&nbsp;číslem (indexem) i, jeho synové jsou právě vrcholy s&nbsp;indexy 2i+1 a&nbsp;2i+2. Do pole níže je zapsaný binární strom z&nbsp;obrázku výše.</p><figure class=\"table\"><table><tbody><tr><td>index</td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr><tr><td>hodnota</td><td>8</td><td>3</td><td>12</td><td>1</td><td>5</td><td>9</td><td>14</td><td>-</td><td>-</td><td>4</td><td>7</td></tr></tbody></table></figure><p>Jak plyne z&nbsp;očíslování, pro úplný binární strom je uložení v&nbsp;poli efektivní a neplýtváme místem. Pokud ale strom úplný nebude, zůstanou nám v&nbsp;poli volná místa. Uložení v&nbsp;poli se tedy vyplatí jen pro stromy, které se od úplných příliš neliší.</p><p>Speciálním případem binárních stromů jsou pak ještě <i>binární vyhledávací stromy</i>. Jsou to normální binární stromy, pro něž navíc platí, že ať si vezmeme libovolný vrchol, budou hodnoty vrcholů v&nbsp;jeho levém podstromu menší než hodnota tohoto vrcholu a&nbsp;hodnoty v&nbsp;jeho pravém podstromu naopak větší.</p><p>V&nbsp;takovém stromu pak zvládneme snadno vyhledávat. Budeme ho postupně procházet od kořene a v&nbsp;jednotlivých vrcholech budeme porovnávat hledanou a aktuální hodnotu a podle toho sestupovat do správného podstromu. Podobná technika je detailněji popsaná ve druhé části kuchařky, v&nbsp;sekci <i>Rozděl a panuj</i>.</p><p>Na složitější datové struktury stavějící na těchto základních (haldy, intervalové stromy,&nbsp;…) se můžete podívat do některé z&nbsp;našich dalších kuchařek, na jejichž přehled jsme vás už odkázali o&nbsp;kapitolu výše.</p>",
  2334. "position": [
  2335. -973.6452713012695,
  2336. 1311.047519683838
  2337. ]
  2338. },
  2339. {
  2340. "id": "label_matematicke",
  2341. "type": "label",
  2342. "comment": "...",
  2343. "requires": [],
  2344. "title": "Potřeba matematického pohledu",
  2345. "position": [
  2346. 1671.7270526885986,
  2347. 2.2010104656219482
  2348. ],
  2349. "hidden": true
  2350. },
  2351. {
  2352. "id": "label-1d-pole",
  2353. "type": "label",
  2354. "comment": "...",
  2355. "requires": [],
  2356. "title": "Pole",
  2357. "rotationAngle": 0,
  2358. "position": [
  2359. -322.5432434082031,
  2360. 671.8694763183594
  2361. ]
  2362. },
  2363. {
  2364. "id": "label-2d-pole",
  2365. "type": "label",
  2366. "comment": "...",
  2367. "requires": [],
  2368. "title": "2D pole",
  2369. "rotationAngle": 340,
  2370. "position": [
  2371. -1940.40087890625,
  2372. -968.7437057495117
  2373. ],
  2374. "hidden": true
  2375. },
  2376. {
  2377. "id": "label-grafy",
  2378. "type": "label",
  2379. "comment": "...",
  2380. "requires": [],
  2381. "title": "Grafy",
  2382. "rotationAngle": 342,
  2383. "position": [
  2384. -1025.697265625,
  2385. 1579.5523328781128
  2386. ],
  2387. "hidden": false
  2388. },
  2389. {
  2390. "id": "label-grafy-pracovni-poznamka",
  2391. "type": "text",
  2392. "comment": "Chtělo by to grafy celé nějak přeuspořádat. Je to přeci jen dost široké téma.",
  2393. "requires": [
  2394. "31-Z3-3"
  2395. ],
  2396. "title": "Grafy, ale neuspořádané",
  2397. "htmlContent": "<p>undefined</p>",
  2398. "position": [
  2399. -972.8342895507812,
  2400. 1705.182228088379
  2401. ],
  2402. "hidden": true
  2403. },
  2404. {
  2405. "id": "label-retezce",
  2406. "type": "label",
  2407. "comment": "...",
  2408. "requires": [],
  2409. "title": "Textové řetězce",
  2410. "rotationAngle": 326,
  2411. "position": [
  2412. -392.4626007080078,
  2413. 1300.9295349121094
  2414. ],
  2415. "hidden": false
  2416. },
  2417. {
  2418. "id": "label-trizeni",
  2419. "type": "label",
  2420. "comment": "",
  2421. "requires": [],
  2422. "title": "Třídění",
  2423. "position": [
  2424. -2183.748046875,
  2425. -446.9033250808716
  2426. ],
  2427. "hidden": true
  2428. },
  2429. {
  2430. "id": "label-uvod",
  2431. "type": "label",
  2432. "comment": "...",
  2433. "requires": [],
  2434. "title": "Úvod",
  2435. "position": [
  2436. -3.4084014892578125,
  2437. 35.22608184814453
  2438. ]
  2439. },
  2440. {
  2441. "id": "label-vaskuv-pokus-o-kecy",
  2442. "type": "label",
  2443. "comment": "...",
  2444. "requires": [],
  2445. "title": "Vaškův pokus o kecy",
  2446. "position": [
  2447. -695.6980514526367,
  2448. -966.9375038146973
  2449. ],
  2450. "hidden": true
  2451. },
  2452. {
  2453. "id": "label-zelvy",
  2454. "type": "label",
  2455. "comment": "...",
  2456. "requires": [],
  2457. "title": "Želvy",
  2458. "rotationAngle": 43,
  2459. "position": [
  2460. 587.7714233398438,
  2461. 399.8365783691406
  2462. ],
  2463. "hidden": true
  2464. },
  2465. {
  2466. "id": "lbl-pokrocile-grafy",
  2467. "type": "label",
  2468. "comment": "...",
  2469. "requires": [],
  2470. "title": "Pokročilejší grafy",
  2471. "position": [
  2472. -969.0080337524414,
  2473. 2068.4594764709473
  2474. ],
  2475. "hidden": false
  2476. },
  2477. {
  2478. "id": "meta-poznamky",
  2479. "type": "label",
  2480. "comment": "...",
  2481. "requires": [],
  2482. "title": "Meta-poznámky",
  2483. "position": [
  2484. -18,
  2485. -159
  2486. ]
  2487. },
  2488. {
  2489. "id": "placeholder-kurz-programovani",
  2490. "type": "text",
  2491. "comment": "",
  2492. "requires": [
  2493. "programovani"
  2494. ],
  2495. "title": "Základní kurz programování",
  2496. "htmlContent": "<p>Tady by měl začítat kurz programování. Chceme ze stávajícího kurzu vybrat úlohy a dát je sem. Postupně by asi také bylo fajn to celé rozvinou do větších detailů.</p><p>&nbsp;</p><p>Zatím je základní kurz na <a href=\"https://ksp.mff.cuni.cz/kurzy/zkp/1-uvod/\">https://ksp.mff.cuni.cz/kurzy/zkp/1-uvod/</a></p>",
  2497. "position": [
  2498. 270.30201721191406,
  2499. 324.0678482055664
  2500. ]
  2501. },
  2502. {
  2503. "id": "programovani",
  2504. "type": "text",
  2505. "comment": "...",
  2506. "requires": [
  2507. "jak-resit-ulohy"
  2508. ],
  2509. "title": "Programování",
  2510. "htmlContent": "<p>Počítače nemluví lidskou řečí. Aspoň zatím. Pokud jim chceme vysvětlit nějaký komplikovanější problém, potřebujeme mluvit správnou řečí - nějakým <strong>programovacím jazykem.</strong></p><h2>Jaký programovací jazyk použít?</h2><p>Programovacích jazyků je více a každý se hodí na něco jiného. S roustoucími zkušenostmi se pravděpodobně naučíš přecházet mezi několika programovacími jazyky podle toho, jaký problém zrovna řešíš.</p><p>Pro řešení úloh Ti doporučujeme <strong>Python 3</strong>. Pokud se ho chceš naučit, můžeš zkusit projít kurzem, který jsme pro Tebe připravili.</p>",
  2511. "position": [
  2512. 124.60416412353516,
  2513. 250.46935510635376
  2514. ]
  2515. },
  2516. {
  2517. "id": "start",
  2518. "type": "text",
  2519. "requires": [
  2520. "label-uvod"
  2521. ],
  2522. "comment": "úvodní kecy o tom, jak to celé funguje",
  2523. "title": "Start",
  2524. "htmlContent": "<p>Aktuálně je celý projekt <strong>ve vývoji</strong>. Pokud najdeš libovolnou chybu nebo pokud Tě napadá, že by se dalo cokoliv vylepšit (a ideálně jak), dej prosím vědět Vaškovi a Standovi. Za libovolnou zpětnou vazbu budeme vděční. Díky!</p><p>Pokud by jsi chtěl(a) kurz vylepšit například úpravou textů nebo přesunem úloh, můžeš! Více informací najdeš v úloze <a href=\"#task/jak-muzu-pomoct\">Jak můžu pomoct</a>.</p><h2>Vítej v novém KSPím kurzu!</h2><p>Chceš se naučit programovat, ale nevíš, na čem si to můžeš zkoušet? Nebo již něco umíš a chceš si své znalosti rozšířit? Potom jsi na správném místě! V našem kurzu najdeš prakticky vše, čemu jsme se kdy v KSPčku věnovali.</p><h3>Co zde (časem) najdeš?</h3><ul><li>Základní kurz programování (dříve byl samostatně)</li><li>Roztříděné úlohy ze starších ročníků a sérií</li><li>Staré seriály</li><li>…a další úlohy, které jsme odněkud vyhrabali nebo nově vyrobili</li></ul><h3>Jak kurz funguje?</h3><p>Když zavřeš tento text, najdeš na stránce spoustu úloh umístěných do <a href=\"#task/kucharka-zakladni-grafy\">grafu</a>. Po přihlášení se ti i začnou vybarvovat podle toho, jestli už jsi na nich někdy dělal(a). Kurz totiž staví nad <a href=\"/cviciste/\">Cvičištěm</a> - místem, kde můžeš řešit naše staré úlohy. Všechny úlohy vyřešené zde v kurzu se ti označí jako vyřešené ve Cvičišti. Stejně tak naopak.</p><p>Úlohy jsou do grafu naskládané podle toho, jak moc spolu tematicky souvisí. Navíc v grafu najdeš i různé texty, některé nové a některé z různých částí našeho webu. Toto uspořádání Ti umožňuje spojit studium různých témat s relevantními úlohami, na kterých si hned můžeš své znalosti procvičit.</p><h3>Co budu mít z toho, že budu úlohy zde řešit?</h3><p>Můžeš se něco nového naučit a mít z toho dobrý pocit. 😀 Nic jiného Ti slíbit nemůžeme. Navíc ono jsou k úlohám většinou přístupná vzorová řešení, takže soutěžit zde nedává moc smysl.</p><p>Ohledně vzorových řešení – je čistě na Tobě, zda budeš úlohy řešit poctivě, nebo jestli si budeš číst řešení před tím, než vymyslíš něco vlastního. Zabránit Ti v tom nedokážeme a ani nechceme. Pokud se chceš něco naučit, nebo si něco procvičit, tak doporučujeme vzorová řešení otevírat až po vlastním řešení, případně když se zasekneš. Získáš tak z kurzu nejvíce.</p>",
  2525. "position": [
  2526. -1.7545125484466553,
  2527. 96.57219696044922
  2528. ]
  2529. }
  2530. ],
  2531. "clusters": {
  2532. "Triviální výpočet": [
  2533. "31-Z1-1"
  2534. ],
  2535. "Triviální průchod 1D pole": [
  2536. "26-Z1-1"
  2537. ],
  2538. "Triviální průchody 2D pole": [
  2539. "26-Z1-2",
  2540. "26-Z4-3",
  2541. "29-Z3-1",
  2542. "31-Z1-4"
  2543. ],
  2544. "Želvy": [
  2545. "29-Z1-1",
  2546. "29-Z2-1",
  2547. "29-Z4-3"
  2548. ],
  2549. "Komplexnější práce s poli": [
  2550. "26-Z2-4",
  2551. "29-Z1-3"
  2552. ],
  2553. "Práce s čísly": [
  2554. "26-Z2-2",
  2555. "26-Z3-3",
  2556. "26-Z4-1"
  2557. ],
  2558. "Práce s řetězci": [
  2559. "26-Z1-3",
  2560. "26-Z2-3",
  2561. "26-Z3-2",
  2562. "29-Z3-2"
  2563. ],
  2564. "Grafy": [
  2565. "26-Z1-4",
  2566. "26-Z3-4",
  2567. "26-Z4-4",
  2568. "29-Z1-4",
  2569. "31-Z1-2",
  2570. "31-Z3-2",
  2571. "31-Z3-3"
  2572. ],
  2573. "Voser": [
  2574. "26-Z3-1",
  2575. "29-Z3-3"
  2576. ],
  2577. "Nápad": [
  2578. "26-Z4-2"
  2579. ],
  2580. "matematické": [
  2581. "30-1-4"
  2582. ]
  2583. }
  2584. }