ÜbungBaut auf Katas: Schleifen auf
icon: bi-quote kind: uebung duration: 1 Doppelstunde languages: [ruby, python, javascript] idea: Buchstaben zählen, umdrehen, umwandeln und verschlüsseln curriculum: "Sek I: Algorithmisches Problemlösen (Zeichenkettenbearbeitung), Information und Daten (Codierung, Verschlüsselung)" requires: [kata-loops]

Katas: Strings

Du schreibst Funktionen, die mit Strings arbeiten: Buchstaben zählen, einen String umdrehen, Großbuchstaben aus Nummern rechnen, eine Adresse aus einem Titel bauen und zum Schluss verschlüsseln wie Caesar.

1. Buchstabe für Buchstabe

Ein Text ist eine Reihe von Zeichen. Man kann sie der Reihe nach durchgehen, nach ihrem Index fragen und aus ihnen einen neuen Text bauen. Diese Funktion setzt jedes Zeichen in eckige Klammern:

def bracket(text)
  result = ''
  text.each_char do |char|
    result += '[' + char + ']'
  end
  result
end

puts bracket('Hallo')     # [H][a][l][l][o]
puts 'Hallo'.length       # 5
puts 'Hallo'[0]           # H, das Zeichen mit dem Index 0
puts 'a'.ord              # 97, die Nummer des Zeichens
puts 98.chr               # b

text.each_char do |char| … end geht die Zeichen der Reihe nach durch, result += … hängt hinten an. text.split zerlegt einen Text an den Leerzeichen in eine Liste von Wörtern, words.join(' ') verbindet sie wieder.

def bracket(text):
    result = ''
    for char in text:
        result += '[' + char + ']'
    return result

print(bracket('Hallo'))   # [H][a][l][l][o]
print(len('Hallo'))       # 5
print('Hallo'[0])         # H, das Zeichen mit dem Index 0
print(ord('a'))           # 97, die Nummer des Zeichens
print(chr(98))            # b

for char in text: geht die Zeichen der Reihe nach durch, result += … hängt hinten an. text.split() zerlegt einen Text an den Leerzeichen in eine Liste von Wörtern, ' '.join(words) verbindet sie wieder.

function bracket(text) {
  let result = '';
  for (const char of text) {
    result += '[' + char + ']';
  }
  return result;
}

console.log(bracket('Hallo'));          // [H][a][l][l][o]
console.log('Hallo'.length);            // 5
console.log('Hallo'[0]);                // H, das Zeichen mit dem Index 0
console.log('a'.charCodeAt(0));         // 97, die Nummer des Zeichens
console.log(String.fromCharCode(98));   // b

for (const char of text) { … } geht die Zeichen der Reihe nach durch, result += … hängt hinten an. text.split(' ') zerlegt einen Text an jedem Leerzeichen in eine Liste, words.join(' ') verbindet sie wieder.

Jedes Zeichen hat eine Nummer: A ist 65, B 66 und so weiter, a ist 97. Welche Nummer zu welchem Zeichen gehört, legt der Zeichensatz fest; die ersten 128 sind seit den 1960er Jahren dieselben (ASCII) und heute ein Teil von Unicode. Mit den Nummern kann man rechnen.

2. Einstieg

Aufgabe 1RückwärtsEinstieg

Schreib eine Funktion reverse_text(text), die den Text rückwärts zurückgibt: reverse_text('Hallo') ergibt 'ollaH'. Mit einer Schleife über die Buchstaben, ohne reverse.

Tipp

text.each_char do |char| … end geht die Buchstaben der Reihe nach durch. Wo muss jeder neue Buchstabe im Ergebnis stehen, vorn oder hinten?

Nächster Tipp

char + result setzt den Buchstaben vor das, was du schon hast.

Aufgabe 1RückwärtsEinstieg

Schreib eine Funktion reverse_text(text), die den Text rückwärts zurückgibt: reverse_text('Hallo') ergibt 'ollaH'. Mit einer Schleife über die Buchstaben, ohne reversed und [::-1].

Tipp

for char in text: geht die Buchstaben der Reihe nach durch. Wo muss jeder neue Buchstabe im Ergebnis stehen, vorn oder hinten?

Nächster Tipp

char + result setzt den Buchstaben vor das, was du schon hast.

Aufgabe 1RückwärtsEinstieg

