Uploaded avatar of glaxxie

Hello World!を解く、どんどん奇妙になる14の方法

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

順列

激しい雷雨が通り過ぎ、かわいそうな不運なマシンが雷に打たれました。 電源はまだ入りますが、今は奇妙な動きをしています。 挨拶メッセージを組み立てる文字はすべて残っていますが、順番がバラバラで、ロジックボードの損傷により、マシンはメッセージの正しい順番をもう取得できません。 しかも運の悪いことに、以前作った信じられないほど信頼できる壊れない小さいマシンは、実は盗まれてしまいました(そう、もうありません!)。 そこで、いつもの相棒に、これらの文字を並べ替えて正しいメッセージにするあらゆる方法を試させることにしました。 なにしろ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

終わり

私の頭の中を巡る、とんでもないツアーでした。 役に立ったかはわかりませんが、間違いなく楽しかったです。

読んでくれてありがとうございました。楽しいプログラミングを!

2024年01月18日(木) · 役に立ちましたか?