Willkommen zum virtuellen Informatikunterricht! Hier kannst du Python lernen und mit kleinen Aufgaben deine Progammierfähigkeiten ausbauen.

Grundlagen  

Grundlagen

First things first: Hier geht es um grundlegende Themen wie Ein- und Ausgabe, Variablen, Schleifen und Verzweigungen.

0 von 5 Aufgaben gelöst
Hello, world!

Schreibe ein Programm, das den Text Hello, world! ausgibt. Achte darauf, dass du genau diesen Text ausgibst.

Persönliche Begrüßung

Schreibe ein Programm, das einen Namen einliest und anschließend eine Begrüßung ausgibt.

Zahlenreihe

Schreibe ein Programm, das alle Zahlen von 1 bis 20 ausgibt (entweder hintereinander oder untereinander):

1 2 3 ... 20
Quadratzahlen

Schreibe ein Programm, das alle Quadratzahlen von 1 bis 20 in der folgenden Form ausgibt:

1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
(usw.)
Pythagoreische Tripel

Gegeben sind drei Zahlen a, b, c. Schreibe eine Funktion, die ermittelt, ob diese drei Zahlen ein pythagoreisches Tripel bilden, also ob sie als Seitenlängen eines rechtwinkligen Dreiecks infrage kommen.


1. Beispiel

Eingabe:

a = 3
b = 4
c = 5

Ausgabe:

True

Erklärung: Die Zahlen bilden ein pythagoreisches Tripel, da gilt: 3² + 4² = 5².


2. Beispiel

Eingabe:

a = 13
b = 5
c = 12

Ausgabe:

True

Erklärung: Die Zahlen bilden ein pythagoreisches Tripel, da gilt: 5² + 12² = 13². In diesem Fall ist a die Hypothenuse.


3. Beispiel

Eingabe:

a = 7
b = 10
c = 9

Ausgabe:

False

*Erklärung: Die Zahlen bilden kein pythagoreisches Tripel, da gilt: 7² + 9² ≠ 10². In diesem Fall war b die längste Seite, aber nicht die Hypothenuse. *


Strings  

Strings

Hier geht es um Strings und die Operationen, die man auf ihnen durchführen kann.

0 von 3 Aufgaben gelöst
Palindrom

Ein Palindrom ist ein Wort, welches sich nicht verändert, wenn es rückwärts gelesen wird. Dabei spielt die Groß- und Kleinschreibung keine Rolle.

Schreibe eine Methode, die ermittelt, ob ein gegebenes Wort ein Palindrom ist oder nicht.


Beispiel

Eingabe:

"Otto"

Ausgabe:

True

Erklärung: „Otto“ ist rückwärts geschrieben „ottO“ und somit ohne Berücksichtigung der Groß- und Kleinschreibung ein Palindrom.


Beispiel

Eingabe:

"Peter"

Ausgabe:

False

Erklärung: „Peter“ ist rückwärts geschrieben „reteP“ und somit selbst ohne Berücksichtigung der Groß- und Kleinschreibung kein Palindrom.

Anagramm

Anagramme sind Paare sinnvoller Wörter, die aus denselben Buchstaben bestehen, sich aber in der Anordnung dieser Buchstaben unterscheiden.

Schreibe eine Methode, die ermittelt, ob ein ein gegebener Strings a ein Anagramm eines anderen gegebenen Strings b ist. Leerzeichen sowie Groß- und Kleinschreibung sollen dabei keine Rolle spielen.


Beispiel

Eingabe:

a = "Weizenfeld", b = "zweifelnde"

Ausgabe:

True

Erklärung: Die Buchstaben des Wortes „Weizenfeld“ können so umgestellt werden, dass sich das Wort „zweifelnde“ ergibt (unter Nichtberücksichtigung der Groß- und Kleinschreibung), deshalb handelt es sich um ein Anagramm.

Großbuchstaben

Schreibe eine Methode, die in einem String alle Buchstaben von A bis Z in Großbuchstaben umwandelt. Alle anderen Zeichen sollen unverändert bleiben.


Beispiel

Eingabe:

"breaking news"

Ausgabe:

"BREAKING NEWS"

Listen  

Listen

Hier geht es um Listen und die Operationen, die man auf ihnen durchführen kann.

0 von 3 Aufgaben gelöst
Summe von Zahlen

Gegeben ist eine Liste von Zahlen. Bilde die Summe aller Zahlen und gib sie zurück.


Beispiel

Eingabe:

[3, 6, 9, 7, 5]