Schreib eine Funktion reverseText(text), die den Text rückwärts zurückgibt: reverseText('Hallo') ergibt 'ollaH'. Mit einer Schleife über die Buchstaben, ohne reverse.

Tipp

for (const char of text) { … } geht die Buchstaben der Reihe nach durch. Wo muss jeder neue Buchstabe im Ergebnis stehen, vorn oder hinten?

Nächster Tipp

char + result setzt den Buchstaben vor das, was du schon hast.

Aufgabe 2Vokale zählenEinstieg

Schreib eine Funktion count_vowels(text), die zählt, wie viele Vokale im Text stehen, also a, e, i, o und u, klein oder groß: count_vowels('Hallo Welt') ergibt 3.

Tipp

Geh die Buchstaben durch und zähle mit, wie bei den Schleifen. 'aeiou'.include?(char) fragt, ob char ein Vokal ist.

Nächster Tipp

text.downcase macht alle Buchstaben klein; dann reicht der Vergleich mit den kleinen Vokalen.

Aufgabe 2Vokale zählenEinstieg

Schreib eine Funktion count_vowels(text), die zählt, wie viele Vokale im Text stehen, also a, e, i, o und u, klein oder groß: count_vowels('Hallo Welt') ergibt 3.

Tipp

Geh die Buchstaben durch und zähle mit, wie bei den Schleifen. char in 'aeiou' fragt, ob char ein Vokal ist.

Nächster Tipp

text.lower() macht alle Buchstaben klein; dann reicht der Vergleich mit den kleinen Vokalen.

Aufgabe 2Vokale zählenEinstieg

Schreib eine Funktion countVowels(text), die zählt, wie viele Vokale im Text stehen, also a, e, i, o und u, klein oder groß: countVowels('Hallo Welt') ergibt 3.

Tipp

Geh die Buchstaben durch und zähle mit, wie bei den Schleifen. 'aeiou'.includes(char) fragt, ob char ein Vokal ist.

Nächster Tipp

text.toLowerCase() macht alle Buchstaben klein; dann reicht der Vergleich mit den kleinen Vokalen.

Aufgabe 3AnfangsbuchstabenEinstieg

Schreib eine Funktion initials(text), die den ersten Buchstaben jedes Wortes zurückgibt, als einen Text: initials('Hackschule Workspace') ergibt 'HW'. Wörter stehen zwischen Leerzeichen, manchmal auch zwischen mehreren.

Tipp

text.split zerlegt den Text an den Leerzeichen in eine Liste von Wörtern, auch an mehreren hintereinander. word[0] ist der erste Buchstabe.

Aufgabe 3AnfangsbuchstabenEinstieg

Schreib eine Funktion initials(text), die den ersten Buchstaben jedes Wortes zurückgibt, als einen Text: initials('Hackschule Workspace') ergibt 'HW'. Wörter stehen zwischen Leerzeichen, manchmal auch zwischen mehreren.

Tipp

text.split() zerlegt den Text an den Leerzeichen in eine Liste von Wörtern, auch an mehreren hintereinander. word[0] ist der erste Buchstabe.

Aufgabe 3AnfangsbuchstabenEinstieg

Schreib eine Funktion initials(text), die den ersten Buchstaben jedes Wortes zurückgibt, als einen Text: initials('Hackschule Workspace') ergibt 'HW'. Wörter stehen zwischen Leerzeichen, manchmal auch zwischen mehreren.

Tipp

text.split(' ') zerlegt den Text an jedem Leerzeichen in eine Liste. word[0] ist der erste Buchstabe.

Nächster Tipp

Zwischen zwei Leerzeichen steht ein leeres Wort, ''. Das hat keinen ersten Buchstaben.

Aufgabe 4GroßbuchstabenEinstieg

Schreib eine Funktion shout(text), die jeden Kleinbuchstaben von a bis z groß macht und alles andere lässt, wie es ist: shout('Hallo, Welt!') ergibt 'HALLO, WELT!'. Ohne upcase: Jedes Zeichen hat eine Nummer, 'A'.ord ist 65, 'a'.ord ist 97.

Tipp

Ein großer Buchstabe hat eine um 32 kleinere Nummer als sein kleiner: 'a'.ord - 32 ist 'A'.ord. 65.chr macht aus der Nummer wieder ein Zeichen.

Nächster Tipp

char >= 'a' && char <= 'z' fragt, ob char ein Kleinbuchstabe ist. Nur dann rechnest du.

