<div> <p>تحويل شجرة التعبيرات باستخدام <code>enum</code> ومطابقة الأنماط (<code>pattern matching</code>)</p> </div>

Rust Hard enums

مهمة «<div> <p>تحويل شجرة التعبيرات باستخدام <code>enum</code> ومطابقة الأنماط (<code>pattern matching</code>)</p> </div>»

تم تقديم تعبير حسابي على شكل شجرة ثنائية. كل عقدة في الشجرة إما أن تكون رقمًا (ورقة) أو عملية (جمع، طرح، ضرب، قسمة) مع فرعين. يجب تنفيذ دالة تستقبل هذه الشجرة وتعيد شجرة جديدة مبسطة وفقًا للقواعد التالية: إذا كانت العقدة عملية، وكان كلا فرعيها أرقامًا، فاحسب النتيجة واستبدل العقدة برقم؛ إذا كان أحد الفرعين هو الرقم 0 والعملية هي الضرب، فاستبدل العقدة بـ 0؛ إذا كان أحد الفرعين هو الرقم 0 والعملية هي الجمع، فاستبدل العقدة بالفرع الآخر؛ إذا كانت العملية هي القسمة، والمقسوم عليه هو الرقم 1، فاستبدل العقدة بالمقسوم؛ إذا كانت العملية هي الطرح، وكلا الفرعين متساويان، فاستبدل العقدة بالرقم 0. طبق هذه القواعد بشكل متكرر حتى يصبح ذلك ممكنًا. من المضمون أن جميع العمليات صحيحة، والقسمة صحيحة مع تقريب للأسفل. بيانات الإدخال: أولاً الرقم n — عدد العقد. ثم n سطر، كل سطر بالتنسيق: نوع العقدة ("num" أو "op")، بالنسبة لـ "num" — القيمة (عدد صحيح)، بالنسبة لـ "op" — رمز العملية ('+'، '-'، '*'، '/') وعددين صحيحين — فهارس الفرع الأيسر والأيمن (فهرسة تبدأ من 0). الجذر دائمًا له الفهرس 0. الإخراج: لكل عقدة بعد التبسيط، أخرج نوعها وقيمتها/عمليتها بنفس التنسيق (ترتيب العقد كما في الشجرة الأصلية، حتى لو أصبحت العقدة رقمًا، احتفظ بفهرسها). إذا أصبحت العقدة رقمًا، أخرج "num القيمة"؛ إذا بقيت عملية، أخرج "op الرمز الفهرس_الأيسر الفهرس_الأيمن" (فهارس الفروع من الشجرة المبسطة).

تنسيق الإدخال

<div class="task-description">
<p>عدد صحيح n (1 ≤ n ≤ 1000). ثم n سطر: للرقم: "num x"; للعملية: "op op_symbol left right".</p>
</div>

تنسيق الإخراج

n سطرًا: لكل عقدة في الترتيب الأصلي: "num value" أو "op symbol left right".

أمثلة

مثال 1

الإدخال
3 num 5 num 3 op + 0 1
الإخراج
num 5 num 3 op + 0 1

مثال 2

الإدخال
cat dog elephant bird
الإخراج
cat dog bird elephant

مثال 3

الإدخال
5 num 0 num 7 op * 0 1 num 2 op + 2 3
الإخراج
num 0 num 7 op * 0 1 num 2 op + 2 3

مثال 4

الإدخال
a ab abc abcd
الإخراج
a ab abc abcd
main.rs