Ausgabe:

30

Erklärung: 30 ist die Summe der Zahlen in der Liste und wird deshalb zurückgegeben.

Maximum finden

Gegeben ist eine Liste von Zahlen. Finde die größte Zahl in der Liste und gib sie zurück.


Beispiel

Eingabe:

[6, 3, 1, 9, 7]

Ausgabe:

9

Erklärung: 9 ist die größte Zahl in der Liste und wird deshalb zurückgegeben.

Monotonie

Gegeben ist eine Reihe (also eine Liste) von Zahlen. Schreibe eine Funktion, die überprüft, ob die Reihe streng monoton ist.


Beispiel 1

Eingabe:

[3, 6, 9]

Ausgabe:

True

Erklärung: Die Zahlenreihe ist streng monoton, weshalb True zurückgegeben wird.


Beispiel 2

Eingabe:

[10, 8, 7]

Ausgabe:

True

Erklärung: Die Zahlenreihe ist streng monoton, weshalb True zurückgegeben wird.


Beispiel 3

Eingabe:

[6, 3, 9]

Ausgabe:

False

Erklärung: Die Zahlenreihe ist nicht streng monoton, weshalb False zurückgegeben wird.


Beispiel 4

Eingabe:

[3, 3, 9]

Ausgabe:

False

Erklärung: Die Zahlenreihe ist nicht streng monoton, weshalb False zurückgegeben wird.


Bit-Basteleien  

Bit-Basteleien

Hier geht es um Bits und Stellenwertsysteme.

0 von 2 Aufgaben gelöst
Binärdarstellung

Schreibe eine Funktion, die eine positive, ganze Zahl in ihre Binärdarstellung umwandelt.


Beispiel

Eingabe:

123

Ausgabe:

'1111011'
Anzahl der gesetzten Bits

Schreibe eine Funktion, die ermittelt, wie viele Bits in der Binärdarstellung einer gegebenen Zahl gesetzt sind.


Beispiel

Eingabe:

123

Ausgabe:

6

Die Binärdarstellung von 123 lautet 1111011. Es sind also 6 Bits gesetzt und daher lautet die Antwort 6.


Krypto  

Krypto

Hier geht es um Strings, Bits, Streams und Verschlüsselung.

0 von 2 Aufgaben gelöst
Cäsar-Chiffre

Bei der Cäsar-Verschlüsselung wird jeder Buchstabe einer Nachricht einfach immer um eine bestimmte Entfernung k nach rechts „verschoben“. Ist z. B. k = 3, so würde aus dem Wort „CAESAR“ das Wort „FDHVDU“ werden, da C zu F wird, A zu D und immer so weiter. Es wird also gewissermaßen auf jeden Buchstaben eine Zahl k „addiert“. Dabei handelt es sich um eine zyklische Addition. Das heisst, dass man wieder bei A beginnt, wenn man über den Buchstaben Z hinauskommt.

Um einen so verschlüsselten Geheimtext zu entschlüsseln, wendet man dasselbe Verfahren an, nur dass man nicht k addiert, sondern k subtrahiert (im Spezialfall k = 13 erhält man so das ROT13-Verfahren, bei es egal ist, ob man addiert oder subtrahiert).

Schreibe eine Funktion, die ein mit dem Cäsar-Verfahren verschlüsseltes Wort wieder entschlüsselt und das entschlüsselte Wort zurückgibt. Das verschlüsselte Wort wird als Parameter s in die Funktion übergeben, der zur Verschlüsselung verwendete Wert k ebenfalls.

Hinweise: Das Argument, das in s übergeben wird, enthält ausschließlich Großbuchstaben von A bis Z (es enthält keine Leerzeichen oder sonstigen Sonderzeichen). Für den Wert k gilt: 0 < k < 26.


Beispiel

Eingabe:

k = 3
s = "WRSVHFUHW"

Ausgabe:

"TOPSECRET"

Erklärung: Alle Buchstaben werden um 3 Positionen im Alphabet nach links verschoben (da wir entschlüsseln) und so entsteht das Lösungswort.

Man in the middle

Gegeben ist ein Datenstrom (also ein Text) unbekannter Länge, der von dir gefiltert werden soll. Ein bestimmtes Wort, das vorher definiert wird, soll durch dein Programm im Datenstrom immer durch ein anderes Wort ersetzt werden.

Implementiere die Methode receive in der Klasse Filter, die immer ein oder mehrere Zeichen dieses Datenstroms erhält und die Aufgabe hat, sie mit Hilfe der Methode send wieder auszugeben. Achte aber darauf, dass du das Suchwort niemals ausgibst, sondern immer durch das Ersatzwort ersetzst.

