{"id":5542,"date":"2012-09-12T20:49:19","date_gmt":"2012-09-13T00:49:19","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=5542"},"modified":"2024-07-15T04:44:58","modified_gmt":"2024-07-15T08:44:58","slug":"18-de","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/18-de\/","title":{"rendered":"18: Effizienz"},"content":{"rendered":"<p>Viele Programmieraufgaben k\u00f6nnen auf mehr als eine Art erledigt werden, aber die eine Art kann unter Umst\u00e4nden viel schneller sein als eine andere. Schnelle Programme zu entwerfen geh\u00f6rt zu den zentralen Aufgaben der Programmierung und der Informatik. Wir sehen uns in dieser Einheit einige Beispiele hierf\u00fcr an.<\/p>\n<h1>Teil 1: Berechne die selbe Sache nicht zweimal<\/h1>\n<p>Die<a href=\"http:\/\/de.wikipedia.org\/wiki\/Fibonacci-Folge\"> Fibonacci-Folge<\/a> ist eine faszinierend einfache Zahlenreihe. Du f\u00e4ngst mit zwei Zahlen an, 1 und 1. Danach gilt: um zur n\u00e4chsten Zahl zu kommen, addiere die vorherigen beiden. Also ist die n\u00e4chste Zahl 1+1=2. Die ersten drei Zahlen sind also<\/p>\n<p style=\"text-align: center;\"><code>1, 1, 2<\/code><\/p>\n<p>die vierte Zahl ist 1+2=3, dann haben wir 2+3=5, und so weiter:<\/p>\n<p style=\"text-align: center;\"><code>1, 1, 2, 3, 5, 8, 13, ...<\/code><\/p>\n<p>Die Fibonacci-Folge wurde urspr\u00fcnglich erfunden, um Kaninchenpopulationen zu beschreiben, und sie hat interessante Verbindungen zur Architektur von verschiedenen Pflanzen. Hier ist ein Teil einer fantastischen Videoreihe \u00fcber die Fibonacci-Folge: <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>Aus der Definition der Fibonacci-Folge l\u00e4sst sich leicht eine rekursive Funktion ableiten. Die n\u00e4chste \u00dcbung definiert eine Funktion <code>Fibonacci(n)<\/code> , um das <code>n<\/code>-te Element in der obigen Liste aufzurufen (beginnend mit <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>Entwirre dieses Programm, so dass es eine rekursive Definition der Fibonacci-Zahlen ausgibt. Der Bewerter wird die ersten zehn ausgeben.<ul class=\"pyscramble\" name=\"pyscramble\" id=\"pyscramble0\">\n <li class=\"pyscramble\">        return Fibonacci(n-1) + Fibonacci(n-2)<\/li>\n <li class=\"pyscramble\">    else:<\/li>\n <li class=\"pyscramble\">        return 1<\/li>\n <li class=\"pyscramble\">def Fibonacci(n):<\/li>\n <li class=\"pyscramble\">    if (n==1 or n==2):<\/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>Es ist aber so, dass die rekursive Funktion zu langsam wird, um Eintr\u00e4ge weiter unten in der Folge zu berechnen. Klicke auf \"Testbefehle eingeben\" und tippe <code>print(Fibonacci(80))<\/code> ein. Wenn du diesen Befehl testest, bekommst du \"Time Limit Exceeded.\" raus.<\/p>\n<p>Warum geht das so langsam? Die Funktion hat keine komplizierten Anweisungen oder Schleifen, nur Addition. Also stellt sich heraus, dass die Langsamkeit in Beziehung dazu steht, wie oft die Funktion aufgerufen wird. Wenn wir <code>Fibonacci(3) <\/code>aufrufen, wird die rekursive Funktion insgesamt drei Mal aufgerufen: der initialisierende Aufruf, dann zwei rekursive Aufrufe. Wenn wir <code>Fibonacci(4)<\/code>aufrufen, wird die rekursive Funktion insgesamt f\u00fcnf Mal aufgerufen: der initialisierende Aufruf, dann die drei Aufrufe, die wir gerade f\u00fcr <code>n=3<\/code> erw\u00e4hnt haben, und einen weiteren rekursiven Aufruf mit <code>n=2<\/code>. Wenn wir <code>Fibonacci(5)<\/code> berechnen, unternehmen wir insgesamt neun Aufrufe, und <code>Fibonacci(6)<\/code> ergibt eine Gesamtzahl an 9+5+1=15 Aufrufen. Die Anzahl der Aufrufe wird schnell sehr gro\u00df, wenn <code>n<\/code> gr\u00f6\u00dfer wird!<\/p>\n<p>Als ungef\u00e4hrer Sch\u00e4tzwert: <code>Fibonacci(n+2)<\/code> braucht mindestens doppelt so viele rekursive Aufrufe wie <code>Fibonacci(n)<\/code>, weil <code>Fibonacci(n+2)<\/code> n\u00e4mlich <code>Fibonacci(n)<\/code> einmal direkt aufruft, und ein anderes Mal indirekt durch den rekursiven Aufruf von <code>Fibonacci(n+1)<\/code>. Also ist die Rechenzeit proportional zu einer <em>exponentiellen Funktion<\/em>, die mindestens so gro\u00df ist wie (\u221a2)<sup>n<\/sup>. Das ist zu langsam! Zum Beispiel: <code>Fibonacci(80)<\/code> ben\u00f6tigt mehr als 2<sup>40<\/sup> = 1099511627776 rekursive Aufrufe.<\/p>\n<p>Das obige Argument weist auf das entscheidende Problem hin: es ist \u00fcberfl\u00fcssig, <code>Fibonacci(n)<\/code> zweimal aufzurufen und die Antwort beim zweiten Mal komplett neu zu berechnen. Wir sollten uns eine L\u00f6sung einfallen lassen, bei der wir eben nicht Zeit damit verschwenden, die selbe Sache immer wieder neu zu berechnen.<\/p>\n<h2>Die L\u00f6sung<\/h2>\n<p>Lass uns versuchen, etwas in Python zu schreiben, das eher dem \u00e4hnelt, was wir in der Einleitung beschrieben haben. Wir hatten ja damit angefangen, 1, 1 aufzuschreiben. Dann haben wir die Folge erweitert, indem wir die letzen beiden Elemente miteinander addiert hatten. Der Code sieht dann folgenderma\u00dfen aus (du musst ihn wieder entwirren):<\/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'>Fast Fibonacci<\/span><\/div>Entwirre die schnelle Version, um gr\u00f6\u00dfere Fibonacci-Werte zu berechnen.<ul class=\"pyscramble\" name=\"pyscramble\" id=\"pyscramble1\">\n <li class=\"pyscramble\">    sequence = [0, 1, 1]  # Fibonacci(0) is 0, Fibonacci(1) and Fibonacci(2) are 1<\/li>\n <li class=\"pyscramble\">        sequence.append(sequence[i-1] + sequence[i-2])<\/li>\n <li class=\"pyscramble\">def Fibonacci(n):<\/li>\n <li class=\"pyscramble\">    return sequence[n]<\/li>\n <li class=\"pyscramble\">    for i in range(3, n+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=\"142dda911985eef1c235b123ab62a5ad\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(1,\"Y\");<\/script>\n<\/p>\n<p>Es ist nat\u00fcrlich immer noch Raum f\u00fcr Verbesserungen, weil wir nicht die ganze Liste neu berechnen m\u00fcssen bei jedem neuen Aufruf, aber es ist erst einmal gut genug, weil es schnell l\u00e4uft, auch f\u00fcr gro\u00dfe Werte von n!<\/p>\n<h1>Teil 2: Berechne keine \u00fcberfl\u00fcssigen Dinge, nicht ein einziges Mal.<\/h1>\n<p>Bei unserem zweiten Beispiel geht es darum, zu \u00fcberpr\u00fcfen, ob Zahlen <strong>Primzahlen<\/strong> sind. Das ist besonders wichtig im Bereich der Kryptographie und Computersicherheit. Eine Zahl ist genau dann eine Primzahl, wenn sie genau zwei Faktoren hat: 1 und sie selbst. Die ersten paar Primzahlen sind 2, 3, 5, 7, 11, 13, 17, 19, 23. (21 ist keine Primzahl, weil sie die Faktoren 3 und 7 hat, sowie 1 und 21.)<\/p>\n<p>Wie k\u00f6nnen wir mit Python \u00fcberpr\u00fcfen, ob eine Zahl eine Primzahl ist? Wir haben <a href=\"http:\/\/cscircles.cemc.uwaterloo.ca\/7b-de\/\">fr\u00fcher bereits<\/a> gesehen, wie man Teilbarkeit berechnet<\/p>\n<p style=\"text-align: center;\"><code>N % D == 0 # ist True falls D ein Teiler von N ist, sonst False<\/code><\/p>\n<p>Mit dem folgenden Programm suchen wir systematisch, ob es f\u00fcr eine Zahl einen Teiler gibt (dann ist sie keine Primzahl):<\/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>\u00dcberpr\u00fcfen ob ein paar Zahlen Primzahlen sind<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 from 2 to N-1\n    if N % D == 0:                             # is D a divisor of N?\n      print(N, \"is not prime; divisible by\", D)\n      return\n  print(N, \"is prime\")                         # there were no divisors<\/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=\"6c26fa224dbd58cfcb868c800ad7b407\"\/>\n<div id='pbresults2' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(2,\"Y\");<\/script>\n<\/p>\n<p>Es funktioniert! Aber es ist auch zu langsam, soweit es gro\u00dfe Zahlen betrifft. W\u00e4hle <strong>Testeingabe<\/strong> und tippe <code>isItPrime(324635459)<\/code> ins Eingabefenster. Das Programm wird nicht rechtzeitig fertig. Probiere das gleiche nochmal mit anderen Werten...du siehst, f\u00fcr Primzahlen, die gr\u00f6\u00dfer sind als ungef\u00e4hr 10000000, wird der Code nie fertig, weil der Bewerter die Teilbarkeits-\u00dcberpr\u00fcfungsschleife nur 10 Millionen mal pro Sekunde ausf\u00fchren kann. Wenn wir gr\u00f6\u00dfere Zahlen \u00fcberpr\u00fcfen wollen, brauchen wir eine effizientere Idee. Lass uns den Code so schreiben, dass er sogar f\u00fcr Zahlen wie eine Billion funktioniert (1 000 000 000 000)!<\/p>\n<p>M\u00fcssen wir wirklich <strong>alle <\/strong>Zahlen zwischen <code>2<\/code> und <code>N-1<\/code> \u00fcberpr\u00fcfen, um herauszufinden, ob <code>N<\/code> eine Primzahl ist? <a class=\"hintlink\"  id=\"hintlink3\">Hinweis<\/a><\/p>\n<h2>Die Idee - und ein Argument<\/h2>\n<p>Wenn du den Hinweis gelesen hast und ein bi\u00dfchen experimentiert hast, hast du vielleicht gemerkt, dass, wenn <code>N<\/code> keine Primzahl ist, das Programm \u00fcblicherweise einen ziemlich kleinen Teiler (verglichen mit <code>N<\/code>) gefunden hat. Zum Beispiel l\u00e4uft die Funktion <code>isItPrime(34827948723948723984729834)<\/code> ziemlich schnell, obwohl die Eingabe riesig ist, und findet den Teiler <code>D=2<\/code>.<\/p>\n<p>Vielleicht m\u00fcssen wir gar nicht alle m\u00f6glichen Teiler \u00fcberpr\u00fcfen. Gibt es vielleicht eine Regel, um die Zahl der Teiler einzuschr\u00e4nken, die wir \u00fcberpr\u00fcfen m\u00fcssen, bevor wir sicher sein k\u00f6nnen, dass <code>N<\/code> eine Primzahl ist? Gottseidank ja! Es stellt sich n\u00e4mlich heraus, dass, <em>wenn <\/em><code>N<\/code><em> keine Primzahl ist, einer seiner Teiler maximal <\/em><code>sqrt(N) <\/code><em>betr\u00e4gt<\/em>. Warum? Naja, wenn <code>N<\/code> keine Primzahl ist, dann hat sie den Teiler <code>A<\/code>. Ein Teiler sein bedeutet, dass es eine andere Zahl <code>B<\/code> solcherart gibt, dass<\/p>\n<p style=\"text-align: center;\"><code>A*B == N<\/code><\/p>\n<p>Lass uns das Argument fortf\u00fchren. Falls <code>A &lt;= sqrt(N)<\/code> oder <code>B &lt;= sqrt(N)<\/code>, dann sind wir gl\u00fccklich: wir haben einen Teiler von <code>N<\/code> gefunden, der klein ist, genau wie geplant. Und das ist auch die einzige M\u00f6glichkeit, denn andernfalls erhalten wir den Widerspruch<\/p>\n<p style=\"text-align: center;\"><code>N = A*B &gt; sqrt(N)*sqrt(N) &gt; N<\/code><\/p>\n<p>Toll! Also lass uns jetzt diese neue Idee in Python implementieren. Die einfachste M\u00f6glichkeit, das alte Vorgehen zu \u00e4ndern, ist es, einen Test innerhalb der <code>for<\/code> Schleife zu erstellen: wenn <code>D &gt; sqrt(N)<\/code> (oder gleichwertig, <code>D*D &gt; N<\/code>), k\u00f6nnen wir einfach die Schleife verlassen (englisch: <code>break<\/code> out) und mit der \u00dcberpr\u00fcfung aufh\u00f6ren.<\/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>Schnellere \u00dcberpr\u00fcfung der Primzahlen<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):          # first added line\n      break                  # second added line\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=\"87782243ae066971c8870ad20d35c7d1\"\/>\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>Das Programm funktioniert jetzt auch f\u00fcr gigantische Primzahlen!<\/p>\n<h2>Letzte \u00dcbung<\/h2>\n<p>In dieser \u00dcbung kombinieren wir die Primzahlen der zweiten H\u00e4lfte dieser Lektion mit der listen-basierten Herangehensweise der ersten H\u00e4lfte. Dein Code sollte eine Tabelle der L\u00e4nge 1000001 ausf\u00fcllen, so dass <code>isPrime[N]<\/code> gleich <code>True<\/code> ist, wenn <code>N<\/code> eine Primzahl ist, und <code>False<\/code>, wenn <code>N<\/code> teilbar ist, f\u00fcr alle <code>N<\/code> bis zu einer Million. (<code>isPrime[0]<\/code> und <code>isPrime[1]<\/code> sollte <code>False<\/code> sein.)<\/p>\n<p><a class=\"hintlink\"  id=\"hintlink5\">Klicke hier, um einen Tipp zu erhalten. Es ist ein ziemlich guter Tipp!<\/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'>Primed for Takeoff<\/span><\/div>Schreibe ein Programm, das die Tabelle <code>isPrime<\/code>, die wir oben beschrieben haben, definiert (Achtung, <code>isPrime<\/code> ist eine Liste und keine Funktion). <a class=\"hintlink\"  id=\"hintlink7\">Tipp<\/a><br\/> Der Bewerter l\u00e4sst dir f\u00fcr die Ausf\u00fchrung deines Programms mehr Zeit als sonst, n\u00e4mlich 7 Sekunden. Einfach die <code>isItPrime<\/code> Funktion zu verwenden wird trotzdem nicht schnell genug sein<em>.<\/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=\"9cb01526813f9b7532c90df42dd658a1\"\/>\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> Dies ist die letze \u00dcbung auf der CSCircles Seite. Gl\u00fcckw\u00fcnsche an alle, die alle \u00dcbungen bew\u00e4ltigt haben! Seht euch die <a href=\"http:\/\/cscircles.cemc.uwaterloo.ca\/ressourcen\/\">Nachlesen-Seite<\/a> an, wenn ihr Hinweise wollt, was ihr als n\u00e4chstes machen k\u00f6nnt. Viel Spa\u00df, viel Gl\u00fcck und gutes Coden! <\/span><\/td><\/table><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Viele Programmieraufgaben k\u00f6nnen auf mehr als eine Art erledigt werden, aber die eine Art kann unter Umst\u00e4nden viel schneller sein als eine andere. Schnelle Programme zu entwerfen geh\u00f6rt zu den zentralen Aufgaben der Programmierung und der Informatik. Wir sehen uns &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/18-de\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2653,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5542","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5542","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\/2653"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=5542"}],"version-history":[{"count":21,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5542\/revisions"}],"predecessor-version":[{"id":15954,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5542\/revisions\/15954"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=5542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}