Python :: Aufgabe #117 :: Lösung #2

6 Lösungen Lösungen öffentlich
#117

Pig Latin - Schweine Latein

Anfänger - Python von DrizZle - 15.06.2016 um 13:57 Uhr
Hier zum Wikipedia Post

Einführung:

Zitat:

Pig Latin (engl.; wörtlich: Schweine-Latein) bezeichnet eine Spielsprache, die im englischen Sprachraum verwendet wird.
Sie wird vor allem von Kindern benutzt, aus Spaß am Spiel mit der Sprache oder als einfache Geheimsprache, mit der Informationen vor Erwachsenen oder anderen Kindern verborgen werden sollen.


Erklärung:

Zitat:

Beginnt das Wort mit einem Konsonanten, so wird der initiale Konsonant oder Konsonantencluster ans Ende des Wortes verschoben und ein „ay“ angehängt. Zu betrachten ist hierbei nicht die Rechtschreibung, sondern die tatsächliche Aussprache: „Stumme“ Konsonantenbuchstaben, wie z. B. das „h“ in „honor“, sind keine Konsonanten.

loser → oser-lay
button → utton-bay
star → ar-stay
three → ee-thray
question → estion-quay
happy → appy-hay
Pig Latin → Ig-pay Atin-lay

Beginnt das Wort mit einem Vokal oder einem stummen Konsonanten, so wird direkt ein „ay“ angehängt.

eagle → eagle-ay
America → America-ay
honor → honor-ay


Aufgabe:
Schreibt ein Programm welches ein belibiges Wort ins Schweine Latein umwandelt und ausgibt. Auf die Regel mit Stummen H's kann man verzichten.
#2
3 Kommentare
1x
vote_ok
von Nachbar (2820 Punkte) - 02.08.2016 um 22:37 Uhr
Quellcode ausblenden Python-Code
# -*- coding: utf-8-sig -*-

def piglatin(piginput):

    qu = "qu", "QU"
    v = "a", "e", "i", "o", "u","A", "E", "I", "O", "U"
    k = "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", \
    "s", "t", "v", "w", "x", "y", "z", "B", "C", "D", "F", "G", "H", "J", "K", \
    "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"
    result = ""
    capital = False

    pigexpression = piginput.split()

    for letter in pigexpression:
        if letter[0].isupper():
            capital = True
        # 3 Konsonanten
        if letter[0] in k and letter[1] in k and letter[2] in k:
            fChar = letter[0:3]
            nWord = letter[3:]
            if capital == True:
                nWord = nWord.capitalize()
                fChar = fChar.lower()
        # 2 Konsonanten
        elif letter[0] in k and letter[1] in k:
            fChar = letter[0:2]
            nWord = letter[2:]
            if capital == True:
                nWord = nWord.capitalize()
                fChar = fChar.lower()
        # Vokal
        elif letter[0] in v:
            fChar = ""
            nWord = letter
            if capital == True:
                nWord = nWord.capitalize()
                fChar = fChar.lower()
        # qu
        elif letter[0:2] in qu:
            fChar = letter[0:2]
            nWord = letter[2:]
            if capital == True:
                nWord = nWord.capitalize()
                fChar = fChar.lower()
        # 1 Konsonant
        else:
            fChar = letter[0:1]
            nWord = letter[1:]
            if capital == True:
                nWord = nWord.capitalize()
                fChar = fChar.lower()

        result = result + nWord + "-" + fChar + "ay "

    print result

piglatin("loser")
piglatin("button")
piglatin("star")
piglatin("three")
piglatin("question")
piglatin("happy")
piglatin("eagle")
piglatin("America")
piglatin("honor")
piglatin("Pig Latin")


AUSGABE (ohne stummes-H-Regel):

Zitat:

oser-lay
utton-bay
ar-stay
ee-thray
estion-quay
appy-hay
eagle-ay
America-ay
onor-hay
Ig-pay Atin-lay

Kommentare:

ZRX88

Punkte: 2770

50 Aufgaben
45 Lösungen
10 Kommentare

