Uploaded avatar of glaxxie

14 egyre furcsább mód a Hello World megoldására

@glaxxie
Több, mint 2 éve ezelőtt

Bevezetés

Ebben a cikkben minden kód Pythonban íródik.

A #48in24 kihívásban az Exercism azt vizsgálja, hogyan közelíti meg a közösség a különböző programozási kihívásokat. A „Hello, World!” az Exercism legalapvetőbb feladata, és túl egyszerűnek tartották ahhoz, hogy hivatalos videó készüljön róla. De én nem vagyok ebben olyan biztos, és úgy gondoltam, jó móka lehet megnézni néhány érdekesebb megközelítést ehhez az egyszerű feladathoz!

Ismerkedjünk meg a „Hello, World!” programmal!

A „Hello, World!” valószínűleg a világ leghíresebb programja. Gyakorlatilag mindenki, aki megtanult programozni, legalább egyszer megírta. Az egyszerűsége és a barátságos üzenete gyakran a programozás csodálatos világába vezető első lépést jelenti.

Az Exercism-ön kapsz egy hello nevű függvényt, amely a „Goodbye, Mars!” szöveget adja vissza.

def hello():
    return 'Goodbye, Mars!'

A feladatod, hogy úgy módosítsd, hogy helyette a „Hello, World!” szöveget adja vissza.

A hagyományos megközelítés

Először is itt a legegyszerűbb megközelítés, és az, amit az Exercism remél, hogy megvalósítasz. Ha egyszerűen kicseréljük a szöveget a „Goodbye, Mars!”-ról a „Hello, World!”-ra, máris nyugodtan visszaadhatjuk!

def hello() -> str:
    return 'Hello, World'

Alternatív megközelítések

Ezt a feladatot meg fogom oldani mindenféle módszerrel, ami csak eszembe jut.

A történet kedvéért ezt az egyszerű függvényt „gépnek” fogom nevezni, olyan gépnek, amelynek egyetlen dolga, hogy visszaadja a „Hello, World!” köszöntést.

Lássuk, hova vezet...!

Az összefűzés

A gép már ismer néhány szót, de úgy tűnik, képtelen... ööö... szóval összefűzni őket.

def hello() -> str:
    words = ["Hello", " world!"]
    return ",".join(words)

A címformázás

A gép akkumulátora ma kicsit gyenge, mert a szavakból hiányzik az energia, és nem kapják meg rendesen a nagybetűt.

def hello() -> str:
    words = "hello, world!"
    return words.title()

A megfordítás

A gép valahogy ismeri a köszöntést, de valami kicsit... hátrafelé néz ki rajta.

def hello() -> str:
    sdrow = "!dlroW ,olleH"
    return sdrow[::-1]

Megjegyzés: A Reverse String a #48in24 kihívás kiemelt feladata. Nézd meg, milyen különböző módon lehet megoldani a különböző nyelvekben!

A felszeletelés

Talán olajat kell cserélni a gépben, mert úgy tűnik, a szokásos köszöntő üzenet kicsit összekeveredett.

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]}"

A currying

Jaj, jaj, a gép néhány alkatrésze karbantartási módban van. Elfelejtette a köszöntő üzenetet, és most már csak darabonként tudja fogadni.

def hello(greet: str):
    def world(location: str) -> str:
        return f"{greet}, {location}!"
    return world

hello = hello("Hello")
hello("World")

Az ASCII

Véletlenül limonádét öntöttél a gépre, és most a szokásos karakterek helyett csak ezeket a furcsa számokat mutatja az üzenetben.

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)

A szótár

Nézted a híreket, és láttál egy riportot egy férfiról, akit S.O.S jelzéssel mentettek meg. „Talán a gépnek is tudnia kellene kezelni a morzejeleket!” – gondoltad, bár azt sem tudod, miért. Hiszen egyetlen dolga, hogy visszaadja a köszöntő üzenetet...

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(".... . .-.. .-.. --- --..-- / .-- --- .-. .-.. -.. -.-.--"))

A funkcionális

Mivel a jelenlegi géped hajlamos a változásra és a károsodásra, úgy döntesz, építesz egy kisebb, de megváltoztathatatlan és elpusztíthatatlan gépet, amely pontosan ugyanazt csinálja. Amikor a rendes gép nem működik, vagy furcsán viselkedik, helyette a kisebbet aktiválja. Várjunk csak, miért nem használjuk ezentúl mindig a kisebbet...?

def hi() -> str:
	return "Hello, World!"

def hello() -> str:
    return hi()

A permutáció

Erős vihar vonult át, és szegény, balszerencsés gépedbe belecsapott a villám. Még bekapcsol, de most furcsán viselkedik. A köszöntő üzenet összeállításához szükséges karakterek mind megvannak, de nincsenek sorrendben, és a logikai panel károsodása miatt a gép már nem tudja helyesen összeállítani az üzenet sorrendjét. És micsoda szerencse: a korábban épített, hihetetlenül megbízható és elpusztíthatatlan kisebb gép valójában lopható volt (igen, eltűnt!). Ezért úgy döntesz, hagyod, hogy a jó öreg barátod minden lehetséges módon megpróbálja ezeket a betűket a helyes üzenetté összekeverni. Végül is csak 13 karakter, a gépnek pedig rengeteg a memóriája. Ennek gyorsnak kell lennie...

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)

A keresés

Úgy döntöttél, frissíted a gépet, hogy különböző nyelveken tudjon köszönni. De az EGYETLEN dolga, hogy angolul mondja, hogy „Hello, World!”, ezért zavarában letölt ki tudja, hányféle módon kifejezhető „Hello, World!”-ot, mindegyiket kicsit más nagybetűkkel és elrendezéssel. Ez összezavart, és nem tudod, melyiket válaszd, de legalább valamilyen sorrendben vannak. Meg kell mondanod a gépnek a helyes megfogalmazást, hogy megtalálja a kifejezést, és újra normális legyen (talán).

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!")

Az öcséd, aki végignézte az egészet, megkérdezte, miért nem törölted inkább az egész káoszt, és adtad meg a gépnek a helyes kifejezést, hogy megjegyezze. Nem válaszoltál, csak meredten néztél rá.

Az elegáns

Úgy döntesz, kísérletezel, és úgy állítod be a gépet, hogy a lenyomott gomb függvényében másképp viselkedjen. Gondoltál rá, hogy kicsit lazább legyen, és kezdjen el „Hi”-t mondani, de mivel elegáns ember vagy, úgy döntesz, hogy mindig csak a hello metódust használod, a másikat pedig leragasztod. Rájössz, hogy elég sok szabad időd van az ilyesmire...

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

A rekurzió

Valamiért úgy döntöttél, vicces lenne, ha a gép kicsit késlekedne, és csak 10 másodperccel később válaszolna. Az öcséd ismét felveti a kérdést, mi értelme van ennek a funkciónak, mert szerinte csak te használod a gépet.

import time

def hello(n=10):
    if n == 0:
        return "Hello, World!"
    else:
        time.sleep(1)
        return hello(n-1)

A véletlenszerűség

Egy nap hirtelen belefáradsz, hogy újra meg újra ugyanazt a köszöntést kapod, ezért úgy döntesz, hogy még egyszer utoljára köszön neked, aztán végleg nyugdíjba küldöd a gépet, és soha többé nem nyúlsz hozzá. Mivel a gép hosszú időn át, jóban-rosszban melletted volt, úgy döntesz, hogy ez utolsó „baráti” találkozást a sorsra bízod. Utoljára bekapcsolod, és hagyod pörögni...

import random

def hello():
    chars = list("Helo,Wrld!")
    greeting = ""
    while (greeting != "Hello, World!"):
        greeting = "".join(random.choices(chars, k=13))
    return greeting

A vég

Vad körutazás volt ez a fejemben. Nem vagyok benne biztos, hogy hasznos volt, de kétségkívül szórakoztató.

Kösz a figyelmet, és jó programozást!

18. Jan 2024 · Hasznosnak találtad?