Das Suchwort findest du in self.search, das Ersatzwort in self.replace (es handelt sich um Strings, es können also genaugenommen beliebige Zeichenketten sein, nicht nur Wörter).

Hinweis: du kannst bei der Lösung dieser Aufgabe nicht warten, bis du „alle“ Zeichen empfangen hast, um dann einfach alle Vorkommen von search durch replace zu ersetzen, weil du nie weißt, wann der Datenstrom zuende ist. Auch falls eine Weile lang kein Zeichen mehr kommt, heisst das nicht, dass der Datenstrom zuende ist. Sorge dafür, dass jedes Zeichen, das du ausgibst, so früh wie möglich gesendet wird.


Beispiel (für search = "Alice" und replace = "Mallory")

Eingabestrom:

Alles deutet darauf hin: Alice hat den Keks aus der Dose geklaut.

Ausgabestrom:

Alles deutet darauf hin: Mallory hat den Keks aus der Dose geklaut.

Beispiel (für search = "Euler" und replace = "Gauß")

Eingabestrom:

Showdown: Euler vs. 100 Eulen

Ausgabestrom:

Showdown: Gauß vs. 100 Eulen

Wizard  

Wizard

Steuere einen Zauberer durch ein Verlies und sorge dafür, dass er bestimmte Aufträge erfüllt.

0 von 5 Aufgaben gelöst
Wizard: Einführung

Steuere den Magier zur Münze und sammle die Münze ein! Du kannst dafür die Methode self.forward() verwenden, mit der du einen Schritt nach vorne gehen kannst. Wenn du angekommen bist, verwende die Methode self.get_coin(), um die Münze aufzuheben.

Münzsammler

Sammle alle Münzen auf! Pass auf, dass du dabei nicht gegen Wände läufst. Um dich zu drehen, kannst du die Funktionen self.turn_left() und self.turn_right() verwenden.

Falls dir der Zauberer zu langsam ist, kannst du die Geschwindigkeit mit self.set_speed(speed) einstellen, wobei du eine Zahl von 1 (sehr langsam) bis 100 (sehr schnell) übergeben musst. Die normale Geschwindigkeit ist 50.

Münzspirale

Sammle alle Münzen auf!

Falls dir der Zauberer zu langsam ist, kannst du die Geschwindigkeit mit self.set_speed(speed) einstellen, wobei du eine Zahl von 1 (sehr langsam) bis 100 (sehr schnell) übergeben musst. Die normale Geschwindigkeit ist 50.

Zickzack

Sammle alle Münzen auf! Versuche, dein Programm mit Hilfe von for-Schleifen und if-Abfragen möglichst kurz zu machen.

Monster-Mampf

Sammle alle Münzen auf. Aber pass auf, dass du nicht vom Monster gefressen wirst!


Pixelgrafik  

Pixelgrafik

Deine Aufgabe ist es, ein Bild zu decodieren. Du bekommst einen Strom einzelner Bytes und daraus ein Bild erstellen.

0 von 6 Aufgaben gelöst
Raw Pixels

In dieser Aufgabe entspricht jedes Byte einem Pixel. Die einzelnen Pixel sind zeilenweise von oben nach unten und in jeder Zeile von links nach rechts codiert. Lies alle Bytes hintereinander und setze den entsprechenden Pixel auf die jeweilge Farbe.

4 Bit-Pixel

In dieser Aufgabe werden immer zwei Pixel in einem Byte komprimiert. Da es nicht mehr als 16 Farben gibt, können immer zwei Pixel zu einem Byte zusammengefasst werden. Dabei bezeichnen die unteren 4 Bits den ersten Pixel, und die oberen 4 Bits den zweiten Pixel:

7 6 5 4 3 2 1 0
2. Pixel 1. Pixel
RLE-Komprimierung

In dieser Aufgabe werden Pixel derselben Farbe zusammengefasst. Dies spart viel Speicherplatz, wenn mehrmals hintereinander dieselbe Farbe im Bild vorkommt. Dieses Verfahren heisst »RLE-Komprimierung« (RLE = Run Length Encoding, auf deutsch »Lauflängencodierung«). Dabei müssen immer zwei Bytes gelesen werden. Das erste Byte gibt an, wie oft die im darauffolgenden Byte codierte Farbe wiederholt wird.

RLE-Komprimierung #2

In dieser Aufgabe wird wieder die RLE-Komprimierung verwendet. Allerdings wird dieses Verfahren hier nur angewendet, wenn ein Pixel mehr als zweimal wiederholt wird, um weiteren Speicherplatz zu sparen.

Dass ein Pixel wiederholt werden soll, wird dadurch signalisiert, dass in einem Byte das höchste Bit gesetzt ist. Wenn es gesetzt ist, wird die Anzahl der Wiederholungen in den unteren 7 Bits angegeben und die Farbe im darauffolgenden Byte. Ist das höchste Bit nicht gesetzt, repräsentiert dieses Byte einfach die Farbe des nächsten Pixels.

Es werden also die folgenden zwei Fälle unterschieden (je nachdem ob das höchste Bit gesetzt ist oder nicht):

7 6 5 4 3 2 1 0
1. Byte 1 Anzahl der Wiederholungen
2. Byte Farbe, die wiederholt werden soll
7 6 5 4 3 2 1 0
1. Byte 0 Farbe des Pixels
RLE-Komprimierung #3

In dieser Aufgabe wird wieder die RLE-Komprimierung verwendet. Hier wird wieder jeder Pixel lauflängencodiert, allerdings werden die Anzahl der Wiederholungen und die Farbe in einem Byte gespeichert:

7 6 5 4 3 2 1 0
Anzahl der Wiederholungen - 1 Farbe, die wiederholt werden soll

Da kein Pixel 0 mal wiederholt wird, sondern mindestens immer einmal, wird die Anzahl der Wiederholungen subtrahiert um 1 abgespeichert.

Deflate-Komprimierung

In dieser Aufgabe wird die Deflate-Komprimierung verwendet, das in vielen Dateiformaten (wie z. B. ZIP, PNG, PDF, ODT und TIFF) zum Einsatz kommt.

Da es nicht trivial ist, einen mit Deflate komprimierten Datenstrom zu dekomprimieren, bietet es sich an, auf die zlib-Bibliothek und die darin enthaltene Methode zlib.decompress zurückzugreifen.


Dies und das  

Dies und das

Ein Sammelsurium kleiner Aufgaben und Kuriositäten.

0 von 2 Aufgaben gelöst
Sandbox

In dieser Sandbox kannst du beliebige Dinge programmieren. Es gibt hier keine richtigen oder falschen Lösungen, aber wenn du mal einen Python-Interpreter zum ausprobieren brauchst, bist du hier genau richtig.

MySQL-Sandbox

In dieser Sandbox kannst du mit deiner MySQL-Datenbank interagieren.

6502 Sandbox

Programmiere eine 6502-CPU mit Assembler-Code.

Der Code beginnt an Adresse $600 und an den Speicherstellen $200 bis $5ff befindet sich der Bildschirmspeicher für 32x32 Pixel mit 16 EGA-Farben.

Eine Übersicht der 6502-Befehle findest du z. B. hier.

Hier gibt es den Quelltext für ein Snake-Spiel, das du einfach kopieren und ausprobieren kannst.

Pixelflut

Zeichne Pixel auf eine gemeinsame Zeichenfläche! Deine Pixel bleiben so lange stehen, bis jemand anderes etwas darüber zeichnet.

Die Zeichenfläche ist 256 Pixel breit und 144 Pixel hoch. Der Pixel links oben hat die Koordinaten (0, 0), der Pixel rechts unten hat die Koordinaten (255, 143). Verwende die Methode self.set_pixel(x, y, r, g, b), um einen Pixel zu setzen, wobei r, g und b jeweils die Intensität von rot, grün und blau im Bereich von 0 bis 255 angeben.

Du darfst natürlich auch die ganze Zeichenfläche überschreiben!

Quine

Ein Quine ist ein Programm, das seinen eigenen Quelltext ausgibt. Dabei ist es nicht erlaubt, den eigenen Quelltext zu lesen.

Schreibe einen Quine! Bonuspunkte (ehrenhalber) gibt es für Lösungen, die nicht sofort per Google zu finden sind. 😉

Test-Sandbox

Hier kannst du mit Unit-Tests experimentieren.

Implementiere zuerst die Funktion vorsprung, so dass alle Tests fehlerfrei durchlaufen.

Finde anschließend weitere Tests, um die Robustheit der Funktion zu erhöhen.

Labeldrucker-Sandbox

Hier kannst du mit einem Label­drucker experi­men­tieren, indem du Label in ZPL (Zebra Programming Language) erstellst.

Maße des Labels:

