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 сподівається побачити в нашому рішенні. Достатньо просто змінити рядок тексту (англ. string) з «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: uk.number.nth.ordinalized Jan 2024 · Виявилося корисним?