Aufgaben Serie B
1 Römische Zahlen I
Schreibe einen Algorithmus, der aus einfachen Strichen (unären Zahlen) römische Zahlen (additiv) generiert.
- Eingabe
-
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
- Ausgabe
-
CLXVIIII
Loading ⌛
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
Loading ⌛
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
Loading ⌛
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
Loading ⌛
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
Loading ⌛
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
Loading ⌛
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
Loading ⌛
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
Loading ⌛
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/ !
Loading ⌛
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.
Loading ⌛
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)