===== Aufgaben Serie C ===== {{gem/mgr}}{{gem/pageinfo}} ==== 1 X-Mas Tree ====== Erstelle einen Algorithmus der aus der folgenden Eingabe eine entsprechenden Weihnachtsbaum zeichnet: ; Eingabe : ooooooo ; Ausgabe : o ooo ooooo ooooooo o * Die Grösse des Baumes ist abhängig von der Eingabe. * Erweiterung 1: Baumstrunk * Erweiterung 2: Baumschmuck {{gem/plain#d419758672dd4212}} ++++ Lösung von Roli | /^(\s*)(o*)oo/ $1$2\n$&/ /^( *o)((\n *o*)*)$/$1$2\n$1/! ++++ ++++ Lösung von Tscherter| /^( *oo?)\n[o\s]*/$&\n$1/! /^( *o*)oo/ $1\n$&/ ++++ ==== 2 Pascalsche Dreieck ===== Erstelle einen Algorithmus der aus der folgenden Eingabe eine entsprechendes binäres Pascalsche Dreieck zeichnet. Eingabe oooooooooooooooooooooooooooooooooooooooo o o o o o o o o o o Ausgabe oooooooooooooooooooooooooooooooooooooooo o o o o o o o o o o o o o o o o o o o o oo oo oo oo oo oo oo oo oo oo o o o o o o o o o o oooo oooo oooo oooo oooo o o o o o o o o o o oo oo oo oo oo o o o o o oooooooo oooooooo oooooooo o o o o o o o o o o o o oo oo oo oo oo oo {{gem/plain#f983e5a38d8e7023}} ++++ Lösung (TSC) | /αo([o \n]*)βo/oα$1oβ / /αo([o \n]*)β /oα$1 βo/ /α ([o \n]*)βo/ α$1oβo/ /α ([o \n]*)β / α$1 β / /α\no(.*)β(.)\no/\noα$1$2\nβo/ /α\n(.*)β(.)/\n$1$2/ ! /^o(o*)\no/oα$1\nβo/ ++++ ==== 3 Häufigste Wort in einem Text ====== Erstelle einen Algorithmus der jenes Wort aus einem Text herausliest, das am häufigsten vorkommt. ; Eingabe : Allein sitzen, allein ruhen, allein gehen. Indem er sich selbst zaehmt, wird er gluecklich allein - allein im Wald. ; Ausgabe : allein {{gem/plain#57189171ba8425d3}} ++++ Lösung| /\W+$//g /ξ(\w+)\b(.*?)(ξ+)\1\b/ξ$3$1$2/g /(ξ+)(ξ+)(\w+)\1(\w+)/$1$2$3/g /.*ξ//! /\W+|^/ξ/g ++++ ==== 4 Zahlenreihe ===== Eine Zahlenreihe ist folgend aufgebaut: Man beginnt mit einer beliebigen Zahl. - Ist die Zahl gerade, kann sie durch zwei geteilt werden - Ist die Zahl ungerade, wird sie mit drei multipliziert und eins wird dazu addiert - Ist die Zahl 1 stoppt die Reihe Beispiel: 6, 3, 10, 5, 16, 8, 4, 2, 1 Programmiere die Zahlenreihe als Markow Algorithmus für eine beliebige Eingabe in unärer Form. Beispiel: ; Eingabe : 111 ; Ausgabe : 111 1111111111 11111 1111111111111111 11111111 1111 11 1 {{gem/plain#f8e4233bf03072ef}} ++++ Lösung | /(^|\n)1$/$&/! stopt bei 1 /(^|\n)(1+)\2$/$&\n$2/ halbiert die zeile /(^|\n)(1+)$/$&\n$2$2$21/ verdreifacht die zeile +1 ++++ ==== 5 Römische Zahlen II ===== Schreibe einen Algorithmus der eine Dezimalzahl römisch darstellt. Bespiel: ; Eingabe : 42 ; Ausgabe : XXXXII {{gem/plain#0285cb446a1ded53}} ++++ Lösung | /IIIII/V/g /VV/X/g /XXXXX/L/g /LL/C/g /CCCCC/D/g /DD/M/g /^α(.*)β//! /9α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1$1$1$1$1$1$1$1/ /8α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1$1$1$1$1$1$1/ /7α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1$1$1$1$1$1/ /6α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1$1$1$1$1/ /5α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1$1$1$1/ /4α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1$1$1/ /3α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1$1/ /2α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1$1/ /1α(.*)β/α$1$1$1$1$1$1$1$1$1$1β$1/ /0α(.*)β/α$1$1$1$1$1$1$1$1$1$1β/ /$/αIβ/++++ ==== 6 Römische Zahlen III ===== Schreibe einen Algorithmus der zwei römische Zahlen addiert. Bespiel: ; Eingabe : LIII + CLXIII ; Ausgabe : CCXVI {{gem/plain#4e4967079acf84be}} ++++ Lösung | - Filtern /[^MDCLXVI]//g - Sortieren /(I)([MDCLXV])/$2$1/g /(V)([MDCLX])/$2$1/g /(X)([MDCL])/$2$1/g /(L)([MDC])/$2$1/g /(C)([MD])/$2$1/g /(D)(M)/$2$1/g - Verdichten /I{5}/V/ /V{2}/X/ /X{5}/L/ /L{2}/C/ /C{5}/D/ /D{2}/M/ Bemerkung: Der Algrithmus prüft nicht ob eine syntaktisch korrekte Addition vorliegt. Er addiert lediglich sämtliche vorhandene Zahlensymbole ''M'', ''D'', ''C'', ''L'', ''X'', ''V'' und ''I'' zu einer einzigen römischen Zahl. ++++ ==== 7 Towers of Hanoi ====== {{http://upload.wikimedia.org/wikipedia/commons/0/07/Tower_of_Hanoi.jpeg?200}} \\ cf. [[wpde>Türme von Hanoi]] Wir haben Scheiben, der Markow-Algorithmus arbeitet aber mit Buchstaben. Um die Lage der Scheiben zu beschreiben, braucht es eine geeignete Codierung: * {{:markow:tvh1.png|}} * {{:markow:tvh2.png|}} * {{:markow:tvh3.png|}} {{gem/plain#05058d36af3ff8ff}} === Lösungen ==== ++++ Lösung von Sandro Ackermann | /α(.*)#([-]+)([bc].*)-\2(c|$)/$1-$2$3#$2$4/ /^(a.*)#([bc][#-]+)-(c|$)/α$1-$2#$3/ /^(a.*)-(b[#-]+-c)([#-]+)#/α$1#$2$3-/ /α(.*)-([-]+)([bc].*)#\2(c|$)/$1#$2$3-$2$4/ /α//! ++++ ++++ Lösung von Vincent Tscherter | /ξ(\w.*)(\w.*)#(-+)(\w.*)-\3$/$1$2-$3$4#$3/ /ξ(\w.*)(\w.*)-(-+)(\w.*)#\3$/$1$2#$3$4-$3/ /^(\w.*)#(\w.*)-(\w.*)$/ξ$2#$3$1-/ /ξ//! Regeln 0 oder 1 wechseln sich mit Regel 2 ab. Regel 2 dient dazu, die kleinste Scheibe eins weiterzugeben (mod 3). Regel 0 resp. Regel 1 führen geweils den einzigen legalen Zug, der die kleinste Scheibe nicht betrifft, aus. ++++ ==== 8 Vokalen und Konsonantentrenner ====== Erstelle einen Algorithmus, der die Buchstaben in einem Text nach Vokalen und Konsonanten auftrennt. ; Eingabe : guten morgen liebe sorgen ; Ausgabe : Vokale : ueoeieeoe Konsonanten : gtnmrgnlbsrgn {{gem/plain#630d637f08f44a9e}} ++++ Lösung| / //g /([^aeiou])([aeiou])/$2$1/g /([aeiou]+)([^aeiou])/Vokale : $1\nKonsonanten : $2/ ! ++++ ==== 9 Conway Folge ====== ; Problemstellung : Prüfe ob eine Zahl zur Conway-Folge ''1'', ''11'', ''21'', ''1211'', ''111221'', ''312211'', ''13112221'', ''1113213211'', ... gehört (''✔'') oder nicht (''✘''). ; Beispiele : ''111221''→ ''111221 ✔'' : ''111222''→ ''111222 ✘'' ; Idee : Erstelle beginnend mit ''1'' solange das Folgeelement der Conway-Folge bis dieses der Eingabe entspricht. Falls dabei ein Folgeelement länger als die Eingabe wird kann die Berechnung abgebrochen werden. \\ Da die Länge von Zeichenketten in Markov-Algorithmen nicht direkt verglichen werden kann, wird diese mit dem Hilfssysmbol '':'' in unärer Schreibweise laufend ermittelt. ''1211'' → ''::::1211'' (entspricht der Textlänge 4) {{gem/plain#4a6f10fd886b308f}} ++++Antwortzugng| /^1$/$& ✔/ /^\d+$/α1βγ$&/ /γ(\d)/:$1γ/ /(\d)(:+)/$2$1/g /α(\d)\1\1/::3$1α/ /α(\d)\1/::2$1α/ /α(\d)/::1$1α/ /:+(\d+)αβ:+\1γ/$1 ✔/ /(:+):+.*β\1(\d+)γ/$2 ✘/ /:+(\d+)α/α$1/g ==Erläuterungen == ; A Initialisierung : Die erste Regeln prüften den Trivialfall ''1''. Ansonsten kommt die zweite Regel zum Zug welche den eigentlichen Algorithmus initialisiert: \\ ''**111221**'' -> ''//α//**1**//βγ//**111221**'' ; B Eingabelänge : Über Regel 4 und 5 werden solange '':'' eingefügt und umplatziert bis die Länge der Eingabe unär feststeht. Dabei wandert ''γ'' ans Ende. \\ ''//α//**1**//βγ//**111221**'' -> ''//α//**1**//β//**::::::111221**//γ//'' ; C Folgeelement : Es folgt über die Regeln 7 bis 9 die Bestimmung des Folgeelements und dessen unären Länge zwischen ''α'' und ''β''. Dabei wandert ''α'' zu ''β''. \\ ''//α//**1**//β//**::::::111221**//γ//'' -> ''::**11**//αβ//**::::::111221**//γ//'' ; D Inhaltsvergleich : Über Regel 11 wird geprüft ob die beiden Elemente links von ''α'' und ''γ'' identisch sind und ein Element der Conwey-Folge konnte gefunden werden (STOP ✔): \\ ''::::::**111221**//αβ//::::::**111221**//γ//'' -> ''**111221** ✔'' : Über Regel 12 prüft der Algorithmus ob das letzte berechnete Folgeelement bereits mehr Zeichen als die zu prüfende Eingabe hat (STOP ✘). \\ ''::::::::**13112221**//αβ//::::::**111222**//γ//'' -> ''**111222** ✘'' : Über Regel 13 wird der nächste Iterationsschritt eingeleitet, so dass anschliessend das nächste Folgeelement berechnet werden kann (WEITER BEI C): \\ ''::::**1211**//αβ//::::::**111221**//γ//'' -> ''//α//**1211**//β//::::::**111221**//γ//'' ++++