Python :: Aufgabe #352 :: Lösung #4

5 Lösungen Lösungen öffentlich
#352

Binärzahl enthält maximal eine Folge von Einsen

Anfänger - Python von JKooP - 23.04.2021 um 15:37 Uhr
Eine als String (Text) dargestellte Binärzahl (0 und 1) soll dahingehend geprüft werden,
ob sie maximal eine Folge von Einsen enthält. Die Länge der Folge ist beliebig.
Dabei kann die Binärzahl auch vorangestellte Nullen enthalten.

Beispiele:
b = "1100"
Lösung: wahr => 1100 (1 Folge)

b = "1010"
Lösung: falsch => 1010 (2 Folgen)

b = "00111000"
Lösung: wahr => 00111000 (1 Folge)

b = "10000001"
Lösung: falsch => 10000001 (2 Folgen)

Schreibe eine Methode/Funktion, die für obige Aufgabenstellung als Ergebnis true/false liefert.

Viel Spaß
#4
vote_ok
von nitnat (670 Punkte) - 07.05.2021 um 21:04 Uhr
Quellcode ausblenden Python-Code
# Die Aufgabenstellung erinnerte mich sofort an klassische deterministische endliche Automaten.
# Daher habe ich hier für diese Aufgabe einen etwas ungewöhnlichen Lösungsweg gewählt.
# Die Klasse DFA implementiert ein Modell für beliebige deterministische endliche Automaten.
# Die Spezifizierung erfolgt durch das 5-Tupel Zustände (list), Alphabet (list),
# Übergangsfunktion als Tabelle (2d list), Startzustand (str) und akzeptierende Endzustände (list).

# Eine graphische Darstellung des Automaten für die konkrete Aufgabenstellung habe ich als Anhang beigefügt.


# Deterministic Finite Automaton
class DFA:
    def __init__(self, S, A, d, s0, F):
        self.states = S
        self.alphabet = A
        self.transition_table = d
        self.start_state = s0
        self.final_states = F

    def delta(self, state, word):
        return self.transition_table[self.states.index(state)][self.alphabet.index(word)]

    def delta_circumflex(self, state, word_list):
        if not word_list:
            return state
        else:
            return self.delta(self.delta_circumflex(state, word_list[:-1]), word_list[-1])

    def run(self, words):
        return self.delta_circumflex(self.start_state, [word for word in words]) in self.final_states


# automaton to solve the problem
states = ["s0", "s1", "s2", "s3"]
alphabet = ["0", "1"]
transition_table = [["s0", "s1"],
                     ["s2", "s1"],
                     ["s2", "s3"],
                     ["s3", "s3"]]
start_state = "s0"
final_states = ["s1", "s2"]


# Test

automaton = DFA(states, alphabet, transition_table, start_state, final_states)

test_data = ["1100", "1010", "00111000", "10000001"]

for element in test_data:
    print(automaton.run(element))

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben