এলোমেলো গণিতের এক্সপ্রেশন তৈরি করা হচ্ছে


16

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

উদাহরণ:

এখানে আমি এলোমেলোভাবে উত্পন্ন করতে চাই এমন কয়েকটি উদাহরণ প্রকাশ করুন:

4 + 2                           [easy]
3 * 6 - 7 + 2                   [medium]
6 * 2 + (5 - 3) * 3 - 8         [hard]
(3 + 4) + 7 * 2 - 1 - 9         [hard]
5 - 2 + 4 * (8 - (5 + 1)) + 9   [harder]
(8 - 1 + 3) * 6 - ((3 + 7) * 2) [harder]

সহজ এবং মাঝারি বেশী প্রশংসনীয় সোজা সম্মুখগামী হয়। এলোমেলো intএলোমেলো অপারেটর, এখানে পাগল কিছুই দ্বারা পৃথক s। তবে এমন শক্তিশালীশক্ত উদাহরণের একটি তৈরি করতে পারে এমন কিছু নিয়ে শুরু করতে আমার কিছুটা সমস্যা হচ্ছে । আমি নিশ্চিত না যে একটি একক অ্যালগরিদম আমাকে শেষ দুটি দিতে পারে।

আমি যা বিবেচনা করছি:

আমি এই ধারণাগুলি চেষ্টা করে বলতে পারি না , কারণ আমি আসলে খুব বেশি সময় নষ্ট করতে চাইনি এমন দিকে যেতে যেদিকে প্রথম কাজ করার সুযোগ নেই। তবে তবুও, আমি কয়েকটি সমাধান সম্পর্কে ভেবেছিলাম:

  • গাছ ব্যবহার করা
  • নিয়মিত অভিব্যক্তি ব্যবহার করা
  • একটি পাগল "টাইপ" লুপ ব্যবহার করা (অবশ্যই সবচেয়ে খারাপ)

আমি যা খুঁজছি:

আমি বিবেচনা করতে পারি যে আপনি আমার বিবেচনা করা সমাধানগুলি এবং আপনার নিজের ধারণাগুলির মধ্যে আপনি কীভাবে সবচেয়ে ভাল বিশ্বাস করেন।

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

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

আমি ভাষা-সম্পর্কিত কোনও বিষয় খুঁজছি না, তবে রেকর্ডের জন্য, আমি এটিকে উদ্দেশ্যমূলক-সি-তে বাস্তবায়ন করার কথা ভাবছি, কারণ এই ভাষাটি আমি সম্প্রতি সবচেয়ে বেশি কাজ করছি।

এই উদাহরণগুলিতে :অপারেটরটিকে অন্তর্ভুক্ত করা হয়নি , কারণ আমি কেবলমাত্র intগুলি চালাতে চাই এবং এই অপারেটরটি অনেকগুলি যাচাইকরণ যুক্ত করে। যদি আপনার উত্তরটি এটিকে পরিচালনা করে একটি সমাধান দেয় তবে তা দুর্দান্ত।

যদি আমার প্রশ্নটির কোনও ব্যাখ্যা প্রয়োজন হয়, তবে মন্তব্যগুলিতে জিজ্ঞাসা করুন। আপনার সাহায্যের জন্য ধন্যবাদ.


2
হুঁ, ফিটনেস ফাংশন যুক্ত করুন এবং দেখে মনে হচ্ছে আপনি জেনেটিক প্রোগ্রামিংয়ের দিকে যাচ্ছেন ।
ফিলিপ

উত্তর:


19

আপনার সমস্যার একটি তাত্ত্বিক ব্যাখ্যা এখানে।

