Uploaded avatar of glaxxie

۱۴ روش روزافزون عجیب برای حل Hello World!

@glaxxie
بیش از 2 سال پیش

مقدمه

در این مقاله، همه‌ی کدها به زبان Python خواهند بود.

Exercism در چالش #48in24 خود در حال بررسی این است که جامعه چه رویکردی به چالش‌های مختلف کدنویسی دارد. «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()

جایگشت

طوفان رعد و برق شدیدی گذشت و ماشین بیچاره و بدشانس شما مورد اصابت صاعقه قرار گرفت. هنوز روشن می‌شود، اما حالا رفتار عجیبی دارد. همه‌ی کاراکترهای لازم برای ساختن پیام سلام همچنان آنجا هستند، اما مرتب نیستند و آسیب به برد منطقی باعث شده ماشین دیگر نتواند ترتیب درست پیام را تشخیص دهد. و با این بدشانسی، ماشین کوچک‌تر فوق‌العاده قابل‌اعتماد و نشکنی که قبلاً ساخته بودید، در واقع قابل دزدیدن بود (بله، رفته است!). بنابراین تصمیم می‌گیرید بگذارید دوست قدیمی خوبتان هر روش ممکنی را امتحان کند تا این حروف را به پیام درست تبدیل کند. بالاخره فقط ۱۳ کاراکتر است و ماشین حافظه‌ی زیادی دارد. این باید سریع باشد...

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()

بازگشتی

بنا به دلایلی تصمیم گرفتید بامزه باشد اگر ماشین کمی تأخیر داشته باشد و فقط با ۱۰ ثانیه تأخیر پاسخ دهد. برادرتان یک بار دیگر این پرسش را مطرح می‌کند که منطق این ویژگی چیست، چون به گفته‌ی او، شما تنها کسی هستید که از این ماشین استفاده می‌کند.

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

پایان

این یک تور وحشیانه در ذهن من بود. مطمئن نیستم مفید بود، اما قطعاً سرگرم‌کننده بود.

ممنون که خواندید و برنامه‌نویسی لذت‌بخشی داشته باشید!

18 ژانویه 2024 · برایتان مفید بود؟