3 দ্বারা বিভাজনের জন্য বিল্ডিং সার্কিট


12

টিসিএসের একটি বুলিয়ান সার্কিটটি মূলত অ্যান্ড, বা, গেটস নয় এমন একটি ডিএজি থাকে এবং যা জানা যায় তার দ্বারা "কার্যকরী সম্পূর্ণতা" তারা সমস্ত সম্ভাব্য ফাংশন গণনা করতে পারে। যেমন এটি একটি ALU এর মূল নীতি ।

চ্যালেঞ্জ: 8-বাইনারি-অঙ্কের সংখ্যাটি 3 দ্বারা বিভাজ্য কিনা তা নির্ধারণ করার জন্য একটি সার্কিট তৈরি করুন এবং কোনওভাবে আপনার ফলাফলটি কল্পনা করুন (অর্থাত কোনও ধরণের ছবিতে)

ভোটারদের জন্য বিচার মানদণ্ড কোড বর্তনী উৎপন্ন করা হবে কিনা তা উপর ভিত্তি করে তৈরি সাধারণীকরণ নির্বিচারে আকার নম্বরে চমত্কারভাবে, এবং আলগোরিদিমিক্যালি-নির্মিত ঠাহর কম্প্যাক্ট / সুষম কিন্তু এখনো এখনও পাঠযোগ্য কিনা (যেমন হাত ব্যবস্থা দ্বারা ঠাহর অনুমোদিত নয়)। অর্থাত্ ভিজুয়ালাইজেশন কেবলমাত্র এন = 8 এর জন্য তবে কোডটি আদর্শভাবে সমস্ত 'এন' এর জন্য কাজ করবে। বিজয়ী এন্ট্রি শুধুমাত্র শীর্ষে ভোট দেওয়া হয়।

কিছুটা অনুরূপ প্রশ্ন: ন্যানড লজিক গেটগুলি ব্যবহার করে একটি গুণক যন্ত্র তৈরি করুন


2
অনেক ভাল. তবে "জেনারালাইজেশন" এবং "নান্দনিক" উদ্দেশ্যগত নয়। সমস্ত প্রশ্নের অবশ্যই একটি উদ্দেশ্যমূলক বিজয়ী মানদণ্ড থাকতে হবে। আপনি যদি এই বৈশিষ্ট্যগুলি প্রয়োগ করতে চান তবে জনপ্রিয়তা-প্রতিযোগিতাটি ব্যবহার করুন। আপনি যদি সংক্ষিপ্ততম কোড চান, কোড-গল্ফ ব্যবহার করুন। আপনি যদি দুটিয়ের সমন্বয় করতে চান তবে কোড-চ্যালেঞ্জ ব্যবহার করুন তবে একটি সূত্র নির্দিষ্ট করুন। উদাহরণস্বরূপ 1.25 * ভোট - 0.25 * দৈর্ঘ্য যেমন এই প্রশ্নটি করে: কোডগলফ.স্ট্যাকেক্সচেঞ্জ
স্তর নদী সেন্ট

ঠিক আছে আপনার জন্য অনুরোধ করা chg। মতামত জন্য THX।
vzn

ওহ, আমি অনুমান করি যে ভিএইচডিএল বা ভেরিলোগ সংকলিত এর সমস্ত অপ্টিমাইজেশনের পরে সবচেয়ে সংক্ষিপ্ত উত্তর দেওয়া উচিত। আমি পরে এটি চেষ্টা করব।
কিরিল কুলাভক

1
আরও ভাল জয়ের মানদণ্ড
হ'ল

@ডাক্তার ??? কি gate-golf? যে ট্যাগ অস্তিত্বহীন। অংশগ্রহণকারীদের জন্য নোট করুন: আপনি কোন ভাষা / চাক্ষুষ সরঞ্জাম ব্যবহার করছেন তা দয়া করে লিখুন। অন্য কেউ যদি plz মন্তব্য প্রবেশ করতে চান। অন্যথায় বিজয়ী টোনাইট গ্রহণ করবে। এখন পর্যন্ত উত্তরদাতাদের কাছে এটি অনেকটা "বিটিই" প্রত্যাশার চেয়ে ভাল হয়েছে!
vzn

উত্তর:


7

সার্কিট 3 গণনা মডুলো 3

গ্রাফ প্রতিটি স্তরে 3 বুলিয়ান বজায় রাখে i। তারা এই সত্যটি উপস্থাপন করে যে সংখ্যার হাই-অর্ডার i বিটগুলি 0, 1, বা 2 মড 3 এর সমান each

এখানে পাইথন কোড যা গ্রাফটি উত্পন্ন করেছিল। বিট সংখ্যক বিট পেতে কেবল এন পরিবর্তন করুন, বা কে আলাদা মডিউল পেতে পারেন। মাধ্যমে পাইথন প্রোগ্রামের আউটপুট চালান ডট ইমেজ তৈরি করতে।

N = 8
K = 3
v = ['0']*(K-1) + ['1']
ops = {}

ops['0'] = ['0']
ops['1'] = ['1']
v = ['0']*(K-1) + ['1']
for i in xrange(N):
  ops['bit%d'%i] = ['bit%d'%i]
  ops['not%d'%i] = ['not','bit%d'%i]
  for j in xrange(K):
    ops['a%d_%d'%(i,j)] = ['and','not%d'%i,v[(2*j)%K]]
    ops['b%d_%d'%(i,j)] = ['and','bit%d'%i,v[(2*j+1)%K]]
    ops['o%d_%d'%(i,j)] = ['or','a%d_%d'%(i,j),'b%d_%d'%(i,j)]
  v = ['o%d_%d'%(i,j) for j in xrange(K)]

for i in xrange(4):
  for n,op in ops.items():
    for j,a in enumerate(op[1:]):
      if ops[a][0]=='and' and ops[a][1]=='0': op[j+1]='0'
      if ops[a][0]=='and' and ops[a][2]=='0': op[j+1]='0'
      if ops[a][0]=='and' and ops[a][1]=='1': op[j+1]=ops[a][2]
      if ops[a][0]=='and' and ops[a][2]=='1': op[j+1]=ops[a][1]
      if ops[a][0]=='or' and ops[a][1]=='0': op[j+1]=ops[a][2]
      if ops[a][0]=='or' and ops[a][2]=='0': op[j+1]=ops[a][1]

for i in xrange(4):
  used = set(['o%d_0'%(N-1)])|set(a for n,op in ops.items() for a in op[1:])
  for n,op in ops.items():
    if n not in used: del ops[n]

print 'digraph {'
for n,op in ops.items():
  if op[0]=='and': print '%s [shape=invhouse]' % n
  if op[0]=='or': print '%s [shape=circle]' % n
  if op[0]=='not': print '%s [shape=invtriangle]' % n
  if op[0].startswith('bit'): print '%s [color=red]' % n
  print '%s [label=%s]' % (n,op[0])
  for a in op[1:]: print '%s -> %s' % (a,n)
print '}'

মহান! গ্রাফভিজও ব্যবহারকরেছেন ... ক্ষুদ্র কোয়েবল , ডায়াগ্রামে অব্যবহৃত ANDs / OR রয়েছে। এছাড়াও তাদের অবস্থানগুলি দেখানোর জন্য বিভিন্ন রঙে ইনপুট বিটগুলি হাইলাইট করার পরামর্শ দেয়
vzn

@ ভিজেএন: ঠিক আছে, ঠিক আছে।
কিথ র্যান্ডাল

12

গভীরতা: 7 (লোগারিদমিক), 18x এবং, 6 এক্স বা 7x এক্সওআর, 31 গেট (লিনিয়ার)

আমি বেস চারটি, তিনটি মডুলোর অঙ্কের অঙ্ক গণনা করি:

স্পষ্টভাবে দৃশ্যমান শ্রেণিবদ্ধ কাঠামো সহ 7-স্তর সার্কিট

লকিসিমে সার্কিট আঁকা

সাধারণীকরণ, আনুষ্ঠানিকভাবে (আশা করি কিছুটা পাঠযোগ্য):

balance (l, h) = {
  is1: l & not h,
  is2: h & not l,
}

add (a, b) = 
  let aa = balance (a.l, a.h)
      bb = balance (b.l, b.h)
  in  { l:(a.is2 & b.is2) | (a.is1 ^ b.is1),
        h:(a.is1 & b.is1) | (a.is2 ^ b.is2)}

pairs [] = []
pairs [a] = [{h:0, l:a}]
pairs [rest.., a, b] = [pairs(rest..).., {h:a, l:b}]

mod3 [p] = p
mod3 [rest.., p1, p2] = [add(p1, p2), rest..]

divisible3 number =
  let {l: l, h: h} = mod3 $ pairs number
  in  l == h

এখন ইংরেজিতে:

সংখ্যায় দুটিরও বেশি বিট থাকা অবস্থায়, দুটি সর্বনিম্ন জোড়া বিট নিন এবং তাদের মডুলো 3 যোগ করুন, তারপরে ফলাফলটি সংখ্যার পিছনে যুক্ত করুন, তারপরে শেষ জোড়টি শূন্য মডুলো 3 হলে ফিরে আসুন If যদি কোনও বিজোড় থাকে সংখ্যায় বিটের সংখ্যা, শীর্ষে একটি অতিরিক্ত শূন্য বিট যুক্ত করুন, তারপরে ধ্রুবক মান প্রচারের মাধ্যমে পোলিশ করুন।

সামনের দিকে না গিয়ে পিছনে যুক্ত করা নিশ্চিত করে যে সংযোজন তালিকার চেয়ে যুক্ত গাছ একটি ভারসাম্যযুক্ত গাছ। ফলস্বরূপ, এটি বিটের সংখ্যায় লোগারিথমিক গভীরতা নিশ্চিত করে: পাঁচটি গেট এবং জোড় বাতিলের জন্য তিনটি স্তর এবং শেষে একটি অতিরিক্ত গেট।

অবশ্যই, যদি আনুমানিক পরিকল্পনাটি পছন্দসই হয় তবে উপরের জোড়টি সামনের অংশে মোড়কের পরিবর্তে পরবর্তী স্তরটিতে অশোধিত পাস করুন। এটি প্রয়োগ করা (এমনকি সিউডোকোডে) তুলনায় আরও সহজ। যদি কোনও সংখ্যার বিটের সংখ্যা দুটি হ'ল (মার্চ ২০১৪ সালের মতো কোনও আধুনিক কম্পিউটার সিস্টেমে সত্য) তবে কোনও একাকী জোড় দেখা যাবে না।

যদি লেআউটরটি লোকালটি সংরক্ষণ করে / রুটের দৈর্ঘ্য হ্রাস করতে পারে, তবে এটি সার্কিটটিকে পাঠযোগ্য।

এই রুবি কোডটি বিট সংখ্যক (এমনকি একটি) এর জন্য একটি সার্কিট ডায়াগ্রাম তৈরি করবে। মুদ্রণ করতে, লগিসিম এ খুলুন এবং চিত্র হিসাবে রফতানি করুন:

require "nokogiri"

Port = Struct.new :x, :y, :out
Gate = Struct.new :x, :y, :name, :attrs
Wire = Struct.new :sx, :sy, :tx, :ty

puts "Please choose the number of bits: "
bits = gets.to_i

$ports = (1..bits).map {|x| Port.new 60*x, 40, false};
$wires = [];
$gates = [];

toMerge = $ports.reverse;

def balance a, b
y = [a.y, b.y].max
$wires.push Wire.new(a.x   , a.y , a.x   , y+20),
          Wire.new(a.x   , y+20, a.x   , y+40),
          Wire.new(a.x   , y+20, b.x-20, y+20),
          Wire.new(b.x-20, y+20, b.x-20, y+30),
          Wire.new(b.x   , b.y , b.x   , y+10),
          Wire.new(b.x   , y+10, b.x   , y+40),
          Wire.new(b.x   , y+10, a.x+20, y+10),
          Wire.new(a.x+20, y+10, a.x+20, y+30)
$gates.push Gate.new(a.x+10, y+70, "AND Gate", negate1: true),
          Gate.new(b.x-10, y+70, "AND Gate", negate0: true)
end

def sum (a, b, c, d)
y = [a.y, b.y, c.y, d.y].max
$wires.push Wire.new(a.x   , a.y , a.x   , y+40),
          Wire.new(a.x   , y+40, a.x   , y+50),
          Wire.new(a.x   , y+40, c.x-20, y+40),
          Wire.new(c.x-20, y+40, c.x-20, y+50),
          Wire.new(b.x   , b.y , b.x   , y+30),
          Wire.new(b.x   , y+30, b.x   , y+50),
          Wire.new(b.x   , y+30, d.x-20, y+30),
          Wire.new(d.x-20, y+30, d.x-20, y+50),
          Wire.new(c.x   , c.y , c.x   , y+20),
          Wire.new(c.x   , y+20, c.x   , y+50),
          Wire.new(c.x   , y+20, a.x+20, y+20),
          Wire.new(a.x+20, y+20, a.x+20, y+50),
          Wire.new(d.x   , d.y , d.x   , y+10),
          Wire.new(d.x   , y+10, d.x   , y+50),
          Wire.new(d.x   , y+10, b.x+20, y+10),
          Wire.new(b.x+20, y+10, b.x+20, y+50)
$gates.push Gate.new(a.x+10, y+90, "XOR Gate"),
          Gate.new(b.x+10, y+80, "AND Gate"),
          Gate.new(c.x-10, y+80, "AND Gate"),
          Gate.new(d.x-10, y+90, "XOR Gate")
$wires.push Wire.new(a.x+10, y+90, a.x+10, y+100),
          Wire.new(b.x+10, y+80, b.x+10, y+90 ),
          Wire.new(b.x+10, y+90, a.x+30, y+90 ),
          Wire.new(a.x+30, y+90, a.x+30, y+100),
          Wire.new(d.x-10, y+90, d.x-10, y+100),
          Wire.new(c.x-10, y+80, c.x-10, y+90 ),
          Wire.new(c.x-10, y+90, d.x-30, y+90 ),
          Wire.new(d.x-30, y+90, d.x-30, y+100)
$gates.push Gate.new(d.x-20, y+130, "OR Gate"),
          Gate.new(a.x+20, y+130, "OR Gate")
end

def sum3 (b, c, d)
y = [b.y, c.y, d.y].max
$wires.push Wire.new(b.x   , b.y , b.x   , y+20),
          Wire.new(b.x   , y+20, b.x   , y+30),
          Wire.new(b.x   , y+20, d.x-20, y+20),
          Wire.new(d.x-20, y+20, d.x-20, y+30),
          Wire.new(c.x   , c.y , c.x   , y+60),
          Wire.new(c.x   , y+60, b.x+30, y+60),
          Wire.new(b.x+30, y+60, b.x+30, y+70),
          Wire.new(d.x   , d.y , d.x   , y+10),
          Wire.new(d.x   , y+10, d.x   , y+30),
          Wire.new(d.x   , y+10, b.x+20, y+10),
          Wire.new(b.x+20, y+10, b.x+20, y+30),
          Wire.new(b.x+10, y+60, b.x+10, y+70)
$gates.push Gate.new(b.x+10, y+60 , "AND Gate"),
          Gate.new(d.x-10, y+70 , "XOR Gate"),
          Gate.new(b.x+20, y+100, "OR Gate" )
end

while toMerge.count > 2  
puts "#{toMerge.count} left to merge"
nextToMerge = []
while toMerge.count > 3
 puts "merging four"
 d, c, b, a, *toMerge = toMerge
 balance a, b
 balance c, d
 sum *$gates[-4..-1]
 nextToMerge.push *$gates[-2..-1] 
end
if toMerge.count == 3
 puts "merging three"
 c, b, a, *toMerge = toMerge
 balance b, c
 sum3 a, *$gates[-2..-1]
 nextToMerge.push *$gates[-2..-1]
end
nextToMerge.push *toMerge
toMerge = nextToMerge
puts "layer done"
end

if toMerge.count == 2
b, a = toMerge
x = (a.x + b.x)/2
x -= x % 10
y = [a.y, b.y].max
$wires.push Wire.new(a.x , a.y , a.x , y+10),
          Wire.new(a.x , y+10, x-10, y+10),
          Wire.new(x-10, y+10, x-10, y+20),
          Wire.new(b.x , b.y , b.x , y+10),
          Wire.new(b.x , y+10, x+10, y+10),
          Wire.new(x+10, y+10, x+10, y+20)
$gates.push Gate.new(x, y+70, "XNOR Gate")
toMerge = [$gates[-1]]
end

a = toMerge[0]
$wires.push Wire.new(a.x, a.y, a.x, a.y+10)
$ports.push Port.new(a.x, a.y+10, true)

def xy (x, y)
"(#{x},#{y})"
end
circ = Nokogiri::XML::Builder.new encoding: "UTF-8" do |xml|
xml.project version: "1.0" do
xml.lib name: "0", desc: "#Base"
xml.lib name: "1", desc: "#Wiring"
xml.lib name: "2", desc: "#Gates"
xml.options
xml.mappings
xml.toolbar do
  xml.tool lib:'0', name: "Poke Tool"
  xml.tool lib:'0', name: "Edit Tool"
end #toolbar
xml.main name: "main"
xml.circuit name: "main" do
  $wires.each do |wire|
    xml.wire from: xy(wire.sx, wire.sy), to: xy(wire.tx, wire.ty)
  end #each 
  $gates.each do |gate|
    xml.comp lib: "2", name: gate.name, loc: xy(gate.x, gate.y) do
      xml.a name: "facing", val: "south"
      xml.a name: "size", val: "30"
      xml.a name: "inputs", val: "2"
      if gate.attrs
        gate.attrs.each do |name, value|
          xml.a name: name, val: value 
        end #each
      end #if
    end #comp
  end #each
  $ports.each.with_index do |port, index|
    xml.comp lib: "1", name: "Pin", loc: xy(port.x, port.y) do
      xml.a name: "tristate", val: "false"
      xml.a name: "output",   val: port.out.to_s
      xml.a name: "facing",   val: port.out ? "north" : "south"
      xml.a name: "labelloc", val: port.out ? "south" : "north"
      xml.a name: "label",    val: port.out ? "out" : "B#{index}"
    end #port
  end #each
end #circuit
end #project
end #builder

File.open "divisibility3.circ", ?w do |file|
file << circ.to_xml
end

puts "done"

অবশেষে, যখন 32 বিটের জন্য একটি আউটপুট তৈরি করতে বলা হয়, আমার লেআউটর এটি তৈরি করে। স্বীকার করা, এটি খুব বিস্তৃত ইনপুটগুলির জন্য খুব কমপ্যাক্ট নয়:

প্রচুর নষ্ট স্থানের সাথে 13-স্তরের একাকীত্ব


এখনও অবধি সত্যিই দুর্দান্ত এবং সেরা সার্কিট / লেআউট দেখাচ্ছে। কোড কোন ভাষায় আছে? আপনি যদি কোন লেআউটটার ব্যবহার করেন? লেআউটারটিকে একটি অ্যালগরিদম হওয়ার জন্য অনুরোধ করা হয়েছিল, এবং ধরে নিতে হবে যে অ্যালগরিদম ব্যবহার করা হয়নি (হ্যান্ড লেআউট) যদি না বলা হয় ...
vzn

@ ভিজএন লাউটারটিও বাস্তবায়ন করতে হয়েছিল? আমি বুঝতে পারি যে এই সীমাবদ্ধতার অর্থ হ'ল আমরা ম্যানুয়ালি ডায়াগ্রামটি আঁকতে পারি, তবে পাঠ্যতা ডায়াগ্রামটি কীভাবে আঁকছে তার উপর নির্ভর করতে হবে না। টিমওয়োলার সার্কিটটি অবশ্যই হাতে তৈরি। সিউডো কোডটি বেশিরভাগ জাভাস্ক্রিপি অবজেক্ট যুক্ত হওয়া হাস্কেলের উপর ভিত্তি করে।
জন ডিভোরাক

অ্যালগোরিদমভাবে তৈরি ভিজ্যুয়ালাইজেশন বলতে মূলত অ্যালগরিদমিক লেআউটটার বোঝানো হত তবে এখন স্বীকার করুন যে এটি অস্পষ্টভাবে ব্যাখ্যা করা যেতে পারে। স্ফটিক স্বচ্ছতার অভাবের জন্য দুঃখিত। আপনি কি এমন কোনও স্বয়ংক্রিয় লেআউটার জানেন যা আপনার হাতের লেআউটে প্রায় অনুরূপ ফলাফল পেতে পারে?
vzn

দুর্ভাগ্যক্রমে না. ইয়েডের দুর্দান্ত লেআউটার রয়েছে তবে এটি ওরিয়েন্টেশনকে উপেক্ষা করে। আমি কখনই ডটের সাথে পরিচিত হইনি বা এর ফলাফলটিও খুব সুন্দর পাই না। আমি অনুমান করি যে আমি এই সিউডোকোডটি রুবিতে (সহজ) অনুবাদ করতে এবং নিজস্ব নিজস্ব লেআউটার (খুব বেশি কঠিন নয়, তবে জটিল) লিখতে পারি যা লগিজিম সার্কিট রফতানি করতে পারে (এটি কেবল একটি এক্সএমএল, এবং এটি এমনকি জিপডও নয়, এত সহজ)। আমি (আমি চাই) করা উচিত, এবং আমি একটি পৃথক উত্তর হিসাবে পোস্ট করা উচিত? এছাড়াও, হাত গণনা হিসাবে গণনা হবে?
জন ডিভোরাক

সমস্ত ভাল উত্তর, তবে এটি এখন পর্যন্ত সবচেয়ে মার্জিত মত দেখাচ্ছে
ডিজিটাল ট্রমা

5

2 × 24 নয়, 2 × 10 + 5 এবং, 2 × 2 + 5 বা 2 × 2 উত্তর OR

এটি পুরোপুরি স্কেল করে না। মোটেও পছন্দ নয় সম্ভবত আমি এটি উন্নতি করার চেষ্টা করব।

আমি 30 টি পর্যন্ত সংখ্যার জন্য এটি পরীক্ষা করেছি এবং এটি দুর্দান্ত কাজ করেছে।

এই 2 টি বড় সার্কিট সক্রিয় ইনপুটগুলির সংখ্যা গণনা করছে:

  • উপরের ডানদিকে একটি এমনকি পাওয়ারের সাথে বিটের সংখ্যা গণনা করা হয় (শূন্য থেকে 4)
  • নীচের বামে একটি বিজোড় শক্তি সহ বিটের সংখ্যা গণনা করে (শূন্য থেকে 4)

যদি এই সংখ্যার পার্থক্য হয় 0বা 3সংখ্যাটি দ্বারা বিভাজ্য হয় 3। নীচের ডান বর্তনী মূলত প্রতিটি বৈধ সমন্বয় মানচিত্র ( 4,4, 4,1, 3,3, 3,0, 2, 2, 1, 1, 0, 0একটি বা মধ্যে)।

মাঝের ছোট্ট বৃত্তটি একটি এলইডি রয়েছে যা যদি সংখ্যাটি 3 দ্বারা বিভাজ্য হয় এবং অন্যথায় বন্ধ হয় on


বাহ সুন্দর / দ্রুত! ... plz কোডের সাথে একটি লিঙ্ক রাখুন বা এটি ইনলাইন করুন ... এছাড়াও আপনি কীভাবে ভিজ্যুয়ালাইজেশন করেছেন ... বিস্তারিত?
vzn

@vzn ভিজ্যুয়ালাইজেশনটি লজিজিমে তৈরি করা হয়েছিল । এটি আমার হাতে নির্মিত হয়েছিল, তবে সাধারণ অ্যালগরিদমটি খুব সহজেই কোনও প্রোগ্রামের সাহায্যে করা যায়। এটি উত্তরে আংশিকভাবে ব্যাখ্যা করা হয়েছে।
টিমওয়োল্লা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.