Buchstaben aufgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
__blackjack__
User
Beiträge: 14050
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@henni31162: Das sieht aber nicht nach Python aus, sondern eher nach C oder einer ähnlichen Programmiersprache in Python-Syntax.

Die Zeichen als Zahlen/Codepoints zu handhaben ist ziemlich ”magisch” und schlecht lesbar, und damit IMHO ”unpythonisch”.

Wenn man korrekterweise ``and`` statt ``&`` verwendet, spart das nicht nur Tests weil ``&`` *immer* beide Seiten auswerten muss, sondern man braucht auch die klammern nicht, weil der ``and``-Operator deutlich weniger stark bindet als ``&``.

Da im ``if`` und im ``elif`` das gleiche gemacht wird, kann man das in *einer* Bedingung zusammenfassen.

Wenn bei einem ``if``/``else`` in einem der Zweige ein ``pass`` steht, hat man was falsch gemacht.

Könnte dann so aussehen:

Code: Alles auswählen

#!/usr/bin/env python3
from string import ascii_lowercase as ALPHABET

VOKALBUCHSTABEN = "aeiou"
assert all(v in ALPHABET for v in VOKALBUCHSTABEN)


def main():
    anzahl = 0
    for b_1 in ALPHABET:
        for b_2 in ALPHABET:
            for b_3 in ALPHABET:
                for b_4 in ALPHABET:
                    if not (
                        (b_1 == b_2 == b_3 and b_1 not in VOKALBUCHSTABEN)
                        or (b_2 == b_3 == b_4 and b_2 not in VOKALBUCHSTABEN)
                    ):
                        anzahl += 1
                        print(f"{anzahl}: {b_1}{b_2}{b_3}{b_4}")


if __name__ == "__main__":
    main()
Löst aber wie __deets__ bemerkte nicht die Aufgabenstellung.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
henni31162
User
Beiträge: 3
Registriert: Montag 4. November 2019, 11:18

__deets__ hat geschrieben: Montag 4. November 2019, 14:00 In Python verknuepft man mit "and", nicht mit dem bitweisen "&". Und ich sehe jetzt nicht, dass die Aufgabenstellung erfuellt ist. Denn du pruefst nur, dass die drei Zeichen *gleich* und Konsonanten sind. Die muesstest du anpassen, damit sie prueft, ob alle drei fraglichen Indizes Vokale sind. Die Beobachtung, dass es nur zwei Positionen fuer das Auftreten geben kann ist aber ein wichtiger Schritt 👍
Hallo __deets__,

ok, das mit "and" ist klar, danke für den Hinweis :-)

Aber die Aufgabenstellung war doch, dass keine 3 Konsonanten hintereinander vorkommen dürfen, nicht 3 Vokale.

@__blackjack__: danke für die nützlichen Hinweise! Ja, ich komme ursprünglich aus der C-Entwicklung ;-)
Kommt ein Suchmaschinenoptimierer in eine Bar, Kneipe, Spelunke, Wirtshaus, Gaststätte, Schänke, Bierstube…
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe mich verschrieben und meinte Konsonanten. Das entscheidende ist das du nur auf zb kkk oder lll etc prüfst. Es darf aber auch nicht klm oder pst sein.
henni31162
User
Beiträge: 3
Registriert: Montag 4. November 2019, 11:18

ahhhh, jetzt habe ich die Aufgabe verstanden :wink:
Kommt ein Suchmaschinenoptimierer in eine Bar, Kneipe, Spelunke, Wirtshaus, Gaststätte, Schänke, Bierstube…
Benutzeravatar
__blackjack__
User
Beiträge: 14050
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python3
import re
from itertools import filterfalse, product
from string import ascii_lowercase

ALPHABET = ascii_lowercase + "ß"
VOWELS = "aeiouy"
CONSONANTS = "".join(letter for letter in ALPHABET if letter not in VOWELS)

WORD_LENGTH = 4
MAX_CONSONANT_RUN_LENGTH = 3

contains_consonant_run = re.compile(
    "[{}]{{{}}}".format(re.escape(CONSONANTS), MAX_CONSONANT_RUN_LENGTH)
).search

assert len(VOWELS) + len(CONSONANTS) == len(ALPHABET)
assert WORD_LENGTH > 0 and MAX_CONSONANT_RUN_LENGTH < WORD_LENGTH


def main():
    all_words = map("".join, product(ALPHABET, repeat=WORD_LENGTH))
    for word in filterfalse(contains_consonant_run, all_words):
        print(word)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hatte vor 3 Wochen diese Lösung im Sinn:

Code: Alles auswählen

from itertools import product
from string import ascii_lowercase

esszet_lowercase = ascii_lowercase + "ß"

def four_letter_words():
    letters = set(esszet_lowercase).difference(set("aeiouy"))
    return ["".join(characters) for characters in product(esszet_lowercase, repeat=4) 
            if not all(characters[i] in letters for i in range(3)) and not all(characters[i] in letters for i in range(1,4))]

print(len(four_letter_words()))
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten