Buchstabenmanipulationen (Zeichenketten)
Schreiben Sie die folgenden kleinen Programme. Alle erwarten einen String, bestehend aus einigen Sätzen. Schreiben Sie zunächst also ein Hauptprogramm, das einen längeren Text mit Leerschlägen und Sonderzeichen als String oder char[]-array enthält oder vom Anwender erfragt (scan).
- auspressen(): Schreiben Sie eine Methode, die aus dem Text alle Buchstaben 'e' entfernt. Dabei werden die 'e' nicht etwa durch einen Leerschlag ersetzt, sondern die Zeichenkette wird bei jedem 'e' um ein Zeichen kürzer.
- nurBuchstaben(): Schreiben Sie eine Methode, die alle Zeichen, die weder Buchstaben, Ziffern noch Leerschläge sind, eliminiert. Der ausgegebene Text (Rückgabewert) enthält also insbesondere keine Sonderzeichen mehr. Aus "Hallo-oh! Welt!" wird "Hallooh Welt".
- miniKompression(): Schreiben Sie eine Methode, die im Text alle Vorkommen der Zeichenkette "en" durch 'x' ersetzt und umgekehrt ('en' → 'x' und 'x' → 'en'). Daneben sollen auch alle Vorkommen von "er" mit 'q' vertauscht werden. Zu guter Letzt soll noch jedes 'y' durch ein "ch" ersetzt werden, dafür bei jedem "ch" nur noch ein 'y' stehen. Haben Sie bemerkt worauf es hinausläuft? Wir haben soeben selbst eine kleine Kompressionsroutine geschrieben. Suchen Sie weitere reversible Ersetzungen und implementieren Sie diese.
0 Kommentare
4 Lösung(en)
import string
allowed_chars=string.ascii_letters + string.digits + u' \näöüÄÖÜ'
allowed_set = set(allowed_chars)
def auspressen(s):
a = list(s)
for i in range (a.count('e')):
a.remove('e')
return ''.join(a)
def nurBuchstaben(s):
a = list(s)
for c in a:
if c not in allowed_set:
a.remove(c)
return ''.join(a)
def kleinbuchstaben(s):
a =s.lower()
return a
def miniKompression_falsch(s):
s1=s.replace('en','x')
s2=s1.replace('er','q')
s3=s2.replace('ch','y')
return s3
def miniKompression(s):
out = u''
w_list = s.split(' ')
jump = False
# in Worte zerlegen
for wort in w_list:
# in Buchstaben Zerlegen
for i in range(len(wort)):
# Buchstaben in c1 und c2 abspeichern
c1 = wort[i]
if i < len(wort)-1:
c2=wort[i+1]
else:
c2=''
# Ersetzungsregeln: en -> x , x --> en , er --> q , q --> er,
# ch --> y , y --> ch
if jump:
# Falls zwei Zeichen in ein Zeichen konvertiert wurde,
# kann das nächste übersprungen werden.
jump = False
continue
elif c1 ==u'e' and c2 == u'n':
out = out + u'x'
jump = True
elif c1 ==u'x':
out = out + u'en'
elif c1 ==u'e' and c2 == u'r':
out = out + u'q'
jump = True
elif c1 ==u'q':
out = out + u'er'
elif c1 ==u'c' and c2 == u'h':
out = out + u'y'
jump = True
elif c1 ==u'y':
out = out + u'ch'
else:
out = out + c1
out = out + u' '
return out
s=u"""Die hinter Wikipedia stehende Organisation Wikimedia hat
von einer US-Stiftung eine Spende über 500'000 Dollar erhalten.
Mit dem Geld sollten weiter freie Informationen zu den Menschen auf
der ganzen Welt gebracht werden, erklärte die William and Flora Hewlett
Foundation. Wikipedia spiele eine wichtige Rolle dabei, Informationen
allgemein zugänglich zu machen. Wikimedia kündigte an, die Software
noch benutzerfreundlicher zu machen und Materialien für neue Mitarbeiter
zu erstellen. (AP)"""
print auspressen(s)
print ''
print nurBuchstaben(s)
print ''
print kleinbuchstaben(s)
print ''
print miniKompression(s)
print ''
print 'Anzahl Buchstaben: '+str(len(miniKompression(s)))
print ''
print miniKompression(miniKompression(s))
print ''
print 'Anzahl Buchstaben: '+str(len(miniKompression(miniKompression(s))))
*process langlvl(saa2);
*process limits(fixeddec(31));
*process aggregate, attributes;
*process flag(W), source, insource, options, xref, nest, number, offset;
*process gonumber, snap;
*process or('!');
/*******************************************************************/
/* Autor : ph. gressly freimann (@ http://www.sanits-training.ch) */
/* Datum : 17. Nov. 2011 */
/* Aufgabe 7.2 (Programmieraufgaben.ch: Buchstabenmanipulation) */
/*******************************************************************/
Strings : proc options(main noexecops);
dcl TRUE bit(1) value('1'b);
dcl FALSE bit(1) value('0'b);
/* Line Buffer size. */
dcl BUFSIZE dec fixed(31) value(1024) ;
dcl FILENAME char(128) varying init("text.txt") ;
/* Aktuelle (temporaere) Zeile */
dcl Zeile char(BUFSIZE) varying ;
dcl InFile file record input external;
/* simpel : */
open file(InFile) title("/" !! FILENAME);
/* komplexer: */
/*open file(InFile) title ('/' !! FILENAME !! ','
!! 'type(text),recsize(' !! BUFSIZE
!! '),append(n)'); */
if (endfile(InFile)) then do;
put skip list("EOF before the occurence of the first line?");
end;
dcl lesend bit(1) init (TRUE);
on endfile(InFile) lesend = FALSE;
read file(InFile) into(Zeile);
do while(lesend);
put skip list("Gelesen: " !! Zeile);
put skip list("");
put skip list("Ausgepresst: " !! auspressen(Zeile));
put skip list("");
put skip list("Nur Buchstaben: " !! nurBuchstaben(Zeile));
put skip list("");
put skip list("Komperss: " !! miniKompression(Zeile));
/* read next line */
read file(InFile) into(Zeile);
end; /* do while */
put skip list("ende.");
close file(InFile);
/* END */
/** Subroutinen **/
miniKompression: proc(Zeile) returns (char(BUFSIZE));
dcl Zeile char(BUFSIZE) varying ;
dcl InPos bin fixed(15) init(1) ;
dcl InCharAct char(1) ;
dcl IncharNext char(1) ;
dcl Resultat char(BUFSIZE + 2) varying init("");
dcl Ersetzt bit(1) ;
do InPos = 1 to length(Zeile) ;
Ersetzt = FALSE;
InCharNext = '';
InCharAct = substr(Zeile, InPos, 1);
if(InPos < length(Zeile)) then do;
InCharNext = substr(zeile, InPos + 1, 1);
end; /* if */
call reversibel((InCharAct), (InCharNext), Resultat,
Ersetzt, InPos,
'e', 'n', 'x');
call reversibel((InCharAct), (InCharNext), Resultat,
Ersetzt, InPos,
'e', 'r', 'q');
call reversibel((InCharAct), (InCharNext), Resultat,
Ersetzt, InPos,
'c', 'h', 'y');
if (^ Ersetzt) then do;
Resultat = Resultat !! InCharAct;
end;
end; /* do Zeile */
return(Resultat);
end miniKompression;
/**
* Reversible Ersetzung
* "ab" wird durch "x" ersetzt und umgekehrt. */
reversibel : proc(InCharAct, InCharNext, Resultat,
Ersetzt, InPos,
a, b, x);
dcl (InCharAct, InCharNext, a, b, x) char(1) ;
dcl Resultat varying char(*) ;
dcl Ersetzt bit(1) ;
dcl InPos bin fixed(15);
if((a = InCharAct) & (b = InCharNext)) then do;
Resultat = Resultat !! x;
Ersetzt = TRUE;
InPos = InPos + 1;
end;
if(x = IncharAct) then do;
Resultat = Resultat !! a !! b;
Ersetzt = TRUE;
end;
end reversibel;
nurBuchstaben : proc(Zeile) returns (char(BUFSIZE));
dcl Zeile char (BUFSIZE) varying ;
dcl Resultat char (BUFSIZE + 1) varying init("") ;
dcl InPos bin fixed(15) init (1) ;
dcl InChar char(1) ;
do InPos = 1 to length(Zeile);
InChar = substr(Zeile, InPos, 1);
if(istAlphaNum(InChar)) then do;
Resultat = Resultat !! InChar;
end; /* if */
end; /* do */
return(Resultat);
end nurBuchstaben;
istAlphaNum: proc(ch) returns (bit(1));
dcl ch char(1);
if(('a' <= ch) & (ch <= 'z')) then do;
return(TRUE);
end; /* if */
if(('A' <= ch) & (ch <= 'Z')) then do;
return(TRUE);
end; /* if */
if(' ' = ch) then do;
return(TRUE);
end; /* if */
if (('0' <= ch) & (ch <= '9')) then do;
return(TRUE);
end; /* if */
return(FALSE);
end istAlphaNum;
auspressen: proc (Zeile) returns(char(BUFSIZE));
dcl Zeile char(BUFSIZE) varying ;
dcl Resultat char(BUFSIZE + 1) varying init("") ;
dcl InPos bin fixed(15) init(1) ;
dcl InChar char(1) ;
do InPos = 1 to length(Zeile);
InChar = substr(Zeile, InPos, 1);
if('e' ^= InChar) then do;
Resultat = Resultat !! InChar;
end;
end; /* do */
return (Resultat);
end auspressen;
end Strings;
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
function pressOutEs(txt) {
txt = txt.split('');
let i;
function remove() {
txt.splice(i, 1);
i--;
}
for (i = 0; i < txt.length; i++) {
if (txt[i] == 'e') { remove(); }
if (txt[i] == 'E') {
txt[i+1] = txt[i+1].toUpperCase();
remove();
}
}
return txt.join('');
}
function lettersOnly(txt) {
return txt.replace(/[^A-z ]/g, '');
}
function miniCompress(txt) {
let copy = '';
for (let i = 0; i < txt.length; i++) {
switch (txt[i]) {
case ('X'): copy += 'En'; break;
case ('x'): copy += 'en'; break;
case ('Q'): copy += 'Er'; break;
case ('q'): copy += 'er'; break;
case ('Y'): copy += 'Ch'; break;
case ('y'): copy += 'ch'; break;
case ('E'):
if (txt[i+1] == 'n') { copy += 'X'; i++; }
else if (txt[i+1] == 'r') { copy += 'Q'; i++; }
else copy += 'E';
break;
case ('e'):
if (txt[i+1] == 'n') { copy += 'x'; i++; }
else if (txt[i+1] == 'r') { copy += 'q'; i++; }
else copy += 'e';
break;
case ('C'):
if (txt[i+1] == 'h') { copy += 'Y'; i++; }
else copy += 'C';
break;
case ('c'):
if (txt[i+1] == 'h') { copy += 'y'; i++; }
else copy += 'c';
break;
default: copy += txt[i];
}
}
return copy;
}
// eingabemaske
document.write(`
<p><textarea id="text"></textarea></p>
<p><button onclick="answer('po')">Auspressen</button>
<button onclick="answer('lo')">Nur Buchstaben</button>
<button onclick="answer('mc')">Mini-Kompression</button></p>
<p><button onclick="answer('bt')">Beispieltext</button>
<button onclick="answer('xx')">Löschen</button></p>
`);
function answer(what) {
let t = document.getElementById('text');
switch (what) {
case ('po'): t.value = pressOutEs(t.value); break;
case ('lo'): t.value = lettersOnly(t.value); break;
case ('mc'): t.value = miniCompress(t.value); break;
case ('xx'): t.value = ''; break;
case ('bt'): t.value =
`Schreiben Sie die folgenden kleinen Programme. Alle erwarten einen String, bestehend aus einigen Sätzen. Schreiben Sie zunächst also ein Hauptprogramm, das einen längeren Text mit Leerschlägen und Sonderzeichen als String oder char[]-array enthält oder vom Anwender erfragt (scan).
auspressen(): Schreiben Sie eine Methode, die aus dem Text alle Buchstaben 'e' entfernt. Dabei werden die 'e' nicht etwa durch einen Leerschlag ersetzt, sondern die Zeichenkette wird bei jedem 'e' um ein Zeichen kürzer.
nurBuchstaben(): Schreiben Sie eine Methode, die alle Zeichen, die weder Buchstaben, Ziffern noch Leerschläge sind, eliminiert. Der ausgegebene Text (Rückgabewert) enthält also insbesondere keine Sonderzeichen mehr. Aus "Hallo-oh! Welt!" wird "Hallooh Welt".
miniKompression(): Schreiben Sie eine Methode, die im Text alle Vorkommen der Zeichenkette "en" durch 'x' ersetzt und umgekehrt ('en' ? 'x' und 'x' ? 'en'). Daneben sollen auch alle Vorkommen von "er" mit 'q' vertauscht werden. Zu guter Letzt soll noch jedes 'y' durch ein "ch" ersetzt werden, dafür bei jedem "ch" nur noch ein 'y' stehen. Haben Sie bemerkt worauf es hinausläuft? Wir haben soeben selbst eine kleine Kompressionsroutine geschrieben. Suchen Sie weitere reversible Ersetzungen und implementieren Sie diese.`;
}
} // lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET 6.x | C# 10.x | VS-2022
var txt = "Suchen Sie weitere 'reversible Ersetzungen' und implementieren Sie diese.";
Console.WriteLine(Auspressen(txt));
Console.WriteLine(NurBuchstaben(txt));
Console.WriteLine(MiniKompression(txt));
string Auspressen(string s) => new System.Text.RegularExpressions.Regex(@"[e]").Replace(s, "");
string NurBuchstaben(string s) => new System.Text.RegularExpressions.Regex(@"[^a-zA-Z0-9äöüÄÖÜß ]").Replace(s, "");
string MiniKompression(string s) {
var sb = new System.Text.StringBuilder();
for (int i = 0; i < s.Length; i++) {
if (s[i] is 'X' or 'x') sb.Append(char.IsUpper(s[i]) ? "En" : "en");
else if (s[i] is 'Q' or 'q') sb.Append(char.IsUpper(s[i]) ? "Er" : "er");
else if (s[i] is 'Y' or 'y') sb.Append(char.IsUpper(s[i]) ? "Ch" : "ch");
else if (s[i] is 'E' or 'e') {
if (s[i + 1] is 'n') { sb.Append(char.IsUpper(s[i]) ? "X" : "x"); i++; }
else if (s[i + 1] is 'r') { sb.Append(char.IsUpper(s[i]) ? "Q" : "q"); i++; }
else sb.Append(char.IsUpper(s[i]) ? "E" : "e");
}
else if (s[i] is 'C' or 'c') {
if (s[i + 1] is 'h') { sb.Append(char.IsUpper(s[i]) ? "Y" : "y"); i++; }
else sb.Append(char.IsUpper(s[i]) ? "C" : "c");
}
else sb.Append(s[i]);
}
return sb.ToString();
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
miniKompression()
Suchen Sie weitere reversible Ersetzungen und implementieren Sie diese.
wird zu
Suyx Sie weitqe revqsible Ersetzungx und implemxtiqx Sie diese.
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 2 |
Schwierigkeit: | Schwer |
Webcode: | 2ogd-g4gf |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |