এএসসিআইআই-আর্ট লজিক গেট ডায়াগ্রাম


12

আমি আপনাকে চ্যালেঞ্জ জানাই যে একটি সমীকরণের পণ্য ফর্মের যোগফলের জন্য একটি (বর্ধিত) এএসসিআইআই-আর্ট লজিক গেট ডায়াগ্রাম তৈরি করার জন্য একটি কোড লিখুন।

গেটগুলি উপস্থাপন করতে নিম্নলিখিত স্বরলিপি ব্যবহার করুন:

এবং
    INPUT───|&&
            |&&───OUTPUT
    INPUT───|&&
অথবা
    INPUT───|OR
            |OR───OUTPUT
    INPUT───|OR  
2 টিরও বেশি ইনপুট সহ গেটস
    INPUT───|OR
            |OR
    INPUT───|OR───OUTPUT
            |OR
    INPUT───|OR
না
    INPUT───│>o───OUTPUT

অক্ষর সেট

নোট করুন যে কোনও ASCII পাইপ সাইন নয় বরং একটি বাক্স-অঙ্কন চরিত্র─ │ ┌ ┐ └ ┘সংযোগের জন্য বক্স-অঙ্কন অক্ষরগুলি ব্যবহার করুন ।

উদাহরণ

ইনপুট
    A'*B'+B*C
আউটপুট
    A────│>o────│&&
                │&&─────┐
    B────│>o────│&&     └│OR
                         │OR─────A*B+B*C
    B───────────│&&     ┌│OR
                │&&─────┘
    C───────────│&&    

বিজয়ী

বিজয়ী 5 দিনের মধ্যে সর্বাধিক ভোট সহ উত্তর


1
মাত্র 95 মুদ্রণযোগ্য ASCII অক্ষর, এবং তারা এর মধ্যে যে কোনো অন্তর্ভুক্ত করবেন না: ─ │ ┌ ┐ └ ┘। আমি মনে করি আপনি এমএস-ডস অক্ষর সেটটি উল্লেখ করছেন । এছাড়াও, আপনার উদাহরণটিতে Bদুটি এবং দ্বারগুলির মধ্যে একটি একক ইনপুট বিভক্ত হওয়া উচিত নয় ? এবং আমরা কি ধরে নিতে পারি যে কোথাও তারের অতিক্রম করার প্রয়োজন হবে না?
r3mainer

2
আপনি কীভাবে "কঠোরভাবে একটি ASCII আর্ট" বলছেন এবং আমি একটি অ-এসসিআইআই অক্ষর সেট ব্যবহার করা প্রয়োজন তা আমি পছন্দ করি।
কেন্ডল ফ্রে ফ্রে

@ স্কোয়ামিশোসিফ্রেজে আমার মনে হয় এসকিআই চার্ট বাড়ানোর পরে এখানে 128 এএসসিআইআই অক্ষর রয়েছে এবং 256 এখানে জুনিপার.নেট
মুকুল কুমার

@ স্কোয়ামিশোসিফ্রেজ: না, তিনি কয়েকটি বর্ধিত এএসসিআইআই চরিত্রকে উল্লেখ করেছেন । আমি এটি স্পষ্ট করতে প্রশ্ন সম্পাদনা করেছি। প্রসারিত ASCII- এ সমস্ত সাত-বিট ASCII অক্ষর পাশাপাশি কিছু অন্যান্য অক্ষর অন্তর্ভুক্ত রয়েছে।
প্রোগ্রামএফক্স

1
বক্স-অঙ্কন চরিত্রগুলি ব্যবহার করার প্রয়োজনীয়তা দেওয়া হয়েছে, এটির ─│চেয়েও অদ্ভুত বলে মনে হচ্ছে যে আপনি সংযোগগুলি তৈরি করছেন ─┤
পিটার টেলর

উত্তর:


16

সি ++ 11

শেষ হয়েছে। এবং এটি আমাকে কেবল দিনের বেশিরভাগ সময় নিয়েছিল।

আমি কোড এবং নমুনা আউটপুট তালিকাভুক্ত করার আগে কিছু দ্রুত নোট:

এই প্রোগ্রামটি সমর্থন করে এমন জিনিসগুলি

  • পদগুলির যে কোনও সংখ্যক ইনপুটগুলির সাথে প্রতিটি
  • ইনপুটগুলি পুনরায় ব্যবহার করা হচ্ছে
  • যখন কেবল একটি ইনপুট উপস্থিত থাকে তখন ও / অথবা গেটের উপস্থাপনা ছাড়াই
  • কোডেজ 437 লাইন-অঙ্কন অক্ষর এবং 7-বিট ASCII- বান্ধব অক্ষর উভয় ব্যবহার করুন (-ডিসিপি 437 বা আপনার সংকলকের সমতুল্য কোডেজ 437 সমর্থনের জন্য যা কিছু রয়েছে)