Aufgabe 4GroßbuchstabenEinstieg

Schreib eine Funktion shout(text), die jeden Kleinbuchstaben von a bis z groß macht und alles andere lässt, wie es ist: shout('Hallo, Welt!') ergibt 'HALLO, WELT!'. Ohne upper: Jedes Zeichen hat eine Nummer, ord('A') ist 65, ord('a') ist 97.

Tipp

Ein großer Buchstabe hat eine um 32 kleinere Nummer als sein kleiner: ord('a') - 32 ist ord('A'). chr(65) macht aus der Nummer wieder ein Zeichen.

Nächster Tipp

'a' <= char <= 'z' fragt, ob char ein Kleinbuchstabe ist. Nur dann rechnest du.

Aufgabe 4GroßbuchstabenEinstieg

Schreib eine Funktion shout(text), die jeden Kleinbuchstaben von a bis z groß macht und alles andere lässt, wie es ist: shout('Hallo, Welt!') ergibt 'HALLO, WELT!'. Ohne toUpperCase: Jedes Zeichen hat eine Nummer, 'A'.charCodeAt(0) ist 65, 'a'.charCodeAt(0) ist 97.

Tipp

Ein großer Buchstabe hat eine um 32 kleinere Nummer als sein kleiner: 'a'.charCodeAt(0) - 32 ist 'A'.charCodeAt(0). String.fromCharCode(65) macht aus der Nummer wieder ein Zeichen.

Nächster Tipp

char >= 'a' && char <= 'z' fragt, ob char ein Kleinbuchstabe ist. Nur dann rechnest du.

Ausprobieren: Ruf deine Funktion shout mit 'grüße' auf. Was passiert mit dem ü und dem ß, und warum? Die fertigen Funktionen der Sprache machen aus ü ein Ü: Sie kennen mehr als die 26 Buchstaben.

3. Übung

Aufgabe 5PalindromÜbung

Ein Palindrom liest sich vorwärts wie rückwärts, wenn man nicht auf groß und klein achtet: »Anna«, »Otto«, »Reliefpfeiler«. Schreib eine Funktion palindrome(text), die true oder false zurückgibt: palindrome('Anna') ergibt true.

Tipp

Jetzt darfst du reverse benutzen. Vergleiche den Text mit sich selbst rückwärts.

Nächster Tipp

text.downcase macht vorher alles klein.

Aufgabe 5PalindromÜbung

Ein Palindrom liest sich vorwärts wie rückwärts, wenn man nicht auf groß und klein achtet: »Anna«, »Otto«, »Reliefpfeiler«. Schreib eine Funktion palindrome(text), die True oder False zurückgibt: palindrome('Anna') ergibt True.

Tipp

Jetzt darfst du [::-1] benutzen: text[::-1] ist der Text rückwärts. Vergleiche ihn mit dem Text.

Nächster Tipp

text.lower() macht vorher alles klein.

Aufgabe 5PalindromÜbung

Ein Palindrom liest sich vorwärts wie rückwärts, wenn man nicht auf groß und klein achtet: »Anna«, »Otto«, »Reliefpfeiler«. Schreib eine Funktion palindrome(text), die true oder false zurückgibt: palindrome('Anna') ergibt true.

Tipp

Jetzt darfst du reverse benutzen: [...text].reverse().join('') ist der Text rückwärts. Vergleiche ihn mit dem Text.

Nächster Tipp

text.toLowerCase() macht vorher alles klein.

Aufgabe 6Wörter zählenÜbung

Schreib eine Funktion word_count(text), die zählt, wie viele Wörter im Text stehen: word_count('Ich lerne Ruby') ergibt 3. Zwischen den Wörtern können mehrere Leerzeichen stehen, auch am Anfang und am Ende.

Tipp

Wie bei den Anfangsbuchstaben: text.split macht aus dem Text eine Liste von Wörtern. Wie lang ist sie?

Aufgabe 6Wörter zählenÜbung

Schreib eine Funktion word_count(text), die zählt, wie viele Wörter im Text stehen: word_count('Ich lerne Ruby') ergibt 3. Zwischen den Wörtern können mehrere Leerzeichen stehen, auch am Anfang und am Ende.

Tipp

Wie bei den Anfangsbuchstaben: text.split() macht aus dem Text eine Liste von Wörtern. Wie lang ist sie?

