FizzBuzz
في لعبة العد FizzBuzz، يعدّ اللاعبون تصاعديًا بدءًا من 1 ويستبدلون بعض الأرقام بكلمات. عند إعطائك رقم الدور n، أعد ما يقوله اللاعب في ذلك الدور: "FizzBuzz" إذا كان n يقبل القسمة على كلٍّ من 3 و5، و"Fizz" إذا كان يقبل القسمة على 3 فقط، و"Buzz" إذا كان يقبل القسمة على 5 فقط، وإلا فأعد n نفسه مكتوبًا كسلسلة نصية، مثل "7".
الدالة
- ninteger
- رقم الدور، عدد صحيح موجب
- تُرجعstring
- الكلمة أو الرقم الذي يُقال في الدور n، كسلسلة نصية
القيود
1 ≤ n ≤ 109- الإجابة دائمًا سلسلة نصية، حتى عندما تكون هي الرقم نفسه.
أمثلة
- المدخلات
- n = 15
- المخرجات
- "FizzBuzz"
- الشرح
- 15 مقسومًا على 3 يساوي 5، و15 مقسومًا على 5 يساوي 3، وكلاهما دون باقٍ، لذا فإن الدور 15 هو
"FizzBuzz".
- المدخلات
- n = 7
- المخرجات
- "7"
- الشرح
- يعطي 7 باقيًا قدره 1 عند قسمته على 3 وباقيًا قدره 2 عند قسمته على 5، لذا لا تنطبق عليه أي كلمة، وتُعيد الرقم كنص،
"7".
سؤال إضافي
تجعل قاعدة جديدة مضاعفات العدد 7 تساوي "Bazz"، وتُوصَل الكلمات بالترتيب، لذا فإن 105 تساوي "FizzBuzzBazz". كيف تضيفها دون كتابة حالة لكل تركيبة؟
تلميحات
افتحها واحدًا تلو الآخر. كل تلميح يكشف أكثر قليلًا.
يخبرك معامل باقي القسمة ما إذا كان عدد يقسم عددًا آخر: يكون
nقابلًا للقسمة على 3 بالضبط عندما يكون باقي قسمةnعلى 3 هو 0.فكّر في العدد 15. فهو يقبل القسمة على 3 وعلى 5. أيّ من عمليات التحقق يجب أن تُنفَّذ أولًا كي تكون نتيجة 15 هي
"FizzBuzz"وليس"Fizz"؟اختبر قابلية القسمة على 15 أولًا، ثم على 3، ثم على 5. إذا لم ينطبق أيٌّ منها، فحوّل العدد إلى سلسلة نصية. تأكد من أن التحويل يكتب كل رقم، بحيث تكون نتيجة 10^9 هي
"1000000000"وليس بالصيغة العلمية.
الحل
كل قاعدة هي فحص لباقي القسمة. تكمن المشكلة في الترتيب: 15 يقبل القسمة على 3، لذا فإن الدالة التي تفحص 3 أولًا وتُرجع النتيجة فورًا ستجيب "Fizz" عن 15. اختبر الحالة المجمعة أولًا، أو أنشئ الإجابة بالاعتماد على كلا الفحصين.
كوّن الكلمة من نتيجتي التحقق
الفكرة
ابدأ بكلمة فارغة. إذا كان 3 يقسم n، فأضف "Fizz"؛ وإذا كان 5 يقسم n، فأضف "Buzz". يُجرى الفحصان دائمًا، لذا يجمع العدد المضاعف لـ15 الجزأين بالترتيب ويصبح "FizzBuzz" من دون حالة خاصة. إذا ظلت الكلمة فارغة، فهذا يعني أن أيًا من القاعدتين لم ينطبق، وتُعيد العدد كسلسلة نصية.
الخوارزمية
- اجعل
wordسلسلة فارغة. - إذا كان
n % 3 == 0، فألحِق"Fizz". - إذا كان
n % 5 == 0، فألحِق"Buzz". - إذا كانت
wordفارغة، فأعِدnمحوّلًا إلى سلسلة نصية. - وإلا فأعِد
word.
def fizzBuzz(n):
word = ""
if n % 3 == 0:
word += "Fizz"
if n % 5 == 0:
word += "Buzz"
# An empty word means neither 3 nor 5 divides n.
if word == "":
return str(n)
return wordتحقّق من 15، ثم 3، ثم 5
الفكرة
العدد القابل للقسمة على 3 و5 معًا هو بالضبط عدد قابل للقسمة على 15، لأن 3 و5 لا يشتركان في أي عامل. لذا فالقاعدة المجمّعة هي فحص واحد، n % 15 == 0، ويأتي أولًا. إذا لم يتحقق، فإن مطابقة 3 تعني 3 فقط، ومطابقة 5 تعني 5 فقط. يُرجع كل فحص النتيجة فورًا، وإذا لم تنطبق أي منها، فأرجِع العدد كسلسلة نصية.
الخوارزمية
- إذا كان
n % 15 == 0، فأعِد"FizzBuzz". - إذا كان
n % 3 == 0، فأعِد"Fizz". - إذا كان
n % 5 == 0، فأعِد"Buzz". - وإلا، فحوِّل
nإلى سلسلة نصية، مع كتابة كل رقم بالحروف.
def fizzBuzz(n):
if n % 15 == 0:
return "FizzBuzz"
if n % 3 == 0:
return "Fizz"
if n % 5 == 0:
return "Buzz"
return str(n)
أخطاء شائعة وحالات حدّية
- اختبار 3 أو 5 قبل 15 والإرجاع فورًا: تظهر 15 و30 و45 على هيئة
"Fizz". - إرجاع الرقم بدلًا من سلسلة نصية. في الدور 7 تكون القيمة
"7". - تحويل الأرقام الكبيرة إلى تدوين علمي. في R، يطبع التحويل العادي 10^9 على هيئة
1e+09؛ استخدمformat(n, scientific = FALSE). - طباعة الإجابة بدلًا من إرجاعها.
أسئلة شائعة3
لماذا يُطرح سؤال FizzBuzz في مقابلات البرمجة؟
يتحقق من قدرتك على تحويل مجموعة قصيرة من القواعد إلى شيفرة عاملة: اختبار الباقي، والشروط بالترتيب الصحيح، ونوع القيمة المعادة الصحيح. يستغرق الأمر بضع دقائق ممن يكتبون الشيفرة بانتظام، لذا فهو مناسب كاختبار سريع قبل الأسئلة الأصعب.
هل يمكنك حل FizzBuzz دون استخدام عامل باقي القسمة؟
نعم. اقسم باستخدام القسمة الصحيحة، ثم اضرب خارج القسمة مرة أخرى وقارنه بـ n: لا يتساويان إلا عندما لا يتبقى شيء. عند طباعة التسلسل كاملًا، يمكنك أيضًا استخدام عدّادين يُعاد ضبطهما عند 3 وعند 5.
ما التعقيد الزمني لـ FizzBuzz؟
الإجابة عن عدد واحد هي O(1): عدد ثابت من عمليات التحقق من باقي القسمة وتحويل عدد يتكوّن من 10 أرقام كحد أقصى. طباعة التسلسل من 1 إلى n هي O(n).
مسائل مشابهة
مسائل تعتمد على الأفكار نفسها. حلّ اثنتين أو ثلاث منها يثبّت النمط.
def fizzBuzz(n):
# اكتب الكود هنااختبار #1
اختبار #2
وسيط
n = 15
الإخراج المتوقع
"FizzBuzz"