| HTML-CODE | Zeichen |
| < | < |
| > | > |
| \n | <br /> |
Ferner muss oben und unten ein code-Tag ergänzt werden, wobei die Zeile ansonsten freibleibt. Auch das ist in Python nicht kompliziert umzusetzen.
| HTML-CODE | Zeichen |
| < | < |
| > | > |
| \n | <br /> |
![]() |
| Das Gitter mit drei eingetragenen Buchstaben |
![]() |
| Ein Graph mit den Buchstaben und den Nachbarn |
| T |
F |
L |
E |
| R |
E |
U |
G |
| D |
A |
K |
W |
| S |
O |
T |
I |
pi = 3.14159265
for data in [(95000000,997000),(92955887.6,131072)]:
ringworld_radius = data[0]
ringworld_width = data[1]
result = 2 * pi * ringworld_radius * ringworld_width
result_earths = result / 196935000
print("{} EARTHS".format(int(result_earths)))
Einzige Schwierigkeit bei der Aufgabe sind die verschiedenen Einheiten, die man leicht überließt, so dass es zu Fehlern im Programm kommen kann.data = """Hewlett-Packard Company, Year 2000 Financial Report
end"""
data = data.split("\n")
for line in data:
''' Das könnte man auch in eine Funktion
packen, jedenfalls wird hier die Message
verschlüsselt...
'''
# Um es mir einfach zu machen habe ich
# zusätzlich zu den Großbuchstaben
# auch die Kleinbuchstaben ins Code-
# Wörterbuch aufgenommen...
codes = {"A":"*",
"a":"*",
"E":"$",
"e":"$",
"I":"#",
"i":"#",
"O":"!",
"o":"!",
"U":"%",
"u":"%",
"Y":"^",
"y":"^"}
if line == "end":
pass
else:
for key in codes.keys():
line = line.replace(key,codes[key])
print(line)
Alternativ hätte man die Message Buchstabe für Buchstabe durchlaufen können und prüfen können, ob Buchstabe.upper() im Wörterbuch steht und die Daten dann entsprechend z. B. an eine Liste anhängen können. Das Ergebnis würde dann codiert zurückgegeben werden. Für 2 Punkte darf man es sich wohl einfacher machen.
![]() |
| Abb. 1: Gefunden werden soll die kürzeste Weg zwischen O und T. |
![]() |
| Abb. 2: Das Problem ist gelöst. Die kürzeste Route ist O, A, B, D, T. |
def passwort_pruefen(passwort):
''' Prüft die Qualität eines passworts
und kann 4 Qualitätsstufen als String
zurückgeben; die Prüfung umfasst folgende
Punkte:
* Länge korrekt len(pw) >= 8?
* wenigstens ein Großbuchstabe enthalten?
* wenigstens eine Ziffer enthalten?
'''
qualitaet = 0
# Ist die Länge korrekt, d. h. >= 8?
if len(passwort) >= 8:
qualitaet += 1
# Ist wenigstens ein Großbuchstabe enthalten?
for a in passwort:
if a.isupper():
qualitaet += 1
break
# Ist wenigstens eine Zahl enthalten?
for a in passwort:
if a.isdigit():
qualitaet += 1
break
# Rückgabe
if qualitaet == 0:
return "WEAK"
elif qualitaet == 1:
return "ACCEPTABLE"
elif qualitaet == 2:
return "GOOD"
else:
return "STRONG"
passwoerter = ["lizard","aardvark","Aardvark","Aardvark77"]
for passwort in passwoerter:
# eingabe = input("Enter your password: ")
print("Enter your password: {}".format(passwort))
print("This password is {}.\n".format(passwort_pruefen(passwort)))
Auch wenn ich aus Bequemlichkeit auf die Eingabe von Passwörtern verzichtet habe und sie aus einer Liste beziehe, bleibt mein Fazit: Keine Herausforderung. Einige andere Aufgaben aus dem Jahr sind schon eine härtere Nuss.
import random
def minenfeld_erzeugen(breite,hoehe,minen):
''' Diese Funktion erzeugt das Spielfeld
'''
felder = minen * "*" + (breite * hoehe - minen) * "0"
felder = [a for a in felder]
random.shuffle(felder)
return felder
def minenfeld_ausgeben(felder,breite):
''' Das Minenfeld ausgeben
'''
for position,feld in enumerate(felder,1):
if feld == "0":
print(".",end=",")
else:
print(feld,end=",")
if position % breite == 0:
print()
def minenfeld_zahlen_eintragen(felder):
''' Beispiel
.... ..11
...* 111*
*... *322
*.*. *3*1
1 2 3
\|/
4-X-6
/|\
7 8 9
'''
for position,feld in enumerate(felder):
if feld == "*":
pass # Da ist eine Mine drauf
else:
feld = int(feld)
'''
1 2 3
\|/
4-X-6
/|\
7 8 9
'''
positionen = []
''' Problem
Im Augenblick werden Sachen fälschlich ausgewertet,
m. E. gibt es 5 Sonderfälle, die abgefangen werden müssen
B CCCC D
A XXXX E
A XXXX E
'''
# Fall B
if position == 0:
positionen = [position + 1, # 6
position + breite, # 8
position + breite + 1] # 9
# Fall A
elif position % breite == 0:
positionen = [position - breite, # 2
position - breite + 1, # 3
position + 1, # 6
position + breite, # 8
position + breite + 1] # 9
# Fall D
elif position == breite -1:
# Muss hier stehen, weil sonst die Bedingng
# bei Fall C das hier 'überschreibt'
# War zuvor Ursache für einen Bug
positionen = [position - 1, # 4
position + breite - 1, # 7
position + breite,] # 8
# Fall C
elif position < breite:
positionen = [position - 1, # 4
position + 1, # 6
position + breite - 1, # 7
position + breite, # 8
position + breite + 1] # 9
# Fall E
# Hier hatte ich Pkt. (%) vor Strich uebersehen
elif (position + 1) % breite == 0:
positionen = [position - breite - 1, # 1
position - breite, # 2
position - 1, # 4
position + breite - 1, # 7
position + breite] # 8
# Fall X
else:
positionen = [position - breite - 1, # 1
position - breite, # 2
position - breite + 1, # 3
position - 1, # 4
position + 1, # 6
position + breite - 1, # 7
position + breite, # 8
position + breite + 1] # 9
for item in positionen:
try:
# print(item,felder[item])
if felder[item] == "*":
feld += 1
except IndexError:
pass
felder[position] = str(feld)
return felder
# Eigentlich
breite = 30
hoehe = 15
minen = 60
felder = minenfeld_erzeugen(breite,hoehe,minen)
felder = minenfeld_zahlen_eintragen(felder)
minenfeld_ausgeben(felder,breite)
Hauptprobleme in der Entwicklung waren:/* * This could be better optimized, but I leave it up to you :) */
# URL http://www.hpcodewars.org/past/cw14/problems/ProblemSet2011Final.pdf
# Problem: 7. QWERTY Sort (7 P)
# Sortierschluessel
ordnung = [a for a in "QWERTYUIOPASDFGHJKLZXCVBNM"]
data = """ARREST
SUBDIVISION
DISCONTENT
SUPERIOR
TOPOLOGY
DEBUNK
APPENDIX
SUBDUE
TRUNK
."""
def liste_sortieren(liste,ordnung):
''' Diese Funktion erledigt die Sortierung
und gibt die sortierte Liste zurueck
'''
while True:
# Wenn die Liste sortiert ist,
# bleibt das beim Durchlauf auf True
sortiert = True
# Iterier über die Liste
for i in range(len(liste)):
# Prüfe 2 benachbarte Listenelemente,
# ihre Buchstaben von vorn nach hinten,
# wenn die Buchstaben gleich, dann weiter
# sonst
# a.) bekomme für den Buchstaben1 den Listenindex,
# b.) bekomme für den Buchstaben2 den Listenindex,
# wenn a > b, dann tausche
# sonst bleibt es so
try:
for id in range(len(liste[i])):
if liste[i][id] == liste[i+1][id]:
pass
else:
if ordnung.index(liste[i][id]) > ordnung.index(liste[i+1][id]):
# print("Tausche!",liste[i],liste[i+1])
# print("Pruefe gerade:",liste[i][id],liste[i+1][id])
# Dreh die beiden Elemente in der Liste um
liste[i], liste[i+1] = liste[i+1], liste[i]
# print("Getauscht:",liste[i],liste[i+1])
# Liste war noch nicht sortiert (!)
sortiert = False
break
except IndexError: # Ende der Liste erreicht
pass
# gehe zum nächsten Listenpaar
if sortiert == True:
return liste # Brich ab!!!
# Normal break, dann Ausgabe, hier return,
# weil in eine Funktion gepackt
# Bekomm die Werte
data = data.split("\n")
liste = []
for zeile in data:
if not zeile == ".":
liste.append(zeile)
# Liste soll sortiert werden
# Da es nur "eine" Liste gibt,
# brauche ich die nicht an die Funktion zu binden,
# also nicht liste = liste_sortieren(liste,ordnung)
liste_sortieren(liste,ordnung)
# Elemente der Liste werden ausgegeben - - - Ausgabe
for item in liste:
print(item)
Naja, noch frage ich mich, ob ein alternatives Sortierverfahren die Aufgabe performanter lösen könnte. Im Kern kopiere ich hier eine Abwandlung des Bubblesort-Algorithmus, wobei meine Implementierung nicht sehr performant ist, weil - wie mir scheint - nicht jeder mögliche Tausch vorgenommen wird.
def term_auswerten(zeile):
''' Die Funktion wertet den Term aus,
Problem hierbei ist,
a.) dass die Punkt-vor-Strich-Regel
ausgeklammert ist, d. h.
b.) der Term von links nach rechts
auszuwerten ist
eval() scheidet aus erst einmal aus;
ein komplexerer Zugriff ist erforderlich
'''
zeile = zeile.replace(" =","") # = brauche ich nicht
zeile = zeile.split(" ")
term = ""
for a in zeile:
if a in ["*","+","-"]:
term = str(eval(term))
term += a
else:
term += a
print(eval(term))
data = """28 - 7 * 3 =
13 * 4 + 8 * 2 + 1 =
4 + 3 * 52 =
0 ="""
zeilen = data.split("\n")
for zeile in zeilen:
if zeile == "0 =":
pass
else:
term_auswerten(zeile)
Die Aufgabe ließ sich schnell lösen, wenn ich auch für die Möglichkeit zur interaktiven Entwicklung dankbar bin. Ich mache noch zu viele Fehler...
data = """13
5D KC 3C 3D
10C 7D 4C AH
10S JH 6C 10D
7S 2H JS QH
2C 7C KD 8C
QD QS KH 2S
3H 4S 5H JD
3S 4H 5S 6H
8H 6S 7H QC
9C 8S 9H 6D
2D 8D AS 5C
JC AH 4D KS
AH 9S 10H 9D"""
# Erste Zeile der Daten auswerten
zeilen, data = data.split("\n",1)
# Daten in Zeilen zerlegen
datenzeilen = data.split("\n")
# Karten aufbauen
ranks = ["2","3","4","5","6","7","8","9","10","J","Q","K","A"]
suits = ["S","H","D","C"]
kartenset = {} # Das ist ein normales Kartenspiel
kartenkeys = [] # Darueber wird die Ausgabe gesteuert
for suit in suits:
for rank in ranks:
karte = rank + suit
kartenset[karte] = 0
kartenkeys.append(karte)
# Die Daten auswerten
for zeile in range(int(zeilen)):
kartenzeile = datenzeilen[zeile].strip(" ").split(" ")
# print(kartenzeile)
for karte in kartenzeile:
kartenset[karte] += 1
# Ausgabe
print("Missing cards: ")
for karte in kartenkeys:
if kartenset[karte] == 0:
print(karte,end=" ")
print("\n")
print("Extra cards: ")
for karte in kartenkeys:
if kartenset[karte] > 1:
print("{} ({})".format(karte,kartenset[karte]-1),end=" ") # - 1
print()
Die erwartete Ausgabe stimmt. Es ist zu beachten, dass bei den zusätzlichen Karten die Anzahl der Karten im Deck um 1 verringert wird, weil ja eine Karte im Deck enthalten sein soll.
def abarbeiten(data):
''' Bekommt als data eine Reihe von Befehlen
und fuehrt Aufgaben auf einer Liste aus
'''
liste = []
zeilen = data.split("\n")
for line in zeilen:
line = line.strip(" ")
if line == "SHOW":
print(" ".join(liste))
else:
befehl, inhalt = line.split(" ",1)
if befehl == "ADD":
# ADD X – puts item X at the end of the list
liste.append(inhalt)
elif befehl == "INSERT":
# INSERT X N – puts item X into the list just before item N
item, item_alt = inhalt.split(" ")
position = liste.index(item_alt)
liste.insert(position,item)
elif befehl == "REMOVE":
# REMOVE X – removes item X from the list
liste.remove(inhalt)
data = """ADD NEVER
ADD COLLAR
INSERT CAT COLLAR
ADD DOG
ADD SCARES
INSERT ANYTHING CAT
REMOVE CAT
INSERT THAT SCARES
REMOVE COLLAR
INSERT WEAR ANYTHING
REMOVE DOG
ADD CAT
INSERT YOUR CAT
SHOW"""
abarbeiten(data)
Eine eher einfache Aufgabe. Neu für mich der Befehl insert() bei einer Liste.
def umfang_berechnen(breite,hoehe):
''' Berechnet den Umfang eines
Rechtecks
'''
return 2 * hoehe + 2 * breite
beispiele = ["4 6","8 5"]
for wertepaar in beispiele:
breite, hoehe = map(int,wertepaar.split(" "))
print(umfang_berechnen(breite,hoehe))
Man könnte vielleicht eine Klasse Rechteck schreiben und um weitere Methoden ergänzen.
''' HP codewars 2012 - problem 15
Queueing Theory, 9 points
Es hatte etwas gedauert sich wieder etwas in die Stringoperationen
hineinzufinden und die Queue aufzubauen. Ansonsten eher Tipparbeit.
'''
def data_verarbeiten(data):
''' Bekommt die Daten und soll sie verarbeiten und
das Ergebnis als String zurueckgeben...
'''
# Variablen
queue = [[] for i in range(9)] # Liste zum Abarbeiten
queueLen = 0 # Laenge der Queue
string = "" # Nimmt das Ergebnis auf
stringLen = 0 # Laenge des Strings
ablaufplan = [] # Regelt die Entnahme aus den Schlangen
# Variablen uebernehmen
data = data.split("\n")
stringLen, queueLen = map(int,data[0].split(" "))
ablaufplan = [int(a[1]) - 1 for a in data[-1].split(" ")]
# Einrichten der Queue
string = " " * stringLen
for zeile in range(1,queueLen+1):
# Der range ist so gewaehlt, dass die erste Zeile (0)
# mit den Metadaten und auch die letzte Zeile (queueLen+2)
# mit dem Ablaufplan nicht geparst wird
queue_id, position, content = data[zeile].split(" ")
queue_id = int(queue_id[-1]) - 1
queue[queue_id].append([position,content])
# Wir arbeiten die queue ab
for id in ablaufplan:
# Ueber die id wird auf die jeweilige Zeile zugegriffen
start, content = queue[id].pop(0)
# Start und Ende festlegen
start = int(start)
ende = start + len(content)
if start == 0:
# z. B.
# 0123456789
# WORT
# 456789
string = content + string[ende:]
else:
# z. B.
# 0123456789
# WORT
# 012 789
string = string[:start] + content + string[ende:]
return string
data = """44 13
Q1 35 KNOWN
Q1 20 IMPORT
Q3 24 GRANT
Q1 4 IN
Q1 15 MADE
Q1 32 AN
Q2 39 LEDGE
Q2 5 NOTION
Q2 6 A
Q2 16 OR
Q3 0 IMAGE
Q3 12 IS
Q3 30 THIS
Q1 Q3 Q3 Q3 Q2 Q1 Q2 Q1 Q3 Q1 Q2 Q2 Q1"""
print(data_verarbeiten(data))
Zumindest wird das Problem so gelöst.
def reparieren(string):
''' Die Funktion repariert die von einem
speelbot misshandelten Woerter
word -> das zu reparierende Wort
a -> der zu tauschende Buchstabe
b -> der richtige Buchstabe
'''
word, a, b = string.split(" ")
return word.replace(a,b)
for wort in ["MUSTARD M C","JUNK J TR","MONSTER ON A"]:
print(wort,"-->",reparieren(wort))
Hier ist im Kern nur eine einfache Ersetzung erforderlich; trügt der Eindruck, den die Problembeschreibung macht, nicht, dann richtet sich diese Aufgabe eher an jüngere Semester. Immerhin gab es 4 Punkte für die Erledigung der Aufgabe.
def umrechnen_liter_gallonen(liters):
''' Erledigt die Umrechnung.
'''
return int(liters / 3.785)
liters = 144
print(umrechnen_liter_gallonen(liters))
Ob die Funktion für die Umrechnung berechtigt ist, darüber ließe sich wohl streiten.
liste = []
item = ""
with open("indexseite.txt") as f:
for line in f:
if item != "":
line = item + line
liste.append(line.replace("\n",""))
item = ""
elif line.startswith("<h2>"):
item = line
else:
liste.append(line.replace("\n",""))
for item in liste:
if item.startswith("<h2>"):
''' da soll ein Anker rein!
http://de.selfhtml.org/html/verweise/projektintern.htm#anker
z. B.
<h2><a name="kapitel2">Kapitel 2</a></h2>
also Element zwischen den h2-Tags ermitteln
und daraus den Anker basteln...
'''
# <h2>Ziel</h2>
ziel = item.rsplit("<")
# ['', 'h2>A', '/h2>']
ziel = ziel[1].split(">")
# ['h2', 'A']
ziel = ziel[1]
# 'A'
zeile = '<h2><a name="{0}">{0}</a></h2>\n'.format(ziel)
else:
zeile = item + "\n"
with open("zieldatei.txt","a") as g:
print(zeile)
g.write(zeile)
Das Skript funktioniert und speichert in die zieldatei.txt die gewünschten Inhalte. Ein weiteres Skript erzeugt ein Inhaltsverzeichnis, das ich oben auf der Seite einfügen kann. Da bereits alle Buchstaben angelegt sind, muss ich nicht erst prüfen, ob die Buchstaben auf der Seite vorhanden sind.import string
def inhaltsverzeichnis_erzeugen():
''' Die Links haben die Form
http://pixewakb.blogspot.de/p/index.html#C
'''
abc = string.ascii_uppercase
url = '{0}'
for a in abc:
print(url.format(a), end=" • " if not a == abc[-1] else "")
inhaltsverzeichnis_erzeugen()
Wünschenswert wäre noch ein Zurücklink bei jedem Anker, aber erst einmal läuft das so.