আপনি কোনও প্রদত্ত ভাষা থেকে শব্দগুলি (বীজগণিতের প্রকাশ) এলোমেলোভাবে তৈরি করতে দেখছেন (সমস্ত সিন্ট্যাক্টিক্যালি সঠিক বীজগণিতিক এক্সপ্রেশনগুলির সীমাহীন সেট)। সরলিকৃত বীজগণিত ব্যাকরণের একটি আনুষ্ঠানিক বর্ণনা এখানে কেবল সংযোজন এবং গুণকে সমর্থন করে:

E -> I 
E -> (E '+' E)
E -> (E '*' E)

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

  1. Eআউটপুট শব্দের একক প্রতীক হিসাবে শুরু করুন ।
  2. নন-টার্মিনাল প্রতীকগুলির মধ্যে এলোমেলোভাবে একসাথে চয়ন করুন।
  3. প্রতীকটির জন্য নির্ধারিত যেকোন একটি উত্পাদনের নিয়মটি এ জাতীয়ভাবে নির্বাচন করুন এবং এটি প্রয়োগ করুন।
  4. কেবলমাত্র টার্মিনাল প্রতীকগুলি বাকি না হওয়া পর্যন্ত পদক্ষেপগুলি 2 - 4 এর পুনরাবৃত্তি করুন।
  5. সমস্ত টার্মিনাল প্রতীক Iএলোমেলো পূর্ণসংখ্যার দ্বারা প্রতিস্থাপন করুন।

এই অ্যালগরিদমের প্রয়োগের উদাহরণ এখানে রয়েছে:

E
(E + E)
(E + (E * E))
(E + (I * E))
((E + E) + (I * E))
((I + E) + (I * E))
((I + E) + (I * I))
((I + (E * E)) + (I * I))
((I + (E * I)) + (I * I))
((I + (I * I)) + (I * I))
((2 + (5 * 1)) + (7 * 4))

আমি তোমাদের কাছে এক ইন্টারফেসের সাথে একটি অভিব্যক্তি প্রতিনিধিত্ব করতে বেছে নেবেন অনুমান Expressionযা শ্রেণীর দ্বারা বাস্তবায়িত হয় IntExpression, AddExpressionএবং MultiplyExpression। দ্বিতীয়টির পরে একটি leftExpressionএবং ছিল rightExpression। সকল Expressionউপশ্রেণী একটি বাস্তবায়ন প্রয়োজন evaluateপদ্ধতি, যা ট্রী কাঠামো এই বস্তু দ্বারা সংজ্ঞায়িত উপর যাও recursively কাজ করে এবং কার্যকরভাবে প্রয়োগ যৌগিক প্যাটার্ন

নোট করুন যে উপরের ব্যাকরণ এবং অ্যালগরিদমের জন্য, Eটার্মিনাল প্রতীক Iহিসাবে p = 1/3একটি এক্সপ্রেশনটি প্রসারিত হওয়ার সম্ভাবনা কেবল তখনই , যখন আরও দুটি অভিব্যক্তিতে একটি এক্সপ্রেশনকে প্রসারিত করার সম্ভাবনা থাকে 1-p = 2/3। সুতরাং, উপরের অ্যালগরিদম দ্বারা উত্পাদিত একটি সূত্রে প্রত্যাশিত সংখ্যার সংখ্যাটি আসলে অসীম। একটি অভিব্যক্তির প্রত্যাশিত দৈর্ঘ্য পুনরাবৃত্ত সম্পর্কের সাপেক্ষে

l(0) = 1
l(n) = p * l(n-1) + (1-p) * (l(n-1) + 1)
     = l(n-1) + (1-p)

যেখানে উত্পাদন বিধি প্রয়োগের l(n)পরে পাটিগণিতের প্রকাশের প্রত্যাশিত দৈর্ঘ্য নির্দেশ করে n। সুতরাং আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি pনিয়মের পরিবর্তে উচ্চ সম্ভাবনা বরাদ্দ করুন যাতে আপনি উচ্চ সম্ভাবনার E -> Iসাথে মোটামুটি ছোট ভাব প্রকাশ করেন।

সম্পাদনা : আপনি যদি উদ্বিগ্ন হন যে উপরের ব্যাকরণটি অনেকগুলি প্যারেনসিস তৈরি করে তবে সেবাস্তিয়ান নেগ্রাসজাসের উত্তরটি দেখুন , যার ব্যাকরণটি খুব সুন্দরভাবে এই সমস্যাটি এড়িয়ে চলে।


ওহো .. এ দুর্দান্ত, আমি এটিকে অনেক পছন্দ করি, ধন্যবাদ! সঠিক পছন্দটি করার জন্য প্রস্তাবিত সমস্ত সমাধানগুলিতে আমাকে আরও কিছুটা দেখতে হবে। আবারও ধন্যবাদ, দুর্দান্ত উত্তর।
rdurand

আপনার সম্পাদনার জন্য ধন্যবাদ, এটি এমন কিছু যা আমি ভাবিনি। আপনি কি মনে করেন যে 2-4 পদক্ষেপগুলি আপনি কতবার যেতে পারছেন তা সীমাবদ্ধ করা কাজ করতে পারে? বলুন, 2-4 পদক্ষেপের 4 (বা যাই হোক না কেন) পুনরাবৃত্তির পরে, কেবল E-> আই বিধিটি মঞ্জুর করবেন ?
rdurand

1
@ আরউরান্ড: হ্যাঁ, অবশ্যই m2-4 এর পুনরাবৃত্তির পরে বলুন , আপনি পুনরাবৃত্তির উত্পাদন বিধিগুলি 'উপেক্ষা' করেন। এটি প্রত্যাশিত আকারের একটি অভিব্যক্তি নিয়ে যাবে l(m)। তবে লক্ষ করুন, এটি (তাত্ত্বিকভাবে) প্রয়োজনীয় নয়, যেহেতু প্রত্যাশিত আকার অসীম হলেও অসীম প্রকাশের সম্ভাবনা শূন্য। তবে, আপনার পদ্ধতিটি অনুশীলনের কারণে অনুকূল, স্মৃতিশক্তি কেবল সীমাবদ্ধ নয়,
ছোটও

আপনার সমাধানের সাহায্যে, আমি এটি তৈরি করার সময় কোনও উপায় প্রকাশ করতে পারি না it কোন আছে? আমি এরপরেও এটি সমাধান করতে পারি, তবে আমি তা না করাই।
rdurand

যদি আপনি এটি চান, তবে বেস বর্ণটি হিসাবে এলোমেলো সংখ্যার সাথে কেন শুরু করবেন না এবং এলোমেলোভাবে এটি বিব্রত করে (পুনর্লিখন) ক্রিয়াকলাপে ব্লাবকে বর্ণিত পদ্ধতিতে ব্যবহার করবেন না কেন? তারপরে, কেবলমাত্র আপনার সম্পূর্ণ অভিব্যক্তির সমাধান হবে না, আপনি সহজেই অভিব্যক্তি গাছের প্রতিটি শাখার জন্য সাবস্ক্রিপশন পেতে পারেন।
মিকোয়াক

7

প্রথমত আমি প্রকৃতপক্ষে পোস্টফিক্স শিরোনামে প্রকাশ করেছি , আপনি সহজেই ইনফিক্সে রূপান্তর করতে পারেন বা আপনার এলোমেলো এক্সপ্রেশন তৈরির পরে মূল্যায়ন করতে পারেন, তবে পোস্টফিক্সে এটি করার অর্থ আপনার প্যারাথেসিস বা অগ্রাধিকার সম্পর্কে চিন্তা করার দরকার নেই।

আমি আপনার অভিব্যক্তিতে পরবর্তী অপারেটরের কাছে উপলব্ধ পদগুলির সংখ্যার চলমান পরিমাণও রাখব (ধরে নিই যে আপনি ক্ষতিকারক প্রকাশগুলি এড়াতে চান) অর্থাত্ এই জাতীয় কিছু:

string postfixExpression =""
int termsCount = 0;
while(weWantMoreTerms)
{
    if (termsCount>= 2)
    {
         var next = RandomNumberOrOperator();
         postfixExpression.Append(next);
         if(IsNumber(next)) { termsCount++;}
         else { termsCount--;}
    }
    else
    {
       postfixExpression.Append(RandomNumber);
       termsCount++;
     }
}

স্পষ্টতই এটি সিউডো কোড তাই পরীক্ষা করা হয় না / ভুলগুলিও থাকতে পারে এবং আপনি সম্ভবত একটি স্ট্রিং ব্যবহার করবেন না তবে কিছু বৈষম্যমূলক ইউনিয়নের স্ট্যাক ব্যবহার করুন


এটি বর্তমানে ধরে নিচ্ছে যে সমস্ত অপারেটর বাইনারি, তবে এটি বিভিন্ন আধ্যাত্মিক অপারেটরগুলির সাথে প্রসারিত করা মোটামুটি সহজ
জে.কে.

অনেক ধন্যবাদ. আমি আরপিএন ভাবিনি, এটি একটি ভাল ধারণা। আমি একটি উত্তর গ্রহণের আগে সমস্ত উত্তর সন্ধান করব, তবে আমি মনে করি আমি এই কাজটি করতে পারব।
rdurand

পোস্ট-ফিক্সের জন্য +1। আপনি স্ট্যাকের চেয়ে বেশি কিছু ব্যবহার করার প্রয়োজনীয়তা দূর করতে পারেন, যা আমি মনে করি গাছ তৈরির চেয়ে সহজ।
নীল

2
@rdurand পোস্ট-ফিক্সের সুবিধার অংশটির অর্থ হল আপনার অগ্রাধিকার সম্পর্কে চিন্তা করার দরকার নেই (এটি পোস্ট-ফিক্স স্ট্যাকটিতে যুক্ত করার আগে এটি ইতিমধ্যে বিবেচনা করা হয়েছে)। যার পরে, আপনি স্ট্যাকের মধ্যে পাওয়া প্রথম অপারেটরটিকে পপ না করা পর্যন্ত আপনি কেবল সমস্ত অপারেটরগুলি পপ করেন এবং তারপরে ফলাফলটিকে স্ট্যাকের দিকে ধাক্কা দেন এবং স্ট্যাকের শেষ মানটি পপ না করা পর্যন্ত আপনি এই পথে চালিয়ে যান।
নীল

1
@rdurand এক্সপ্রেশনটি 2+4*6-3+7পোস্ট-ফিক্স স্ট্যাকে রূপান্তরিত হয় + 7 - 3 + 2 * 4 6( স্ট্যাকের শীর্ষস্থানটি সবচেয়ে বেশি)। আপনি 4 এবং 6 বন্ধ করুন এবং অপারেটর প্রয়োগ করুন *, তারপরে আপনি 24 টি পিছনে চাপ দিন। তারপরে আপনি 24 এবং 2 এ পপ করুন এবং অপারেটর + প্রয়োগ করবেন, তারপরে আপনি 26 টি পিছনে চাপ দিন। আপনি এইভাবে চালিয়ে যান এবং আপনি সঠিক উত্তর পাবেন তা খুঁজে পাবেন। লক্ষ করুন যে, * 4 6হয় প্রথম স্ট্যাক শর্তাবলী। এর অর্থ এটি প্রথম সম্পাদিত হয় কারণ আপনি প্রথম বন্ধনীর প্রয়োজন ছাড়াই প্রাধান্য নির্ধারণ করেছেন।
নীল

4

ব্লাবের উত্তরটি একটি ভাল সূচনা, তবে তার আনুষ্ঠানিক ব্যাকরণটি অনেকগুলি পরকীয়া তৈরি করে।

এটি আমার গ্রহণ করা এখানে:

E -> I
E -> M '*' M
E -> E '+' E
M -> I
M -> M '*' M
M -> '(' E '+' E ')'

Eএকটি অভিব্যক্তি, Iএকটি পূর্ণসংখ্যা এবং Mএটি একটি বহির্গমন যা গুণনের ক্রিয়াকলাপের জন্য একটি যুক্তি।


1
ভাল এক্সটেনশন, এটি অবশ্যই কম বিশৃঙ্খল দেখাচ্ছে!
ব্লুব

আমি যেমন ব্লাবের উত্তরে মন্তব্য করেছি, আমি কিছু অযাচিত বন্ধনী রাখব। অ্যাড-অনের জন্য ধন্যবাদ এলোমেলোভাবে "কম এলোমেলো" করুন;)!
rdurand

3

"শক্ত" অভিব্যক্তির প্রথম বন্ধনীগুলি মূল্যায়নের ক্রমকে উপস্থাপন করে। সরাসরি প্রদর্শিত ফর্মটি সরাসরি উত্পন্ন করার চেষ্টা করার পরিবর্তে, কেবল এলোমেলো ক্রমে অপারেটরগুলির একটি তালিকা নিয়ে আসুন এবং সেখান থেকে প্রকাশের প্রদর্শন ফর্মটি পান।

নাম্বার: 1 3 3 9 7 2

অপারেটর: + * / + *

ফলাফল: ((1 + 3) * 3 / 9 + 7) * 2

ডিসপ্লে ফর্মটি ডাইভারিং করা অপেক্ষাকৃত সরল পুনরাবৃত্তির অ্যালগরিদম।

আপডেট: ডিসপ্লে ফর্মটি তৈরি করতে এখানে পার্লের একটি অ্যালগরিদম। কারণ +এবং *বিতরণযোগ্য, এটি opera অপারেটরগুলির জন্য শর্তগুলির ক্রম এলোমেলো করে। এটি একপাশে সমস্ত বিল্ডিং থেকে বন্ধনীগুলি রাখতে সহায়তা করে।

use warnings;
use strict;

sub build_expression
{
    my ($num,$op) = @_;

    #Start with the final term.
    my $last_num = pop @$num; 
    my $last_op = pop @$op;

    #Base case: return the number if there is just a number 
    return $last_num unless defined $last_op;

    #Recursively call for the expression minus the final term.
    my $rest = build_expression($num,$op); 

    #Add parentheses if there is a bare + or - and this term is * or /
    $rest = "($rest)" if ($rest =~ /[+-][^)]+$|^[^)]+[+-]/ and $last_op !~ /[+-]/);

    #Return the two components in a random order for + or *.
    return $last_op =~ m|[-/]| || rand(2) >= 1 ? 
        "$rest $last_op $last_num" : "$last_num $last_op $rest";        
}

my @numbers   = qw/1 3 4 3 9 7 2 1 10/;
my @operators = qw|+ + * / + * * +|;

print build_expression([@numbers],[@operators]) , "\n";

এই অ্যালগরিদমটি সর্বদা ভারসাম্যহীন গাছ উত্পাদন করে বলে মনে হয়: বাম শাখাটি গভীর, ডানদিকটি কেবল একটি একক সংখ্যা। প্রতিটি অভিব্যক্তির শুরুতে প্রচুর খোলার প্যারান থাকবে এবং ক্রিয়াকলাপটি সর্বদা বাম থেকে ডানে থাকবে right
স্ক্রিপ্টিন

আপনার উত্তরের জন্য ধন্যবাদ, এবং, এটি সাহায্য করে। তবে @ স্ক্রিপ্টিন, আমি বুঝতে পারি না যে আপনি এই উত্তরে কী পছন্দ করেন না? আপনি কিছুটা ব্যাখ্যা করতে পারেন?
rdurand