#1
18.12.2016 um 22:15 Uhr
Hi,

Ich habe etwas gebraucht, bis ich den Code verstanden habe ;) ;)

Sehr spannende Lösung! Du bist ja auch jeden beschriebenen Weg durchgegangen.

Zur Lesbarkeit:
* v und k könnte man ggf. auch ausschreiben.
* result und captial vorher zu initialisieren ist wohl auch zuviel.
* Wenn du die Abfrage letter[0].isUpper() nach unten schiebst, brauchst du wohl so 20 Zeilen weniger. ( und capital auch nicht.)


post_arrow
397 0

Nachbar

Punkte: 2820

30 Aufgaben
67 Lösungen
44 Kommentare

#2
24.12.2016 um 23:45 Uhr
Hi,

vielen Dank für deinen Kommentar. Das glaube ich dir, ich bin gerad selbst kaum noch durchgestiegen :o)
Ja meine Variablen-Benennungen sind wohl öfter suboptimal.
Die "Ist-Großbuchstabe-Abfrage" nach unten zu verschieben ist genial. Da habe ich brutal überflüssigen Code produziert - aua...
Die result Variable muss ich allerdings schon initialisieren, sonst kann ich am Ende (result = result + nWord + "-" + fChar + "ay ") nicht damit arbeiten bzw. bekomme eine Fehlermeldung. Es sei denn ich habe wieder irgendwas übersehen.

Grüße vom
Nachbar

Korrigierter Code:
[Python]def piglatin(piginput):

qu = "qu", "QU"
v = "a", "e", "i", "o", "u","A", "E", "I", "O", "U"
k = "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z", "B", "C", "D", "F", "G", "H", "J", "K", \
"L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"
result = ""

pigexpression = piginput.split()

for letter in pigexpression:
# 3 Konsonanten
if letter[0] in k and letter[1] in k and letter[2] in k:
fChar = letter[0:3]
nWord = letter[3:]
# 2 Konsonanten
elif letter[0] in k and letter[1] in k:
fChar = letter[0:2]
nWord = letter[2:]
# Vokal
elif letter[0] in v:
fChar = ""
nWord = letter
# qu
elif letter[0:2] in qu:
fChar = letter[0:2]
nWord = letter[2:]
# 1 Konsonant
else:
fChar = letter[0:1]
nWord = letter[1:]

if letter[0].isupper():
nWord = nWord.capitalize()
fChar = fChar.lower()

result = result + nWord + "-" + fChar + "ay "
return result

expression = raw_input("Please enter a word: ")

print "\nPiglatin: " + piglatin(expression)[/Python]
post_arrow
398 0

Nachbar

Punkte: 2820

30 Aufgaben
67 Lösungen
44 Kommentare

#3
24.12.2016 um 23:48 Uhr
Hm neue Lösung unleserlich, letzter Versuch:

def piglatin(piginput):

qu = "qu", "QU"
v = "a", "e", "i", "o", "u","A", "E", "I", "O", "U"
k = "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z", "B", "C", "D", "F", "G", "H", "J", "K", \
"L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"
result = ""

pigexpression = piginput.split()

for letter in pigexpression:
# 3 Konsonanten
if letter[0] in k and letter[1] in k and letter[2] in k:
fChar = letter[0:3]
nWord = letter[3:]
# 2 Konsonanten
elif letter[0] in k and letter[1] in k:
fChar = letter[0:2]
nWord = letter[2:]
# Vokal
elif letter[0] in v:
fChar = ""
nWord = letter
# qu
elif letter[0:2] in qu:
fChar = letter[0:2]
nWord = letter[2:]
# 1 Konsonant
else:
fChar = letter[0:1]
nWord = letter[1:]

if letter[0].isupper():
nWord = nWord.capitalize()
fChar = fChar.lower()

result = result + nWord + "-" + fChar + "ay "
return result

expression = raw_input("Please enter a word: ")

print "\nPiglatin: " + piglatin(expression)
post_arrow
399 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben