混淆了我解决暂停问题的尝试


31

请注意:从本质上讲,此挑战的规范很难理解。它可能至少需要一门有关可计算性理论的新生课程,或者具有同等背景的阅读知识。此外,挑战本身也相当艰巨。要回答该问题,就需要为所选语言的某些子集编写一个完整的口译员,不仅如此,而且口译员也必须采用像奎奴纳这样的形式。如果您的答案不能满足所有要求,则可以肯定不符合规范。

您无需解决暂停问题(甚至部分解决)即可解决此挑战。但是,你几乎可以肯定必要写(您使用写在上面解释同一种语言的语言,)一个解释,虽然它不一定是功能齐全。正是这个使这成为一个有趣的挑战。

我答应为符合规范的第一个答案奖励500点奖励,这将奖励给Jo King的BF答案

挑战

Alan Turing关于停止问题无法解决的证明的粗略简化版本如下所示:

假设我已经编写了一个程序F来解决暂停程序。即,F将另一个程序的源代码作为输入,如果停止F(G)则返回,否则返回。1G0

但是,如果我给您我的程序,F那么您可以构建另一个程序H,它以我的程序H作为输入来运行。如果F(H)return,0H返回0,但否则故意进入无限循环。这导致了一个悖论,我们必须得出结论,F毕竟这不能解决暂停问题。

您的任务是编写程序H,但要有所不同:我不会给您我的程序。相反,您的程序将接收我程序的源代码作为输入。那是:

  • 您的程序将以源代码形式接收我的程序作为输入。(例如,作为文件还是作为命令行输入,详细信息取决于您。)

  • 我的程序将使用与您的程序相同的语言编写,并且还将以源代码字符串的形式接受输入。

  • 如果我的程序返回0给定当你的程序作为输入,你的程序应该停止(和返回0)时给予我的程序作为输入。(“重现0” 的确切含义取决于您。)

  • 如果我的程序没有停止,或者返回除0给定程序作为输入时以外的其他任何内容,则程序应无限期运行。

唯一的困难就是,要使其变得更加困难,就必须遵守以下规则:

  1. 您不能使用任何内置函数execeval-type函数。

  2. 您不能使用任何“作弊”方法来获取自己程序的源代码。(例如,您不能说“将其保存在名为'程序'的文件中”,然后再包含open(program)在您的程序中。)

这意味着您的程序必须是某种疯狂的超级字符串,它们不仅可以以字符串的形式重现其自身的源代码,而且还能够正确地解析和解释其编写的语言。

为了使它的疯狂程度有所减轻,只允许使用所选语言的一部分(图灵完成)。因此,如果您的程序是用Python编写的,并且仅在我的程序仅包含ifs和while循环以及基本的字符串操作时才可以运行,那么只要您的程序也仅使用这些内容就可以了。(这意味着您不必担心实现所选语言的整个标准库!)但是,您的程序确实必须运行-您不能只编写自己的语言。

这是,因此得票最多的答案将获胜。但是,如上所述,要完全满足规范要求是一个严峻的挑战,因此,根据我的判断,我将对第一个回答给予500点奖励。

请注意:毫无疑问,鉴于我使用的确切措辞,您可以通过多种方式“应对”这一挑战。但是,我真的很希望能找到能使问题变得实质的答案。预期的挑战非常艰巨,但有可能实现,我真的希望看到真正的解决方案。我不会将悬赏奖励给在我的判断中感到作弊的答案。


注意:此挑战最初是作为发布的,但由于没有“客观的获胜标准”,于2016年关闭,为了将其重新开放,我将其更改为。但是,我发现,截至2018年1月,PPCG实际上并未禁止进行是最新的元讨论),因此首先将其关闭是违反网站政策的。我知道popcons如今并不流行,但这是一个古老的挑战,它的性质使其确实不适用于计分系统。如果仍然有人强烈认为不应该这样做,那么让我们进行一次元讨论,然后再开始进行密切投票。最后,在有人花了最后一年尝试解决方案的机会之外,请放心,它在这项挑战中将具有竞争力,并且像在一样值得悬赏版。


1
返回是指退出代码还是标准输出?还是两者都可以接受?
PlasmaPower 2014年

两者都是可以接受的。
纳撒尼尔(Nathaniel)

@Nathaniel我认为将接收到的代码导出F到文件中并进行import处理是非法的吗?; 3
cjfaure

1
我很喜欢这个问题,但是很难理解。如果其他人遇到麻烦,这两张幻灯片(Java伪代码)使我更容易理解:imgur.com/a/NRmyO
哈利

1
您提到了“问题的精神”和“真正的解决方案”。你是什​​么意思?我们应该为我们自己的语言写一个翻译吗?我无法想象另一种方式。
KSFT

Answers:


23

Brainfuck6013 4877 4376字节

编辑:-1136字节。切换到更好的方法来生成数据

Edit2:-501字节。重新审视我的自我解释器并将其缩减了数百个字节

->++>++++>+>++>+++>>++++>>++++>>+++>>++++>>+++>>++>++>++>++>++>++>++>++>++>++>++++>+++++>+>++>++>++>++>++>++>>+++>+>++>++>++++>+>+++>+>++++>+>+++>+>++>>>+++++>++++>++++>>+++>>++++>>+++>>++>++>++>++>++>++>++>++++>+++++>+>++>++>++>++>++>++>>+++>+>++>++++>+>+++>+>++++>+>+++>+>++>>>+++++>+++>>+++>+>+++++>+++++>++++>>++>+>++>++>++>++>++>++>+++>>++>++>>++++>>+++>++>++>++>++>++>++++>+++++>>++>++>++>+>+++>>++++>>++>++>++>>++>++>++>>++>++>++>>++>++>++>++>++>++>>++>++>++>++>++>++>>++>++>++>>++>++>++>++>>++>++>++>++>++++>+>+++>>+++++>+++>>++>>+++++>>>++>>++>++>++>>+++++>+++++>>>++>++>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>++++>++++>++++>>+++>>>++++>>+++>>>++++>>+++>+>++++>+++++>>>++>+>+>+++>+>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>+++++>+++>>++++>>+++>>>++++>>+++>>>++++>>+++>>>++++>+++++>+>+>++>++++>+>+++>+>++>>>++++>>+++>>+++>+>+>++++>++++>+++++>>++>+>+++>+>+++>>>++++>>+++>>++++>++++>+++++>+>++>>+++>>+++>+>+>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>+++>>>>++++>>+++>>>++++>>+++>+>++++>++++>+++++>+++>+>+++>>>>++++++>++++>>++>++>++>++>++>++>++>++++>+>+++++>+++++>+++++>+++++>+++++>+++++>>+++++>+++>++>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>+++++>+>++>++>++>>>>>+++>+>+>+>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>++++>>+++>>++++>+>++>++>+>++>>>>>+++>+>+>+>+++++>+++++>++++>>+++>>++++>+>+++++>+>++>++>++>++>++>++>++>>>>>+++>+>+>++>++>++>++>++++>+++++>+>+++++>+++++>+++++>+++++>+++++>+++++>>+++>++>+>++>++++>>+++>>++++>+>++>++>+>++>>>>>+++>+>+>+>+++++>+++++>++++>>+++>>++++>+>+++++>+>++>>>>>+++>+>+>+++++>+>++++>++>+++>+>++++>>+++>>++++++>+++>>>>++>+>+>+>+>+++++>++++>+>+++>>++++>+++++>++++>+>+>+++>>++++>+>++>++++>>+++>>>++++>+>+++>+>+>++++>>>++>++++>+>+>++++>+>+++>+>+>+++++>++++>>>+++>+>++++>>>>>++++>>+++>>++>+>+>++++>+>+++>+>+++>+>+++++>++++>>>+++>+>++++>>>>>++++>>+++>>+++++>+>+>++++>+>+++>+>+++>+>++>++>++++>+++++>>>++>+>+>+++>>>++++>>+++>>+++>+>+++>+>++++>+>+++>>+++++>+>+++>>+++++>++++>+>+>+++>>++++>+>++>++>++++>>+++>>>++++>+>+>+++>>++++>+>+>++>++++>+>+>++++>+>+++>>++++>+++++>+>+>++>>>+++>>+++++>+++++>++++>+>+>+++>>++++>++++>>+++>>++>+>+>++++>+>+++>+>+++>>++>++++>+>+>+++>>++++>++++>>+++>>+++++>+>+>++++>+>+++>+>+++>>++>++++>>+++>>+++>+++>+>+>++++>+>+++>>+++++>+++++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>+++++++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>+++++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>++++++>+>+>+>++++>+>+++>+>+>+>++++>+>+++>+>++++>+>+++>>++++>++++>>+++>>++++>>+++>>>>++++>>+++>>>++>+>+>+>++++>+>+++>+>+>+>++++>+>+++>+>++++>+>+++>>+++++>+++>>++++>>+++>>++++>>+++>>>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>>++++>>>+++>>++++>+>+>+>++++>+>+>+++>+>++>>>>++++>>>+++>>+++++>+++>>++++>+++++>+++>+>+>++>++++>+>++++>+++++>>>++>+>+>+++>+>+++>+>++++>+++++>>>++>+>+>+++>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>++>++>++++>+++++>+++++>>++++>+++++>+>+>++>>>+++>>+++>++>+>+>+++++>++++>++>++>+>+>+++>+>++++>+++++>>>>++++>>>+++>>++>+>+>+>++++>+>+>+++>+>+++>+>++++>+>+++>+>+++>+>++>++>++>++>++>++>++>++>>>++++>++>+>+>+++++>>>+++>>+++>>>++++>++++[<+]>[>[>]>[>]>++++++++++[-<++++++>]<++[<]<[<]<+>>-[[>]>[>]>+++++++[-<++++++>]<+[<]<[<]<+>>-]>]<--[>+<++++++]>++>[>]+++++[->+++<]>[>+++>+++>+++>++++++>++++++>+++>++++>++++[<]>-]>+>->>+>+++>-->>++[<]<<[<]<<[<]>[[[>]>>[>]>>[>]<[->>+<<]<[<]<<[<]<<[<]>-]>[>]>>[>]>>[>]>>[-<<+[<]<+>>[>]>]<<[[->+<]<]>>[>]>[[-<+>]>]<<[<]<<[<]<<[<]>]>>>[>]>>[>]<[[-]<]>>>,[>+++++++[<------>-]+<-[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<-<+++>>>>]<<<--------------[>]>[<++<+>>>>]<<<--[>]>[<-<+++++++>>>>]<<++++[-<------>]+<+[>]>[<++<+>>>>]<<<--[>]>[<-<+>>>>]<<-<[+]<[>]>,]>>>+<<<<-[<]>[-[<<]>[<+[>]>>[<]<<[>>+[<<[<]<<-[>>]<[>>>>[>]>+<<[<]<]<-[>>]<[>>>>[>]>-<<[<]<]<++[->>+<<]>>[>]>]<]<[<]>-<]>-[<<]>[<++[>]>>[<<]>[<<+[<<[<]>[-<<+>>]>--[<<]>[[>]>+<<[<]<]>+[<<]>[[>]>-<<[<]<]>+[>]>]]<<[<]>--<]>-[<<]>[[>]>>.<<<[<]<]>-[<<]>[[>]>>-<<<[<]<]>-[<<]>[[>]>>,<<<[<]<<<[<]<[<]>[[>]>[>]>>>[>]>>+<<<[<]<<<[<]<[<]>-]>[>]>[>]>>[<]<]>-[<<]>[[>]>>+<<<[<]<]>-[<<]>[[>]>>>[>>]>[<<<[<<]<+>>>[>>]>-]>[-]<<+[<[->>+<<]<]<[->>+<<]<[<]<]>-[<<]>[[>]>++[-->[-<<+>>]>]+<<-[++<<]<[->>>[>>]>+<<<[<<]<]<[<]<]<++++++++>>[+<<->>]>]>>[]

