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.
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.
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.
text.each_char do |char| … end geht die Buchstaben der Reihe nach durch. Wo muss jeder neue Buchstabe im Ergebnis stehen, vorn oder hinten?
char + result setzt den Buchstaben vor das, was du schon hast.
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].
for char in text: geht die Buchstaben der Reihe nach durch. Wo muss jeder neue Buchstabe im Ergebnis stehen, vorn oder hinten?
char + result setzt den Buchstaben vor das, was du schon hast.
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.
for (const char of text) { … } geht die Buchstaben der Reihe nach durch. Wo muss jeder neue Buchstabe im Ergebnis stehen, vorn oder hinten?
char + result setzt den Buchstaben vor das, was du schon hast.
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.
Geh die Buchstaben durch und zähle mit, wie bei den Schleifen. 'aeiou'.include?(char) fragt, ob char ein Vokal ist.
text.downcase macht alle Buchstaben klein; dann reicht der Vergleich mit den kleinen Vokalen.
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.
Geh die Buchstaben durch und zähle mit, wie bei den Schleifen. char in 'aeiou' fragt, ob char ein Vokal ist.
text.lower() macht alle Buchstaben klein; dann reicht der Vergleich mit den kleinen Vokalen.
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.
Geh die Buchstaben durch und zähle mit, wie bei den Schleifen. 'aeiou'.includes(char) fragt, ob char ein Vokal ist.
text.toLowerCase() macht alle Buchstaben klein; dann reicht der Vergleich mit den kleinen Vokalen.
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.
text.split zerlegt den Text an den Leerzeichen in eine Liste von Wörtern, auch an mehreren hintereinander. word[0] ist der erste Buchstabe.
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.
text.split() zerlegt den Text an den Leerzeichen in eine Liste von Wörtern, auch an mehreren hintereinander. word[0] ist der erste Buchstabe.
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.
text.split(' ') zerlegt den Text an jedem Leerzeichen in eine Liste. word[0] ist der erste Buchstabe.
Zwischen zwei Leerzeichen steht ein leeres Wort, ''. Das hat keinen ersten Buchstaben.
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.
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.
char >= 'a' && char <= 'z' fragt, ob char ein Kleinbuchstabe ist. Nur dann rechnest du.
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.
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.
'a' <= char <= 'z' fragt, ob char ein Kleinbuchstabe ist. Nur dann rechnest du.
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.
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.
char >= 'a' && char <= 'z' fragt, ob char ein Kleinbuchstabe ist. Nur dann rechnest du.
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.
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.
Jetzt darfst du reverse benutzen. Vergleiche den Text mit sich selbst rückwärts.
text.downcase macht vorher alles klein.
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.
Jetzt darfst du [::-1] benutzen: text[::-1] ist der Text rückwärts. Vergleiche ihn mit dem Text.
text.lower() macht vorher alles klein.
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.
Jetzt darfst du reverse benutzen: [...text].reverse().join('') ist der Text rückwärts. Vergleiche ihn mit dem Text.
text.toLowerCase() macht vorher alles klein.
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.
Wie bei den Anfangsbuchstaben: text.split macht aus dem Text eine Liste von Wörtern. Wie lang ist sie?
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.
Wie bei den Anfangsbuchstaben: text.split() macht aus dem Text eine Liste von Wörtern. Wie lang ist sie?
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.
Wie bei den Anfangsbuchstaben: text.split(' ') zerlegt den Text an jedem Leerzeichen. Zähl die Stücke, die nicht leer sind.
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.
Merk dir das bisher längste Wort in einer Variablen und vergleich jedes Wort mit ihm, wie beim Maximum zweier Zahlen.
word.length ist die Länge eines Wortes.
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.
Merk dir das bisher längste Wort in einer Variablen und vergleich jedes Wort mit ihm, wie beim Maximum zweier Zahlen.
len(word) ist die Länge eines Wortes.
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.
Merk dir das bisher längste Wort in einer Variablen und vergleich jedes Wort mit ihm, wie beim Maximum zweier Zahlen.
word.length ist die Länge eines Wortes.
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.
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.
clean.split macht daraus eine Liste von Wörtern, join('-') verbindet sie mit -.
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.
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.
clean.split() macht daraus eine Liste von Wörtern, '-'.join(words) verbindet sie mit -.
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.
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.
clean.split(' ') zerlegt an den Leerzeichen, filter((word) => word !== '') lässt die leeren Stücke weg, join('-') verbindet mit -.
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.
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.
Für Großbuchstaben dasselbe mit 65 statt 97. Ein Zeichen, das kein Buchstabe ist, hängst du so an, wie es ist.
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.
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.
Für Großbuchstaben dasselbe mit 65 statt 97. Ein Zeichen, das kein Buchstabe ist, hängst du so an, wie es ist.
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.
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.
In JavaScript bleibt der Rest einer negativen Zahl negativ: -1 % 26 ist -1. (x % 26 + 26) % 26 ist immer zwischen 0 und 25.
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.
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.
Wenn man die Buchstaben beider Wörter sortiert, was kommt bei Anagrammen heraus?
text.chars.sort ist die sortierte Liste der Buchstaben, downcase und delete(' ') machen vorher klein und nehmen die Leerzeichen weg.
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.
Wenn man die Buchstaben beider Wörter sortiert, was kommt bei Anagrammen heraus?
sorted(text) ist die sortierte Liste der Buchstaben, lower() und replace(' ', '') machen vorher klein und nehmen die Leerzeichen weg.
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.
Wenn man die Buchstaben beider Wörter sortiert, was kommt bei Anagrammen heraus?
[...text].sort().join('') sortiert die Buchstaben, toLowerCase() und replaceAll(' ', '') machen vorher klein und nehmen die Leerzeichen weg.
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.
Ein Wort besteht aus seinem ersten Buchstaben, word[0], und dem Rest, word[1..]. Der eine wird groß (upcase), der andere klein (downcase).
text.split und join(' ') sorgen für genau ein Leerzeichen zwischen den Wörtern.
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.
Ein Wort besteht aus seinem ersten Buchstaben, word[0], und dem Rest, word[1:]. Der eine wird groß (upper()), der andere klein (lower()).
text.split() und ' '.join(words) sorgen für genau ein Leerzeichen zwischen den Wörtern.
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.
Ein Wort besteht aus seinem ersten Buchstaben, word[0], und dem Rest, word.slice(1). Der eine wird groß (toUpperCase()), der andere klein (toLowerCase()).
Sammle die Wörter in einer Liste und verbinde sie mit join(' '); leere Stücke aus split(' ') lässt du weg.
Ein Extra für Schnelle: Die Seite ist ohne dieses Kapitel vollständig.
Zwei Katas, die nicht mitzählen.
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.
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.
Wie weit er rückt: key[i % key.length].ord - 97. Damit rufst du deine Caesar-Funktion für den einen Buchstaben auf.
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.
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.
Wie weit er rückt: ord(key[i % len(key)]) - 97. Damit rufst du deine Caesar-Funktion für den einen Buchstaben auf.
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.
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.
Wie weit er rückt: key.charCodeAt(i % key.length) - 97. Damit rufst du deine Caesar-Funktion für den einen Buchstaben auf.
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.
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.
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.
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.
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.
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.