{"id":10005,"date":"2017-05-18T02:11:25","date_gmt":"2017-05-18T06:11:25","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=10005"},"modified":"2017-08-13T11:06:38","modified_gmt":"2017-08-13T15:06:38","slug":"18-pl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/18-pl\/","title":{"rendered":"18: Wydajno\u015b\u0107"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com, http:\/\/cscircles.ca<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/-->\n<p>Wiele zada\u0144 programowania mo\u017cna wykona\u0107 na wi\u0119cej ni\u017c jeden spos\u00f3b, ale jeden spos\u00f3b mo\u017ce by\u0107 znacznie szybszy od drugiego. Projektowanie szybkich program\u00f3w jest cz\u0119\u015bci\u0105 sztuki i nauki programowania komputerowego. W tym \u0107wiczeniu przyjrzymy si\u0119 kilku przyk\u0142adom.<\/p>\n<h1>Cz\u0119\u015b\u0107 1: Nie Zmieniaj Tego Samego Dwa Razy<\/h1>\n<p><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Ci%C4%85g_Fibonacciego\">Ci\u0105g Fibonacciego<\/a> jest fascynuj\u0105cym i prostym ci\u0105giem liczb. Zaczynamy od dw\u00f3ch liczb: 1 i 1. Aby <em>uzyska\u0107 nast\u0119pn\u0105 liczb\u0119 dodajemy poprzednie dwie<\/em>. Dlatego nast\u0119pna liczba to 1 + 1 = 2. Daje to pierwsze trzy wyrazy, <\/p>\n<p style=\"text-align: center;\"><code>1, 1, 2<\/code><\/p>\n<p>i czwarty wyraz to  1+2=3, then we have 2+3=5 i wtedy mamy:<\/p>\n<p style=\"text-align: center;\"><code>1, 1, 2, 3, 5, 8, 13, ...<\/code><\/p>\n<p>Ci\u0105g Fibonacciego zosta\u0142 pierwotnie stworzony, na potrzeby obliczania populacji kr\u00f3lik\u00f3w, ma fantastyczne powi\u0105zania z architektur\u0105 ro\u015blin. Oto cz\u0119\u015b\u0107 niesamowitej serii film\u00f3w o ci\u0105gu Fibonacciego: <div style='text-align: center;'>\n<iframe width='560' height='315' src='https:\/\/www.youtube.com\/embed\/ahXIMUkSXX0?rel=0' frameborder='0' allowfullscreen>\n<\/iframe>\n<\/div>\n<p>Definicja ci\u0105gu Fibonacciego nadaje si\u0119 w spos\u00f3b naturalny do funkcji rekurencyjnej. Kolejne \u0107wiczenie definiuje funkcj\u0119 <code>Fibonacci(n)<\/code> w celu otrzymania <code>n<\/code>-tej pozycji na powy\u017cszej li\u015bcie (zaczynaj\u0105c od <code>n=1<\/code>).<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform0\" method=\"POST\">\n<div class='pybox modeNeutral scramble' id='pybox0'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Scramble Exercise: <\/span><span class='title'>Nibofacci<\/span><\/div>Posortuj program tak, aby da\u0142 rekurencyjn\u0105 definicj\u0119 ci\u0105gu Fibonacciego. Nasz automatyczny tester wypisze pierwszych dziesi\u0119\u0107 z nich.<ul class=\"pyscramble\" name=\"pyscramble\" id=\"pyscramble0\">\n <li class=\"pyscramble\">def Fibonacci(n):<\/li>\n <li class=\"pyscramble\">        return Fibonacci(n-1) + Fibonacci(n-2)<\/li>\n <li class=\"pyscramble\">        return 1<\/li>\n <li class=\"pyscramble\">    if (n==1 or n==2):<\/li>\n <li class=\"pyscramble\">    else:<\/li>\n<\/ul>\n<input type='hidden' id='usercode0' name='usercode0'\/>\n<div id='pbhistory0' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput0\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit0' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch0\" value=\"Input Switch\" onclick=\"pbInputSwitch(0,'Y')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse0\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"0\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"771d5db1d831345d1541a0f9df133ac8\"\/>\n<div id='pbresults0' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(0,\"Y\");<\/script>\n<\/p>\n<p>Ta funkcja rekurencyjna staje si\u0119 jednak zbyt wolna do obliczania kolejnych element\u00f3w ci\u0105gu. Naci\u015bnij \u201eWprowad\u017a polecenie testowe\u201d i wpisz <code>print(Fibonacci(80))<\/code>. Podczas testowania otrzymasz komunikat \"Limit czasu przekroczony\".<\/p>\n<p>Dlaczego tak powoli? Funkcja ta nie ma skomplikowanych instrukcji lub p\u0119tli, tylko dodawanie. Wi\u0119c powolno\u015b\u0107 okazuje si\u0119 by\u0107 zwi\u0105zana z liczb\u0105 wszystkich odwo\u0142a\u0144 do funkcji. Je\u015bli wywo\u0142ujemy <code>Fibonacci(3)<\/code>, funkcja rekurencyjna jest wywo\u0142ywana \u0142\u0105cznie trzy razy: pocz\u0105tkowe wywo\u0142anie, a nast\u0119pnie dwa wywo\u0142ania rekurencyjne. Je\u015bli wywo\u0142ujemy <code>Fibonacci(4)<\/code>, funkcja rekurencyjna jest wywo\u0142ywana pi\u0119ciokrotnie: pocz\u0105tkowe wywo\u0142anie, trzy razy dla <code>n=3<\/code> w\u0142a\u015bnie wspomniane i jedno wywo\u0142anie rekurencyjne dla <code>n=2<\/code>. Obliczanie <code>Fibonacci(5)<\/code> daje \u0142\u0105cznie dziewi\u0119\u0107 wywo\u0142a\u0144, a <code>Fibonacci(6)<\/code> daje \u0142\u0105cznie 9 + 5 + 1 = 15 wywo\u0142a\u0144. Liczba wywo\u0142a\u0144 jest bardzo szybko bardzo du\u017ca, gdy <code>n<\/code> ro\u015bnie!<\/p>\n<p>W przybli\u017conej ocenie, <code>Fibonacci(n+2)<\/code> wymaga co najmniej dwukrotnie wi\u0119kszej liczby wywo\u0142a\u0144 rekurencyjnych ni\u017c <code>Fibonacci(n)<\/code>, poniewa\u017c <code>Fibonacci(n+2)<\/code> bezpo\u015brednio wywo\u0142uje <code>Fibonacci(n)<\/code> , a innym razem po\u015brednio przez rekurencyjne wywo\u0142anie <code>Fibonacci(n+1)<\/code>. Wi\u0119c czas obliczeniowy jest proporcjonalny do <em>funkcji wyk\u0142adniczej<\/em> co najmniej tak du\u017cej jak (\u221a2)<sup>n<\/sup>. To jest zbyt powolne! Np. <code>Fibonacci(80)<\/code> wymaga wi\u0119cej ni\u017c 2<sup>40<\/sup> = 1099511627776 wywo\u0142a\u0144 rekurencyjnych.<\/p>\n<p>Ten argument zawiera nawet dok\u0142adny problem konceptualny: dwukrotne wywo\u0142anie<code>Fibonacci(n)<\/code> i ponowne obliczanie odpowiedzi od pocz\u0105tku po raz drugi jest marnotrawstwem. Powinni\u015bmy wymy\u015bli\u0107 jakie\u015b podej\u015bcie, w kt\u00f3rym nie marnujemy czasu na ponowne obliczanie tej samej rzeczy w k\u00f3\u0142ko.<\/p>\n<h2>Rozwi\u0105zanie<\/h2>\n<p>Spr\u00f3bujmy w Pythonie zrobi\u0107 co\u015b bardziej podobnego do wprowadzenia. Zacz\u0119li\u015bmy od zapisu 1, 1. Nast\u0119pnie poszerzali\u015bmy sekwencj\u0119, dodaj\u0105c ostatnie dwa elementy razem. Oto jak wygl\u0105da kod; ponownie do ciebie nale\u017cy odpowiednie posortowanie.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral scramble' id='pybox1'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Scramble Exercise: <\/span><span class='title'> Szybki Fibonacci<\/span><\/div>Posortuj szybk\u0105 wersj\u0119, aby oblicza\u0107 wi\u0119ksze warto\u015bci Fibonacciego.<ul class=\"pyscramble\" name=\"pyscramble\" id=\"pyscramble1\">\n <li class=\"pyscramble\">        sequence.append(sequence[i-1] + sequence[i-2])<\/li>\n <li class=\"pyscramble\">    return sequence[n]<\/li>\n <li class=\"pyscramble\">def Fibonacci(n):<\/li>\n <li class=\"pyscramble\">    for i in range(3, n+1):      <\/li>\n <li class=\"pyscramble\">    sequence = [0, 1, 1]  # Fibonacci(0) wynosi 0, Fibonacci(1) i Fibonacci(2) wynosi 1<\/li>\n<\/ul>\n<input type='hidden' id='usercode1' name='usercode1'\/>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput1\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch1\" value=\"Input Switch\" onclick=\"pbInputSwitch(1,'Y')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse1\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"1\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"2e41034bd14583cdb29195363b817411\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(1,\"Y\");<\/script>\n<\/p>\n<p>Nadal jest troch\u0119 miejsca na ulepszenia, poniewa\u017c nie musimy ponownie oblicza\u0107 ca\u0142ej tablicy w ka\u017cdym nowym wywo\u0142aniu, ale jest to wystarczaj\u0105co dobre, poniewa\u017c dzia\u0142a szybko, nawet na du\u017cych warto\u015bciach n!<\/p>\n<h1>Cz\u0119\u015b\u01072: Nie Obliczaj Niepotrzebnych Rzeczy, Nawet Raz<\/h1>\n<p>Nasz drugi przyk\u0142ad polega na sprawdzeniu, czy liczby s\u0105 liczbami <strong>pierwszymi<\/strong>, co ma znaczenie w kryptografii i bezpiecze\u0144stwie komputerowym. Liczba jest pierwsza, je\u015bli ma dok\u0142adnie dwa dzielniki naturalne: 1 i sam\u0105 siebie. Oto kilka kolejnych liczb pierwszych to 2, 3, 5, 7, 11, 13, 17, 19, 23. (Na przyk\u0142ad, 21 nie jest pierwsze, poniewa\u017c ma nast\u0119puj\u0105ce dzielniki 3 i 7, a tak\u017ce 1 i 21.)<\/p>\n<p>W jaki spos\u00f3b mo\u017cemy sprawdzi\u0107, czy liczba jest pierwsza w Pythonie? Widzieli\u015bmy <a href=\"7b-pl\/\">wcze\u015bniej<\/a>, jak sprawdzi\u0107  podzielno\u015b\u0107:<\/p>\n<p style=\"text-align: center;\"><code>N % D == 0 \u00a0# will be True if D is a divisor of N, False otherwise<\/code><\/p>\n<p>Poprzez sprawdzenie wszystkich mo\u017cliwych dzielnik\u00f3w, przyst\u0119pujemy do nast\u0119puj\u0105cego programu.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox2'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Sprawdzenie, czy niektore liczby s\u0105 pierwsze<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 162px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=6 readonly='readonly'  style = 'height : 162px;'  class='pyboxCode RO'>\ndef isItPrime(N):\n  for D in range(2, N):                        # test D od 2 do N-1\n    if N % D == 0:                             # D jest dzielnikiem N?\n      print(N, \"nie jest pierwsza; podzielna przez\", D)\n      return\n  print(N, \"jest pierwsza\")                         # nie ma dzielnik\u00f3w<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput2\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch2\" value=\"Input Switch\" onclick=\"pbInputSwitch(2,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'Y')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"9188dec23f9477a4a2d5b449c6a23b2e\"\/>\n<div id='pbresults2' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(2,\"Y\");<\/script>\n<\/p>\n<p>To dzia\u0142a! Ale dla du\u017cych liczb te\u017c zbyt wolno. Naci\u015bnij <strong>Wprowad\u017a dane<\/strong> i wpisz <code>isItPrime(324635459)<\/code>. Min\u0105\u0142 czas. Spr\u00f3buj dla innych warto\u015bci ... dla liczb pierwszych wi\u0119kszych ni\u017c 10000000 kod przestaje dzia\u0142a\u0107, poniewa\u017c nasz automatyczny tester mo\u017ce wykona\u0107 sprawdzanie podzielno\u015bci tylko oko\u0142o 10 milion\u00f3w razy na sekund\u0119. Je\u015bli chcemy sprawdzi\u0107 wi\u0119ksze liczby, b\u0119dziemy potrzebowa\u0107 bardziej wydajnego pomys\u0142u. Napiszmy kod, kt\u00f3ry dzia\u0142a nawet dla liczb wi\u0119kszych ni\u017c trylion (1000000000000)!<br \/>\nCzy naprawd\u0119 musimy sprawdzi\u0107 <strong>wszystkie<\/strong> liczby mi\u0119dzy <code>2<\/code> a <code>N-1<\/code>, aby sprawdzi\u0107, czy <code>N<\/code> jest liczb\u0105 pierwsz\u0105?<a class=\"hintlink\"  id=\"hintlink3\">Wskaz\u00f3wka<\/a><\/p>\n<h2>Idea i Argument<\/h2>\n<p>Je\u015bli przeczyta\u0142e\u015b wskaz\u00f3wk\u0119 i eksperymentowa\u0142e\u015b, zauwa\u017cy\u0142e\u015b, \u017ce je\u015bli <code>N<\/code> nie jest liczb\u0105 pierwsz\u0105, program zazwyczaj ma do\u015b\u0107 ma\u0142y dzielnik w por\u00f3wnaniu z <code>N<\/code>. Na przyk\u0142ad i<code>isItPrime(34827948723948723984729834)<\/code> dzia\u0142a do\u015b\u0107 szybko, mimo \u017ce jego wej\u015bcie jest gigantyczne, Znaleziony dzielnik to <code>D=2<\/code>.<\/p>\n<p>Mo\u017ce nie musimy rzeczywi\u015bcie sprawdza\u0107 wszystkich mo\u017cliwych czynnik\u00f3w. Czy istnieje niewielki limit liczby czynnik\u00f3w, kt\u00f3re musimy sprawdzi\u0107, zanim b\u0119dziemy mogli by\u0107 pewni, \u017ce <code>N<\/code> jest liczb\u0105 pierwsz\u0105? Na szcz\u0119\u015bcie, tak! W rzeczywisto\u015bci mo\u017cemy argumentowa\u0107 to tak, \u017ce <em>je\u015bli<\/em> <code>N<\/code> <em>nie jest liczb\u0105 pierwsz\u0105, to jeden z jej dzielnik\u00f3w jest co najwy\u017cej <\/em><code>sqrt(N)<\/code>. Czemu? C\u00f3\u017c, je\u015bli <code>N<\/code> nie jest liczb\u0105 pierwsz\u0105, to ma dzielnik <code>A<\/code>. Bycie dzielnikiem oznacza, \u017ce jest jaka\u015b inna liczba <code>B<\/code> taka, \u017ce<\/p>\n<p style=\"text-align: center;\"><code>A*B == N<\/code><\/p>\n<p>Kontynuujemy nasz\u0105 argumentacj\u0119. Je\u015bli <code>A &lt;= sqrt(N)<\/code> lub <code>B &lt;= sqrt(N)<\/code>, to jeste\u015bmy szcz\u0119\u015bliwi: znale\u017ali\u015bmy dzielnik <code>N<\/code>, kt\u00f3ry jest ma\u0142y, tak jak chcieli\u015bmy. Ale w rzeczywisto\u015bci s\u0105 to jedyne mo\u017cliwo\u015bci: w przeciwnym razie, dostajemy sprzeczno\u015b\u0107<\/p>\n<p style=\"text-align: center;\"><code>N = A*B &gt; sqrt(N)*sqrt(N) = N<\/code><\/p>\n<p>Wspaniale! Wi\u0119c teraz, nale\u017cy wdro\u017cy\u0107 ten nowy pomys\u0142 w Pythonie. Naj\u0142atwiejszym sposobem na zmian\u0119 starego podej\u015bcia jest dodanie testu do p\u0119tli for: once <code>D &gt; sqrt(N)<\/code> (lub r\u00f3wnowa\u017cnie, <code>D*D &gt; N<\/code>), mo\u017cemy w\u0142a\u015bnie z u\u017cyciem <code>break<\/code> wyj\u015b\u0107 z p\u0119tli i zatrzyma\u0107 testowanie.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform4\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox4'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Szybsze sprawdzenie liczb pierwszych<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 292px;'><textarea wrap='off' name='usercode4' id='usercode4'  cols=10 rows=11 readonly='readonly'  style = 'height : 292px;'  class='pyboxCode RO'>\ndef isItPrime(N): # same as before\n  for D in range(2, N):\n    if (D * D > N):          # pierwsza dodana linia\n      break                  # druga dodana linia\n    if N % D == 0:\n      print(N, \"is not prime; divisible by\", D)\n      return\n  print(N, \"is prime\")\n\nisItPrime(1000006000009)\nisItPrime(1666666009999)<\/textarea><\/div>\n<div id='pbhistory4' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit4' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(4)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(4,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse4\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"4\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"46a708a9408746f27acf779eefb38935\"\/>\n<div id='pbresults4' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit4\").value = \"Run program\";document.getElementById(\"inputInUse4\").value = \"N\";<\/script>\n<\/p>\n<p>Program teraz dzia\u0142a na gigantycznych liczbach pierwszych!<\/p>\n<h2>\u0106wiczenie Ko\u0144cowe<\/h2>\n<p>W tym \u0107wiczeniu \u0142\u0105czymy obliczanie liczb pierwszych z drugiej po\u0142owy lekcji z podej\u015bciem opartym na listach z pierwszej po\u0142owy. Tw\u00f3j kod powinien wype\u0142ni\u0107 tablic\u0119 o d\u0142ugo\u015bci 1000001, tak \u017ce <code>isPrime[N]<\/code> jest r\u00f3wna True, je\u015bli <code>N<\/code> jest liczb\u0105 pierwsz\u0105, a <code>False<\/code> je\u015bli <code>N<\/code> jest liczb\u0105 z\u0142o\u017con\u0105, dla wszystkich <code>N<\/code> do jednego miliona. (<code>isPrime[0]<\/code> i <code>isPrime[1]<\/code> powinny by\u0107 <code>Fals<\/code>.)<\/p>\n<p><a class=\"hintlink\"  id=\"hintlink5\">Kliknij tutaj, aby uzyska\u0107 podpowied\u017a. I to du\u017c\u0105!<\/a><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox6'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Liczby Pierwsze Na Start<\/span><\/div>Napisz program, kt\u00f3ry definiuje tabel\u0119 <code>isPrime<\/code>, kt\u00f3r\u0105 opisali\u015bmy powy\u017cej (zauwa\u017c, \u017ce <code>isPrime<\/code> to lista, a nie funkcja). <a class=\"hintlink\"  id=\"hintlink7\">Wskaz\u00f3wka<\/a><br\/> <em>Nasz tester pozwoli na d\u0142u\u017csze ni\u017c zwykle wykonywanie twojego programu, <strong>7 sekund<\/strong> czasu. Jednak, proste u\u017cycie funkcji <code>isItPrime<\/code> nie b\u0119dzie wystarczaj\u0105co szybkie.<\/em><div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode6' id='usercode6'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput6\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit6' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch6\" value=\"Input Switch\" onclick=\"pbInputSwitch(6,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(6)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(6,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect6' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(6,'18.sieve')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(6);\" >Help<\/option>\n<\/select><\/div>\n<input type='hidden' name='timeout' value='20000'\/>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse6\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"6\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"f0a7a31fc0609521e9ce1789ffed2eeb\"\/>\n<div id='pbresults6' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(6);});pbInputSwitch(6,\"Y\");<\/script>\n<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> To ostatnie \u0107wiczenie w witrynie CS Circles. Gratulacje dla tych, kt\u00f3rzy pr\u00f3bowali wszystkich lekcji! Wi\u0119cej informacji na temat tego, czego si\u0119 dowiedzia\u0142e\u015b, znajdziesz na <a class=\"open-same-window\" href=\"\/resources\/\">stronie zasob\u00f3w<\/a>. Mi\u0142ej zabawy, powodzenia w dobrym kodowaniu! <\/span><\/td><\/table><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wiele zada\u0144 programowania mo\u017cna wykona\u0107 na wi\u0119cej ni\u017c jeden spos\u00f3b, ale jeden spos\u00f3b mo\u017ce by\u0107 znacznie szybszy od drugiego. Projektowanie szybkich program\u00f3w jest cz\u0119\u015bci\u0105 sztuki i nauki programowania komputerowego. W tym \u0107wiczeniu przyjrzymy si\u0119 kilku przyk\u0142adom. Cz\u0119\u015b\u0107 1: Nie Zmieniaj &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/18-pl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10005","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=10005"}],"version-history":[{"count":12,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10005\/revisions"}],"predecessor-version":[{"id":10471,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10005\/revisions\/10471"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=10005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}