পানফিক্স নোটেশনে একটি এক্সপ্রেশন রূপান্তর করুন


19

আমি এসোলেংগুলি ব্রাউজ করছিলাম এবং এই ভাষাটি অনুসরণ করছিলাম: https://github.com/catseye/Quylthulg

এই ভাষা সম্পর্কে একটি আকর্ষণীয় বিষয় হ'ল এটি উপসর্গ, পোস্টফিক্স বা ইনফিক্স ব্যবহার করে না, এটি তিনটি ব্যবহার করে এটি "পানফিক্স" স্বরলিপি বলে।

এখানে একটি উদাহরণ। স্বাভাবিক পোতা প্রতিনিধিত্ব করতে 1+2panfix, এটা হয়ে: +1+2+। অপারেটরগুলি আগে, মাঝখানে এবং অপারেন্ডগুলির পরে উভয়ই কেমন তা লক্ষ্য করুন। অন্য একটি উদাহরণ (1+2)*3। এটি হয়ে যায় *+1+2+*3**অপারেশনগুলির ক্ষেত্রে তিনটি স্থানে কীভাবে রয়েছে তা আবার লক্ষ্য করুন Notice+1+2+ এবং 3

চ্যালেঞ্জ

আপনি যেমন অনুমান করতে পারেন, এই চ্যালেঞ্জটির আপনার কাজটি হ'ল ইনফিক্স থেকে পানফিক্সে রূপান্তর করা।

কয়েকটি স্পষ্টতা:

  • আপনাকে কেবলমাত্র চারটি বুনিয়াদি ক্রিয়াকলাপ মোকাবেলা করতে হবে: +-*/
  • আপনাকে কেবল বাইনারিগুলির অ্যানারি সংস্করণগুলির সাথে ডিল করতে হবে না
  • আপনাকে প্রথম বন্ধনী সামলাতে হবে
  • */তখনকার সাধারণ অগ্রাধিকার নিয়মগুলি অনুমান করুন +-এবং তাদের সকলের জন্য বাম সহযোগিতা করুন।
  • সংখ্যাগুলি নন-নেগেটিভ পূর্ণসংখ্যা হবে
  • ইনপুট এবং আউটপুট উভয় ক্ষেত্রে আপনার বিকল্প থাকতে পারে

পরীক্ষার মামলা

1+2  ->  +1+2+
1+2+3  ->  ++1+2++3+
(1+2)*3  ->  *+1+2+*3*
10/2*5  ->  */10/2/*5*
(5+3)*((9+18)/4-1)  ->  *+5+3+*-/+9+18+/4/-1-*

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোড !

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6), 160 বাইট

f=(s,t=s.replace(/[*-/]/g,"'$&'"),u=t.replace(/^(.*?)([*-9]+)'([*/])'([*-9]+)|([*-9]+)'([+-])'([*-9]+)|\(([*-9]+)\)/,"$1$3$2$3$4$3$6$5$6$7$6$8"))=>t==u?t:f(s,u)

সমস্ত অপারেটরকে উদ্ধৃতি দিয়ে কাজ করে (যা তাদের পূর্বে চরিত্রের কোড দেয় *), তারপরে উপলভ্য '*'বা '/'ক্রিয়াকলাপ '+'বা '-'অপারেশন বা ()গুলি অনুসন্ধান করে এবং এর প্যানফিক্স স্বরলিপি দিয়ে প্রথমটিকে প্রতিস্থাপন করে। উদাহরণ:

(5+3)*((9+18)/4-1)
(5'+'3)'*'((9'+'18)'/'4'-'1)
(+5+3+)'*'((9'+'18)'/'4'-'1)
+5+3+'*'((9'+'18)'/'4'-'1)
+5+3+'*'((+9+18+)'/'4'-'1)
+5+3+'*'(+9+18+'/'4'-'1)
+5+3+'*'(/+9+18+/4/'-'1)
+5+3+'*'(-/+9+18+/4/-1-)
+5+3+'*'-/+9+18+/4/-1-
*+5+3+*-/+9+18+/4/-1-*

3

জাভাস্ক্রিপ্ট (ES6), 285 282 281 267 251 243 241 238 234 232 231 বাইট

~ 15 ধন্যবাদ বাইট নিল

f=(I,E=I.match(/\d+|./g),i=0)=>(J=T=>T.map?T.map(J).join``:T)((R=(H,l=(P=_=>(t=E[i++])<")"?R(0):t)(),C,F)=>{for(;(C=P())>")"&&(q=C>"*"&&C<"/")*H-1;)F=q+H?l=[C,l,C,P(),C]:F?l[3]=[C,l[3],C,R(1),C]:l=R(1,l,i--)
i-=C>")"
return l})(0))

জাভাস্ক্রিপ্টে এটি গণিতের চেয়ে কিছুটা শক্ত। এটি মূলত একটি অতিরিক্ত-বিশেষজ্ঞ এবং গল্ফ অপারেটর-অগ্রাধিকার পার্সার

অবৈধ ইনপুটগুলিতে স্ট্যাকের ওভারফ্লোগুলি সৃষ্টি করে।

ডেমো

Ungolfed

