مقدمة
لأغراض هذا المقال، ستكون كل الأكواد بلغة Python.
في تحدي #48in24، يستكشف Exercism كيف يتناول المجتمع تحديات برمجية مختلفة. تعد "Hello, World!" أبسط تمرين على Exercism، ورُئي أنه أبسط من أن يُصنع له فيديو رسمي. لكني لست متأكدًا من ذلك، ورأيت أنه قد يكون ممتعًا أن نلقي نظرة على بعض الأساليب الأكثر تشويقًا لهذا التمرين البسيط!
تعرّف على "Hello, World!"
من المحتمل أن يكون "Hello, World!" أشهر برنامج في العالم. كل من تعلّم البرمجة تقريبًا قد كتبه مرة واحدة على الأقل. غالبًا ما ترمز بساطته ورسالته الودودة إلى الخطوة الأولى في عالم البرمجة الرائع.
على Exercism، يُزوَّد لك بدالة اسمها hello تُرجع "Goodbye, Mars!".
def hello():
return 'Goodbye, Mars!'
مهمتك أن تغيّرها لتُرجع "Hello, World!" بدلًا من ذلك.
الأسلوب التقليدي
أولًا، لدينا الأسلوب الأبسط، وهو الذي يأمل Exercism أن تطبقه. بتغيير بسيط للسلسلة النصية من "Goodbye, Mars!" إلى "Hello, World!"، يمكننا الآن إرجاعها بأمان!
def hello() -> str:
return 'Hello, World'
أساليب بديلة
سأحل هذا التمرين مستخدمًا كل الطرق المتنوعة التي يمكن أن تخطر ببالي.
لأغراض السرد، سأشير إلى هذه الدالة البسيطة باسم "الآلة"، آلةٌ مهمتها الوحيدة أن تُرجع تحية "Hello, World!".
لنرَ إلى أين يؤدي هذا...!
الدمج
الآلة تعرف بعض الكلمات بالفعل، لكنها تبدو غير قادرة على أن تربط... آه، إم، حسنًا، أن تربطها معًا.
def hello() -> str:
words = ["Hello", " world!"]
return ",".join(words)
العنوان
بطارية الآلة منخفضة قليلًا اليوم، فكل الكلمات تفتقر إلى الطاقة ولا تُكتب بحروف كبيرة بشكل صحيح.
def hello() -> str:
words = "hello, world!"
return words.title()
العكس
الآلة تعرف التحية بطريقة ما، لكن يبدو أن هناك شيئًا فيها... معكوسًا.
def hello() -> str:
sdrow = "!dlroW ,olleH"
return sdrow[::-1]
ملاحظة: تمرين Reverse String من التمارين المميزة في تحدي #48in24. لا تنسَ أن تتصفح مختلف الأساليب لحله بلغات مختلفة!
التقطيع والتقسيم
ربما تحتاج الآلة إلى تغيير زيتها، إذ يبدو أن رسالة التحية المعتادة مختلطة قليلًا.
def hello() -> str:
w = "Holld, Werlo!"
return f"{w[0]}{w[8]}{w[2:4]}{w[1]}{w[5:8]}{w[-2]}{w[-4:-2]}{w[4]}{w[-1]}"
الكاري
أوه أوه، بعض أجزاء الآلة في وضع الصيانة. لقد نسيت رسالة التحية، ولم تعد تقبل الرسالة إلا جزءًا جزءًا.
def hello(greet: str):
def world(location: str) -> str:
return f"{greet}, {location}!"
return world
hello = hello("Hello")
hello("World")
ASCII
سكبت بعض عصير الليمون على الآلة عن غير قصد، وهي الآن لا تعرض لك سوى هذه الأرقام الغريبة بدلًا من الأحرف المعتادة في الرسالة.
def hello() -> str:
ascii = [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]
return ''.join(chr(value) for value in ascii)
القاموس
شاهدت الأخبار ورأيت مقطعًا عن رجل أُنقذ باستخدام إشارة S.O.S. "ربما ينبغي أن تكون الآلة قادرة على التعامل مع شفرة مورس أيضًا!"، فكرت في نفسك، لكنك لست متأكدًا من السبب. فمهمتها الوحيدة أن تُرجع رسالة التحية...
def hello(morse) -> str:
morse_code = {
"...." : "H",
"." : "e",
".-.." : "l",
"---" : "o",
"--..--": ",",
"/" : " ",
".--" : "W",
".-." : "r",
"-.." : "d",
"-.-.--": "!"
}
return "".join(morse_code[value] for value in morse.split())
print(hello(".... . .-.. .-.. --- --..-- / .-- --- .-. .-.. -.. -.-.--"))
الأسلوب الوظيفي
وبما أن آلتك الحالية عرضة للتغيير والتلف، تقرر أن تبني آلة أصغر لكنها ثابتة ولا يمكن تدميرها، وتفعل الشيء نفسه تمامًا. وكلما تعطلت الآلة العادية أو تصرفت بغرابة، ستفعّل الآلة الأصغر بدلًا منها. انتظر، لمَ لا نستخدم الآلة الأصغر من الآن فصاعدًا..
def hi() -> str:
return "Hello, World!"
def hello() -> str:
return hi()
التباديل
مرّت عاصفة رعدية قوية، وضرب البرق آلتك المسكينة سيئة الحظ. لا تزال تعمل عند تشغيلها، لكنها الآن تتصرف بغرابة. كل الأحرف اللازمة لتجميع رسالة التحية لا تزال موجودة، لكنها غير مرتبة، والتلف الذي لحق بلوحة المنطق يعني أن الآلة لم تعد تستطيع ترتيب الرسالة بشكل صحيح. وبحسن حظك، تبيّن أن الآلة الأصغر الموثوقة للغاية وغير القابلة للتدمير التي بنيتها سابقًا كانت في الواقع قابلة للسرقة (نعم، لقد اختفت!). لذلك، تقرر أن تدع صديقك القديم الطيب يجرّب كل الاحتمالات الممكنة لخلط هذه الأحرف حتى تصل إلى الرسالة الصحيحة. ففي النهاية، هي 13 حرفًا فقط، والآلة تملك ذاكرة كبيرة. يجب أن يكون هذا سريعًا...
from itertools import permutations
def hello() -> str:
chars = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!']
all_permutations = permutations(chars)
for perm in all_permutations:
if ("".join(perm) == "Hello, World!"):
return ''.join(perm)
البحث
قررت تحديث الآلة لتتيح لها أن تحيّي بلغات مختلفة. لكن مهمتها الوحيدة هي أن تقول "Hello, World!" بالإنجليزية، لذا وفي حيرتها تقرر أن تنزّل عددًا هائلًا من صيغ قول "Hello, World!"، كل واحدة منها بأحرف كبيرة وترتيب مختلفين قليلًا. تركك ذلك في حيرة وغير متأكد من أيها تختار، لكنها على الأقل مرتبة بنوع من الترتيب. عليك أن تخبر الآلة بالصياغة الصحيحة، لتتمكن من إيجاد العبارة وتعود طبيعية مرة أخرى (ربما).
def hello(my_fav_phrase) -> str:
combinations = [
"HELLO, WORLD!",
# many many many items later,
"hello, world!"
]
lower = 0
upper = len(combinations)
while lower <= upper:
mid = (lower + upper) // 2
mid_val = combinations[mid]
if mid_val == my_fav_phrase:
return combinations[mid]
elif mid_val < my_fav_phrase:
lower = mid + 1
else:
high = mid - 1
return "Error: Can't find {my_fav_phrase}"
hello("Hello, World!")
سألك أخوك الأصغر، الذي كان يشاهد الأمر كله، لماذا لم تحذف هذه الفوضى كلها ثم تعطي الآلة العبارة الصحيحة لتتذكرها. لم تجب، واكتفيت بتحديقه.
الراقي
تقرر أن تجرّب وتعدّل الآلة لتتصرف بشكل مختلف حسب الزر الذي يُضغط.
فكرت في جعلها أكثر عفوية، فتبدأ بقول "Hi"، لكنك وبصفتك شخصًا راقيًا، تقرر ألا تستخدم سوى الطريقة hello وأن تغطي الأخرى بشريط لاصق.
أنت تدرك أن لديك وقتًا طويلًا لتصرفه في هذه الأمور..
class Greeting:
location = "World"
def __init__(self) -> None:
pass
def hello(self):
return f"Hello, {self.location}!"
def hi(self):
return f"Hi, {self.location}!"
salutation = Greeting()
salutation.hello()
الاستدعاء الذاتي
لسبب ما، قررت أن يكون مضحكًا أن تتأخر الآلة قليلًا ولا تستجيب إلا بعد 10 ثوانٍ. يرفع أخوك مرة أخرى السؤال عن المنطق وراء هذه الميزة، لأنه وفقًا له، أنت الوحيد الذي يستخدم الآلة.
import time
def hello(n=10):
if n == 0:
return "Hello, World!"
else:
time.sleep(1)
return hello(n-1)
العشوائية
فجأة، في أحد الأيام، تشعر فحسب بالملل من التحية نفسها مرة بعد مرة، فتقرر أن تدعها تحيّيك مرة أخيرة وتُحيل الآلة إلى التقاعد نهائيًا، ولن تلمسها مرة أخرى. وبما أن الآلة كانت معك في السراء والضراء ولفترة طويلة، تقرر أن تترك هذه المقابلة الأخيرة بين "صديقين" لمشيئة القدر. تشغّلها مرة أخيرة وتدعها تدور فحسب...
import random
def hello():
chars = list("Helo,Wrld!")
greeting = ""
while (greeting != "Hello, World!"):
greeting = "".join(random.choices(chars, k=13))
return greeting
النهاية
كانت تلك جولة جامحة عبر عقلي. لست متأكدًا أنها كانت مفيدة، لكنها كانت ممتعة بالتأكيد.
شكرًا لقراءتك، وبرمجة ممتعة!