একটি লজিক সিস্টেম ঠিক করা


16

আপনাকে লজিক স্টেটমেন্টগুলির একটি সেট দেওয়া হয়েছে। আপনার চ্যালেঞ্জটি হ'ল অন্যকে বিরোধী যে কোনও একটি অপসারণ করা, তবে অনুকূল উপায়ে (অর্থাত্ ন্যূনতম সংখ্যার বিবৃতি অপসারণ)।

চ্যালেঞ্জ

আপনি এমন একটি প্রোগ্রাম বা একটি ফাংশন লিখবেন যা ইনপুট হিসাবে বিবৃতিগুলির তালিকা নেয়, ন্যূনতম সংখ্যার বিবৃতি সরিয়ে দেয় যে কোনও সমাধান রয়েছে এবং বাকী অংশগুলি আউটপুট করে।

যুক্তিবিদ্যা

বিবৃতিগুলির মধ্যে ভেরিয়েবল A-Z এবং অপারেটর থাকে।

5 জন অপারেটর রয়েছে : -(না), v(বা), ^(এবং), ->(যদি) এবং <->(আইএফএফ)।

সঠিক তালিকা:

A | B | -A | AvB | A^B | A->B | A<->B
0 | 0 |  1 |  0  |  0  |   1  |   1
0 | 1 |  1 |  1  |  0  |   1  |   0
1 | 0 |  0 |  1  |  0  |   0  |   0
1 | 1 |  0 |  1  |  1  |   1  |   1

এই অপারেটরগুলি প্রথম বন্ধনের সাথে একত্রিত হতে পারে ():

A | B | -(AvB) | Av(-A) | A^(-A) | (AvB)->(-B)
0 | 0 |    1   |    1   |    0   |      1
0 | 1 |    0   |    1   |    0   |      0
1 | 0 |    0   |    1   |    0   |      1
1 | 1 |    0   |    1   |    0   |      0

লজিক সিস্টেমগুলি 1 বা আরও বেশি বিবৃতি নিয়ে গঠিত ।

একটি সমাধান করার জন্য যুক্তিবিজ্ঞান সিস্টেম একটি রাষ্ট্র যেখানে সব বিবৃতি একযোগে সত্য।

লজিক সিস্টেমগুলির উদাহরণ:

AvB
-(A<->B)
(AvB)->(-B)

শুধুমাত্র সমাধান হল A = 1, B = 0

A^B
-(B<->A)

এটির কোনও সমাধান নেই ; কোন সমন্বয় Aএবং Bউভয় বিবৃতি সত্য।

ইনপুট

আপনি ইনপুট হিসাবে বিবৃতি একটি সেট পাবেন । এটি STDIN বা ফাংশন আর্গুমেন্টগুলির মাধ্যমে নেওয়া যেতে পারে, অ্যারে হিসাবে ফর্ম্যাট করা (সুবিধাজনক বিন্যাসে) অথবা একটি নতুন লাইন দ্বারা পৃথক করা বা স্থান-পৃথক স্ট্রিং।

বিবৃতিগুলি নিম্নলিখিত ফর্মের হবে ( প্রায়- এবিএনএফ ):

statement        = variable / operation
operation        = not-operation / binary-operation
not-operation    = "-" operand
binary-operation = operand binary-operator operand
operand          = variable / "(" operation ")"
variable         = "A"-"Z"
binary-operator  = "v" / "^" / "->" / "<->"

উদাহরণ বিবৃতি:

A
Av(-B)
(A<->(Q^C))v((-B)vH)

আউটপুট

আপনি অবশ্যই (সম্ভবত) হ্রাসিত বিবৃতিগুলির সেটটি ফিরে পেয়েছেন, যা সেগুলি পেয়েছে ঠিক সেই আকারে। আবার, তালিকাটি স্ট্রিংগুলির একটি অ্যারে বা একটি নিউলাইন-বিচ্ছিন্ন বা স্থান-পৃথক স্ট্রিং হিসাবে ফর্ম্যাট করা যেতে পারে।

বিধি

  • আপনার সর্বদা সর্বনিম্ন সংখ্যার বিবৃতি অপসারণ করা উচিত। যদি একাধিক সম্ভাব্য সমাধান হয় তবে তার মধ্যে একটি আউটপুট নিন।
  • আপনি ধরে নিতে পারেন ইনপুটটিতে সর্বদা কমপক্ষে 1 টি স্টেটমেন্ট থাকে এবং ইনপুটটিতে কোনও বিবৃতি পুনরাবৃত্তি হয় না।
  • আপনি ধরে নিতে পারেন না যে আউটপুটটিতে সর্বদা একটি বিবৃতি থাকে। (উদাহরণ দেখুন)
  • আপনার উত্তরটি বৈধ হওয়ার সাথে মানক লুফোলগুলি ব্যবহার করে এবং এর মধ্যে একটি অপসারণ করতে হবে।
  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর ins

উদাহরণ

ইনপুট:

A^(-A)

আউটপুট:

(nothing)

ইনপুট:

A^B A<->(-B) A<->B

আউটপুট:

A^B A<->B

ইনপুট:

["AvB","A^B"]

আউটপুট:

["AvB","A^B"]

3
এটি প্রাসঙ্গিক কিনা আমি জানি না, তবে এই সমস্যাটি সর্বাধিক সেট প্যাকিংয়ে নেমে আসে যা এনপি-সম্পূর্ণ।
লিফ উইলার্টস

আপনার ব্যাকরণ অনুসারে, উদাহরণের তৃতীয় বিবৃতিটি সঠিক নয় ( (AvB)->-Bহওয়া উচিত (AvB)->(-B))
গর্বিত হাসেলেলার

ধন্যবাদ
পূর্কাকুডারী

এছাড়াও, মধ্যে বন্ধনীগুলি A<->(Q^C))v((-B)vHহ'ল মশকযুক্ত।
গর্বিত হাসেলেলার

পুনঃটুইট
পূর্কাকাডারী

উত্তর:


3

রুবি, 299 298 283 279 বাইট

class Object;def * o;!self|o;end;def s;w=join.gsub(/\W/,"").chars.uniq;n=w.size;(0..2**n).any?{|i|n.times{|j|eval(w[j]+"=#{i[j]>0}")};all?{|e|eval([%w[<-> ==],%w[-> *],%w[- !],%w[^ &],%w[v |]].inject(e){|x,i|x.gsub(*i)})}}?self:combination(size-1).map(&:s).max_by(&:size);end;end
  • অভিব্যক্তিগুলির একটি অ্যারের প্রত্যাশা করে।
  • আপনি যদি এটি চালাচ্ছেন, তবে রুবির অভ্যন্তর থেকে ER VERBOSE = শিল সেট করুন যাতে আপনার ধ্রুবকগুলি পুনরায় সংজ্ঞা দেওয়ার বিষয়ে প্রচুর সতর্কতা না পান।
  • নোট করুন যে এটি আসলে ভেরিয়েবলটি "v" সেট করে তবে এটি কোনও পার্থক্য করে না।
  • সত্য মানগুলি ব্যবহার করে কারণ তাদের ইতিমধ্যে আবশ্যক সমস্ত অপারেটর রয়েছে। দুর্ভাগ্যক্রমে রুবির বুলিয়ান ক্লাস নেই তাই জড়িত থাকতে আমাদের বানর-প্যাচ অবজেক্টটি করতে হবে :)
  • এটি কেবল ছোট করে তুলতে পারত যদি আমরা কেবল সমস্ত বড় আকারের ভেরিয়েবলগুলি সেট করি তবে এটি চালাতে প্রচুর পরিমাণ সময় লাগবে। এই সম্পর্কে সম্ভবত একটি সতর্কতা থাকা উচিত।

Ungolfed:

class Object
  def * o 
    !self|o
  end 
end

def sat? exs 
  #exs: an array of expressions
  s=[%w[<-> ==], %w[-> *], "-!", "^&", %w[v ||]]

  w=exs.join.gsub(/\W/,"").chars.uniq #variable names
  n=w.size
  if (0...2**n).any? {|i|
    n.times do |vi|
      eval("#{w[vi]}=#{i[vi]==1}")
    end 
    exs.all?{|ex|eval(s.inject(ex){|x,i|x.gsub(i[0],i[1])})}
  }
    exs
  else
    exs.combination(exs.size-1).map{|sm|sat?(sm)}.max_by(&:size)
  end
end

5

পাইথন 3, 431 বাইট

এখনই খুব গল্ফ হয়নি, তবে আমি অনুমান করছি যে আমি উত্তর দিয়ে বলটি ঘূর্ণায়মান করব। এখানে চেষ্টা করুন , g()প্রধান কাজ।

import re,itertools as H
def g(i):
 y=re.sub(r'\W','',''.join(set(i)).upper());l=i.split()
 def e(s):
  def f(a):
   for v,w in a:exec(v+'='+w)
   return eval(re.sub('[^A-Z()]+',lambda x:{'v':' or ','^':'*','<->':'==','->':'<=','-':'not '}[x.group()],s))
  return[c for c in H.product("01",repeat=len(y))if f(zip(y,c))]
 for n in range(len(l),-1,-1):
  for q in H.combinations(l,n):
   if e('('+')^('.join(q)+')'):return' '.join(q)

খুব ঠান্ডা. আমি এটি 428-এ নামিয়েছি
PurkkaKoodari

আপনি যেভাবে সত্যের মানকে মডেলিং করছেন তাতে সমস্যা আছে is উদাহরণস্বরূপ, g ("A (AvA) <-> A") এর ইনপুটটি ফিরিয়ে দেওয়া উচিত, তবে এটি কাজ করে না কারণ যদি A = 1 হয়, তবে আভা = 2।
ইব্রাহিম টেন্সার

আহা, আপনি ঠিক বলেছেন, এটি উল্লেখ করার জন্য ধন্যবাদ। এখনই এটিকে "এবং" এ ফিরিয়ে দেওয়া হয়েছে যেহেতু আমি তাদের তুলনা করার আরও ছোট পদ্ধতির কথা ভাবতে পারি নি। গল্ফ পরিবর্তনগুলি Pietu জন্য ধন্যবাদ!
TheMadHaberdasher

আমি বিশ্বাস করি vঅর্থাৎ or
পুর্কাকুডারী

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