Это Куайн или как? - PullRequest
       45

Это Куайн или как?

1 голос
/ 24 сентября 2019

Я написал простой декоратор, который печатает переданную ему функцию (например, "foo"), а затем я декорирую ее для себя.Наконец, он печатает обе письменные функции.

Я недавно читал о квинах и немного застрял с его точным определением.Например, согласно этому источнику квинна "должна распечатать именно те инструкции, которые программист написал как часть программы".

Итак, мой вопрос: могу ли я считать написанную программу квинной?

def decorate(function):
    from inspect import getsourcelines

    def wrapper(*args, **kwargs):
        for line_num, code_line in enumerate(getsourcelines(function)[0]):
            print(code_line)
    return wrapper


@decorate
def foo(bar1, bar2=777):
    print("bar")


foo(None)

decorate(decorate)(decorate)

точный вывод:

@decorate
def foo(bar1, bar2=777):
    print("bar")

def decorate(function):
    from inspect import getsourcelines

    def wrapper(*args, **kwargs):
        for line_num, code_line in enumerate(getsourcelines(function)[0]):
            code_line = code_line.replace('\n', '')
            print(code_line)
    return wrapper

1 Ответ

2 голосов
/ 24 сентября 2019

Quine - это компьютерная программа, которая не принимает никаких входных данных и создает копию своего собственного исходного кода в качестве единственного выходного сигнала 1

Исходя из последнего, кто редактировал определение Википедии,чем строго нет.Это впечатляет, и вы довольно близки, но порядок имеет значение, и вам нужны эти два вызова внизу в вашем выводе.

В общем, чтобы проверить, является ли ваша программа квине:

./my_quine > output
diff my_quine output # should result in no differences

Если вы не используете язык сценариев, может быть несколько шагов, очевидно:

cc my_quine.c -o my_quine
./my_quine > output
diff my_quine.c output

или

 javac MyQuine.java
 java MyQuine > output
 diff MyQuine.java output

, и вы можете технически опустить шебанг вверхняя часть файла языка сценариев при вводе и выводе (например, #!/usr/bin/tclsh), если вы вызываете файл через интерпретатор напрямую:

tclsh my_quine.tcl > output
diff my_quine.tcl output
...