एक सर्किट आरेख की व्याख्या करें


12

आपकी चुनौती तर्क फाटकों के साथ एक सर्किट आरेख की व्याख्या करना है।

लॉजिक गेट्स (आपको वास्तव में यह जानने की जरूरत नहीं है कि ये चुनौती पूरी करने के लिए क्या करते हैं):

  • और गेट: a
  • या गेट: o
  • नंद द्वार: A
  • न गेट: O
  • Xor गेट: x
  • xnor गेट: X
  • गेट नहीं: ~

प्रत्येक गेट पर अंतिम एक दो इनपुट लेता है। .गेट पर केंद्रित 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))))

ऊओह्ह्ह्ह, दिलचस्प! मैं इसे एक शॉट दूँगा।
cjfaure

5
मैं इस से बाहर आने के लिए एक दिलचस्प उत्साह का पूर्वाभास कर रहा हूं, अगर हम इसे ट्यूरिंग-पूर्ण बनाने के लिए एक तरह से बढ़ाते हैं।
विक्टर स्टैफुसा

"संकलक त्रुटि" (यानी विकृत इनपुट वायरिंग) के मामले में, दुभाषिया को क्या करना चाहिए?
विक्टर स्टैफुसा

और, अगर मैं सीधे दो इनपुट जोड़ता हूं? या सीधे दो आउटपुट कनेक्ट करें? या इनपुट आउटपुट के लिए खुली लाइनें?
विक्टर स्टैफुसा

1
@ विक्टर यह पहले से ही समान है। लेकिन मैं आगे बढ़ गया और एक और एक
जस्टिन

जवाबों:


4

पायथन 2488 1567 806 706 697 657 653

Gzip + निष्पादन के लिए याय!

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


एल्गोरिथ्म

यह मूल रूप से आउटपुट से एक बल्कि भोली डीएफएस है। प्रत्येक आउटपुट के लिए, यह कैरेक्टर एक से इसके बाईं ओर शुरू होता है और हर गेट पर ब्रांचिंग (और एक्सप्रेशन को जोड़ते हुए) वायर को ट्रेस करता है। जब यह किसी इनपुट तक पहुंचता है, तो इसे अभिव्यक्ति में जोड़ देता है और अंतिम बिंदु पर पहुंच जाता है, क्योंकि हम यह सुनिश्चित कर सकते हैं कि गेट के बिना ब्रांचिंग संभव नहीं है। और निश्चित रूप से किसी भी अवैध मामलों को छोड़ दिया जाता है। वास्तव में इसके लिए कुछ भी विशेष नहीं है - और इसलिए यह होने की संभावना से अधिक लंबा है।


टिप्पणियाँ

आकार शायद कुछ पुनर्गठन के साथ काफी कम हो सकता है, लेकिन मैंने आज के लिए इस पर पर्याप्त समय बिताया है। मैन्युअल रूप से गोल्फ वाला संस्करण एक संपीड़ित था।

Gzip कम्प्रेशन गोल्फ को दिलचस्प बनाता है, क्योंकि कुछ कैशिंग (जैसे 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)

डीएफएस क्या है? इसके अलावा, आउटपुट से पीछे की ओर काम करना बिल्कुल वैसा ही है जैसा मैं सोच रहा था।
जस्टिन

@Quincunx गहराई-पहली-खोज। मूल रूप से, पुनरावृत्ति (या अन्यथा एक एलआईएफओ निर्माण, एक स्टैक का उपयोग करके) और जब तक यह एक मृत अंत या लक्ष्य को हिट नहीं करता है, तब तक एक पथ के साथ यात्रा करना संभव है, जिस बिंदु पर यह विचलन के अंतिम बिंदु पर लौटता है और अन्य पथों की कोशिश करता है।
बॉब

इनपुट्स पर अच्छी धारणा है। यह वही है जो मेरा मतलब था (और मैंने यह सुझाव देने के लिए उसे शब्द देने की कोशिश की)। हालाँकि, क्या आपका प्रोग्राम 0अंक के रूप में काम करता है ? कैसे के बारे में अदला-बदली का आदेश दिया जाता है ताकि 2पहले आए 1, आदि
जस्टिन

@Quincunx मैं पायथन का उपयोग कर रहा हूं .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नाम में किसी भी फ़ाइल एक्सटेंशन के बिना, बस कहा जाना चाहिए ।
  • यह पता लगाने का कोई प्रयास नहीं करता है कि क्या कोष्ठक आवश्यक हैं या नहीं। यह मानता है कि वे हमेशा आवश्यक होते हैं, और चूंकि यह धारणा झूठी है, इसलिए आवश्यकता से बहुत अधिक कोष्ठक है, लेकिन चूंकि यह वैसे भी युक्ति को विफल नहीं करता है, इसलिए यह कोई समस्या नहीं है।
  • प्रत्येक बाइनरी ऑपरेटर के मापदंडों का क्रम सामान्य रूप से अप्रत्याशित है, क्योंकि यह वेग पर निर्भर करता है कि मान प्रचारित हैं और सेल स्कैनिंग क्रम से हैं। लेकिन चूंकि सभी बाइनरी ऑपरेटर कम्यूटेटिव हैं, इसलिए यह कोई समस्या नहीं होनी चाहिए।

मुझे यकीन है कि इसे कम करना संभव होना चाहिए, लेकिन बस थोड़ा सा।

दुभाषिया सेलुलर ऑटोमेटा के कुछ प्रकार के रूप में लागू किया जाता है। यह संपूर्ण फ़ील्ड सेटिंग मानों को स्कैन करता है, इसे कई बार आवश्यकतानुसार दोहराता है जब तक कोई परिवर्तन नहीं पता चलता है।

यहाँ एक ungolfed संस्करण है:

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। वहाँ शायद अन्य चीजें हैं, लेकिन मुझे नहीं पता कि कैसे जावा को गोल्फ करना है।
बॉब

@ थैंक्यू, आपके सुझाव ने मुझे 7 पात्रों को छोटा कर दिया। इसके अलावा, मैं और 4 कम कर सकता हूं।
विक्टर स्टैफुसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.