Uploaded avatar of glaxxie

14 ολοένα και πιο παράξενοι τρόποι να λύσεις το Hello World!

@glaxxie
πριν από Πάνω από 2 χρόνια

Εισαγωγή

Για τις ανάγκες αυτού του άρθρου, όλος ο κώδικας θα είναι σε 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

Το τέλος

Ήταν ένα τρελό ταξίδι στο μυαλό μου. Δεν είμαι σίγουρος αν ήταν χρήσιμο, αλλά σίγουρα είχε πλάκα.

Ευχαριστώ που το διάβασες και καλό προγραμματισμό!

Translation missing: el.number.nth.ordinalized Jan 2024 · Σου φάνηκε χρήσιμο;