From 42c24d6f3c17869f69dbb1f70162f3d61a65cd7b Mon Sep 17 00:00:00 2001 From: reniz-shah Date: Wed, 7 Aug 2024 17:52:07 +0530 Subject: [PATCH] resolve comments which is create enum for states and char types extract state machine outside function --- strings/string_is_valid_number.py | 84 ++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/strings/string_is_valid_number.py b/strings/string_is_valid_number.py index d9d4bfa8e..9e2ac663f 100644 --- a/strings/string_is_valid_number.py +++ b/strings/string_is_valid_number.py @@ -6,6 +6,82 @@ Input: s = -90E3 Output: True Leetcode link: https://leetcode.com/problems/valid-number/description/ """ +from enum import Enum +from typing import Dict + +class CharType(Enum): + NUMERIC = 'NUMERIC' + SIGN = 'SIGN' + EXPONENT = 'EXPONENT' + DECIMAL = 'DECIMAL' + +class State(Enum): + INITIAL = 'INITIAL' + SIGNED = 'SIGNED' + WHOLE = 'WHOLE' + FRACTIONAL = 'FRACTIONAL' + FRACTION = 'FRACTION' + EXPONENTIAL = 'EXPONENTIAL' + EXP_SIGN = 'EXP_SIGN' + EXP_NUMBER = 'EXP_NUMBER' + +state_machine : Dict[State, Dict[CharType, State]] = { + State.INITIAL: {CharType.NUMERIC: State.WHOLE, CharType.SIGN: State.SIGNED, CharType.DECIMAL: State.FRACTIONAL}, + State.SIGNED: {CharType.NUMERIC: State.WHOLE, CharType.DECIMAL: State.FRACTIONAL}, + State.WHOLE: {CharType.NUMERIC: State.WHOLE, CharType.DECIMAL: State.FRACTION, CharType.EXPONENT: State.EXPONENTIAL}, + State.FRACTIONAL: {CharType.NUMERIC: State.FRACTION}, + State.FRACTION: {CharType.NUMERIC: State.FRACTION, CharType.EXPONENT: State.EXPONENTIAL}, + State.EXPONENTIAL: {CharType.NUMERIC: State.EXP_NUMBER, CharType.SIGN: State.EXP_SIGN}, + State.EXP_SIGN: {CharType.NUMERIC: State.EXP_NUMBER}, + State.EXP_NUMBER: {CharType.NUMERIC: State.EXP_NUMBER}, +} + +from enum import Enum +from typing import Dict + + +class CharType(Enum): + NUMERIC = "NUMERIC" + SIGN = "SIGN" + EXPONENT = "EXPONENT" + DECIMAL = "DECIMAL" + + +class State(Enum): + INITIAL = "INITIAL" + SIGNED = "SIGNED" + WHOLE = "WHOLE" + FRACTIONAL = "FRACTIONAL" + FRACTION = "FRACTION" + EXPONENTIAL = "EXPONENTIAL" + EXP_SIGN = "EXP_SIGN" + EXP_NUMBER = "EXP_NUMBER" + + +state_machine: Dict[State, Dict[CharType, State]] = { + State.INITIAL: { + CharType.NUMERIC: State.WHOLE, + CharType.SIGN: State.SIGNED, + CharType.DECIMAL: State.FRACTIONAL, + }, + State.SIGNED: {CharType.NUMERIC: State.WHOLE, CharType.DECIMAL: State.FRACTIONAL}, + State.WHOLE: { + CharType.NUMERIC: State.WHOLE, + CharType.DECIMAL: State.FRACTION, + CharType.EXPONENT: State.EXPONENTIAL, + }, + State.FRACTIONAL: {CharType.NUMERIC: State.FRACTION}, + State.FRACTION: { + CharType.NUMERIC: State.FRACTION, + CharType.EXPONENT: State.EXPONENTIAL, + }, + State.EXPONENTIAL: { + CharType.NUMERIC: State.EXP_NUMBER, + CharType.SIGN: State.EXP_SIGN, + }, + State.EXP_SIGN: {CharType.NUMERIC: State.EXP_NUMBER}, + State.EXP_NUMBER: {CharType.NUMERIC: State.EXP_NUMBER}, +} from enum import Enum from typing import Dict @@ -78,12 +154,8 @@ def classify_char(char: str) -> CharType | None: >>> classify_char('e') >>> classify_char('.') - - >>> classify_char('') - - >>> classify_char('0') - - >>> classify_char('01') + 'decimal' + >>> classify_char('r') """ if len(char) != 1: