একটি সার্কিট ডায়াগ্রাম ব্যাখ্যা করুন


12

আপনার চ্যালেঞ্জটি একটি সার্কিট ডায়াগ্রামের ব্যাখ্যা করা, লজিক গেট দিয়ে সম্পূর্ণ।

লজিক গেটস (এই চ্যালেঞ্জটি সম্পন্ন করার জন্য আপনার আসলে এইগুলি কী হবে / কী তা জানতে হবে না):

  • এবং গেট: a
  • বা গেট: o
  • নন্দ গেট: A
  • না গেট: O
  • জোর গেট: x
  • এক্সনোর গেট: X
  • গেট নয়: ~

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

তারের দ্বারা প্রতিনিধিত্ব করা হয় -|\/.=

  • - দুটি তারের সাথে যোগাযোগ করে, একটি ডানে এবং একটি বামে: c-c
  • | দুটি তারের সাথে যোগাযোগ করে, একটি উপরে এবং একটি নীচে:

    c
    |
    c
    
  • /এবং \নিম্নলিখিত হিসাবে কাজ:

    c        c
     \      /
      c    c
    
  • . পার্শ্ববর্তী প্রতিটি তারের সাথে যোগাযোগ করুন:

    ccc
    c.c
    ccc
    
  • =বিশেষ; এটি এটি জুড়ে সংলগ্ন তারগুলি সংযুক্ত করে:

    -=-
    

    দুটি তারের সাথে সংযোগ স্থাপন করে। নীচে

    \|/
    -=-
    /|\
    

    প্রতিটি বিপরীত তারের একে অপরের সাথে সংযুক্ত থাকে, তবে অন্যদের সাথে নয় (এটি এটির থেকে পৃথক হয় .)।

  • কারেন্ট প্রবাহিত হওয়ার জন্য, দুটি তারের দুটিই অন্যটির সাথে সংযুক্ত থাকতে হবে, সুতরাং |-, কারেন্ট প্রবাহিত হয় না

তারের উদাহরণ:

      .-.
     =   \
 .--. .---=---
-.   =     .--
 .--. .-------

ইনপুটটি দুটি তারে বিভক্ত হয় এবং তারপরে তিনটি বিভক্ত হয়। এই বিভক্তিতে নীচের তারটি মাঝখানে চলে যায় এবং উপরের তারের নীচের দিকে বিভাজনটি নীচে প্রদর্শিত হয়। এর পরে, তিনটি তারের শীর্ষটি মাঝখানে সরানো হয়েছে।

গেটস সহ নমুনা তারের:

--.
   o..~..
--.      o.---
   a.---.
--.

ছক পূরণ করা:

  • প্রতিটি ইনপুট তারের একটি অঙ্ক সহ লেবেল করা হবে। শেষে (সম্পর্কে newline সামনে ডান) এ প্রতিটি আউটপুট লেবেলযুক্ত করা হবে :(এবং টেলিগ্রাম সবসময় যাব অধিকার তা, অর্থাত্ -:বা .:বা =:)
  • ইনপুট সর্বদা বৈধ থাকবে; গেট ব্যতীত কোনও লুপ বা তারগুলি একসাথে যোগদান করবে না। নোট করুন যে আলগা প্রান্তের সাথে তারের থাকতে পারে।
  • = প্রয়োজনীয় হলেই ব্যবহৃত হবে।

আউটপুট ফরমেট:

  • প্রতিটি ইনপুট সংশ্লিষ্ট সংখ্যার সাথে রেফারেন্স করা হয়।
  • একটি এক্সপ্রেশন আউটপুট হয়। উদাহরণস্বরূপ, যদি তারগুলি গণনা ইনপুট 1 এবং ইনপুট 2 হয় তবে আউটপুট হয় 1a2
  • আউটপুট করা যাই হোক না কেন ফাংশন শুরুতে লজিক গেটের সাথে সামঞ্জস্য করা আবশ্যক।
  • না দেখানোর জন্য, ~সঠিক জায়গার আগে রাখুন।
  • একাধিক ফাংশনের জন্য, মৃত্যুদন্ড কার্যকর করার ক্রমটি দেখানোর জন্য বন্ধনী ব্যবহার করুন। যখন কেবলমাত্র একক ফাংশন থাকে তখন প্যারেন্টিসগুলিও ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ,

    1-.~.-.
           A.~.-:
          .
    2-.  /
       x.
    3-.
    

    এর একটি সম্ভাব্য আউটপুট রয়েছে ~((2x3)A(~1))

  • একাধিক আউটপুটগুলি অবশ্যই একটি নতুন লাইনের (বা সমতুল্য) দ্বারা পৃথক করা উচিত

নমুনা ইনপুট:

1--.---.
    x.  \
2--.  x.-=---------.
     .    .~.       X.--.
3---. .      a.----.   /
       O.~.-.       \ /
      .              =
4-.  /              / .-:
   X.              .----:
5-.

একটি সম্ভাব্য সম্পর্কিত আউটপুট:

(~1)a(~(3O(4X5))
((1x2)x3)X((~1)a(~(3O(4X5))))

ওওহহহ, আকর্ষণীয়! আমি একটা শট দেব।
সিজেফুরে

5
আমি এটি থেকে একটি আকর্ষণীয় বিস্ময় প্রকাশের আগাম ধারণা করছি, যদি আমরা এটিকে টুরিং-সম্পূর্ণ করার পদ্ধতিতে প্রসারিত করি।
ভিক্টর স্টাফুসা

একটি "সংকলক ত্রুটি" এর ক্ষেত্রে (অর্থাত্‍ বিকৃত ইনপুট ওয়্যারিং) দোভাষীর কী করা উচিত?
ভিক্টর স্টাফুসা

এবং, আমি যদি সরাসরি দুটি ইনপুট সংযোগ করি? অথবা সরাসরি দুটি আউটপুট সংযোগ করবেন? অথবা আউটপুটটিতে খোলা লাইন ইনপুট?
ভিক্টর স্টাফুসা

1
@ ভিক্টর এটি ইতিমধ্যে একই রকম। তবে আমি এগিয়ে গিয়ে অন্য একটি
জাস্টিন

উত্তর:


4

পাইথন 2488 1567 806 706 697 657 653

জিজিপ + এক্সের জন্য ইয়ে!

import zlib,base64;exec zlib.decompress(base64.b64decode('eNp1U8FuqzAQvPMV7sm2gBSuuFupX9BLD5UoBxNMMAkEgQmJVPXb364Daiu9ntaznt2dWYzthvPo2HSbgsrU7E3so0FmAWtgnyeFshjSImC2Zs1Tws4js/fQPMPJ9KKTlFrPeVPIbDRuHnvOA3YByuS2UCNwrloYqOMRQ1ooDY0qwaoKRJxGSZRKP+QCwBn/0YRyzPYcYq77irUATVbGcIytGkN4E7mOyiLayx/MT888AthMx9DGDTLj/zIfPz44emUGqC/Zoio1UdFzohzFp0TNNA7xQhFxDWJiNGNG98L54yLVYUsv3+kZx9G8/uyEoQFk8NELrDeIIggf5Cb3b3/I3nnFNdZe0QOrCHl4+4ZsgVyH16gMb4XHq4IrwA0gkV7kAwyZH7Fs7f0S/O7IbnZX7jelzy+v13f8LsAFD0kVfrQyTklZyCUPL+F2Ef66WHug7i9f/bWyfnOIsrNTZQ/WCXxCcAnY/QmwMeggLwIyeCKD+FB3k6tsj/K6nR4G01fiZCcnTlIGBkw/d2bUzvgSG2kqMvhOkU+ZNirvGS1XgyWKy/xS2TDa3uE/kNuoJX0UC/kP8j/kmA=='))

সীমাবদ্ধতা এবং অনুমান

যেমনটি হয়, কেবল 9 টি ইনপুট সমর্থিত - একাধিক সংখ্যা সঠিকভাবে পরিচালনা করা হয় না। বৈশিষ্ট বোঝা যায় যে যে ইনপুট একটি সঙ্গে লেবেলযুক্ত অঙ্ক , না একটি সংখ্যা , এই অনুমোদিত হয়।


ইনপুট এবং আউটপুট

ইনপুট স্ট্যান্ডার্ড ইন এর মাধ্যমে নেওয়া হয়, এবং আউটপুট স্ট্যান্ডার্ড আউট এর মাধ্যমে হয়।


পরীক্ষামূলক

নমুনা ইনপুট এবং আউটপুট:

1--.---.
    x.  \
2--.  x.-=---------.
     .    .~.       X.--.
3---. .      a.----.   /
       O.~.-.       \ /
      .              =
4-.  /              / .-:
   X.              .----:
5-.


(~(1))a(~((3)O((4)X(5))))
(((1)x(2))x(3))X((~(1))a(~((3)O((4)X(5)))))

এখানে পরীক্ষিত: http://ideone.com/gP4CIq


অ্যালগরিদম

এটি আউটপুট থেকে মূলত একটি বরং নিষ্পাপ ডিএফএস। প্রতিটি আউটপুটের জন্য, এটি অক্ষর থেকে শুরু করে তার বাম দিকে শুরু হয় এবং তারটি সনাক্ত করে, প্রতিটি গেটে শাখা (এবং অভিব্যক্তি যোগ করে)। এটি যখন কোনও ইনপুট এ পৌঁছায়, এটি এটিকে এক্সপ্রেশন এবং ব্যাকট্র্যাকগুলিতে যুক্ত করে এটি ব্রাঞ্চ করা শেষ পয়েন্টে যুক্ত করে, যেহেতু আমরা নিশ্চিত হতে পারি যে গেট ছাড়া শাখা প্রশাখি করা সম্ভব নয় । এবং অবশ্যই কোনও অবৈধ মামলা বাতিল করা হয়। এটির জন্য আসলে বিশেষ কিছু নেই - এবং এটি সম্ভবত এটির চেয়ে দীর্ঘতর হতে পারে।


মন্তব্য

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

গিজিপ সংক্ষেপণ গল্ফিংকে আকর্ষণীয় করে তোলে, কারণ নির্দিষ্ট কিছু ক্যাচিং (উদাহরণস্বরূপ d=(-1,0,1)) আসলে সংক্ষেপণ অ্যালগরিদমকে এটির যত্ন নিতে দেওয়া থেকে বেশি জায়গা নেয়। তবে, আমি সংক্ষেপণের জন্য অনুকূলকরণের চেয়ে ম্যানুয়াল সংস্করণটি যথাসম্ভব গল্ফ বেছে নিয়েছি।


ম্যানুয়ালি গল্ফড ( 909 895 840 803):

import sys
def T(c,p):
 h=c[0];i=c[1]
 if h<0 or i<0 or h>=len(m)or i>=len(m[h]):return''
 v=m[h][i];r='';j=p[0];k=p[1];a=h;b=i;d=(-1,0,1)
 if v==' ':return''
 if v in'=-'and j==h:b-=k-i;r+=T([a,b],c)
 if v in'=|'and k==i:a-=j-h;r+-T([a,b],c)
 if v in'=/\\':
  e=j==h or k==i;s=j-h>0;t=j-h<0;u=k-i>0;w=k-i<0;f=(s and u)or(t and w);g=(s and w)or(t and u)
  if not(e or v=='/'and f or v=='\\'and g):a-=j-h;b-=k-i;r+=T([a,b],c)
 if v=='.':
  for x in d:
   for y in d:
    w=[a+x,b+y]
    if not(x==y==0)and w!=p:r+=T(w,c)
 if j==h and k-i>0:
  if v in'aoAOxX':r='('+T([a-1,b-1],c)+')'+v+'('+T([a+1,b-1],c)+')'
  if v=='~':r='~('+T([a,b-1],c)+')'
 if v.isdigit():r=v
 return r
m=[]
for l in sys.stdin:
 m.append(list(l))
e=enumerate
for i,a in e(m):
 for j,b in e(a):
  if b==':':
   print T([i,j-1],[i,j])

সম্পূর্ণ অবহেলিত (2488):

import sys

def findOuts(c):
    for i, iVal in enumerate(c):
        for j, jVal in enumerate(iVal):
            if jVal == ':':
                yield [i, j]

def trace(pos, prev):
    if pos[0] < 0 or pos[1] < 0 or pos[0] >= len(circuit) or pos[1] >= len(circuit[pos[0]]):
        return ''
    val = circuit[pos[0]][pos[1]]
    if val == ' ':
        return ''
    next = pos[:]
    ret = ''
    if val in '=-':
        if prev[0] == pos[0]:
            next[1] -= prev[1] - pos[1]
            ret += trace(next, pos)
    if val in '=|':
        if prev[1] == pos[1]:
            next[0] -= prev[0] - pos[0]
            ret += trace(next, pos)
    if val in '=/\\':
        # top-bottom, left-right
        tblr = prev[0] == pos[0] or prev[1] == pos[1]
        # top-left, bottom-right
        tlbr = (prev[0] - pos[0] == 1 and prev[1] - pos[1] == 1) or (prev[0] - pos[0] == -1 and prev[1] - pos[1] == -1)
        # top-right, bottom-left
        trbl = (prev[0] - pos[0] == 1 and prev[1] - pos[1] == -1) or (prev[0] - pos[0] == -1 and prev[1] - pos[1] == 1)
        if not ((val == '/' and (tlbr or tblr)) or (val == '\\' and (trbl or tblr)) or (val == '=' and tblr)):
            next[0] -= prev[0] - pos[0]
            next[1] -= prev[1] - pos[1]
            ret += trace(next, pos)

    if val == '.':
        for x in (-1,0,1):
            for y in (-1,0,1):
                if x == y == 0:
                    continue

                w = [next[0] + x, next[1] + y]
                if w == prev:
                    continue

                # only one of them should return anything
                ret += trace(w, pos)

    # assumption that a logic gate always has a . on its connections, as according to spec
    if val in 'aoAOxX':
        # only from the right/output
        if not (prev[0] == pos[0] and prev[1] == pos[1] + 1):
            return ret
        ret = '(' + trace([next[0] - 1, next[1] - 1], pos) + ')' + val + '(' + trace([next[0] + 1, next[1] - 1], pos) + ')'

    if val == '~':
        # only from the right/output
        if not (prev[0] == pos[0] and prev[1] == pos[1] + 1):
            return ret
        ret = '~(' + trace([next[0], next[1] - 1], pos) + ')'

    if val in '123456789':
        ret = val

    return ret

circuit = []
for line in sys.stdin.readlines():
    # padding added to prevent index out of bounds later
    circuit.append(list(line))

for out in findOuts(circuit):
    next = out[:]
    next[1] -= 1
    print trace(next, out)

ডিএফএস কি? এছাড়াও, আউটপুট থেকে পিছনে কাজ করা ঠিক আমি যা ভাবছিলাম তা হ'ল।
জাস্টিন 16

@ কিউইচুনক্স গভীরতা-প্রথম-অনুসন্ধান। মূলত, পুনরাবৃত্তি (বা অন্যথায় একটি LIFO কনস্ট্রাক্ট, একটি স্ট্যাক ব্যবহার করে) এবং যতক্ষণ সম্ভব কোনও পথ ধরে যাতায়াত করে যতক্ষণ না এটি একটি শেষ প্রান্তে বা লক্ষ্যটিকে আঘাত করে, যেখানে এটি বিচ্ছিন্নতার শেষ পয়েন্টে ফিরে আসে এবং অন্যান্য পথগুলি চেষ্টা করে।
বব

ইনপুটগুলিতে ভাল ধারণা। এটাই আমি বোঝাতে চেয়েছিলাম (এবং আমি এটি বোঝাতে চেষ্টা করেছিলাম)। তবে, আপনার প্রোগ্রামটি 0কী অঙ্ক হিসাবে কাজ করে ? অদলবদল অর্ডার সম্পর্কে কীভাবে এটি 2আগে আসে 1etc. ইত্যাদি
জাস্টিন

@ কুইনকুনস আমি পাইথন ব্যবহার করছি .isdigit()যা কার্যকরভাবে রেজেক্সের সমান যা [0-9]আমি বলতে পারি। আপনার অনুমান অনুযায়ী সঠিক? অদলবদল অর্ডার বলতে কী বোঝ? এটি যেভাবে বাস্তবায়িত হয়েছে, এটি প্রথমে যে কোনও লজিক গেটের উপরের শাখায় চলে আসবে তবে ইনপুটগুলি অর্ডার দেওয়ার কোনও গ্যারান্টি নেই।
বব

isdigit()সামঞ্জস্যপূর্ণ. অদলবদল ক্রম মানে 2প্রথম ইনপুট এবং 1দ্বিতীয় ইনপুট (উল্লম্বভাবে সাজানো) এর মতো কিছু।
জাস্টিন

6

জাভা: 1523 1512 অক্ষর

import java.util.*;class W{int v=99;Map<Integer,String>t;boolean k;public static void main(String[]y){new W().d();}W(){try{java.io.InputStream i=new java.io.File("r").toURL().openStream();t=new HashMap<>();int a=0,x=0,y=0;while((a=i.read())>-1){if(a==10){y++;x=0;continue;}q(x,y,(a>47&a<58?"!":"")+(char)a);x++;}}catch(Exception e){}}void d(){while(!k){k=!k;for(Map.Entry<Integer,String>g:t.entrySet())e(g.getKey(),g.getValue());}for(String b:t.values())if(b.startsWith("$"))System.out.println(b.substring(1));}void e(int a,String s){if(s==null||!s.startsWith("!"))return;int x=a/v,y=a%v;s=s.substring(1);b(s,x,y,x-1,y+1);b(s,x,y,x,y+1);b(s,x,y,x+1,y+1);b(s,x,y,x-1,y);b(s,x,y,x+1,y);b(s,x,y,x-1,y-1);b(s,x,y,x,y-1);b(s,x,y,x+1,y-1);}void b(String p,int m,int n,int x,int y){String s=t.get(x*v+y);if(s==null)return;boolean g=y==n+1;boolean h=y==n-1;boolean i=x==m+1;boolean j=x==m-1;if(z(s,"-=")&n==y){if(i)b(p,x,y,x+1,y);if(j)b(p,x,y,x-1,y);}if(z(s,"|=")&m==x){if(g)b(p,x,y,x,y+1);if(h)b(p,x,y,x,y-1);}if(z(s,"/=")){if(j&g)b(p,x,y,x-1,y+1);if(i&h)b(p,x,y,x+1,y-1);}if(z(s,"\\=")){if(i&g)b(p,x,y,x+1,y+1);if(j&h)b(p,x,y,x-1,y-1);}if(z(s,".")){q(x,y,"!"+p);u();}if(z(s,"~")){q(x,y,"!~("+p+")");u();}if((s.charAt(0)=='%'&n==y-1)|(s.charAt(0)=='&'&n==y+1)){q(x,y,"!("+p+")"+s.charAt(1)+"("+s.substring(2)+")");u();}if(z(s,"OoAaXx")){q(x,y,(n==y+1?"%":"&")+s+p);u();}if(z(s,":")){q(x,y,"$"+p);u();}}void q(int x,int y,String z){t.put(x*v+y,z);}void u(){k=false;}boolean z(String s,String c){return c.indexOf(s)>-1;}}

এটি নমুনা ইনপুট জন্য এই আউটপুট দেয়:

(~(((5)X(4))O(3)))a(~(1))
((~(((5)X(4))O(3)))a(~(1)))X(((2)x(1))x(3))

এর আকারটি হ্রাস করার জন্য:

  • ইনপুটটি সর্বদা বৈধ বলে ধরে নিলে এটি কোনও ত্রুটি পরীক্ষা করা, ত্রুটি পরিচালনা বা ইনপুট বৈধতা দেয় না।
  • ইনপুট 99 লাইন সীমাবদ্ধ।
  • নামে rকোনও ফাইল এক্সটেনশন ছাড়াই এর ইনপুট ফাইলটিকে ন্যায়সঙ্গত বলা উচিত ।
  • প্রথম বন্ধনী প্রয়োজনীয় বা না প্রয়োজন তা সনাক্ত করার জন্য এটি কোনও প্রচেষ্টা করে না। এটি ধরে নেওয়া হয় যে এগুলি সর্বদা প্রয়োজনীয়, এবং যেহেতু এই অনুমানটি মিথ্যা, প্রয়োজনের তুলনায় অনেক বেশি প্রথম বন্ধনী রয়েছে, তবে যেহেতু এটি এটিকে কোনওভাবেই ব্যর্থ করে তোলে না, এটি কোনও সমস্যা নয়।
  • প্রতিটি বাইনারি অপারেটরের পরামিতিগুলির ক্রমটি সাধারণভাবে অনাকাঙ্ক্ষিত, কারণ এটি গতিবেগের উপর নির্ভর করে যে মানগুলি প্রচারিত হয় এবং সেল স্ক্যানিং ক্রম থেকে। তবে যেহেতু সমস্ত বাইনারি অপারেটরগুলি পরিবর্তনশীল, তাই এটি কোনও সমস্যা হওয়া উচিত নয়।

আমি নিশ্চিত যে এটি আরও কমানো সম্ভব হবে, তবে কিছুটা হলেও।

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

এখানে একটি অবারিত সংস্করণ:

import java.util.*;

class Wiring {

    int maxLines = 99;
    Map<Integer, String> circuitState;
    boolean finished;

    public static void main(String[] args) {
        new Wiring().interpret();
    }

    Wiring() {

        try {
            // Always read the input from the "r" file, and do not check if it even
            // exists. BTW, the toURL() method is deprecated, but we don't care about
            // this in code-golfing.
            java.io.InputStream stream = new java.io.File("r").toURL().openStream();

            circuitState = new HashMap<>();
            int byteRead = 0, cellX = 0, cellY = 0;

            while ((byteRead = stream.read()) > -1) {

                // Check for line break;
                if (byteRead == 10) {
                    cellY++;
                    cellX = 0;
                    continue;
                }

                // Populate the circuit cell. Precede numbers with an exclamation mark.
                setCircuitCell(cellX, cellY, (byteRead >= '0' & byteRead <= '9' ? "!" : "") + (char) byteRead);
                cellX++;
        } catch (Exception e) {
        }
    }

    void interpret() {
        while (!finished) {
            finished = !finished; // i.e. finished = false;
            for (Map.Entry<Integer, String> entry : circuitState.entrySet()) {
                analyzeCell(entry.getKey(), entry.getValue());
            }
        }

        // Now print the output. To do that scan for cells marked with "$".
        for (String cell : circuitState.values()) {
            if (cell.startsWith("$")) System.out.println(cell.substring(1));
        }
    }

    void analyzeCell(int cellIndex, String cellValue) {
        // Only the cells with a value marked with "!" are worth to analyze.
        if (cellValue == null || !cellValue.startsWith("!")) return;

        // Convert the cellIndex to a bidimensional coordinate.
        int x = cellIndex / maxLines, y = cellIndex % maxLines;

        // Remove the "!".
        cellValue = cellValue.substring(1);

        // Propagate the cell value to neighbouring cells.
        propagateCellData(cellValue, x, y, x - 1, y + 1);
        propagateCellData(cellValue, x, y, x, y + 1);
        propagateCellData(cellValue, x, y, x + 1, y + 1);
        propagateCellData(cellValue, x, y, x - 1, y);
        propagateCellData(cellValue, x, y, x + 1, y);
        propagateCellData(cellValue, x, y, x - 1, y - 1);
        propagateCellData(cellValue, x, y, x, y - 1);
        propagateCellData(cellValue, x, y, x + 1, y - 1);
    }

    void propagateCellData(String cellValue, int sourceX, int sourceY, int targetX, int targetY) {
        String targetContent = circuitState.get(targetX * maxLines + targetY);

        // If the target cell does not exist, just ignore.
        if (targetContent == null) return;

        boolean targetBelowSource = targetY == sourceY + 1;
        boolean targetAboveSource = targetY == sourceY - 1;
        boolean targetRightToSource = targetX == sourceX + 1;
        boolean targetLeftToSource = targetX == sourceX - 1;

        // Propagate horizontally through wires.
        if (isStringContained(targetContent, "-=") & sourceY == targetY) {
            if (targetRightToSource) propagateCellData(cellValue, targetX, targetY, targetX + 1, targetY);
            if (targetLeftToSource) propagateCellData(cellValue, targetX, targetY, targetX - 1, targetY);
        }

        // Propagate vertically.
        if (isStringContained(targetContent, "|=") & sourceX == targetX) {
            if (targetBelowSource) propagateCellData(cellValue, targetX, targetY, targetX, targetY + 1);
            if (targetAboveSource) propagateCellData(cellValue, targetX, targetY, targetX, targetY - 1);
        }

        // Propagate in the diagonal x=-y.
        if (isStringContained(targetContent, "/=")) {
            if (targetLeftToSource & targetBelowSource) {
                propagateCellData(cellValue, targetX, targetY, targetX - 1, targetY + 1);
            }
            if (targetRightToSource & targetAboveSource) {
                propagateCellData(cellValue, targetX, targetY, targetX + 1, targetY - 1);
            }
        }

        // Propagate in the diagonal x=y.
        if (isStringContained(targetContent, "\\=")) {
            if (targetRightToSource & targetBelowSource) {
                propagateCellData(cellValue, targetX, targetY, targetX + 1, targetY + 1);
            }
            if (targetLeftToSource & targetAboveSource) {
                propagateCellData(cellValue, targetX, targetY, targetX - 1, targetY - 1);
            }
        }

        // If we got a dot, store the value there.
        // Do not forget to mark it with "!", so we can rescan it later.
        if (isStringContained(targetContent, ".")) {
            setCircuitCell(targetX, targetY, "!" + cellValue);
            markThatStateChanged();
        }

        // If we got a "~", store the inverted value there.
        // Do not forget to mark it with "!", so we can rescan it later.
        if (isStringContained(targetContent, "~")) {
            setCircuitCell(targetX, targetY, "!~(" + cellValue + ")");
            markThatStateChanged();
        }

        // If we found a binary logical port with one of the values set and
        // we can set the another value, do it. Use "%" and "&" to know which
        // one was already defined.
        // BTW, do not forget to mark it with "!", so we can rescan it later.
        if ((targetContent.charAt(0) == '%' & sourceY == targetY - 1)
                | (targetContent.charAt(0) == '&' & sourceY == targetY + 1))
        {
            setCircuitCell(targetX, targetY,
                    "!(" + cellValue + ")"
                    + targetContent.charAt(1)
                    + "(" + targetContent.substring(2) + ")");
            markThatStateChanged();
        }

        // Found a binary logical port without any value setted, so set it.
        // Use "%" and "&" to mark which one was setted.
        if (isStringContained(targetContent, "OoAaXx")) {
            setCircuitCell(targetX, targetY, (sourceY == targetY + 1 ? "%" : "&") + targetContent + cellValue);
            markThatStateChanged();
        }

        // If we found an output, store the value there.
        // Mark it with "$", so we will print it in the future.
        if (isStringContained(targetContent, ":")) {
            setCircuitCell(targetX, targetY, "$" + cellValue);
            markThatStateChanged();
        }
    }

    void setCircuitCell(int cellX, int cellY, String cellContents) {
        circuitState.put(cellX * maxLines + cellY, cellContents);
    }

    void markThatStateChanged() {
        finished = false;
    }

    boolean isStringContained(String searchingString, String searchTarget) {
        return searchTarget.indexOf(searchingString) > -1;
    }
}

try{}catch(Exception e){}দুটি ব্যবহারের চেয়ে ছোট্ট বিট সস্তা throws Exception। সম্ভবত অন্যান্য জিনিস রয়েছে, তবে জাভা গল্ফ করবেন কীভাবে আমার কোনও ধারণা নেই।
বব

@ Bob ধন্যবাদ, আপনার পরামর্শ আমাকে এটি 7 টি অক্ষর হ্রাস করতে বাধ্য করেছে। এছাড়াও, আমি আরও 4 টি হ্রাস করতে পারে।
ভিক্টর স্টাফুসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.