😎

最悪なコードと最高なコード

2023/10/03に公開

chatgptに最悪なコードを作ってもらいました

普通に作ってもらった

import random as r,math as m;exec(''.join([chr(108-(i%2)*32)+chr(97+(i%2)*4) for i in range(12)]));x,y,z,a,b,c=1,2,3,4,5,6
def f(x,y,z,a,b,c):return m.sqrt(x**2+y**2+z**2),m.sqrt(a**2+b**2+c**2)
def g(v,w):return r.choice([v,w])
print(g(*f(x,y,z,a,b,c)))

ダメポイント解説

インポートを不明瞭にする。
変数名を一文字にする。
複数の変数を一行で定義する。
execを使ってコードを隠蔽する。

感想

変数aとかbとか白目になりますよねww
見ただけでおええなんじゃこりゃーですね

最適化後

import random
import math

def calculate_vector_magnitude(x, y, z):
    return math.sqrt(x**2 + y**2 + z**2)

def choose_random_value(value1, value2):
    return random.choice([value1, value2])

# 変数の値は仮のもので、具体的な値に変更可能です。
vector1 = (1, 2, 3)
vector2 = (4, 5, 6)

magnitude1 = calculate_vector_magnitude(*vector1)
magnitude2 = calculate_vector_magnitude(*vector2)

print(choose_random_value(magnitude1, magnitude2))
  • Importの明確化: random と math モジュールを明確にインポートしています。これにより、どのモジュールが使用されているのかが一目瞭然になります。

  • 関数名の明確化: 関数名をわかりやすくして、何をする関数なのか明確にしています。

  • 関数の引数: 引数名も明確にしました。これにより、この関数が何を期待しているのかが明確になります。

  • 変数名の改善: 変数名を具体的な名前に変更しました。これにより、何を格納しているのかがわかりやすくなります。

  • 不要な操作の削除: exec関数や一文字変数名など、可読性を損なう要素を削除しました。

  • コードの分割: コードを論理的なブロックに分け、それぞれの部分が何をしているのか一目でわかるようにしました。

実行すると数値が出ます!

正規表現ごりごり

import re, random

def obfuscate(s): return ''.join([chr(ord(c)+1) for c in s])
def deobfuscate(s): return ''.join([chr(ord(c)-1) for c in s])

mangled_string = obfuscate('Hello, World!')

# 複雑な正規表現
pattern1, pattern2, pattern3 = r"(?<=H)e(?:l){2}o", r"(?<=, )W(?=o)", r"!(?![\w\s])"

# 置換処理
m1 = re.sub(pattern1, lambda x: obfuscate(x.group()), mangled_string)
m2 = re.sub(pattern2, lambda x: obfuscate(x.group()), m1)
m3 = re.sub(pattern3, lambda x: obfuscate(x.group()), m2)

# 複雑な検索
if re.search(r"(?i)jtmmp\,\040Xpsme(?![\w\s])", m3):
    output = re.sub(r"(?<=, )xpsme", "universe", deobfuscate(m3), flags=re.I)
else:
    output = random.choice([obfuscate("UNKNOWN"), obfuscate("ERROR")])

print(deobfuscate(output))

ダメポイント

  • 複雑な正規表現: pattern1, pattern2, pattern3はそれぞれ複雑な正規表現を使用しています。

  • pattern1: (?<=H)e(?:l){2}o は、Hに続くelloという文字列を検索します。

  • pattern2: (?<=, )W(?=o) は、, の後にWがあり、oが続く場合にマッチします。

  • pattern3: !(?![\w\s]) は、!に続く文字が英数字または空白でない場合にマッチします。

  • 置換処理: re.subを使用して、これらの複雑な正規表現に一致する部分を置換しています。

  • 複雑な検索: re.searchで複雑な正規表現r"(?i)jtmmp,\040Xpsme(?![\w\s])"を使用して、条件に一致するかどうかを検証しています。

最適化

ごめんなさいchatgpt大先生でもなおせませんでした・・・
長文の正規表現は避けたいものです

最高?のコード

def sum_numbers(numbers):
    """
    Given a list of numbers, return their sum.
    
    Parameters:
        numbers (list): List of numbers to be summed.
        
    Returns:
        int: Sum of all the numbers in the list.
    """
    total = 0
    for number in numbers:
        total += number
    return total

# 使用例
numbers_list = [1, 2, 3, 4, 5]
result = sum_numbers(numbers_list)
print(f"The sum of the numbers is: {result}")

OKポイント

関数にはコメント(docstring)がついており、何をする関数なのかが明確です。
変数名は明確で読みやすく、コードの意図を理解しやすくしています。
コードは単一の目的(この場合は数値の合計)に集中しているため、拡張や修正が容易です。

結論:初心に戻る、あわてない

今日は何を書こうかと思いつきで記事を書いてみたんですが
焦るとコードが雑、動けばヨシになりがちなわたし。チームで開発している事
後々困る人がいる(自分も含めて)ことを改めて思ったのでした・・・

Discussion