====== Aufgaben Serie B =====
{{gem/mgr}}{{gem/pageinfo}}
==== 1 Römische Zahlen I ====
Schreibe einen Algorithmus, der aus einfachen Strichen (unären Zahlen) römische Zahlen (additiv) generiert.
; Eingabe
: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
; Ausgabe
: CLXVIIII
{{gem/plain#74d671347041bc60}}
++++ Lösung | /I{5}/V/g
/V{2}/X/g
/X{5}/L/g
/L{2}/C/g
/C{5}/D/g
/D{2}/M/g
++++
++++ Lösung (inkl Substraktionsregeln) | /I{1000}/M/
/I{900}/CM/
/I{500}/D/
/I{400}/CD/
/I{100}/C/
/I{90}/XC/
/I{50}/L/
/I{40}/XL/
/I{10}/X/
/I{9}/IX/
/I{5}/V/
/I{4}/IV/
++++
==== 2 Sortierer ====
Schreibe einen Algorithmus, eine Liste unärer Zahlen sortiert.
111111111111111 111111
11111111111 111111111
111111111111 -> 11111111111
111111 111111111111
111111111 111111111111111
{{gem/plain#f89eddf83829c294}}
++++ Antwortzugang | /^(1*)(1+)\n\1$/$1\n$1$2/m
++++
==== 3 Binäres Inkrementieren ====
Schreibe einen Algorithmus, der eine Binärzahl um eins vergrössert (inkrementiert). Beispiel:
; Eingabe
: 110011
; Ausgabe
: 110100
{{gem/plain#22fc6b6f1cea8d0b}}
++++ Lösung |
/(^|^0+|0)x/1/ ! erste 0 vor x mit 1 ersetzten
/1x/x0/ x wandert nach links und ersetzt 1 mit 0
/$/x/ Ein x am Ende einfügen
++++
==== 4 Binärer Addierer ====
Schreibe einen Markow Algorithmus der zwei binäre Zahlen addiert. Beispiel
; Eingabe
: 101+11001
; Ausgabe
: 11110
{{gem/plain#115cab11f6cc5383}}
++++ Lösung|
/(^|μ)0*10*10*10*ψ/1ψ1/
/(^|μ)0*10*10*ψ/1ψ0/
/(^|μ)0*10*ψ/ψ1/
/(^|μ)0+ψ/ψ0/
/^ψ0*//!
/^\+μ(.*)/$1ψ/
/([01]?)\+([01]*?)([01]?)(μ|$)/+$2μ$1$3$4/
Geht es auch verständlicher? Die Aufgabe ''x+y'' ist kann wie eine schriftliche Addition im Dezimalsystem angegangen werden.
101
+ 11001
-------
= ?
=======
Stelle für Stelle werden die Ziffern und der Übertrag addiert; das Resultat und der neue Übertrag wird festgehalten. Linearisiert sehen die Schritte wie folgt aus. Ziffern die verarbeitet kann man weglassen.
Formatiert Kompakt
000111 + 110011 Ü0 = _______ 000111+110011=0
00011_ + 11001_ Ü1 = ______0 00011+11001=10
0001__ + 1100__ Ü1 = _____10 0001+1100=110
000___ + 110___ Ü1 = ____010 000+110=1010
00____ + 11___ Ü0 = ___1010 00+11=01010
0_____ + 1_____ Ü0 = __11010 0+1=011010
______ + ______ Ü0 = _111010 +=0111010
Der Algorithmus muss jeweils pro Stelle 8 Fälle unterscheiden, das führt zu den folgenden Regeln:
/0(\+[01]*)0=0/$1=00/
/0(\+[01]*)0=1/$1=01/
/0(\+[01]*)1=0/$1=01/
/1(\+[01]*)0=0/$1=01/
/0(\+[01]*)1=1/$1=10/
/1(\+[01]*)0=1/$1=10/
/1(\+[01]*)1=0/$1=10/
/1(\+[01]*)1=1/$1=11/
/\+=0*//!
++++
==== 5 Multiplikation====
Schreibe einen Algorithmus der zwei ''*''-getrennte unäre Zahlen miteinander multipliziert. Beispiel:
; Eingabe
: 1111*1111
; Ausgabe
: 1111111111111111
{{gem/plain#4de2eef1dc7b82e4}}
++++ Lösung |
/1\*(1*)/*$1α$1/
/\*1*|α//
++++
==== 6 Teilen mit Rest ====
Schreibe eine Markow Alogrithmus für die Division zweier '':''-getrennten unären Zahlen //n// und //m//, wobei //m// nicht 0 sein darf. Beispiel:
; Eingabe
: 11111111111:111
; Ausgabe
: 111R11
{{gem/plain#c3be9777f5456e76}}
++++ Lösung |
/(1*):\1ξ/:$1ξ1/ Divisor vom Dividend abziehen
/(1*):.*ξ(1*)/$2R$1/! Ausgabe formatieren (stop)
/.*:$/div 0!/! Division durch 0 (stop)
/$/ξ/ Trennzeichen ξ einfügen
++++
==== 7 GGT ====
Schreibe einen Alogrithmus, der den grössten gemeinsamen Teiler von zwei ''#''-getrennten unären Zahlen berechnet. Bespiel:
; Eingabe
: 111111111111#111111
; Ausgabe
: 111111
{{gem/plain#89f05a39c4894ae4}}
++++ Lösung |
/^(1+)#\1$/$1/ ! ggt(x,x) = x (stop)
/^(1+)#\1(1+)$/$1#$2/ ggt(x,y) = ggt(x,y-x) falls x < y
/^(1+)(1+)#\1$/$1#$2/ ggt(x,y) = ggt(x-y,y) falls x > y
++++
==== 8 KGV ====
Schreibe einen Alogrithmus, der das kleinste gemeinsamen Vielfache von zwei ''#''-getrennten unären Zahlen berechnet. Beispiel:
; Eingabe
: 111111111111#111111111111111111
; Ausgabe
: 111111111111111111111111111111111111
{{gem/plain#7d894d6197b6ac49}}
++++ Lösung |
/^(1+)#(1+)ψ(\2+)$/$3/! Dritte Gruppe (Kandidat) ist ein
Vielfaches der zweiten Gruppe (STOPP)
/^(1+)#(1+)ψ/$1#$2ψ$1/ Kandidat wird um erste Gruppe
vergrössert
/$/ψ/ Initialisierung (Kandidat = 0)
++++
==== 9 Von unär nach binär konvertieren ====
Schreibe einen Markow Algorithmus, der eine unäre Zahl in eine binäre Zahl konvertiert.
++++ Lösung ohne Gruppen (exotisch) |
/1β/β0/
/0β/1/
/β/1/
/α1/βα/
/α// !
/1/α1/
//0/ !
++++
{{gem/plain#7d221606c8df60d0}}
++++ Lösung mit Gruppen |
/^(1+)\1(α|$)/$1α0/ gerade anzahl > 0 & behalte die hälfte
/^1(1+)\1(α|$)/$1α1/ ungerade anzahl > 1 & behalte die hälfte
/^1α/1/!
/^$/0/! eingabe war leer > 0
++++
==== 10 Von binär nach unär konvertieren ====
Schreibe einen Markow Algorithmus, der eine binäre Zahl in eine unäre Zahl konvertiert.
{{gem/plain#6603837ed9f3574f}}
++++ Lösung a|
/0ζ(1+)/ζ$1$1/ Abarbeiten eine unbelegten Stelle
/1ζ(1+)ξ/ζ$1$1ξ$1/ Abarbeiten eine belegten Stelle
/^ζ.*ξ//! Terminierung
/$/ζ1ξ/ Initialisierung
Erläuterungen: Mit jeder Stelle verdoppelt sich die Wertigkeit ''$1$1''. Fall die Stelle belegt ist, so ist dem aktuellen Wert die Wertigkeit der Stelle anzufügen: ''ξ$1''
++++
++++ Lösung b (exotisch) |
/I0/0II/
/1/0I/
/0//
++++