Aufgabe 6Wörter zählenÜbung

Schreib eine Funktion wordCount(text), die zählt, wie viele Wörter im Text stehen: wordCount('Ich lerne Ruby') ergibt 3. Zwischen den Wörtern können mehrere Leerzeichen stehen, auch am Anfang und am Ende.

Tipp

Wie bei den Anfangsbuchstaben: text.split(' ') zerlegt den Text an jedem Leerzeichen. Zähl die Stücke, die nicht leer sind.

Aufgabe 7Das längste WortÜbung

Schreib eine Funktion longest_word(text), die das längste Wort im Text zurückgibt: longest_word('Ich lerne Programmieren') ergibt 'Programmieren'. Sind mehrere gleich lang, gewinnt das erste. Ein leerer Text hat kein Wort: Dann kommt '' zurück.

Tipp

Merk dir das bisher längste Wort in einer Variablen und vergleich jedes Wort mit ihm, wie beim Maximum zweier Zahlen.

Nächster Tipp

word.length ist die Länge eines Wortes.

Aufgabe 7Das längste WortÜbung

Schreib eine Funktion longest_word(text), die das längste Wort im Text zurückgibt: longest_word('Ich lerne Programmieren') ergibt 'Programmieren'. Sind mehrere gleich lang, gewinnt das erste. Ein leerer Text hat kein Wort: Dann kommt '' zurück.

Tipp

Merk dir das bisher längste Wort in einer Variablen und vergleich jedes Wort mit ihm, wie beim Maximum zweier Zahlen.

Nächster Tipp

len(word) ist die Länge eines Wortes.

Aufgabe 7Das längste WortÜbung

Schreib eine Funktion longestWord(text), die das längste Wort im Text zurückgibt: longestWord('Ich lerne Programmieren') ergibt 'Programmieren'. Sind mehrere gleich lang, gewinnt das erste. Ein leerer Text hat kein Wort: Dann kommt '' zurück.

Tipp

Merk dir das bisher längste Wort in einer Variablen und vergleich jedes Wort mit ihm, wie beim Maximum zweier Zahlen.

Nächster Tipp

word.length ist die Länge eines Wortes.

Aufgabe 8Ein Text für die AdresseÜbung

Eine Adresse im Netz hat keine Leerzeichen und keine Satzzeichen: Aus dem Titel »Hello World!« wird hello-world. Schreib eine Funktion slug(text), die alles klein macht, nur Buchstaben von a bis z und Ziffern behält und die Wörter mit - verbindet: slug('Hello World!') ergibt 'hello-world'. Umlaute kommen nicht vor.

Tipp

In zwei Schritten: Mach zuerst aus jedem Zeichen, das kein kleiner Buchstabe und keine Ziffer ist, ein Leerzeichen. Dann sind nur noch Wörter und Leerzeichen übrig.

Nächster Tipp

clean.split macht daraus eine Liste von Wörtern, join('-') verbindet sie mit -.

Aufgabe 8Ein Text für die AdresseÜbung

Eine Adresse im Netz hat keine Leerzeichen und keine Satzzeichen: Aus dem Titel »Hello World!« wird hello-world. Schreib eine Funktion slug(text), die alles klein macht, nur Buchstaben von a bis z und Ziffern behält und die Wörter mit - verbindet: slug('Hello World!') ergibt 'hello-world'. Umlaute kommen nicht vor.

Tipp

In zwei Schritten: Mach zuerst aus jedem Zeichen, das kein kleiner Buchstabe und keine Ziffer ist, ein Leerzeichen. Dann sind nur noch Wörter und Leerzeichen übrig.

Nächster Tipp

clean.split() macht daraus eine Liste von Wörtern, '-'.join(words) verbindet sie mit -.

Aufgabe 8Ein Text für die AdresseÜbung

Eine Adresse im Netz hat keine Leerzeichen und keine Satzzeichen: Aus dem Titel »Hello World!« wird hello-world. Schreib eine Funktion slug(text), die alles klein macht, nur Buchstaben von a bis z und Ziffern behält und die Wörter mit - verbindet: slug('Hello World!') ergibt 'hello-world'. Umlaute kommen nicht vor.

Tipp

In zwei Schritten: Mach zuerst aus jedem Zeichen, das kein kleiner Buchstabe und keine Ziffer ist, ein Leerzeichen. Dann sind nur noch Wörter und Leerzeichen übrig.