57.0 mm × 31.5 mm
472 × 268 Pixel (8 dpmm)
Safe Area: 16 Pixel

Befehlsübersicht

Ein Label muss immer mit ^XA beginnen und mit ^XZ enden. Dazwischen befinden sich ein oder mehrere Felder (Fields) – dies können z. B. Texte, Barcodes oder grafische Elemente sein. Einzelne Felder werden mit ^FS (Field Separator) voneinander getrennt.

Hinweis: Obwohl es nicht Teil der ZPL-Spezifikation ist, können in der Hackschule einzelne Zeilen mit # auskommentiert werden.

^BC
Code 128 Bar Code (Barcode drucken)
^BCo,h,f,g,e,m
o – orientation (N, R, I, B)
h – bar code height (1-32000)
f – print interpretation line (Y, N)
g – print interpretation line above code (Y, N)
e – UCC check digit (Y, N)
m – mode (N, U)
^XA ^BCN,60^FDHello^FS ^XZ
^BQ
QR Code Bar Code (QR-Code drucken)
^BQa,b,c
a – field position (N)
b – model (2)
c – magnification factor (1-10)
Achtung: das Fehlerkorrektur-Level wird hierbei in ^FD angegeben!
^FDa,bc
a – error correction (H, Q, M, L)
b – character mode (A, M)
c – barcode data
^XA ^BQN,,4^FDM,AHello^FS ^XZ
^CF
Change Alphanumeric Default Font (Schriftart ändern)
^CFf,h,w
f – specified default font (A-Z, 0-9)
h – character height
w – character width
^XA ^CFE,30 ^FDHello^FS ^XZ
^FB
Field Block (mehrzeiliger Text)
^FBa,b,c,d,e
a – width of text
b – maximum number of lines in text block
c – add or delete space between lines
d – text justification (L, C, R)
e – hanging indent
Hinweis: Einzelne Zeilen werden mit \& getrennt.
^XA ^CF0,40 ^FB472,4,0,L,0^FDLeft 1\&Left 2\&^FS ^FB472,4,0,C,0^FDCenter 1\&Center 2\&Center 3\&^FS ^FB472,4,0,R,0^FDRight 1\&Right 2\&^FS ^XZ
^FD
Field Data (Daten, die gedruckt werden sollen)
^FDa
a – data to be printed
^FO
Set Field Origin (linke obere Ecke verschieben)
^FOx,y
x – x-axis location
y – y-axis location
^XA ^FO100,100 ^FDHello^FS ^XZ
^FR
Field Reverse Print (Feld invers drucken)
Hierbei wird jeder durch die Zeichenoperation betroffene Pixel invertiert.
^XA ^CF0,60 ^GB 100,100,10^FS ^FR^FDHello^FS ^XZ
^GB
Graphic Box (Rechteck zeichnen)
^GBw,h,t,c,r
w – box width
h – box height
t – border thickness
c – line color (B, W)
r – degree of corner-rounding (0-8)
^XA ^GB100,100,10^FS ^FO120,0^GB100,100,20,B,3^FS ^FO240,0^GB100,100,30,B,6^FS ^XZ
^GC
Graphic Circle (Kreis zeichnen)
^GCd,t,c
d – circle diameter
t – border thickness
c – line color (B, W)
^XA ^GC100,5 ^XZ
^GD
Graphic Diagonal Line (Linie zeichnen)
^GDw,h,t,c,o
w – box width
h – box height
t – border thickness
c – line color (B, W)
o – orientation (L, R)
^XA ^GD70,100,5,B,R^FS ^FO70,0^GD140,100,1,B,L^FS ^XZ
^GE
Graphic Ellipse (Ellipse zeichnen)
^GEw,h,t,c
w – ellipse width
h – ellipse height
t – border thickness
c – line color (B, W)
^XA ^GE160,90,10 ^XZ
^GF
Graphic Field (Grafik zeichnen)
^GFa,b,c,d,data
a – compression type
b – binary byte count
c – graphic field count
d – bytes per row
^XA ^GFA,8,8,1,55AA55AA55AA55AA^FS ^XZ
Komplexere Beispiele findest du hier: Detectives, Moon, Study, Tree, Balloon, Mountains, Space 1, Space 2, Space 3.
^FS
Field Separator (Feldende)
^XA
Start Format (Labelbeginn)
^XZ
End Format (Labelende)

Eine vollständige Übersicht über alle ZPL-Befehle gibt es hier: ZPL II Programming Guide.

Impressum und Datenschutz