@ স্ক্রিপ্টিন, এটি ডিসপ্লে ক্রমের সাধারণ র্যান্ডমাইজেশনের সাথে স্থির করা যেতে পারে। আপডেট দেখুন।

@rdurand @ dan1111 আমি স্ক্রিপ্টটি চেষ্টা করেছি। বড় বাম সাবট্রির বিষয়টি স্থির, তবে উত্পন্ন গাছ এখনও খুব ভারসাম্যহীন। এই ছবিটি আমার অর্থ বোঝায়। এটি কোনও সমস্যা হিসাবে বিবেচিত হবে না তবে এটি এমন পরিস্থিতির দিকে পরিচালিত করে যেখানে স্যুপ এক্সপ্রেসনগুলি কখনই উত্পন্ন বাক্সে উপস্থাপন করা (A + B) * (C + D)হয় না এবং অনেকগুলি নেস্টেড পেরেনও রয়েছে are
স্ক্রিপ্টিন

3
@ স্ক্রিপ্টিন, এটি সম্পর্কে চিন্তাভাবনা করার পরে, আমি সম্মতি জানাই এটি একটি সমস্যা।

2

গাছের পদ্ধতির প্রসারিত করতে, আসুন প্রতিটি নোড হয় একটি পাতা বা বাইনারি এক্সপ্রেশন:

Node := Leaf | Node Operator Node

নোট করুন যে একটি পাতা এখানে এলোমেলোভাবে উত্পন্ন পূর্ণসংখ্যা।

এখন, আমরা এলোমেলোভাবে একটি গাছ তৈরি করতে পারি। প্রতিটি নোডের পাতাগুলির সম্ভাবনার বিষয়ে সিদ্ধান্ত নেওয়া আমাদের প্রত্যাশিত গভীরতা নিয়ন্ত্রণ করতে দেয়, যদিও আপনি সম্ভবত পরম সর্বোচ্চ গভীরতাও পেতে চান:

Node random_tree(leaf_prob, max_depth)
    if (max_depth == 0 || random() > leaf_prob)
        return random_leaf()

    LHS = random_tree(leaf_prob, max_depth-1)
    RHS = random_tree(leaf_prob, max_depth-1)
    return Node(LHS, RHS, random_operator())

তারপরে, গাছ মুদ্রণের জন্য সহজ নিয়ম হ'ল ()প্রতিটি পাত ছাড়াইয়ের অভিব্যক্তি চারপাশে মোড়ানো এবং অপারেটর অগ্রাধিকার সম্পর্কে উদ্বেগ এড়ানো উচিত।


উদাহরণস্বরূপ, আমি যদি আপনার শেষ নমুনা এক্সপ্রেশনটি প্রথম বন্ধনীরূপী করি:

(8 - 1 + 3) * 6 - ((3 + 7) * 2)
((((8 - 1) + 3) * 6) - ((3 + 7) * 2))

আপনি যে গাছটি উত্পন্ন করবে তা আপনি পড়তে পারেন:

                    SUB
                  /      \
               MUL        MUL
             /     6     /   2
          ADD          ADD
         /   3        3   7
       SUB
      8   1

1

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


আপনার উত্তরের জন্য ধন্যবাদ. গাছ সম্পর্কে আমার একই ধারণা ছিল, স্যুপ এক্সপ্রেসনগুলি মূল্যায়ন / পরীক্ষা করতে সক্ষম হয়েছি। আপনার সমাধান সম্পর্কে আপনি একটি ছোট্ট আরও কিছু বিবরণ দিতে পারেন? আপনি কীভাবে এমন একটি গাছ তৈরি করবেন (আসলে কীভাবে নয় তবে সাধারণ কাঠামোটি কী হবে)?
rdurand

1

ব্লাবের দুর্দান্ত উত্তরটি এখানে কিছুটা আলাদা:

