সংখ্যায় যোগ করার জন্য গুনফল


17

2 পূর্ণসংখ্যার মধ্যকার গুণকে এরকম সংখ্যার যোগে আরও কমিয়ে আনা যায়

3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5

Exponentiation (উত্থাপন একটি ক্ষমতায় ) ও multiplications সিরিজের মধ্যে হ্রাস করা যেতে পারে:

5 ^ 3 = 5 * 5 * 5

অতএব, ক্ষুদ্রাকর্ষণটি সংখ্যার সংখ্যায় হ্রাস করা যেতে পারে, বহুগুণ প্রকাশ করে, তারপরে সংযোজনগুলির একটি সিরিজে। উদাহরণস্বরূপ, 5 ^ 3(5 কিউবড) পুনরায় লেখা যেতে পারে

5 ^ 3 = 5 * 5 * 5
      = (5 + 5 + 5 + 5 + 5) * 5
      = (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
      = 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5

আপনার কাজটি হল, প্রদত্ত এক্সপ্রেশন, গুণ এবং সংযোজন নিয়ে একসাথে যুক্ত অভিব্যক্তিগুলি সংযোজনের সংক্ষিপ্ততম সিরিজে এটি হ্রাস করুন। "সংক্ষিপ্ততম" এক্সপ্রেশনটি সংক্ষিপ্ত সংখ্যক +চিহ্ন সহ অভিব্যক্তি হিসাবে সংজ্ঞায়িত হয়েছে, এখনও মূল অভিব্যক্তিতে দুটি সংখ্যার মধ্যে একটি ব্যবহার করে। উদাহরণস্বরূপ, কম অভিব্যক্তি 10 * 2হয় 10 + 10

ইনপুটটির সাথে জড়িত সংখ্যাগুলি সমস্ত ধনাত্মক পূর্ণসংখ্যার হবে, এবং অভিব্যক্তিটি অগ্রগতি নির্দেশ করার জন্য পূর্ণসংখ্যা এবং বন্ধনী ( ) সহ কেবল +(সংযোজন), *(গুণ) এবং ^(ক্ষয়) হবে of()

আউটপুটটিতে কেবল ধনাত্মক পূর্ণসংখ্যা এবং +চিহ্ন থাকতে হবে। আপনার হ্রাসের পৃথক পদক্ষেপগুলি আউটপুট করা উচিত নয়, কেবল চূড়ান্ত আউটপুট। আউটপুট কোনও সংখ্যার সমন্বিত নাও থাকতে পারে যা ইনপুটটিতে প্রদর্শিত হবে না। তবে আপনি এর পরিবর্তে যে কোনও 3 স্বতন্ত্র চিহ্ন ব্যবহার করতে পারেন +*^তবে দয়া করে সেগুলি কী প্রতীক তা বলুন

ইনপুট এবং আউটপুট পৃথককারী স্পেসগুলি আপনার প্রোগ্রামগুলিতে ব্যবহৃত হতে পারে বা নাও হতে পারে, অর্থাত্ 3 * 5হয় হয় 5 + 5 + 5বা হিসাবে আউটপুট করা যায় 5+5+5

মনে রাখবেন যে বেশিরভাগ ক্ষেত্রে সংযোজন আসলে সম্পাদিত হয় না। সংক্ষিপ্তসারটি সম্পাদন করতে হবে এমন একমাত্র ক্ষেত্রে যখন আপনার মতো কিছু থাকে 5 ^ (1 + 2), সেই ক্ষেত্রে সংযোজন চালিয়ে যাওয়া প্রয়োজন -> 5 ^ 3 -> 5 * 5 * 5 -> ...। পরীক্ষার কেস দেখুন # 4।

আপনার কোডে এমন অসম্পূর্ণ প্রকাশে আগত ইনপুটগুলি পরিচালনা করার দরকার নেই। উদাহরণস্বরূপ (2 + 2) * (4 + 1),। এখনও অবধি নির্ধারিত বিধিগুলির কারণে, লক্ষ্যটি উত্তর গণনা করা নয়, লক্ষ্যটি সংযোজনগুলিকে সহজ করা। সুতরাং এক্সপ্রেশনগুলি সমাধান করা বা কম করা (ক্রমবর্ধমান কোনটি সরল করতে, কোনটি ছেড়ে যাবে?) এর উপর নির্ভর করে ফলাফলটি ভিন্ন হতে পারে। আরেকটি অবৈধ উদাহরণ: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???

এটি তাই সংক্ষিপ্ততম কোডের জয়

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

Input => output

5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2

আমরা কি **পরিবর্তে ব্যবহার করতে পারি ^?
এরিক আউটগল্ফার

@ এরিকথ আউটগল্ফার হ্যাঁ, এটি সুষ্ঠু বলে মনে হচ্ছে।
কেয়ার্ড কইনারিংহিংহ


1
বৈধ আউটপুটটি কী গঠন করে তা নিয়ে আমি এখনও বিভ্রান্ত। প্রশ্নে আপনি বলছেন using only one of the two numbers in the original expression.তবে আসল অভিব্যক্তিতে দুটির বেশি সংখ্যা থাকতে পারে। কেন পাই না কেন 8 + 8এটির জন্য বৈধ আউটপুট নয় 2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1। এই প্রশ্নটি এখনও আমার কাছে অস্পষ্ট।
পোস্ট রক গার্ফ হান্টার

উত্তর:


6

রেটিনা , 302 বাইট

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

y- Exponentiation
x- গুণ
p- সংযোজন

\d+
$*
{1`(\(\w+\)|1+)y(\(\w+\)|1+)
>$0<
(?<=>(\(\w+\)|1+)y1*)1
$1x
>(\(\w+\)|1+)y
(
x<
)
\((1+(x1+)*)\)(?!y)
$1
(?<!1)(1+)x(\(\w+\)|1+\1)(?!1)
$2x$1
1`(\(\w+\)|1+)x1+
>$0<
(?<=>(\(\w+\)|1+)x1*)1
$1p
>(\(\w+\)|1+)x
(
p<
)
(?<!x|y)\((1+(p1+)*)\)(?!x|y)
$1
y\((1+)p([1p]*\))
y($1$2
}`y\((1+)\)
y$1
1+
$.0

অনলাইনে এটি ব্যবহার করে দেখুন - সমস্ত পরীক্ষার ক্ষেত্রে

পরীক্ষার কেস রূপান্তরকারী

ব্যাখ্যা

\d+                             Convert to unary
$*
{1`(\(\w+\)|1+)y(\(\w+\)|1+)    Begin loop: Delimit current exponentiation group
>$0<
(?<=>(\(\w+\)|1+)y1*)1          Replace exponentiation with multiplication
$1x
>(\(\w+\)|1+)y                  Replace garbage with parentheses
(
x<
)
\((1+(x1+)*)\)(?!y)             Remove unnecessary parentheses around multiplication
$1
(?<!1)(1+)x(\(\w+\)|1+\1)(?!1)  Maybe swap order of multiplicands
$2x$1
1`(\(\w+\)|1+)x1+               Delimit current multiplication group
>$0<
(?<=>(\(\w+\)|1+)x1*)1          Replace multiplication with addition
$1p
>(\(\w+\)|1+)x                  Replace garbage with parentheses
(
p<
)
(?<!x|y)\((1+(p1+)*)\)(?!x|y)   Remove unnecessary parentheses around addition
$1
y\((1+)p([1p]*\))               Handle the 4th test case by adding if necessary
y($1$2
}`y\((1+)\)                     End of loop
y$1
1+                              Convert unary back to decimal
$.0

আপনি লক্ষ্য করতে পারেন যে সর্বাধিক ব্যবহৃত গ্রুপটি (\(\w+\)|1+)। এটি প্রথম বন্ধনীর সাথে বা কোনও পূর্ণসংখ্যার সাথে একটি অভ্যন্তরীণ প্রকাশের সাথে মেলে। আমি যে চিহ্নগুলি করেছি তা ব্যবহার করতে বেছে নিয়েছি যাতে আমি \wএকটি অক্ষর শ্রেণীর চেয়ে বরং ব্যবহার করতে পারি । আমি নিশ্চিত নন যে শব্দহীন চিহ্নগুলি ব্যবহার করা ভাল এবং কিছু সীমারেখা শব্দের সীমানা ( \b) দিয়ে প্রতিস্থাপন করা ভাল ।


5

গণিত, 250 218 183 170 বাইট

f~(s=SetAttributes)~HoldAll;{a,t}~s~Flat;f@n_:=Infix[Hold@n//.{a_~Power~b_:>t@@Hold@a~Table~b,Times->t,Plus->a,Hold->Dot}/.t->(a@@Table[#,1##2]&@@Reverse@Sort@{##}&),"+"]

এটি কাজ করে! অবশেষে!

ফাংশন নির্ধারণ f

ইনপুটটি একটি সরল গণিতের প্রকাশ। (যেমন 1 + 2না "1 + 2")

অনলাইনে চেষ্টা করে দেখুন!

নোট করুন যে টিআইও লিঙ্কটির কিছুটা আলাদা কোড রয়েছে, যেমন টিআইও (যা আমি অনুমান করি যে ম্যাথেমেটিকা ​​কার্নেল ব্যবহার করে) পছন্দ করে না Infix। আমি Riffleপরিবর্তে ম্যাথমেটিকা ​​আরপিএল এর একই চেহারা পেতে ব্যবহার করেছি ।

Ungolfed

f~(s = SetAttributes)~HoldAll;  (* make f not evaluate its inputs *)

{a, t}~s~Flat;  (* make a and t flat, so that a[a[1,a[3]]] == a[1,3] *)

f@n_ :=  (* define f, input n *)

 Infix[

  Hold@n  (* hold the evaluation of n for replacement *)

    //. {  (* expand exponents *)

     (* change a^b to t[a,a,...,a] (with b a's) *)
     a_~Power~b_ :> t @@ Hold@a~Table~b,

     (* Replace Times and Plus with t and a, respectively *)
     Times -> t, 
     Plus -> a, 

     (* Replace the Hold function with the identity, since we don't need
         to hold anymore (Times and Plus are replaced) *)
     Hold -> Dot 

     } /.  (* Replace; expand all t (= `Times`) to a (= `Plus`) *)

        (* Take an expression wrapped in t. *)
        (* First, sort the arguments in reverse. This puts the term
            wrapped in `a` (if none, the largest number) in the front *)
        (* Next, repeat the term found above by <product of rest
            of the arguments> times *)
        (* Finally, wrap the entire thing in `a` *)
        (* This will throw errors when there are multiple elements wrapped
           in `a` (i.e. multiplying two parenthesized elements) *)
        t -> (a @@ Table[#, 1 ##2] & @@
               Reverse@Sort@{##} &),

  "+"]  (* place "+" between each term *)

6
ঠিক আছে, আমি খুশি যে আমি একটি চ্যালেঞ্জ তৈরি করেছি যে ম্যাথামেটিকায়ার জন্য কোনও বিল্ট ইন নেই: পি
কায়ারড কইনারিংহিংহ

3

গণিত, 405 406 বাইট

f~SetAttributes~HoldAll;p=(v=Inactive)@Plus;t=v@Times;w=v@Power;f@x_:=First@MinimalBy[Inactivate@{x}//.{w[a___,b_List,c___]:>(w[a,#,c]&/@b),t[a___,b_List,c___]:>(t[a,#,c]&/@b),p[a___,b_List,c___]:>(p[a,#,c]&/@b),p[a_]:>a,w[a_,b_]:>t@@Table[a,{Activate@b}],t[a___,t[b__],c___]:>t[a,b,c],p[a___,p[b__],c___]:>p[a,b,c],{a___,{b__},c___}:>{a,b,c},t[a__]:>Table[p@@Table[i,{Activate[t@a/i]}],{i,{a}}]},Length];f

অবহেলিত এবং ব্যাখ্যা

SetAttributes[f, HoldAll]
p = Inactive[Plus]; t = Inactive[Times]; w = Inactive[Power];
f[x_] := First@MinimalBy[
   Inactivate[{x}] //. {
     w[a___, b_List, c___] :> (w[a, #, c] & /@ b),
     t[a___, b_List, c___] :> (t[a, #, c] & /@ b),
     p[a___, b_List, c___] :> (p[a, #, c] & /@ b),
     (* distribute lists of potential expansions over all operations *)
     p[a_] :> a,
     (* addition of a single term is just that term *)
     w[a_, b_] :> t @@ Table[a, {Activate@b}],
     (* a^b simplifies to a*a*...*a b times no matter what b is *)
     t[a___, t[b__], c___] :> t[a, b, c],
     p[a___, p[b__], c___] :> p[a, b, c],
     {a___, {b__}, c___} :> {a, b, c},
     (* operations are associative *)
     t[a__] :> Table[p @@ Table[i, {Activate[t@a/i]}], {i, {a}}]
     (* for a product, generate a list of potential expansions *)}
   , Length]
f

আমি কষ্ট একটি মহান চুক্তি গিয়েছিলাম নিম্নলিখিত এফেক্ট পেতে: এই ফাংশন স্বাভাবিক একটি প্রমিত ম্যাথামেটিকাল অভিব্যক্তি ইনপুট হিসাবে লাগে, +, *, এবং ^অপারেশন (এবং প্রথম বন্ধনী) এটি, এবং আউটপুট কি একটি প্রমিত ম্যাথামেটিকাল অভিব্যক্তি মত দেখাচ্ছে (কিন্তু সঙ্গে উত্তর হিসাবে "নিষ্ক্রিয়" প্লাস চিহ্নগুলি)।

উপরের ফাংশনটি ইনপুটটিতে সমস্ত ক্রিয়াকলাপ নিষ্ক্রিয় করে শুরু হয়। তারপরে, কোনও কিছুই আর সরল করা না যাওয়া পর্যন্ত এটি বারবার সম্প্রসারণের বিধিগুলি প্রয়োগ করে। যখনই এটি কোনও পণ্যের মুখোমুখি হয় 2 * 3 * 4, যা একাধিক উপায়ে প্রসারিত করা যায়, এটি সম্ভাব্য বিস্তারের একটি তালিকা তৈরি করে এবং চালিয়ে যায়। শেষে, আমরা সম্ভাব্য চূড়ান্ত উত্তরের একটি তালিকা পেয়েছি এবং সংক্ষিপ্ততমটি বেছে নেওয়া হয়েছে।

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