সাধারণ বিপরীত পোলিশ নোটেশন প্রোগ্রামিং ভাষার জন্য কম্পাইলার অনুকূলিত করুন


24

বিবরণ

কালিমা প্রোগ্রামিং ল্যাঙ্গুয়েজ (আইপিএল) পোলিশ রিভার্স নোটেশন ব্যবহার করে। এটিতে নিম্নলিখিত আদেশগুলি রয়েছে:

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

আইপিএল কেবল পূর্ণসংখ্যার সাথে কাজ করে এবং সাধারণ গণনার জন্য ব্যবহৃত হয়। একটি আইপিএল প্রোগ্রাম এক লাইনে লেখা হয় এবং ফাঁক দিয়ে পৃথক করা হয়। খালি স্ট্রিং একটি বৈধ আইপিএল প্রোগ্রাম।

আইপিএল প্রোগ্রাম:

i i + o 

দুটি সংখ্যার ইনপুট দেয়, তাদের একসাথে যুক্ত করে ফলাফল আউটপুট করে।

ইনপুট নম্বর এবং পূর্ণসংখ্যা যা স্ট্যাকের দিকে ধাক্কা দেওয়া যায় সেগুলি [-999, 999] এর মধ্যে রয়েছে তবে আউটপুট যেকোনও হতে পারে। আপনার ভাষা যদি বড় সংখ্যা সমর্থন করে না তবে এটি ঠিক আছে।

ইনপুট / আউটপুট ফর্ম্যাট

আপনি যেকোন ইনপুট / আউটপুট ফর্ম্যাট চয়ন করতে পারেন যতক্ষণ না এটি বুঝতে / পড়ার / স্ট্রিং, তালিকা, টোকেন ইত্যাদির জন্য পরিষ্কার হয় clear

কার্য

আপনাকে কিছু আইপিএল প্রোগ্রাম দেওয়া আছে, আপনার এটি অপ্টিমাইজ করতে হবে (দৈর্ঘ্য হ্রাস):

i 12 + 3 + o d 2 3 + d

অপ্টিমাইজেশনের পরে হয়ে যাবে

i 15 + o

আপনাকে স্ট্যাকের অবস্থা সংরক্ষণ করতে হবে না, তবে মূল এবং অনুকূলিত কর্মসূচির জন্য ইনপুট এবং আউটপুটগুলির পরিমাণ এবং তাদের ক্রমটি মিলবে।

তাই আইপিএল প্রোগ্রাম:

-40 i * 2 * o i + 3 1 + o i 2 *

অপ্টিমাইজেশনের পরে হয়ে যাবে

i -80 * o i 4 o i

অথবা

-80 i * o i 4 o i

(মনে রাখবেন যে আপনাকে সমস্ত ইনপুটগুলি অপ্রাসঙ্গিক হলেও সংরক্ষণ করতে হবে)।

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

স্কোরিং

ডিফল্ট কোড-গল্ফ স্কোরিং।

আপডেট: @ স্যাঙ্কাইজিসের পরামর্শ অনুসারে খাঁটি কোড গল্ফ স্কোরিংয়ে স্কোরিং পরিবর্তন হয়েছে।

পরীক্ষার কেস:

ইনপুট:

(empty string)

সম্ভাব্য আউটপুট:

(empty string)

ইনপুট:

i 4 * 2 + 3 * 6 - o

সম্ভাব্য আউটপুট:

i 12 * o

ইনপুট:

1 1 + o

সম্ভাব্য আউটপুট:

2 o

ইনপুট:

i 2 + 3 + o d 2 3 + d

সম্ভাব্য আউটপুট:

i 5 + o

ইনপুট:

-40 i * 2 * o i + 3 1 + o i 2 *

সম্ভাব্য আউটপুট:

-80 i * o i 4 o i

ইনপুট:

i i 1 + i 1 + i 1 + i 1 + d d d d o 

সম্ভাব্য আউটপুট:

i i i i i d d d d o 

ইনপুট:

i i i 0 * * * o

সম্ভাব্য আউটপুট:

i i i 0 o

ইনপুট:

i i i 1 * * * o

সম্ভাব্য আউটপুট:

i i i * * o

ইনপুট:

i 222 + i 222 - + o

সম্ভাব্য আউটপুট:

i i + o

ইনপুট:

i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o

সম্ভাব্য আউটপুট:

i i i i i o 1 o

ইনপুট:

i 1 + 2 * 1 + o 

সম্ভাব্য আউটপুট:

i 2 * 3 + o

ইনপুট:

1 1 + o i 2 + 3 + o d 2 3 + d 4 i * 2 * o i + 3 1 + o i 2 * i i 1 + i 1 + i 1 + i 1 + d d d d o i i i 0 * * * o i i i 1 * * * o i 2 + i 2 - + o i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o

সম্ভাব্য আউটপুট:

2 o i 5 + o 8 i * o i 4 o i i i i i i d d d d o i i i 0 o i i i * * * o i i + o i i i i i o 1 o

