मान लीजिए कि हमारे पास एक सरणी n है जो किसी भी संख्या के द्विआधारी प्रतिनिधित्व का प्रतिनिधित्व करती है। हमें यह जांचना है कि नियतात्मक परिमित ऑटोमेटा डीएफए का उपयोग करके इसका द्विआधारी प्रतिनिधित्व तीन से विभाज्य है या नहीं।
इसलिए, यदि इनपुट n =[1, 1, 0, 0] (12 का बाइनरी) जैसा है, तो आउटपुट ट्रू होगा।
इसे हल करने के लिए, हम नीचे की तरह DFA का निर्माण कर सकते हैं -
विधि सरल है जब कोई संख्या 3 से विभाज्य होती है तो शेषफल 0 होगा, यदि नहीं तो शेष 1 या 2 होगा। इन तीन शेषफलों के लिए तीन अवस्थाएँ हैं। प्रारंभिक अवस्था भी अंतिम अवस्था होती है क्योंकि जब शेषफल 0 होता है तो इसका अर्थ है कि संख्या विभाज्य है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- dfa_state :=0
- i के लिए 0 से लेकर अंकों के आकार -1 तक के लिए
- अंक:=अंक[i]
- यदि dfa_state 0 है, तो
- यदि अंक 1 के समान है, तो
- dfa_state :=1
- यदि अंक 1 के समान है, तो
- अन्यथा जब dfa_state 1 है, तो
- यदि अंक 0 के समान है, तो
- dfa_state :=2
- अन्यथा,
- dfa_state :=0
- यदि अंक 0 के समान है, तो
- अन्यथा जब dfa_state 2 है, तब
- यदि अंक 0 के समान है, तो
- dfa_state :=1
- यदि अंक 0 के समान है, तो
- यदि dfa_state 0 है, तो
- सही लौटें
- झूठी वापसी
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
def solve(nums): dfa_state = 0 for i in range(len(nums)): digit = nums[i] if dfa_state == 0: if digit == 1: dfa_state = 1 elif dfa_state == 1: if digit == 0: dfa_state = 2 else: dfa_state = 0 elif dfa_state == 2: if digit == 0: dfa_state = 1 if dfa_state == 0: return True return False n = [1, 1, 0, 0] print(solve(n))
इनपुट
[1, 1, 0, 0]
आउटपुट
True