এই প্রোগ্রামটি সমর্থন করে না এমন বিষয়গুলি

  • প্রথম বন্ধনীর সাথে গ্রুপিং (কারণ, গুরুত্ব সহকারে?)
  • একাধিক নোটিং
  • কোনও শ্বেত স্পেস যা একটি সরল ASCII স্থান নয়
  • যথাযথ গল্ফিকেশন (যদিও আমি সমস্ত মন্তব্য স্পিরিটে সরিয়ে দিয়েছি)
  • সনে কোডিং অনুশীলন
  • ইনপুট পার্সিং কোড দিয়ে চোখের যোগাযোগ করা
  • পোর্টেবল, ইউনিকোড লাইন-অঙ্কন অক্ষর। আমি ইউনিকোড সমর্থন করতে পারিনি কারণ রেন্ডারিং লজিক একটি দ্বিমাত্রিক charবাফার "ডাউন" আঁকতে সক্ষম হওয়ার উপর নির্ভর করে ।

কোড

#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <stdexcept>
#include <set>
#include <map>
#include <valarray>
#include <cmath>

using namespace std;

vector<string> split(const string str, const string delim)
{
    vector<string> v;

    set<char> d;
    for (char c : delim) d.insert(c);

    string current {};
    for (char c : str)
    {
        if (d.find(c) != d.end())
        {
            v.push_back(current);
            current = "";
        }
        else
        {
            current += c;
        }
    }
    v.push_back(current);

    return v;
}

using Input = string;
struct TermInput
{
    Input name;
    int ypos;
    bool neg;
};
using Term = vector<TermInput>;
using Expr = vector<Term>;

#ifdef CP437
constexpr char VERT    = '\xB3';
constexpr char HORIZ   = '\xC4';
constexpr char RBRANCH = '\xC3';
constexpr char LUP     = '\xD9';
constexpr char LDOWN   = '\xBF';
constexpr char RUP     = '\xC0';
constexpr char RDOWN   = '\xDA';
#else
constexpr char VERT    = '|';
constexpr char HORIZ   = '-';
constexpr char RBRANCH = '}';
constexpr char LUP     = '\'';
constexpr char LDOWN   = '.';
constexpr char RUP     = '`';
constexpr char RDOWN   = ',';
#endif

string repeat(string s, int n)
{
    stringstream ss;
    for (int i = 0; i < n; i++)
    {
        ss << s;
    }

    return ss.str();
}
string repeat(char c, int n)
{
    stringstream ss;
    for (int i = 0; i < n; i++)
    {
        ss << c;
    }

    return ss.str();
}

enum class Direction
{
    RIGHT,
    DOWN
};

void matrixPut(char *matrix, int h, int w, int x, int y, const string s, Direction dir)
{
    if (x >= w || y >= h)
    {
        stringstream ss;
        ss << "matrixPut: point (" << x << ", " << y << ") out of matrix bounds!";
        throw new out_of_range(ss.str());
    }

    char *ins = matrix + (y * w) + x;
    char *end = matrix + (h * w);
    for (char c : s)
    {
        if (ins >= end) break;
        *ins = c;

        if (dir==Direction::RIGHT)
        {
            ins++;
        }
        else
        {
            ins += w;
        }
    }
}

void matrixPrint(char *matrix, int h, int w)
{
    for (int i = 0; i < (h * w); i++)
    {
        cout << matrix[i];
        if ((i+1)%w == 0) cout << endl;
    }
}

int main (int argc, char *argv[])
{
    string expression;

    if (argc == 1)
    {
        cout << "Enter expression:" << endl;
        getline(cin, expression);
    }
    else
    {
        expression = argv[1];
    }

    expression.erase(remove(expression.begin(), expression.end(), ' '), expression.end());

    Expr expr {};
    auto inputs = set<Input>();
    auto termInputs = multimap<Input, TermInput>();

    int inputYPos = 0;

    auto e = split(expression, "+");
    for (string term : e)
    {
        Term currTerm {};

        auto t = split(term, "*");
        for (string in : t)
        {
            bool neg = false;
            if (in.back() == '\'')
            {
                in.pop_back();
                neg = true;
            }

            Input currInput {in};
            inputs.insert(currInput);

            TermInput ti {currInput, inputYPos, neg};
            currTerm.push_back(ti);

            termInputs.insert(pair<Input, TermInput>{in, ti});
            inputYPos++;
        }

        expr.push_back(currTerm);
        inputYPos++;
    }


    int height = inputs.size() + termInputs.size() + expr.size() - 1;

    int width = 0;

    width += max_element(inputs.begin(), inputs.end(), [](Input a, Input b){ return a.length() < b.length(); })->length() + 2;
    int inputWidth = width;
    width += inputs.size()*2;

    int notAndStart = width;

    width += 7;
    width += expr.size()+1;

    int orStart = width;

    width += 4;

    width += 4;

    width += expression.length();

    char matrix[height * width];
    for (int i = 0; i < height*width; i++) matrix[i] = ' ';

    int  baseY = inputs.size();

    {
        int x = width - 4 - expression.length();
        int y = baseY + ((height-baseY) / 2);
        matrixPut(matrix, height, width, x, y, repeat(HORIZ, 4) + expression, Direction::RIGHT);
    }

    {
        int x = orStart;
        int y = baseY + (height-baseY)/2 - expr.size()/2;

        if (expr.size() == 1)
        {
            matrixPut(matrix, height, width, x, y, repeat(HORIZ, 4), Direction::RIGHT);
        }
        else {
            matrixPut(matrix, height, width, x  , y, repeat(HORIZ, expr.size()), Direction::DOWN);
            matrixPut(matrix, height, width, x+1, y, repeat(VERT , expr.size()), Direction::DOWN);
            matrixPut(matrix, height, width, x+2, y, repeat('O'  , expr.size()), Direction::DOWN);
            matrixPut(matrix, height, width, x+3, y, repeat('R'  , expr.size()), Direction::DOWN);
        }
    }

    {
        int x = notAndStart;
        int y = baseY;
        for (Term t : expr)
        {
            string layer[7];
            for (TermInput ti : t)
            {
                layer[0] += HORIZ;
                layer[1] += (ti.neg ? '>' : HORIZ);
                layer[2] += (ti.neg ? 'o' : HORIZ);
                layer[3] += HORIZ;
                layer[4] += (t.size() > 1 ? VERT : HORIZ);
                layer[5] += (t.size() > 1 ? '&' : HORIZ);
                layer[6] += (t.size() > 1 ? '&' : HORIZ);
            }

            for (int i = 0; i < 7; i++)
            {
                matrixPut(matrix, height, width, x+i, y, layer[i], Direction::DOWN);
            }

            y += t.size() + 1;
        }
    }

    {
        int x = 0;
        int y = 0;

        for (Input i : inputs)
        {
            string str = i + ": ";
            str += repeat(HORIZ, inputWidth - str.length());

            matrixPut(matrix, height, width, x, y, str, Direction::RIGHT);

            y++;
        }
    }

    {
        int x = inputWidth;
        int num = 0;
        int offset = inputs.size() * 2 - 1;

        for (Input in : inputs)
        {
            int y = 0;
            int len = inputs.size() * 2 - 1;
            auto it = inputs.find(in);
            while (it != inputs.begin())
            {
                it--;
                y++;
                len -= 2;
            }
            matrixPut(matrix, height, width, x, y, repeat(HORIZ, len) + LDOWN, Direction::RIGHT);
        }

        for (Input in : inputs)
        {
            auto yBreakRange = termInputs.equal_range(in);
            valarray<int> yBreaks(termInputs.count(in));
            int idx = 0;
            for (auto ti = yBreakRange.first; ti != yBreakRange.second; ti++)
            {
                yBreaks[idx++] = baseY + ti->second.ypos;
            }

            for (int y : yBreaks)
            {
                matrixPut(matrix, height, width, x+offset, y, repeat(HORIZ, inputs.size()*2 - offset), Direction::RIGHT);
            }

            int y = num + 1;
            int maxBreak = yBreaks.max();
            string branch = repeat(VERT, maxBreak - y + 1);

            for (int i : yBreaks)
            {
                branch[i-y] = RBRANCH;
            }
            branch.back() = RUP;

            matrixPut(matrix, height, width, x+offset, y, branch, Direction::DOWN);

            offset -= 2;
            num++;
        }
    }

    {
        int x = notAndStart + 7;
        int outY = baseY + (height-baseY)/2 - expr.size()/2;
        int breakx = expr.size()/2;

        for (Term t : expr)
        {
            int inY = baseY + (t.front().ypos + t.back().ypos) / 2;

            matrixPut(matrix, height, width, x, inY, repeat(HORIZ, abs(breakx)+1), Direction::RIGHT);

            matrixPut(matrix, height, width, x+abs(breakx)+1, outY, repeat(HORIZ, expr.size()-abs(breakx)), Direction::RIGHT);

            if (inY < outY)
            {
                string branch = LDOWN + repeat(VERT, outY-inY-1) + RUP;
                matrixPut(matrix, height, width, x+abs(breakx)+1, inY, branch, Direction::DOWN);
            }
            else if (inY > outY)
            {
                string branch = RDOWN + repeat(VERT, inY-outY-1) + LUP;
                matrixPut(matrix, height, width, x+abs(breakx)+1, outY, branch, Direction::DOWN);
            }

            outY++;
            breakx--;
        }
    }

    cout << endl;
    matrixPrint(matrix, height, width);
    cout << endl;
}