1
একটি প্রশ্ন: আপনি কী সরল i i d oকরতে পারবেন i o i(ইনপুটটি ক্রমানুসারে এবং আউটপুটটি সাজানো আছে) বা আপনার এটিকে সরল করা উচিত নয়? (ইনপুট এবং আউটপুটগুলির সেটটি
যথাযথ

1
@ সানচিইজ নং, ইনপুট এবং আউটপুটগুলি যথাযথ হওয়া উচিত। যদি অরিজিনাল প্রোগ্রামটি 2 টি সংখ্যার আউটপুট দেওয়ার আগে অপ্টিমাইজ করা কিছু করে তবে তা করা উচিত।
Ломакин

1
পিপিসিজিতে আপনাকে স্বাগতম! চমৎকার প্রথম চ্যালেঞ্জ!
লুইস ফেলিপ দে জেসুস মুনোজ

6
পর্যালোচনা সারি থেকে , আমি মনে করি না যে এই চ্যালেঞ্জটি অস্পষ্ট। আপনি যদি করেন তবে কেন তা সম্পর্কে মন্তব্য করুন।
mbomb007

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

উত্তর:


5

ওল্ফ্রাম ভাষা (গণিত) , 733 728 690 564 516 506 513 548 বাইট

j=Integer;f=Flatten;s=SequenceReplace;A=FixedPoint[f@s[#,{{x_j,p,y_j,t}->{y,t,x*y,p},{x_j,y_j,p}->x+y,{x_j,y_j,t}->x*y,{x_j,p,y_j,p}->{x+y,p},{x_j,t,y_j,t}->{x*y,t},{0,p}|{1,t}->{},{0,t}->{d,0}}]//.{a___,Except[i|o]}->{a}&,#]&;B=Expand@Check[f@FoldPairList[f/@Switch[#2,i,{{i},{#,i@c++}},o,{{Last@#},#},d,{{},Most@#},p,{{},{#[[;;-3]],Tr@#[[-2;;]]}},t,{{},{#[[;;-3]],#[[-2]]*Last@#}},_,{{},{##}}]&,c=0;{},#],x]&;F=MinimalBy[w=A@f[#/.m->{-1,t,p}];z=B@w;s[#,{-1,t,p}->m]&/@A/@Select[Permutations@Join[w,Cases[z /.i@_->i,_j,∞]],B@#==z&],Length][[1]]&

এটি অনলাইন চেষ্টা করুন!

এটি একটি চার-পদক্ষেপের ট্যুর-ডি-ফোর্স যা (1) "-" * -1 * + "এর সাথে" - "প্রতিস্থাপন করে যাতে আমাদের বিয়োগগুলি মোকাবেলা করতে হবে না, (2) আদেশের তালিকাটি কিছুটা সরল করে, ( 3) কমান্ডগুলির এই তালিকার সমস্ত অনুমতিগুলির একটি তালিকা তৈরি করে এবং পার্স করা (সম্পাদিত) করার সময় একই ফলাফল দেয় এমনগুলি খুঁজে বের করে এবং (4) কমান্ডের এই তালিকাগুলিকে কিছুটা সহজ করে এবং কিছু ক্রিয়াকলাপকে আবার রূপান্তর করার পরে সংক্ষিপ্ততমটিকে বেছে নেয় icks subtractions।

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

এই কোডটি সমস্ত "-" অপারেশনগুলিকে "+" ক্রিয়াকলাপগুলি লক্ষণগুলি উল্টিয়ে দেওয়ার পরে অপ্টিমাইজেশনের পদক্ষেপ নিয়ে আসে এবং কোডটি আবার স্ট্রিংয়ে রূপান্তরিত করার পরে কেবল "-" অপারেটরের পুনরায় পরিচয় করে। এটি উদাহরণস্বরূপ বোঝায় যে "i -1 i * + o" "ii - o" এ সঠিকভাবে অনুকূলিত হয়েছে।

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

G[S_] := StringReplace[{"p" -> "+", "m" -> "-", "t" -> "*"}]@StringRiffle@
         Quiet@F@
         ToExpression[StringSplit[S] /. {"+" -> p, "-" -> m, "*" -> t}]

স্ট্রিং-ফর্ম্যাট মোড়ক সহ টোকেনের সংখ্যার পরিবর্তে চূড়ান্ত কোডের স্ট্রিংয়ের দৈর্ঘ্য হ্রাস করা এবং আরও কয়েকটি রূপান্তর সংজ্ঞা সহ অন-গল্ফযুক্ত সংস্করণ:

(* convert code string to list of operators *)
inputfilter[s_] := ToExpression[Flatten[StringSplit[s] /.
  {"i" -> i, "o" -> o, "d" -> d, "+" -> p, "-" -> {-1, t, p}, "*" -> t}]]

(* convert list of operators to code string *)
outputfilter[s_] := StringReplace[StringRiffle@Flatten@SequenceReplace[s,
  {{-1, t, p} -> m,                         (* convert "-1 t p" back to "-"             *)
   {x_ /; x < 0, p} -> {-x, m},             (* convert "y x +" to "y -x -" when x<0     *)
   {x_ /; x < 0, t, p} -> {-x, t, m}}],     (* convert "y x * +" to "y -x * -" when x<0 *)
  {"m" -> "-", "p" -> "+", "t" -> "*"}]     (* backsubstitution of symbols              *)

(* simplify a list of operators somewhat *)
simplifier[s_] := FixedPoint[Flatten@SequenceReplace[#,
  {{x_Integer, p, y_Integer, t} -> {y, t, x*y, p},  (*  "x + y *" -> "y * (xy) +"       *)
   {x_Integer, y_Integer, p} -> x + y,              (*  "x y +" -> "(x+y)"              *)
   {x_Integer, y_Integer, t} -> x*y,                (*  "x y *" -> "(xy)"               *)
   {x_Integer, p, y_Integer, p} -> {x + y, p},      (*  "x + y +" -> "(x+y) +"          *)
   {x_Integer, t, y_Integer, t} -> {x*y, t},        (*  "x * y *" -> "(xy) *            *)
   {0, p} | {1, t} -> {},                           (*  "0 +" and "1 *" are deleted     *)
   {x_Integer, i, p} -> {i, x, p},                  (*  "x i +" -> "i x +"              *)
   {x_Integer, i, t} -> {i, x, t},                  (*  "x i *" -> "i x *"              *)
   {0, t} -> {d, 0}}] //.                           (*  "0 *" -> "d 0"                  *)
  {a___, Except[i | o]} -> {a} &, s]                (* delete trailing useless code     *)

(* execute a list of operators and return the list of generated outputs *)
parse[s_] := Expand@Quiet@Check[Flatten@FoldPairList[  (* stack faults are caught here     *)
  Function[{stack, command},                        (* function called for every command*)
    Flatten /@ Switch[command,                      (* code interpretation:             *)
    i, {{i}, {stack, i[inputcounter++]}},           (* output "i" and add input to stack*)
    o, {{stack[[-1]]}, stack},                      (* output top of stack              *)
    d, {{}, Most[stack]},                           (* delete top of stack              *)
    p, {{}, {stack[[;; -3]], stack[[-2]] + stack[[-1]]}},  (* add two stack elements    *)
    t, {{}, {stack[[;; -3]], stack[[-2]]*stack[[-1]]}},    (* multiply two stack elements*)
    _, {{}, {stack, command}}]],                    (* put number onto stack            *)
    inputcounter = 0; {},                           (* start with zero input counter and empty stack*)
    s],                                             (* loop over code list              *)
  x]                                                (* return "x" if an error occurred  *)

(* the main function that takes a code string and returns an optimized code string *)
F[s_] := Module[{w, q},
  w = simplifier@inputfilter@s;      (* convert input to useful form *)
  q = parse[w];                      (* execute input code *)
  MinimalBy[
    outputfilter@*simplifier /@      (* simplify and stringify selected codes          *)
      Select[Permutations[w],        (* all permutations of code list                  *)
             parse[#] == q &],       (* select only those that give the correct output *)
    StringLength] // Union]          (* pick shortest solution by length               *)

বাগটি ধরার জন্য @ রিডানডেন্সিকে ধন্যবাদ: Expandবিতরণযোগ্য সমতুল্যতা পরিচালনা করতে পার্সারের আউটপুটটিতে একটি প্রয়োগ প্রয়োজন । 506 → 513

হালনাগাদ

এছাড়াও Now সেরা অনুকূল রূপ 1 o 1 + oথেকে 1 o 2 o। এটি একটি আশ্চর্যজনকভাবে জটিল কেস এবং কোডটি আরও ধীর করে তুলেছিল। 513 → 548


দেখে মনে হচ্ছে এটি পরীক্ষার ক্ষেত্রে ত্রুটি দেয় i i 1 + i 1 + i 1 + i 1 + d d d d o
গ্রিমি

@ গ্রিমি যেমনটি বলেছিলাম, এই কোডটি বড় সমস্যাগুলির জন্য চালিত হয় না কারণ এটি কোড স্পেসের এক বিস্তৃত সমন্বয় অনুসন্ধানের মধ্য দিয়ে যায়। আপনার ত্রুটি টিআইও-তে একটি স্মৃতি-বহির্ভূত ত্রুটি এবং আমার কোডের কারণে নয়।
রোমান

"আইআই ১ + ডি ও" এর জন্য গ্রিমি আমার কোডটি "আইআইডি ও" দেয়, যা আমি অপ্টিমাইজড মনে করি। "Ii 1 + i 1 + dd o" এর জন্য এটি "iii + d o" দেয়, এতে আরও স্পষ্ট "আইআইআইডি ও" অপ্টিমাইজেশনের সমান টোকেন রয়েছে ens আমি আর ইনপুট চেষ্টা করিনি।
রোমান ২

আমি বিশ্বাস করি ইনপুটটি i 2 * i 2 * + oঅপ্টিমাইজড আউটপুট উত্পাদন করা উচিত i i + 2 * o, তবে এই কোডটি (অপরিশোধিত) ইনপুট দেয়।
অপ্রয়োজনীয়

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