Вступ
Для цієї статті весь код буде мовою 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
Кінець
Це була шалена подорож моїм розумом. Не певен, що це було корисно, але точно було весело.
Дякую за читання й успіхів у програмуванні!