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 · কাজে লেগেছে?