একটি এনএফএ অনুকরণ


15

একটি ননডেটেরেমনিস্টিক সসীম অটোমেটন একটি সীমাবদ্ধ রাষ্ট্র মেশিন যেখানে একটি টিপল (state,symbol) একাধিক রাজ্যে ম্যাপ করা হয়। অর্থাৎ। আমরা স্বাভাবিক প্রতিস্থাপন δ:Q×ΣQ  একটি পরিবর্তন ফাংশন DFA তে অন্য ফাংশন Δ:Q×ΣP(Q)

এনএফএ কী তা আপনি যদি জানেন তবে আপনি পরবর্তী বিভাগটি এড়াতে চাইতে পারেন।

আনুষ্ঠানিক সংজ্ঞা

একটি এনএফএ দ্বারা অনন্যরূপে বর্ণনা করা হয়

  • রাজ্যের একটি সীমাবদ্ধ সেটQ
  • Σ প্রতীক একটি সীমাবদ্ধ সেট
  • Δ:Q×ΣP(Q) রূপান্তর ফাংশন
  • q0Q প্রারম্ভিক অবস্থায়
  • FQ চূড়ান্ত রাজ্যের একটি সেট

মেশিনটি শুরু হবে এবং প্রতীকগুলির একটি সীমাবদ্ধ স্ট্রিং পড়বে, প্রতিটি প্রতীকের জন্য এটি একই সাথে একটি বর্তমান রাষ্ট্রের সাথে রূপান্তর ফাংশন ফাংশন প্রয়োগ করবে এবং প্রতিটি নতুন সেটকে বর্তমান রাজ্যের সংস্থায় যুক্ত করবে।q0wΣ

চ্যালেঞ্জ

এই চ্যালেঞ্জের জন্য আমরা এটিকে সহজ করার জন্য ignore উপেক্ষা করব , তদুপরি বর্ণমালা সর্বদা (ছোট-ছোট) অক্ষর letters থেকে এবং রাষ্ট্রগুলির সেটটি পূর্ণসংখ্যা কিছু অ-নেগেটিভ জন্য । প্রাথমিক অবস্থা সর্বদা ।F a z {0N}N0

একটি শব্দ এবং একটি বর্ণনায় আপনার কাজটি সমস্ত চূড়ান্ত অবস্থা নির্ধারণ করে।w{az}

উদাহরণ

স্ট্রিং এবং নিম্নলিখিত বিবরণটি বিবেচনা করুন:abaab

state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]

মেশিনটি শুরু হবে :q0=0

  1. একটি read পড়ুন : নতুন স্টেটস statesa{1}
  2. একটি read পড়ুন : নতুন রাজ্যগুলি statesb{1,2}
  3. একটি read পড়ুন : নতুন স্টেটস { 0 }a{0}
  4. একটি পড়া নতুন পদ বলে: { 1 }a{1}
  5. একটি : নতুন রাজ্যগুলি { 1 , 2 }b{1,2}

সুতরাং চূড়ান্ত রাজ্যগুলি এবং এইভাবে আউটপুট হবে {1,2}

দ্রষ্টব্য: ধাপে (২) রাষ্ট্রের মানচিত্রের রূপান্তর হিসাবে বর্ণনায় কেবল খালি খালি সেটগুলিতে স্থানান্তর অন্তর্ভুক্ত রয়েছে।2

বিধি

ইনপুট একটি স্ট্রিং এবং (ছাড়া NFA বিবরণ কিছু নিয়ে গঠিত হবে -transitions):ε

  • ইনপুট স্ট্রিং সর্বদা { az } এর উপাদান হবে {একটি...z- র}*
  • বৈধ ইনপুট (সীমাবদ্ধ নয়):
    • টিপলস / তালিকার তালিকা / অ্যারে
    • নতুন লাইন পৃথক ইনপুট
  • এনএফএ-এর বর্ণনায় ফলাফল হিসাবে খালি খালি সেটগুলির সাথে কেবল স্থানান্তর থাকবে
    • যদি ফলাফল একই হয় (উদাহরণস্বরূপ নিয়ম 0,'a',[1,2]এবং 0,'b',[1,2]সংক্ষেপে সংক্ষিপ্ত হতে পারে) আপনি একই অক্ষরগুলির সাথে বিধিগুলি সংক্ষিপ্ত করতে পারেন0,"ab",[1,2]
    • আপনি প্রতিটি নিয়ম পৃথকভাবে নিতে পারেন (উদাহরণস্বরূপ নিয়ম 0,'a',[1,2]হতে পারে 0,'a',[1]এবং 0,'a',[2])
  • আপনি চাইলে আপনি বড় হাতের অক্ষর চয়ন করতে পারেন
  • আপনি ইনপুট হিসাবে রাজ্যের সংখ্যা নিতে পারেন
  • আপনি ইনপুটগুলির কোনও ধরণের ক্রম অনুমান করতে পারেন (উদাহরণস্বরূপ রাষ্ট্র বা প্রতীক অনুসারে অর্ডার)

আউটপুটটি চূড়ান্ত রাজ্যের তালিকা / সেট / নতুন-লাইন পৃথক আউটপুট ইত্যাদি হবে

  • অর্ডার কিছু যায় আসে না
  • কোনও নকল নেই (এটি একটি সেট হিসাবে)

পরীক্ষার মামলা

এই উদাহরণগুলি সেই বিন্যাসে থাকবে description word -> statesযেখানে descriptionটিপলগুলির একটি তালিকা রয়েছে (state,symbol,new-states):

[]  "x" -> []
[]  "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])]  "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])]  "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])]  "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])]  "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])]  "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])]  "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])]  "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])]  "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])]  "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])]  "abb" -> [1,2]


3
এটি আমার অটোমেটন কোর্স থেকে ভীতিজনক স্মৃতি ফিরিয়ে এনেছে।
ডন হাজার হাজার

আমরা কি প্রতিটি নতুন রাষ্ট্রের জন্য পৃথক লাইনগুলির সাথে ইনপুট নিতে পারি, উদাহরণস্বরূপ এটি কাজের উদাহরণের জন্য?
ovs

@ovs: অবশ্যই এগিয়ে যান!
5

উত্তর:


7

হাস্কেল , 66 বাইট

import Data.List
f d=foldl(\s c->nub[r|(y,r)<-d,g<-s,(g,c)==y])[0]

এটি অনলাইন চেষ্টা করুন!


আপনার দ্বারা আমদানি পরিত্রাণ পেতে পারেন nubযদি আপনি রাজ্যের অনুমান করা [Int], তারপর আপনি ব্যবহার প্রতিটি পরীক্ষা করতে পারবেন [0..]যা সসীম হল: 60 বাইট
ბიმო

@BWO সর্বাঙ্গে এই iterates Intগুলি এবং সমস্ত বর্তমান রাজ্যের উপর এবং সেইজন্য এখনও ডুপ্লিকেট রাজ্যের উৎপন্ন হয়। উদাহরণ ( পরীক্ষার উদ্দেশ্যে পরিবর্তিত [0..]হয়েছে [0..3], তবে
এটির

হ্যাঁ, আমি কী ভাবছিলাম তা নিশ্চিত না .. কিছু নয় ..
ბიმო

4

ব্র্যাচল্যাগ , 42 বাইট

,0{hẸ&t|∋₁B∋IhJ&tJ&hhC∧I∋₁C∧It∋S&hb;B,S↰}ᵘ

[স্ট্রিং, এনএফএ] হিসাবে ইনপুট যেখানে এনএফএ রাষ্ট্রীয় স্থানান্তরের একটি তালিকা [প্রাথমিক অবস্থা, চিঠি, তালিকা হিসাবে নতুন রাজ্য]

ব্যাখ্যা

,0                                              # Append 0 to the input (initial state)
  {                                      }ᵘ     # Find all unique outputs
   h                                            # if first element (string)
    Ẹ                                           #   is empty
     &t                                         #   then: return last element (current state)
       |                                        #   else:
        ∋₁B                                     #       save the state transitions in "B"
           ∋I                                   #       take one of these transitions, save in "I"
             hJ                                 #       take the initial state requirement, store in "J"
               &tJ                              #       make sure "J" is actually the current state
                  &hhC                          #       Save first char of string in C
                      ∧I∋₁C                     #       make sure the char requirement for the state transition is the current char
                           ∧It∋S                #       Make "S" equal to one of the new states
                                &hb             #       Behead the string (remove first char)
                                   ;B,S         #       Add B (the state transitions) and S (the new state)
                                       ↰        #       recur this function

এটি অনলাইন চেষ্টা করুন!


4

ব্র্যাচল্যাগ ভি 2, 31 বাইট

{b,Ȯ,Ȯ\c↔,0↔ġ₃kH&hg;Hz{∋ᵈ}ᵐtt}ᵘ

এটি অনলাইন চেষ্টা করুন! ( বা আরও জটিল উদাহরণ সহ )

ব্র্যাচল্যাগ এই ধরণের সমস্যার ক্ষেত্রে সত্যিই ভাল এবং সমস্যাগুলির ক্ষেত্রে সত্যই খারাপ যা দুটি পৃথক ইনপুট এবং একটি আউটপুট প্রয়োজন। এই প্রোগ্রামের প্রায় সবগুলিই নদীর গভীরতানির্ণয়।

ইনপুট ফর্ম্যাটটি দুটি উপাদানযুক্ত একটি তালিকা: প্রথমটি রাষ্ট্রীয় রূপান্তরগুলির তালিকা ( [oldState, symbol, newState]) এবং দ্বিতীয়টি প্রতীকগুলির তালিকা। আমি এই প্রোগ্রামটি প্রাথমিকভাবে প্রতীকগুলির জন্য অক্ষর কোডগুলি নিয়ে কাজ করার পরিকল্পনা করেছি (কারণ ব্র্যাচল্যাগের স্ট্রিং হ্যান্ডলিংটি কখনও কখনও কিছুটা অদ্ভুত হতে পারে) তবে দেখা গেছে যে অক্ষরগুলিও খুব বেশি কাজ করে (যদিও আপনাকে ইনপুট স্ট্রিংকে অক্ষরের একটি তালিকা হিসাবে লিখতে হবে, যেমনটি নয় একটি স্ট্রিং)। যদি কোনও রাষ্ট্র-প্রতীক জুটি একাধিক বিভিন্ন রাজ্যে স্থানান্তর করতে পারে তবে আপনি এটি মোকাবেলায় একাধিক ট্রানজিশন লেখেন।

ব্যাখ্যা

{b,Ȯ,Ȯ\c↔,0↔ġ₃kH&hg;Hz{∋ᵈ}ᵐtt}ᵘ
{                            }ᵘ   Find all distinct outputs that can result from:
 b                                  taking the input minus its first element,
  ,Ȯ                                appending a singleton list (i.e. an element)
    ,Ȯ                              then appending that same element again
      \                             and transposing;
       c                            then concatenating the resulting lists,
        ↔,0↔                        prepending a 0,
            ġ₃                      grouping into blocks of 3 elements
              k                       (and discarding the last, incomplete, block),
               H&                   storing that while we
                 h                  take the first input element,
                  g  z              pair a copy of it with each element of
                   ;H                 the stored value,
                      {  }ᵐ         assert that for each resulting element
                       ∋ᵈ             its first element contains the second,
                        ᵈ ᵐ           returning the list of second elements,
                            t       then taking the last element of
                           t          the last element.

প্রোগ্রামটির কিছু আংশিক সংস্করণ কী উত্পাদন করবে তা দেখে এটি অনুসরণ করা সম্ভবত সহজ easier প্রতিটি সময় নিম্নলিখিত ইনপুট ব্যবহার:

[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[97,98,97,97,98]]

আমরা এই প্রোগ্রামের কিছু উপসর্গের ফলাফলগুলি পর্যবেক্ষণ করতে পারি:

[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[97,98,97,97,98]]b,Ȯ,Ȯ
[[97,98,97,97,98],L,L]

[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[97,98,97,97,98]]b,Ȯ,Ȯ\
[[97,A,A],[98,B,B],[97,C,C],[97,D,D],[98,E,E]]

[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[97,98,97,97,98]]b,Ȯ,Ȯ\c↔,0↔
[0,97,A,A,98,B,B,97,C,C,97,D,D,98,E,E]

[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[97,98,97,97,98]]b,Ȯ,Ȯ\c↔,0↔ġ₃k
[[0,97,A],[A,98,B],[B,97,C],[C,97,D],[D,98,E]]

[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[97,98,97,97,98]]b,Ȯ,Ȯ\c↔,0↔ġ₃kH&hg;Hz
[[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[0,97,A]],
 [[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[A,98,B]],
 [[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[B,97,C]],
 [[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[C,97,D]],
 [[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[D,98,E]]]

[[[0,97,1],[1,97,0],[1,98,1],[1,98,2]],[97,98,97,97,98]]b,Ȯ,Ȯ\c↔,0↔ġ₃kH&hg;Hz{∋ᵈ}ᵐ
e.g. [[0,97,1],[1,98,1],[1,97,0],[0,97,1],[1,98,1]]

এখানে প্রথম উদাহরণের জন্য, Lপ্রাথমিকভাবে একটি অজানা উপাদান, তবে আমরা যখন এটির মাধ্যমে স্থানান্তর করি তখন \ব্র্যাচল্যাগ বুঝতে পারে যে একমাত্র সম্ভাবনাটি ইনপুটটির সমান দৈর্ঘ্য সহ একটি তালিকা। এখানে সর্বশেষ উদাহরণ হ'ল নিরপেক্ষবাদী; আমরা এনএফএ-তে ব্র্যাচল্যাজে ননডেটেরিনিজম ব্যবহার করে মডেলিং করছি।

সম্ভাব্য উন্নতি

এখানে কিছু সিনট্যাক্স, যেমন ↔,0↔এবং বিশেষত জগাখিচুড়ি H&hg;Hz{…ᵈ}ᵐমোটামুটি আঁকড়ে আছে। এটি অবলম্বন করার কোনও নিদারুণ উপায় থাকলে আমি অবাক হব না।

{∋ᵈ}ᵐএটি একেবারে সন্দেহজনক কাঠামোর নিজস্ব হ'ল - আপনি কেবল লিখতে সক্ষম হবেন বলে আশা করেছিলেন ∋ᵈᵐ- তবে এটি কোনও কারণে বিশ্লেষণ করে না।


∋ᵈᵐবিশ্লেষণ করে না কারণ এটি প্রয়োগ করা হয়েছে যে তাত্ত্বিকভাবে বহু-চরিত্রের মেটা-প্রিকেটিক নামগুলি ব্যবহার করা যেতে পারে (যদি আমরা একক-প্রতীক সম্ভাবনার বাইরে চলে যাই)। অনুশীলনে এটি বর্তমানে ব্যবহৃত হয় না।

3

পাইথন 3, 103 80 বাইট

@ বিডাব্লুওকে ধন্যবাদ

w=lambda n,f,a={0}:w(n,f[1:],{y for(x,c,y)in n if c==f[0]and{x}&a})if''<f else a

Tio

পূর্ববর্তী "মার্জিত" তালিকা অনুধাবন (103 বাইট):

def w(a,b):
    q=[0]
    for c in b:q=[j for s in q for i in a if s in i if i[1]==c for j in i[2]]
    return q

লজ্জাজনক যে পাইথন 3 এর অভাব আছে reduce.. তবে পুনরাবৃত্তি এবং আসল সেটগুলি আপনাকে এখনও 80 বাইটে নামিয়ে আনছে
ბიმო

@ বিডব্লিউও সুন্দর, ধন্যবাদ, উপরেরটি আমার নতুন প্রিয় উদাহরণটি দেখানোর জন্য পাইথন কোডটি ... এক লাইনের দৈত্য তালিকা বোধগম্যতা আমাকে তাদের চেয়ে আরও বেশি
উপভোগ

আমার মনে হয় আপনি প্রতিস্থাপন 2 বাইট সংরক্ষণ করতে পারবেন if''<fসঙ্গে if f
চ্যাস ব্রাউন

@ চাস ব্রাউন যে f টি ব্যর্থ হলে খালি স্ট্রিংয়ের মতো মিথ্যা মান হয়
কুইনটেক

আসলে, আমি যা বলছি,
এটিকে


3

আর , 81 বাইট

function(a,b,e,s)Reduce(function(A,x)unique(e[a%in%A&b==x]),el(strsplit(s,"")),0)

এটি অনলাইন চেষ্টা করুন!

সোজা উত্তর ব্যবহার করে Reduce। তিন ভেক্টর হিসেবে নিয়ম লাগে state, symbol, new-statesনামক a,b,e

বিধিগুলি পৃথক (যেমন নিয়ম 0,'a',[1,2]হল 0,'a',1এবং 0,'a',2)।



2

পরিষ্কার , 68 বাইট

Ovs এর হাস্কেল সমাধানের উপর ভিত্তি করে এটি আমার প্রাথমিক পদ্ধতির চেয়ে কিছুটা ছোট।

এখন একটি পরীক্ষার জোতা অন্তর্ভুক্ত

import StdEnv
?d=foldl(\s c=removeDup[r\\(y,r)<-d,g<-s|(g,c)==y])[0]

এটি অনলাইন চেষ্টা করুন!


1
@ বিডব্লিউও টেস্ট জোতা যুক্ত হয়েছে
Sepurous

1

কাঠকয়লা , 44 বাইট

⊞υ⁰Fη«≔υζ≔⟦⟧υFζFθ¿∧⁼§λ⁰κ⁼§λ¹ιF§λ²¿¬№υμ⊞υμ»Iυ

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

⊞υ⁰

0{0}

Fη«

ইনপুট উপর লুপ।

≔υζ

রাষ্ট্রটি অনুলিপি করুন।

≔⟦⟧υ

রাষ্ট্র পুনরায় সেট করুন।

Fζ

রাজ্যের অনুলিপি উপর লুপ।

Fθ

এনএফএ এন্ট্রিগুলি লুপ করুন।

¿∧⁼§λ⁰κ⁼§λ¹ι

যদি এন্ট্রি মেলে তবে ...

F§λ²

... নতুন রাজ্যের উপর লুপ ...

¿¬№υμ

.... যদি তারা ইতিমধ্যে তালিকায় না থাকে ...

⊞υμ»

... তাদের তালিকায় যুক্ত করুন।

Iυ

পৃথক লাইনে অন্তর্ভুক্ত আউটপুট জন্য স্ট্রিংয়ের জন্য রাজ্যের তালিকা কাস্ট করুন



1

জাপট , 31 বাইট

W=[W]c;Ê?ßUÅVVf!øW føUg)mÌc):Wâ

চেষ্টা করে দেখুন!

জ্যাপের ক্ষমতাকে আরও কিছু ইনপুট থেকে সুস্পষ্টভাবে একটি ফাংশন গঠনের দক্ষতার আরও ভাল ব্যবহার সহ 2 টি বাইট সংরক্ষণ করা হয়েছে

ব্যাখ্যা:

W=[W]c;                            Initialize the state set to [0] on the first run
       Ê?                   :Wâ    If the input is empty return the unique states; else...
             Vf!øW                 Get the transitions valid for one of the current states
                   føUg)           Of those, get the ones valid for the current character
                        mÌc)       Merge the states of the remaining transitions
         ßUÅV                      Repeat with the remaining characters as input

নতুন "ইনিশিয়াল স্টেটস" কোডটি আরও কিছু বিশদ ব্যবহার করতে পারে। W3 টিরও কম ইনপুট থাকলে জাপট 0 টি সূচনা করে, সুতরাং প্রথম রানটি [W]হয় [0]এবং cএকটি অ্যারে "সমতল" করে। [0]এটি ইতিমধ্যে সমতল হিসাবে এটি, তাই এটি পরিবর্তন করা হয় না। পরবর্তী সময়ে রানগুলির Wএকটি আলাদা মান থাকে, উদাহরণস্বরূপ [1,2]। যে ক্ষেত্রে [W]হয়ে [[1,2]], একটি একক-উপাদানের বিন্যাস যেখানে যে উপাদান একটি অ্যারে। এবার cসেটি আন-আপ করে আবার ফিরে আসে [1,2]। সুতরাং, প্রথম W=[0]রানেই এটি এবং পরবর্তী রানগুলিও এটি W=W

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.