Nächster Tipp

clean.split(' ') zerlegt an den Leerzeichen, filter((word) => word !== '') lässt die leeren Stücke weg, join('-') verbindet mit -.

4. Knobelei

Aufgabe 9Die Caesar-VerschlüsselungKnobelei

Caesar soll seine Briefe so verschlüsselt haben: Jeder Buchstabe rückt im Alphabet um dieselbe Zahl weiter, nach z geht es bei a weiter. Schreib eine Funktion caesar(text, shift): Klein- und Großbuchstaben rücken um shift weiter, alles andere bleibt. caesar('Hallo', 3) ergibt 'Kdoor', caesar('xyz', 3) ergibt 'abc'; mit einem negativen shift geht es zurück.

Tipp

Zähl die Buchstaben von 0 bis 25: char.ord - 97 ist 0 für 'a'. Dann rückst du weiter, und % 26 bringt dich nach 25 wieder auf 0.

Nächster Tipp

Für Großbuchstaben dasselbe mit 65 statt 97. Ein Zeichen, das kein Buchstabe ist, hängst du so an, wie es ist.

Aufgabe 9Die Caesar-VerschlüsselungKnobelei

Caesar soll seine Briefe so verschlüsselt haben: Jeder Buchstabe rückt im Alphabet um dieselbe Zahl weiter, nach z geht es bei a weiter. Schreib eine Funktion caesar(text, shift): Klein- und Großbuchstaben rücken um shift weiter, alles andere bleibt. caesar('Hallo', 3) ergibt 'Kdoor', caesar('xyz', 3) ergibt 'abc'; mit einem negativen shift geht es zurück.

Tipp

Zähl die Buchstaben von 0 bis 25: ord(char) - 97 ist 0 für 'a'. Dann rückst du weiter, und % 26 bringt dich nach 25 wieder auf 0.

Nächster Tipp

Für Großbuchstaben dasselbe mit 65 statt 97. Ein Zeichen, das kein Buchstabe ist, hängst du so an, wie es ist.

Aufgabe 9Die Caesar-VerschlüsselungKnobelei

Caesar soll seine Briefe so verschlüsselt haben: Jeder Buchstabe rückt im Alphabet um dieselbe Zahl weiter, nach z geht es bei a weiter. Schreib eine Funktion caesar(text, shift): Klein- und Großbuchstaben rücken um shift weiter, alles andere bleibt. caesar('Hallo', 3) ergibt 'Kdoor', caesar('xyz', 3) ergibt 'abc'; mit einem negativen shift geht es zurück.

Tipp

Zähl die Buchstaben von 0 bis 25: char.charCodeAt(0) - 97 ist 0 für 'a'. Dann rückst du weiter, und % 26 bringt dich nach 25 wieder auf 0.

Nächster Tipp

In JavaScript bleibt der Rest einer negativen Zahl negativ: -1 % 26 ist -1. (x % 26 + 26) % 26 ist immer zwischen 0 und 25.

Ausprobieren: Verschlüssle einen Satz mit 13 und das Ergebnis noch einmal mit 13. Was kommt heraus, und warum gerade bei 13?

Caesar lässt sich knacken, indem man alle 25 Verschiebungen ausprobiert. Wie heute verschlüsselt wird, mit einem Passwort, mit zwei Schlüsseln und mit Unterschriften, zeigt die Aktivität Kryptographie im Terminal.

Aufgabe 10AnagrammeKnobelei

Zwei Wörter sind Anagramme, wenn sie aus genau denselben Buchstaben bestehen, jeder gleich oft: »Lampe« und »Palme«. Schreib eine Funktion anagram(a, b), die true oder false zurückgibt; groß und klein und Leerzeichen zählen nicht. anagram('Lampe', 'Palme') ergibt true.

Tipp

Wenn man die Buchstaben beider Wörter sortiert, was kommt bei Anagrammen heraus?

Nächster Tipp

text.chars.sort ist die sortierte Liste der Buchstaben, downcase und delete(' ') machen vorher klein und nehmen die Leerzeichen weg.

Aufgabe 10AnagrammeKnobelei

Zwei Wörter sind Anagramme, wenn sie aus genau denselben Buchstaben bestehen, jeder gleich oft: »Lampe« und »Palme«. Schreib eine Funktion anagram(a, b), die True oder False zurückgibt; groß und klein und Leerzeichen zählen nicht. anagram('Lampe', 'Palme') ergibt True.