আপনি এখানে যা তৈরি করার চেষ্টা করছেন তা হ'ল মূলত একটি পার্সার যা বিপরীতে পরিচালনা করে। আপনার সমস্যা এবং পার্সারের মধ্যে যা মিল রয়েছে তা প্রসঙ্গমুক্ত ব্যাকরণ , এটি ব্যাকাস-নওর আকারে :

digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
number ::= <digit> | <digit> <number>
op ::= '+' | '-' | '*' | '/'
expr ::= <number> <op> <number> | '(' <expr> ')' | '(' <expr> <op> <expr> ')'

পার্সারগুলি টার্মিনালের একটি স্ট্রিমের সাথে শুরু করে (আক্ষরিক টোকেনগুলি পছন্দ করে 5বা *) এবং এগুলিকে ননটার্মিনালগুলিতে (টার্মিনাল এবং অন্যান্য ননটারিনালগুলি সমন্বিত জিনিস যেমন numberবা হিসাবে op) একত্রিত করার চেষ্টা করে । আপনার সমস্যাটি অযৌক্তিকর সাথে শুরু হয় এবং বিপরীতে কাজ করে, যখন কেউ মুখোমুখি হয় তখন এলোমেলোভাবে "বা" (পাইপ) চিহ্নগুলির মধ্যে কিছু বাছাই করে এবং টার্মিনালে পৌঁছানো পর্যন্ত পুনরাবৃত্তভাবে প্রক্রিয়াটি পুনরাবৃত্তি করে।

অন্যান্য উত্তরগুলির মধ্যে দু'একটি পরামর্শ দিয়েছে যে এটি একটি গাছের সমস্যা, এটি এমন একটি নির্দিষ্ট সংকীর্ণ শ্রেণীর ক্ষেত্রে যেখানে এমন কোনও নন-টার্মিনাল নেই যা অন্য কোনও অযৌক্তিকের মাধ্যমে প্রত্যক্ষ বা অপ্রত্যক্ষভাবে তাদের উল্লেখ করে। ব্যাকরণ যেহেতু এটির অনুমতি দেয় তাই এই সমস্যাটি সত্যই একটি নির্দেশিত গ্রাফ । (অন্য একটি নিয়ন্ত্রকের মাধ্যমে অপ্রত্যক্ষ রেফারেন্সগুলিও এটিকে গণনা করে))

১৯৮০ এর দশকের শেষের দিকে ইউজনেটে স্পো নামে একটি প্রোগ্রাম প্রকাশিত হয়েছিল যা মূলত এলোমেলো ট্যাবলয়েড শিরোনাম তৈরির জন্য ডিজাইন করা হয়েছিল এবং এই "বিপরীত ব্যাকরণ" নিয়ে পরীক্ষার জন্য একটি দুর্দান্ত বাহন হিসাবে দেখা যায়। এটি টেম্পলেটগুলি পড়ে টার্মিনালের একটি এলোমেলো স্ট্রিম উত্পাদন নির্দেশ করে ope এর বিনোদনমূলক মানের বাইরে (শিরোনাম, দেশীয় সংগীত, উচ্চারণযোগ্য ইংলিশ গিব্বারিশ), আমি 26 বছরের পুরানো হওয়া সত্ত্বেও প্লেইন টেক্সট থেকে এক্সএমএল পর্যন্ত টেস্ট ডেটা তৈরির জন্য দরকারী এমন টেমপ্লেট লিখেছি 26 এবং কে অ্যান্ডআর সিতে লিখিত এবং একটি কুরুচিপূর্ণ টেম্পলেট ফর্ম্যাট রয়েছে, এটি কেবল সূক্ষ্ম সংকলন করে এবং বিজ্ঞাপন হিসাবে কাজ করে। আমি এমন একটি টেম্পলেট বেতার দিয়েছি যা আপনার সমস্যার সমাধান করে এবং এটি পেস্টবিনে পোস্ট করেছে যেহেতু এখানে প্রচুর পাঠ যুক্ত করা উপযুক্ত মনে হয় না।

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