0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UEC25 Advent Calendar 2025

この記事は、UEC25アドベントカレンダー2025の12月24日の記事です。

前日の記事はまだ公開されていません。

翌日の記事はまだ公開されていません。

はじめに

前置き

 さて、毎年12月24日の午後6時から12月25日の深夜2時までは、一年で一番Fuckが行われる8時間だと言われています。
 実際にその通りで、私は今夜Fuckする予定がありますし、私の友人も今夜Fuckするそうです。
 学校で会う友達、少し気になっているクラスの女子、教授、街中ですれ違う前髪がチャーミングな青いニットの女性、一日10時間画面に向かってゲームをしている学生、ミニスカ、マフラー、もふもふ手袋の防寒ばっちりな女子高生、みんな、これからFuckします。
 気だるげにすき家で働いている大学生バイト、ぴょこんと寝癖のついた図書館の司書さん、看護婦さん、みなこれからFuckします。
ですが、電通大生にそんなやつはいないでしょう。1
悲しいですね。
そんな皆さんが、今からでも好きなFuckができるように、この記事に好きなFuckのやり方を全部書くことにしました。
この記事を読めば、皆さんFuckができるようになるはずです。
 みんなでFuckしましょう。

環境について

1. Pythonの実行環境を用意する

"{} Python 環境構築".format(PCの環境)
などで調べれば、Pythonの実行環境の作り方は分かると思います。
Colabなどでも、工夫すれば実行できます。

2. Fuckの実行環境を用意する
  1. 自分のFuckファイルを好きな場所に保存してください
  2. COMMANDSの内容を、自分の好きなFuckに置き換えた下のコードを、適当なファイル名で保存する(後に詳しく説明します)
  3. 今保存したPythonコードを実行して、実行するFuckファイルを選ぶと、Fuckされます
bf_interpriter.py
COMMANDS = {
    "+":"くり",
    "-":"クリ",
    ">":"ます",
    "<":"マス",
    "[":"",
    "]":"",
    ",":"Xmas",
    ".":"めりー",
}



#!/usr/bin/python
#
# Brainfuck Interpreter
# Copyright 2011 Sebastian Kaspari
#
# Usage: ./brainfuck.py [FILE]

# From http://code.activestate.com/recipes/134892/
# "getch()-like unbuffered character reading from stdin
#  on both Windows and Unix (Python recipe)"

import sys
import os.path

try:
    import tkinter.filedialog
except:
    pass


class _Getch:
    """Gets a single character from standard input.  Does not echo to the
screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): return self.impl()


class _GetchUnix:
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch


class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()


getch = _Getch()


def execute(filename):
    f = open(filename, "r")
    evaluate(f.read())
    f.close()


def evaluate(code):
    code = cleanup(list(code))
    bracemap = buildbracemap(code)

    cells, codeptr, cellptr = [0], 0, 0

    while codeptr < len(code):
        command = code[codeptr]

        if command == ">":
            cellptr += 1
            if cellptr == len(cells):
                cells.append(0)

        if command == "<":
            cellptr = 0 if cellptr <= 0 else cellptr - 1

        if command == "+":
            cells[cellptr] = cells[cellptr] + 1 if cells[cellptr] < 255 else 0

        if command == "-":
            cells[cellptr] = cells[cellptr] - 1 if cells[cellptr] > 0 else 255

        if command == "[" and cells[cellptr] == 0:
            codeptr = bracemap[codeptr]
        if command == "]" and cells[cellptr] != 0:
            codeptr = bracemap[codeptr]
        if command == ".":
            sys.stdout.write(chr(cells[cellptr]))
        if command == ",":
            cells[cellptr] = ord(getch())

        codeptr += 1


def cleanup(code):
    return "".join(
        filter(lambda x: x in [".", ",", "[", "]", "<", ">", "+", "-"], code)
    )


def buildbracemap(code):
    temp_bracestack, bracemap = [], {}

    for position, command in enumerate(code):
        if command == "[":
            temp_bracestack.append(position)
        if command == "]":
            start = temp_bracestack.pop()
            bracemap[start] = position
            bracemap[position] = start
    return bracemap



def convert_to_bf(code:str) -> str:
    i = 0
    bf_code = ""
    while i < len(code):
        for command, symbol in COMMANDS.items():
            if code[i:i+len(symbol)] == symbol:
                bf_code += command
                i += len(symbol)
                break
        else:
            i += 1
            continue
    return bf_code

def convert_from_bf(bf_code):
    code = ""
    for s in bf_code:
        for command, symbol in COMMANDS.items():
            if s == command:
                code += symbol

    return code




def main():
    if len(sys.argv) == 2:
        print(sys.argv)
        execute(sys.argv[1])
        return

    try:
        file_name = tkinter.filedialog.askopenfilename()
    except:
        print("この環境では動かないようです")
        return

    if file_name is None:
        return

    with open(file_name) as f:
        evaluate(convert_to_bf(f.read()))


if __name__ == "__main__":
    main()

具体的な使い方

動作確認用

上のコードのCOMMANDSを特に変更しなければ、XmaxFuckを実行することができます。
UEC Xmas fuckと出力するXmasFuckのコードを下に置いておくので、ファイルに保存して試してみてもいいでしょう。

uec.xf
くりくりくりくりくりくりくりくりくりくりくりくりくりくりくりくりくりすますくりくり
くりくりくりマスクリスますめりーますくりくりくりくりくりくりくりすますくりくりくり
くりくりくりくりくりくりくりマスクリスますクリめりークリクリめりーますくりくりくり
くりくりくりくりくりすますくりくりくりくりマスクリスますめりーますくりくりくりくり
くりくりくりくりくりくりすますくりくりくりくりくりくりくりくりくりマスクリスます
クリクリめりーますくりくりくりくりくりくりくりくりくりくりくりすますくりくりくり
くりくりくりくりくりくりくりマスクリスますクリめりーますくりくりくりくりくりくり
くりくりくりくりすますくりくりくりくりくりくりくりくりくりくりマスクリスますクリ
クリクリめりーますくりくりくりくりくりくりくりくりくりくりくりすますくりくりくり
くりくりくりくりくりくりくりマスクリスますくりくりくりくりくりめりーますくりくり
くりくりくりくりくりくりくりくりすますくりくりくりマスクリスますくりくりめりーます
くりくりくりくりくりくりくりくりくりくりすますくりくりくりくりくりくりくりくりくり
くりマスクリスますくりくりめりーますくりくりくりくりくりくりくりくりくりくりくり
くりすますくりくりくりくりくりくりくりくりくりくりマスクリスますクリクリクリめりー
ますくりくりくりくりくりくりくりくりくりくりすますくりくりくりくりくりくりくりくり
くりくりマスクリスますクリめりーますくりくりくりくりくりくりくりくりくりくりくりす
ますくりくりくりくりくりくりくりくりくりくりマスクリスますクリクリクリめりーます
くりくりくりくりくりくりくりくりくりくりめりー

COMMANDS変更の詳しいやり方

お察しがつくと思われますが、"+":"UEC",というように変更した場合、インクリメントに対応する文字がUECになります。
余計なところを消さないよう気をつけてください。

例として、フレンズ Kemonoとして動かす場合のCOMMANDSを置いておきます。

COMMANDS = {
    "+":"たーのしー!",
    "-":"すっごーい!",
    ">":"たのしー!",
    "<":"すっごーい!",
    "[":"うわー!",
    "]":"わーい!",
    ",":"おもしろーい!",
    ".":"なにこれなにこれ!",
}

謝辞 Thanks

Code github

https://github.com/pocmo/Python-Brainfuck

こちらのコードを改造させていただきました。ありがとうございます
I've fucked this fucking. Fuck you.

アドベントカレンダー

https://adventar.org/calendars/11349

作ってくれてありがとナス

  1. この記事は電通大のアドベントカレンダーとして作成されました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?