在线尝试!这里的输入是一个简单的cat程序(,[.,]),它将打印程序本身。

通过在值0的单元格上结束程序来定义“返回0”。

我过去编写的两个程序的一个邪恶组合,一个藜和一个自解释器。第一部分是quine部分,该部分将获取数据并在数据中填充数据,然后是源代码。接下来是自解释器,它将获取您的程序并运行它。这几乎是普通自解释器的不变副本,除了它不是直接获取输入,而是从数据部分的开头获取输入,如果没有更多输入,则将单元格设置为0。最后,结束对当前细胞程序并运行[]。如果返回值为0,则我的程序将以零结尾。如果还有其他问题,它将运行无限循环。如果您的程序永远运行,我的程序将永远运行。

怎么运行的:

第1部分:数据生成

->++>++++> ....... >+++++>>>+++>>+++>>>++++>+++

这部分构成了数据条的数据部分,是3270字节处的大部分代码。起点-是数据起点的标记。每个部分>+++代表此部分之后的代码字符。

Number of Pluses
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
> | < | + | ] | [ | - | , | . |

第2部分:使用数据生成数据部分

+[<+]>

[
    Add a right arrow
    >[>]>[>]>(10++++++++++)[-<(6++++++)>]<++[<]<[<]
    <+>>-
    Add the right amount of pluses
    [
        [>]>[>]>(7+++++++)[-<(6++++++)>]<+[<]<[<]<+>>-
    ]
    >
]
Add the beginning minus
<--[>+<++++++]>++

这将使用第1部分中的数据将用于生成数据的字符添加到代码部分。它>在代码部分的末尾添加了一个,并且该单元格的值具有许多优点。

第3部分:使用数据生成其余代码

Initialises the 8 characters of brainfuck
>[>]+++++[->+++<]>[>+++>+++>+++>++++++>++++++>+++>++++>++++[<]>-]
>+>->>+>+++>-->>++[<]<<[<]<<[<]>

Tape looks like:
data 0 0 code 0 0 characters

Runs through the data destructively and adds the represented symbol to the code section
[
    [
        For each plus in this cell
            Shift the gap in the characters over one
        [>]>>[>]>>[>]<[->>+<<]
        <[<]<<[<]<<[<]>-
    ]
    Navigate to character
    >[>]>>[>]>>[>]>>
    Copy the character to the end of the code section
    [-<<+[<]<+>>[>]>]

    Shift the symbol section over one
    <<[[->+<]<]
    >>[>]>[[-<+>]>]

    Navigate to next byte of data
    <<[<]<<[<]<<[<]>
]

Remove characters
>>[>]>>[>]<[[-]<]

销毁数据部分并将其余的源代码添加到代码部分

第四部分:获取输入程序

>>>,
[
    >(7+++++++)[<(6------)>-]+<-
    [>]>
    [plus <+<+>>>>]<<<
    -[>]>
    [comma <+<+>>>>]<<<
    -[>]>
    [minus <+<+>>>>]<<<
    -[>]>
    [dot <-<+++>>>>]<<<
    (14--------------)[>]>
    [left <++<+>>>>]<<<
    --[>]>
    [right <-<+++++++>>>>]<<
    (29++++[-<------>]+<+)
    [>]>
    [start loop <++<+>>>>]<<<
    --[>]>
    [end loop <-<+>>>>]<<
    -<[+]<[>]>,
]

获取输入的程序。删除非brainfuck字符,并用数字表示每个字符:

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
] | [ | . | - | , | + | > | < |

用表示程序的结尾255

第5部分:解释输入

Initialise simulated tape
>>>+<<<<-

[<]>
[
    -[<<]>
    [end loop
        co 0 0 0 e:  _1 0 0 0 1 ?
        Check if current cell is one
        <+[>]>>[<]<<
        co 0 0 1 e _1: 0 0 !0 1
        or
        co 0 0 1 e _1 0: 0 0 1
        [ If current cell is one navigate to corresponding start loop
            Create counter
            >>+
            [
                co 0 0 de _1 0 c: !0 1
                checks if next instruction is an end loop
                <<[<]<<-
                [>>]<
                c !0 0: 0 de _1 0 c !0 1
                or
                c: 0 0  0 de _1 0 c !0 1
                [>>>>[>]>+<<[<]<] Add one to counter if it is
                checks if start loop
                <-[>>]<
                c !0 0: 0 de _1 0 c !0 1
                or
                c: 0 0  0 de _1 0 c !0 1
                [>>>>[>]>-<<[<]<] Subtract one from counter if it is
                c ? 0: 0 de _1 0 c !0 1
                Adds two to counteract checks and move to the next instruction
                <++[->>+<<]
                >>[>]>
                c 0 0 ode _1 0 c: !0 1
                End on the counter
                    If the counter is 0 then we have reached the corresponding bracket
            ]
            c 0 0 2 de _1 0 0: !0 1 0
            <
        ]
        c 0 0 1?2 de _1 0: 0 0 1 0
        Subtract one from current instruction
            This executes the start loop code next but that does nothing
        <[<]>-<
    ]
    >-[<<]>
    [start loop
        c 0 0 0 de:  _1 0 0 ? 1
        <++[>]>>[<<]>
        c 0 0 2 de _1 0 0 0 1:
        or
        c 0 0 2 de _1 0 0: !0 1
        [ If current cell is 0 navigate to corresponding end loop
            Initialise counter
            <<+
            c 0 0 ode _1 0 c: 0 1
            [ While counter is not 0
                Transfer current instruction over (first instruction is guaranteed to be start loop)
                <<[<]>[-<<+>>]>
                co 0 0 de _1 0 c: 0 1
                Check if start loop
                --[<<]>
                co 0 0: !0 e _1 0 c 0 1
                or
                co 0 0 0 e _1 0 c 0 1
                [[>]>+<<[<]<] Add one to counter if so
                checks if end loop
                >+[<<]>
                co 0 0: !0 e _1 0 c 0 1
                or
                co 0 0 0 e:  _1 0 c 0 1
                [[>]>-<<[<]<] Subtract one from counter if so
                Add one to counteract checks and navigate to counter
                >+[>]>
                co 0 0 de _1 0 c: 0 1
                End on counter
                    If counter is 0 then we have reached the corresponding end loop
            ]
            co 0 1 e _1 0 0: 0 1
        ]
        co 0 0 2?1 e _1 0 0: ? 1
        Subtract two from the current instruction to bring it back up to the right value
        <<[<]>--<
    ]
    3 of these are pretty self explanatory
    Navigate to the current cell and execute the instruction on it
    >-[<<]>
    [output
        [>]>>.<<<[<]<
    ]
    >-[<<]>
    [minus
        [>]>>-<<<[<]<
    ]
    >-[<<]>
    [input
        Reset current cell
        [>]>>, (no more input so this is set to 0)
        co 0 0 0 e:  _1 0 0 0: 1 b 1 a 0 d 1 e 1 f
        Navigate to start of code section
        <<<[<]<<<[<]<[<]>
        d: ata 0 co 0 0 0 e _1 0 0 0 1 b
        or
        0: co 0 0 0 e _1
        Transfer next instruction to current cell
        [[>]>[>]>>>[>]>>+<<<[<]<<<[<]<[<]>-]
        0: ata 0 co 0 0 0 e _1 0 0 d 1 b
        or
        0: co 0 0 0 e _1
        Navigate back to the normal spot
        >[>]>[>]>>[<]<
    ]
    >-[<<]>
    [plus
        [>]>>+<<<[<]<
    ]
    >-[<<]>
    [right
        Simulated tape looks like:
            a b c: d e f
        co 0 0 0 e:  _1 0 0 c 1 b 1 a 0 d 1 e 1 f
        Navigate to value of cell to the right
        [>]>>>[>>]>
        co 0 0 0 e _1 0 0 c 1 b 1 a 0 d: 1 e 1 f
        Transfer it to temporary cell
        [<<<[<<]<+>>>[>>]>-]
        co 0 0 0 e _1 d 0 c 1 b 1 a 0 0: 1 e 1 f
        Pop extra marker if it exists from the right cells and add one to the left
        >[-]<<+
        co 0 0 0 e _1 d 0 c 1 b 1 a 1: 0 0 e 1 f
        Transfer all left cells over 2 cells
        [<[->>+<<]<]<[->>+<<]
        co 0 0 0 e _1 0: 0 d 1 c 1 b 1: a 0 e 1 f
        Navigate back to normal spot
        <[<]<
    ]
    >-[<<]>
    [left
        Simulated tape looks like:
            a b c: d e f
        co 0 0 0: e _1 0 0 c 1 b 1 a 0 d 1 e 1 f
        Add temporary marker
        [>]>++
        co 0 0 0 e _1 0 2: c 1 b 1 a 0 d 1 e 1 f
        Remove temporary marker and transfer all left cells over two
        [-->[-<<+>>]>]
        co 0 0 0 e _1 c 0 b _1 a _1 0 0: d 1 e 1 f
        Add marker to right cells remove marker from left cells and reset left cell's markers
        +<<-[++<<]<
        co 0 0 0 e _1 c: 0 b 1 a 0 0 1 d 1 e 1 f
        Transfer current cell to to right cells
        [->>>[>>]>+<<<[<<]<]
        co 0 0 0 e _1 0: 0 b 1 a 0 c 1 d 1 e 1 f
        Navigate back to normal spot
        <[<]<
    ]
    Add 8 to reverse checks
    <(8++++++++)>>

    Execute next instruction
    [+<<->>]>
]

解释程序。与普通代码的唯一区别是,输入是从代码段的开头而不是输入开始的。

第6部分:如果return不为0,则暂停

>>[]

导航到的结束细胞程序,如果返回的不是0。如果是0,退出循环,并结束对同一0运行一个无限循环。

测试输入:

始终返回0(停止并返回0)

(empty program)

始终返回1(永远运行)

+

返回所有加在一起的输入,mod 256(返回211,因此它将永远运行)

,[[->+<],]>

如果代码的最后两个字符是无限循环([]),则返回0 (您的程序在给定我的程序时返回0 ,因此我的程序停止了)

,[>,]>(9+++++++++)[-<(10++++++++++)>]<[-<-<->>]+<---[[-]>[-]<]<-[[-]>>[-]<<]>+>[-<->]<    

那些仍在阅读的人的趣闻

如果此程序的输入是该程序的源代码,则它将开始递归,重复创建运行该程序的自解释器,然后再次提供相同的程序。这给了我一些有关在Brainfuck中创建实际递归程序的有趣想法。无需像本问题中那样检查返回值并启动无限循环,而是可以保存返回值并对其执行操作。一个简单的例子是一个析因程序

If cell1 == 0:
    Get input into cell1
If cell1 == 1 or cell1 == 0:
    Return 1
Else:
    Initialise self-interpreter-quine function
    Pass cell1-1 into cell1 of the function
    Run function
    Multiply cell1 by the return value
    Return cell1

当然,考虑到运行递归自解释器将成倍增加运行时间,因此这是一种完全疯狂的脑力激荡编码方式。


好极了!顺便说一句,如果您想打高尔夫球,考虑到您的回归惯例,我认为您可以放弃支持.。尽管由于这不再是代码问题,所以支持整个语言可能会更加令人印象深刻。
与Orjan约翰森

@ØrjanJohansen,我可能仅通过切换到另一种数据生成方法就可以节省大约一千个字节。而且,自解释器不是我可以写的最小的,因为它支持负数单元格。
Jo King

看来应该赢得赏金,但我想花时间去理解它,而不是自己成为BF高手。如果您下周没有回音,可以给我ping吗?
纳撒尼尔(Nathaniel)

1
据我所知,我确认这符合规范。赏金应该很快就向您飞来。(系统会延迟一段时间才能让我授予它。)谢谢您的回答,非常感谢。
纳撒尼尔(Nathaniel)'18年

1
您可能对Muriel感兴趣。
PyRulez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.