Tipp

Wenn man die Buchstaben beider Wörter sortiert, was kommt bei Anagrammen heraus?

Nächster Tipp

sorted(text) ist die sortierte Liste der Buchstaben, lower() und replace(' ', '') machen vorher klein und nehmen die Leerzeichen weg.

Aufgabe 10AnagrammeKnobelei

Zwei Wörter sind Anagramme, wenn sie aus genau denselben Buchstaben bestehen, jeder gleich oft: »Lampe« und »Palme«. Schreib eine Funktion anagram(a, b), die true oder false zurückgibt; groß und klein und Leerzeichen zählen nicht. anagram('Lampe', 'Palme') ergibt true.

Tipp

Wenn man die Buchstaben beider Wörter sortiert, was kommt bei Anagrammen heraus?

Nächster Tipp

[...text].sort().join('') sortiert die Buchstaben, toLowerCase() und replaceAll(' ', '') machen vorher klein und nehmen die Leerzeichen weg.

Aufgabe 11Namen schreibenKnobelei

Schreib eine Funktion format_name(text), die jedes Wort mit einem großen Buchstaben anfangen lässt und den Rest klein schreibt; zwischen den Wörtern steht danach genau ein Leerzeichen. format_name('max mustermann') ergibt 'Max Mustermann', format_name('ADA LOVELACE') ergibt 'Ada Lovelace'. Ohne capitalize.

Tipp

Ein Wort besteht aus seinem ersten Buchstaben, word[0], und dem Rest, word[1..]. Der eine wird groß (upcase), der andere klein (downcase).

Nächster Tipp

text.split und join(' ') sorgen für genau ein Leerzeichen zwischen den Wörtern.

Aufgabe 11Namen schreibenKnobelei

Schreib eine Funktion format_name(text), die jedes Wort mit einem großen Buchstaben anfangen lässt und den Rest klein schreibt; zwischen den Wörtern steht danach genau ein Leerzeichen. format_name('max mustermann') ergibt 'Max Mustermann', format_name('ADA LOVELACE') ergibt 'Ada Lovelace'. Ohne capitalize und title.

Tipp

Ein Wort besteht aus seinem ersten Buchstaben, word[0], und dem Rest, word[1:]. Der eine wird groß (upper()), der andere klein (lower()).

Nächster Tipp

text.split() und ' '.join(words) sorgen für genau ein Leerzeichen zwischen den Wörtern.

Aufgabe 11Namen schreibenKnobelei

Schreib eine Funktion formatName(text), die jedes Wort mit einem großen Buchstaben anfangen lässt und den Rest klein schreibt; zwischen den Wörtern steht danach genau ein Leerzeichen. formatName('max mustermann') ergibt 'Max Mustermann', formatName('ADA LOVELACE') ergibt 'Ada Lovelace'. Ohne eine fertige Funktion, die es für ein ganzes Wort tut.

Tipp

Ein Wort besteht aus seinem ersten Buchstaben, word[0], und dem Rest, word.slice(1). Der eine wird groß (toUpperCase()), der andere klein (toLowerCase()).

Nächster Tipp

Sammle die Wörter in einer Liste und verbinde sie mit join(' '); leere Stücke aus split(' ') lässt du weg.

5. Extras Extra

Ein Extra für Schnelle: Die Seite ist ohne dieses Kapitel vollständig.

Zwei Katas, die nicht mitzählen.

Aufgabe 12Die Vigenère-VerschlüsselungExtra

Bei Caesar rückt jeder Buchstabe gleich weit. Vigenère nimmt ein Schlüsselwort aus Kleinbuchstaben: Der erste Buchstabe des Textes rückt so weit wie der erste des Schlüssels (a um 0, b um 1 …), der zweite wie der zweite, und ist der Schlüssel zu Ende, fängt er von vorn an. Was kein Buchstabe ist, bleibt und verbraucht keinen Buchstaben des Schlüssels. Schreib vigenere(text, key): vigenere('hallo welt', 'abc') ergibt 'hbnlp yemv'. Deine Caesar-Funktion darfst du mitbenutzen, wenn du sie hier hineinschreibst.

Tipp

Zähl in einer eigenen Variablen mit, wie viele Buchstaben des Textes schon verschlüsselt sind: key[i % key.length] ist der Buchstabe des Schlüssels, der dran ist.

Nächster Tipp

Wie weit er rückt: key[i % key.length].ord - 97. Damit rufst du deine Caesar-Funktion für den einen Buchstaben auf.

Aufgabe 12Die Vigenère-VerschlüsselungExtra

Bei Caesar rückt jeder Buchstabe gleich weit. Vigenère nimmt ein Schlüsselwort aus Kleinbuchstaben: Der erste Buchstabe des Textes rückt so weit wie der erste des Schlüssels (a um 0, b um 1 …), der zweite wie der zweite, und ist der Schlüssel zu Ende, fängt er von vorn an. Was kein Buchstabe ist, bleibt und verbraucht keinen Buchstaben des Schlüssels. Schreib vigenere(text, key): vigenere('hallo welt', 'abc') ergibt 'hbnlp yemv'. Deine Caesar-Funktion darfst du mitbenutzen, wenn du sie hier hineinschreibst.

Tipp

Zähl in einer eigenen Variablen mit, wie viele Buchstaben des Textes schon verschlüsselt sind: key[i % len(key)] ist der Buchstabe des Schlüssels, der dran ist.

Nächster Tipp

Wie weit er rückt: ord(key[i % len(key)]) - 97. Damit rufst du deine Caesar-Funktion für den einen Buchstaben auf.

Aufgabe 12Die Vigenère-VerschlüsselungExtra

Bei Caesar rückt jeder Buchstabe gleich weit. Vigenère nimmt ein Schlüsselwort aus Kleinbuchstaben: Der erste Buchstabe des Textes rückt so weit wie der erste des Schlüssels (a um 0, b um 1 …), der zweite wie der zweite, und ist der Schlüssel zu Ende, fängt er von vorn an. Was kein Buchstabe ist, bleibt und verbraucht keinen Buchstaben des Schlüssels. Schreib vigenere(text, key): vigenere('hallo welt', 'abc') ergibt 'hbnlp yemv'. Deine Caesar-Funktion darfst du mitbenutzen, wenn du sie hier hineinschreibst.

Tipp

Zähl in einer eigenen Variablen mit, wie viele Buchstaben des Textes schon verschlüsselt sind: key[i % key.length] ist der Buchstabe des Schlüssels, der dran ist.

Nächster Tipp

Wie weit er rückt: key.charCodeAt(i % key.length) - 97. Damit rufst du deine Caesar-Funktion für den einen Buchstaben auf.

Aufgabe 13Ein sicheres Passwort?Extra

Viele Seiten nehmen ein Passwort nur, wenn es mindestens acht Zeichen hat und darin mindestens ein Kleinbuchstabe, ein Großbuchstabe und eine Ziffer vorkommen. Schreib strong_password(password), die true oder false zurückgibt: strong_password('Passwort1') ergibt true. Ob so eine Regel ein Passwort wirklich sicher macht, ist eine andere Frage.

Tipp

Drei Fragen auf einmal: Merk dir für jede Art von Zeichen in einer Variablen, ob sie schon vorkam, und geh das Passwort einmal durch.

Aufgabe 13Ein sicheres Passwort?Extra

Viele Seiten nehmen ein Passwort nur, wenn es mindestens acht Zeichen hat und darin mindestens ein Kleinbuchstabe, ein Großbuchstabe und eine Ziffer vorkommen. Schreib strong_password(password), die True oder False zurückgibt: strong_password('Passwort1') ergibt True. Ob so eine Regel ein Passwort wirklich sicher macht, ist eine andere Frage.

Tipp

Drei Fragen auf einmal: Merk dir für jede Art von Zeichen in einer Variablen, ob sie schon vorkam, und geh das Passwort einmal durch.

Aufgabe 13Ein sicheres Passwort?Extra

Viele Seiten nehmen ein Passwort nur, wenn es mindestens acht Zeichen hat und darin mindestens ein Kleinbuchstabe, ein Großbuchstabe und eine Ziffer vorkommen. Schreib strongPassword(password), die true oder false zurückgibt: strongPassword('Passwort1') ergibt true. Ob so eine Regel ein Passwort wirklich sicher macht, ist eine andere Frage.

Tipp

Drei Fragen auf einmal: Merk dir für jede Art von Zeichen in einer Variablen, ob sie schon vorkam, und geh das Passwort einmal durch.