নমুনা আউটপুট

$ ./gates "A'*B'+B*C"

A: -----.
B: ---. |
C: -. | |
    | | `->o-|&&--.
    | }--->o-|&&  `-|OR
    | |          ,--|OR----A'*B'+B*C
    | `------|&&-'
    `--------|&&

$ ./gates "A*B'*C+B*D'+F*C'*D+G*E*A'+F"

A: -------------.
B: -----------. |
C: ---------. | |
D: -------. | | |
E: -----. | | | |
F: ---. | | | | |
G: -. | | | | | |
    | | | | | | }----|&&
    | | | | | }--->o-|&&---.
    | | | | }--------|&&   |
    | | | | | | |          |
    | | | | | `------|&&--.|
    | | | }------->o-|&&  ||
    | | | | |   |         |`---|OR
    | }--------------|&&  `----|OR
    | | | | `----->o-|&&-------|OR----A*B'*C+B*D'+F*C'*D+G*E*A'+F
    | | | `----------|&&  ,----|OR
    | | |       |         |,---|OR
    `----------------|&&  ||
      | `------------|&&--'|
      |         `->o-|&&   |
      |                    |
      `--------------------'

নমুনা আউটপুট (সিপি 437 সক্ষম সহ)

A: ─────────────┐
B: ───────────┐ │
C: ─────────┐ │ │
D: ───────┐ │ │ │
E: ─────┐ │ │ │ │
F: ───┐ │ │ │ │ │
G: ─┐ │ │ │ │ │ │
    │ │ │ │ │ │ ├────│&&
    │ │ │ │ │ ├───>o─│&&───┐
    │ │ │ │ ├────────│&&   │
    │ │ │ │ │ │ │          │
    │ │ │ │ │ └──────│&&──┐│
    │ │ │ ├───────>o─│&&  ││
    │ │ │ │ │   │         │└───│OR
    │ ├──────────────│&&  └────│OR
    │ │ │ │ └─────>o─│&&───────│OR────A*B'*C+B*D'+F*C'*D+G*E*A'+F
    │ │ │ └──────────│&&  ┌────│OR
    │ │ │       │         │┌───│OR
    └────────────────│&&  ││
      │ └────────────│&&──┘│
      │         └─>o─│&&   │
      │                    │
      └────────────────────┘


এটি আমি চেয়েছি আউটপুট নয়, আপনার কঠোর পরিশ্রমের জন্য +1 (ব্যক্তিগতভাবে, আমি এটির প্রশংসা করি) yourআপনি আপনার ভাষার উল্লেখ করুন!
মুকুল কুমার

যশ। এটি সিপি 437 না খুব সুন্দর।
জোনাথন ভ্যান মাত্রে

আমি উপরের প্রতিক্রিয়ার ভিত্তিতে পোস্টটিতে কিছু কোড সম্পাদনা করেছি (কোড নয়)। আমি আমার সিস্টেমে কাজ করার জন্য মিনজিডাব্লুও পেয়েছি যাতে আমি এটি স্থানীয় সিপি 437 সমর্থন দিয়ে তৈরি করতে পারি, তাই আমি কিছু নমুনা আউটপুট ফর্ম যুক্ত করেছি added
curtmack

202 লাইনে আমি ভিজ্যুয়ালএক্সপ্রেসে সংকলন ত্রুটি পেয়েছি: int উচ্চতা এবং প্রস্থ প্রস্থ: এক্সপ্রেশনটির একটি ধ্রুবক মান থাকতে হবে। এছাড়াও আপনি নিখোঁজ ছিলেন#include <vector>
জ্যাক কোল

5

সি ++

ছি! 1 দিনের 12 ঘন্টা হয়েছে !!!
এই কোডটি কেবল অ্যারে পরিচালনা করে

ইনপুট (প্রকার)

  • কেবল এসওপি (পণ্যগুলির যোগফল) ফর্ম।
  • দু'টি ভেরিয়েবলের সাথে গুন যুক্ত করার শর্তাদি

    EXAMPLES :-
    
        A*B'+B*A+C*D  
    
        X*Y+Z'*A'*V*D+B*G+C'*A'  
    
  • পদ, ভেরিয়েবলের যে কোনও সংখ্যক হ্যান্ডেল করতে পারে।

    কোড: -

    #include<iostream>
    using namespace std;
    int main()
    {
    int i,j,k,l,m=0;
    char arr[80][80],expr[45];
    cout<<"enter the SOP(Sum Of products) expression : ";
    cin>>expr;
    cout<<"\n\n";
    for(i=0;expr[i]!='\0';i++)
    if(expr[i]=='*')m++;
    for(i=0;i<80;i++)
        for(j=0;j<80;j++)
            arr[i][j]=' ';
    for(i=0,j=0;i<80,expr[j]!='\0';j++)
    {
        if(expr[j]<=90&&expr[j]>=65||expr[j]<=122&&expr[j]>=97)
        {
            arr[i][0]=expr[j];
            i+=2;
        }
    }
    for(i=0,j=1;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j-1]<=90&&arr[i][j-1]>=65||arr[i][j-1]<=122&&arr[i][j-1]>=97)
        {
            for(k=0;k<7;k++)
                arr[i][j+k]=196;
            arr[i][j+k]=180;
        }
    }
    for(i=0,j=0;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j]==(char)180&&arr[i][j+1]==' ')
        {
            arr[i][j+1]=38;
        }
    }
    for(i=0,j=0,k=1;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i-1][j]==(char)180&&arr[i+1][j]==(char)180)
        {
            if(arr[i-1][j+1]==(char)38&&arr[i+1][j+1]==(char)38&&k)
            {
                arr[i][j]=179;arr[i][j+1]=38;
                for(l=2;l<4;l++)
                {
                    arr[i][j+l]=196;
                }
                k--;
            }
            else if(k==0)
            {
                k=1;
            }
        }
    }
    l=m;
    for(i=0,j=0;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j-1]==(char)196&&arr[i][j+1]==' '&&arr[i][j-2]==(char)38)
            {
            if(arr[i+3][j-2]==(char)38)
            {
                for(k=0;k<l;k++)
                    arr[i][j+k]=(char)196;
                arr[i][j+k-1]=(char)191;
    
                l--;
            }
            else
            {
                for(k=0;k<m;k++)
                arr[i][j+k]=(char)196;
            }
        }
    }
    for(i=0,j=0,k=1;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j]==(char)191&&arr[i][j-1]==(char)196)
        {
            for(;arr[i+k][j]==' ';k++)
            {
                arr[i+k][j]=(char)179;
            }
        k=1;
        }
    }
    for(i=0,j=0;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j]==(char)179&&arr[i][j-3]==(char)38&&arr[i+1][j]==(char)196)
        {
            arr[i][j]=(char)192;
            for(k=1;arr[i-k][j+k]==(char)179;k++)
            {
                arr[i-k][j+k]=(char)192;
            }
        }
    }
    for(i=0,j=0;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j-1]==(char)192)
        {
            for(k=0;arr[i][j+k]!=' ';k++)
                arr[i][j+k]=(char)196;
        }
    }
    for(i=0,j=0;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j-1]==(char)192&&arr[i][j]==' '||arr[i][j-1]==(char)196&&arr[i][j]==' ')
        {
            arr[i][j]=(char)180;
            arr[i][j+1]='O';
            arr[i][j+2]='R';
        }
    }
    for(i=0,j=0;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j-1]=='R'&&arr[i+1][j-1]==' ')
        {
            for(k=0;k<3;k++)
                arr[i][j+k]=(char)196;
            j+=k;
            for(k=0;expr[k]!='\0';k++)
            {
                arr[i][j+k]=expr[k];
            }
        }
    }
    for(i=0,k=0;i<80,expr[k]!='\0';k++)
    {
        if((expr[k]<='z'&&expr[k]>='a'||expr[k]<='Z'&&expr[k]>='A'))
        {
            if(expr[k+1]=='\'')
                arr[i][1]='\'';
            i+=2;
        }
    }
    for(i=0,j=0;i<80;j++)
    {
        if(j==80){i++;j=0;}
        if(arr[i][j]=='\''&&arr[i][j+1]==(char)196)
        {
            arr[i][j+3]=(char)180;
            arr[i][j+4]=(char)62;
            arr[i][j+5]='o';
        }
    }
    for(i=0;i<35;i++)
    {
        for(j=0;j<80;j++)
            cout<<arr[i][j];
        cout<<'\n';
    }
    return 0;
    }  
    

আউটপুট

এখানে চিত্র বর্ণনা লিখুন

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