convert = input => {
  tokens = input.match(/\d+|./g);
  i = 0;
  parse_token = () => (token = tokens[i++]) == "(" ? parse_tree(false) : token;
  parse_tree = (mul_div_mode, left = parse_token()) => {
    while ((oper = parse_token()) != ")" && !((is_plus_minus = oper == "+" || oper == "-") && mul_div_mode)) {
      if (is_plus_minus || mul_div_mode)
        left = [oper, left, oper, parse_token(), oper];
      else if (non_first)
        left[3] = [oper, left[3], oper, parse_tree(true), oper];
      else
        left = parse_tree(true, left, i--);
      non_first = true;
    }
    if (oper != ")")
      i--;
    return left;
  };
  format_tree = tree => tree.map ? tree.map(format_tree).join("") : tree;
  return format_tree(parse_tree(false));
}

S.split``হওয়া উচিত [...S], যদিও এটি /\d+|./gআপ-ফ্রন্টে মিলতে এবং পরিবর্তে এটির পক্ষে কাজ করতে সহায়তা করতে পারে ।
নীল

@ নীল ধন্যবাদ আমি এটি খতিয়ে দেখব।
পূর্কাকুডারী

2

ম্যাথামেটিকাল, 203 195 বাইট

এটি সম্ভবত দক্ষের চেয়ে কম, তবে কাজটি করা বলে মনে হচ্ছে।

Function[f,ReleaseHold[(Inactivate@f/._[Plus][a_,b_/;b<0]:>a~"-"~-b//Activate@*Hold)//.a_/b_:>a~"/"~b/.{a_Integer:>ToString@a,Plus:>"+",Times:>"*"}]//.a_String~b_~c_String:>b<>a<>b<>c<>b,HoldAll]

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

ব্যাখ্যা: সম্পূর্ণ অভিব্যক্তিটিকে গাছ হিসাবে ব্যাখ্যা করার পক্ষে এটি যথেষ্ট সহজ:

গাছ

এই পর্যায়ে অপারেটরগুলি (প্রতিটি নোড যা একটি পাতা নয়) আর অপারেটর নয়, তারা আসলে স্ট্রিংগুলিতে রূপান্তরিত হয়েছে "+"। পূর্ণসংখ্যাগুলিও স্ট্রিংগুলিতে নিক্ষেপ করা হয়। তারপরে পুনরাবৃত্তি প্রতিস্থাপনের নিয়মটি প্রতিটি নোডকে পানফিক্সে ঠিক দুটি পাতায় রূপান্তরিত করেparent-leaf1-parent-leaf2-parent । কিছু পুনরাবৃত্তির পরে গাছটি একটি স্ট্রিংয়ে হ্রাস পায়।

বাইট কাউন্টের প্রধান ক্ষতি হ'ল ম্যাথমেটিকা ​​ব্যাখ্যা করে

5 - 4 -> 5 + (-4)
9 / 3 -> 9 * (3^(-1))

এবং এটি পার্সিংয়ের সময়ও ঘটে।

কিছুটা নিচে গল্ফ করা, যেহেতু নিদর্শনটিও a_/b_ব্যাখ্যা করা হয় a_ * (b_)^(-1)। এছাড়াও অন্য কোথাও কিছু ছোটখাট অপ্টিমাইজেশন।


1

প্রোলোগ, 87 বাইট

x(T)-->{T=..[O,A,B]}->[O],x(A),[O],x(B),[O];[T].
p:-read(T),x(T,L,[]),maplist(write,L).

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

ব্যাখ্যা

প্রোলোগে গাণিতিক অপারেটরগুলি সাধারণত টুপল কনস্ট্রাক্টর হিসাবে ব্যাখ্যা করা হয় । যাইহোক, তারা প্রকৃত পাটিগণিত অপারেটরগুলির উপর ভিত্তি করে ঠিক একই প্রাধান্য বিধিগুলি পালন করে; আপনি গঠন করতে পারেন tuples সঙ্গে পোতা স্বরলিপি, এবং +এবং -বাঁধাই করা কম শক্তভাবে *এবং /সঙ্গে অগ্রগণ্যতা গ্রহণ মনোভাব দলের মধ্যে ডানে বামে। এই প্রশ্নটি ঠিক তাই জিজ্ঞাসা করে; সুতরাং, আমরা ইনপুট থেকে পুরো নেস্টেড টুপল পড়তে পারি এবং এর ইতিমধ্যে সঠিক কাঠামো রয়েছে। এটা কি pকরে।

এর পরে, আমাদের এটি Panfix স্বরলিপি রূপান্তর করা প্রয়োজন। xকনস্ট্রাকটর এবং পূর্ণসংখ্যার একটি panfixed তালিকায় ইনপুট পরিবর্তন করে, এবং একটি ইংরেজী বাক্য প্রায় সরাসরি যেমন পড়া যায়: " xএর T: যদি Tকন্সট্রাকটর সঙ্গে একটি tuple হয় Oএবং আর্গুমেন্ট A, Bতারপর, O, xএর A, O, xএর B, Oঅন্য T"। শেষ অবধি, আমাদের কেবল কোনও বিভাজক ছাড়াই তালিকাটি মুদ্রণ করতে হবে (অর্থাত্ তালিকার প্রতিটি উপাদানকে maplistকল করতে ব্যবহার করে write)।

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

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