Durma problemini çözme girişimlerimi şaşırtmak


31

Lütfen dikkat: Doğası gereği, bu zorluk için spec anlamak zordur. Muhtemelen, hesaplanabilirlik teorisinde en azından birinci sınıf bir ders ya da eşdeğer bir arka plan okuması gerektirir. Ek olarak, mücadelenin kendisi oldukça zordur. Cevaplamak, seçtiğiniz dil altkümesinin tamamı için bütün bir tercüman yazmasını gerektirecek ve sadece bu değil, aynı zamanda tercümanın bir benzeri formda olması gerekecek. Cevabınız bütün bunları yapmıyorsa, şartnameye uymamak neredeyse kesindir.

Bu zorluğu çözmek için durma problemini (kısmen de olsa) çözmenize gerek yoktur. Ancak, neredeyse kesinlikle yapmak o özellik tam olması gerekmez rağmen (o yorumladığı aynı dilde yazılmış kullandığınız dil, ait) bir tercüman yazma gereğini. Bu ilginç bir meydan okuma yapan budur.

Spesifikasyonu karşılayan ilk cevaba 500 puan ödül vereceğime söz verdim ve bu Jo King's BF cevabına verilecek .

Meydan okuma

Alan Turing'in durma probleminin çözülemezliği konusundaki kanıtının kaba ve basitleştirilmiş bir versiyonu şöyle olur:

FDurdurulan programı çözmek için bir program yazdığımı varsayalım . Olduğunu, Fgirdi olarak başka bir programın kaynak kodunu alır ve F(G)geri dönmek gerekiyordu 1eğer Galıkoymaların ve 0aksi.

Fakat eğer size programımı verirsem , programımı girdisiyle çalıştıran Fbaşka bir program Holuşturabilirsiniz H. Eğer F(H)geri dönüşler 0sonra Hgeri döner 0, fakat aksi halde bilerek sonsuz bir döngüye girer. Bu bir paradoksa yol açar ve sonuçta Fdurma problemini çözemeyeceğimize karar vermeliyiz .

Görevin programı yazmak H, ama bir bükülme ile: Sana programımı vermeyeceğim. Bunun yerine, programınız programımın kaynak kodunu girdi olarak alacak. Yani:

  • Programınız programımı kaynak kod biçiminde bir girdi olarak alacak . (Örneğin bir dosya veya komut satırı girişi olarak, detaylar size kalmış.)

  • Programım , programınızla aynı dilde yazılacak ve ayrıca bir kaynak kod dizgisi biçiminde girdi alacaktır.

  • Eğer benim program döner 0zaman verilen programı girişi olarak, program durdurma (ve dönüş olmalıdır 0) verilen programımı girdi olarak. (“Returing 0” ın tam anlamı size kalmış.)

  • eğer programım durmuyorsa veya 0programınıza girdi olarak verilenden başka bir şey döndürmezse , programınız süresiz olarak çalışmaya devam etmelidir.

Büküm, şu ki, gerçekten çok daha zorlaştırmak için aşağıdaki kurallara uymalısınız:

  1. Herhangi bir yerleşik execveya tür evalişlevi kullanamazsınız .

  2. Kendi programınızın kaynak kodunu bulmak için herhangi bir "hile" yöntemi kullanamazsınız. (Örneğin, “bunu 'program' adlı bir dosyaya kaydet” diyemez ve ardından programınıza ekleyebilirsiniz open(program).)

Bu, programınızın, yalnızca kendi kaynak kodunu bir dize biçiminde çoğaltmakla kalmayıp aynı zamanda yazdığı dili doğru şekilde ayrıştırıp yorumlayabilen bir tür çılgın süper quin olması gerektiği anlamına gelir.

Bunu delicesine daha az zorlaştırmak için, seçtiğiniz dilin sadece (Turing-complete) alt kümesini kullanmanıza izin verilir. Bu nedenle, programınız Python'da yazılmışsa ve yalnızca programım yalnızca ifs ve whiledöngüler ve temel dize işlemleri içeriyorsa işe yararsa, programınız yalnızca bu şeyleri kullandığı sürece sorun olmaz. (Bu, seçtiğiniz dilin standart kütüphanesinin tamamını uygulama konusunda endişelenmenize gerek olmadığı anlamına gelir!) Ancak, programınızın gerçekten çalışması gerekir - yalnızca kendi dilinizi oluşturamazsınız.

Bu , bu yüzden en çok oy alan cevap kazanıyor. Bununla birlikte, yukarıda belirtildiği gibi, sadece teknik özelliklerle tanışmak ciddi bir zorluktur, bu nedenle kararıma göre ilk cevaba 500 puanlık bir ödül vereceğim.

lütfen aklınızda bulundurun: kuşkusuz, kullandığım ifadeleri verilen bu zorlukla "hile yapabileceğiniz" birçok yol vardır. Bununla birlikte, sorunun ruhuna giren cevapları ümit ediyorum. Amaçlandığı gibi zorluk çok zor ama mümkün ve bunun için gerçek çözümler görmeyi umuyorum. Ödülümü aldığım kararda hile yapan bir cevaba vermeyeceğim.


Not: Bu meydan okuma başlangıçta olarak yayınlandı , ancak 2016'da "nesnel kazanma kriteri" olmadığından kapatıldı ve yeniden açmak için golfüne değiştirdim. Ancak, 2018 Ocak ayından bu yana, aslında PPCG'de yasaklanmadığını ( bunun en yeni meta tartışmasıyla) yasaklandığını ve bu nedenle ilk önce kapatmanın site politikasına aykırı olduğunu buldum . Popcons'ların bu günlerde popüler olmadığını biliyorum, ancak bu eski bir zorluk ve doğası için gerçekten uygun değil puanlama sistemiyle. Eğer biri hala buna izin verilmemesi gerektiğine dair kuvvetli bir görüşme varsa) oylar etrafa atılmaya başlıyor Son olarak, birinin geçen yıl çözümlerini golf oynamaya çaba harcadığı şansı azalıyorsa, bu mücadelede tam olarak rekabet edebildiğinden ve kazandığı kadar ödül alacağından emin olabilirsiniz. olmuştur sürümü.


1
Dönerek, çıkış kodunu veya stdout'u mu kastediyorsunuz? Ya da her ikisi de kabul edilebilir mi?
PlasmaPower

Her ikisi de kabul edilebilir.
Nathaniel,

@Nathaniel aldığım kodun Fbir dosyaya aktarılması ve gönderilmesi yasa dışı importolur mu? ; 3
cjfaure

1
Bu soruyu çok beğendim ama anlamak zor. Başkası sorun yaşıyorsa, bu iki slayt (Java psuedocode'da) anlamamı çok kolaylaştırdı: imgur.com/a/NRmyO
Harry

1
"Sorunun ruhu" ve "orijinal çözümler" den bahsediyorsunuz. Bununla ne demek istiyorsun? Dilimiz için bir tercüman kendimiz mi yazmalıyız? Bunu yapmanın başka bir yolunu düşünemiyorum.
KSFT

Yanıtlar:


23

brainfuck , 6013 4877 4376 bayt

Düzenleme: -1136 bayt. Quine için veri oluşturmanın daha iyi bir yoluna geçti

Düzen2: -501 bayt. Tercümanımı tekrar ziyaret et ve birkaç yüz byte kes.

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

Çevrimiçi deneyin! Buradaki giriş,[.,], programın kendisini yazdıracakbasit bir kedi programıdır ().

"Return 0", programı 0 değerine sahip bir hücrede sonlandırarak tanımlanır.

Geçmişte yazdığım iki programın kutsal olmayan bir birleşimi, bir soru ve bir tercüman. İlk bölüm, verileri alan ve bandı kaynak kodunu takip eden veri üretimi ile dolduran ince kısımdır. Daha sonra , programınızı alan ve çalıştıran kendi kendine tercüman . Bu, normal bir kendi kendine tercümanın değiştirilmemiş bir kopyasıdır; doğrudan girdi almak yerine, daha fazla girdi yoksa, hücreyi 0'a ayarlayarak veri bölümünün başından girdi alır. Son olarak, programınızın mevcut hücresinde bitirin ve çalıştırın []. Döndürülen değer 0 ise, programım sıfırda bitecek. Başka bir şey ise, sonsuz bir döngü çalışacaktır. Eğer programınız sonsuza çalışırprogramım sonsuza dek sürecek.

Nasıl çalışır:

Bölüm 1: Veri Üretimi

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

Bu bölüm, sıranın veri bölümünü oluşturur ve 3270 bayttaki kodun çoğunluğudur. Başlangıç -, verinin başlangıcı için bir işaretleyicidir. Her biri >+++bu bölümden sonra kodun bir karakterini temsil eder.

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

2. Bölüm: Verileri kullanarak veri bölümünü oluşturun

+[<+]>

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

Bu, verileri bölüme veri üretmek için kullanılan karakterleri eklemek için bölüm 1'deki verileri kullanır. >Kod bölümünün sonuna bir a ekler ve bu hücrenin değeri pek çok artıdır.

3. Bölüm: Verileri kullanarak kodun kalanını oluşturun

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
>>[>]>>[>]<[[-]<]

Veri bölümünü yok eder ve kaynak kodun geri kalanını kod bölümüne ekler

Bölüm 4: Girilen programı al

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

Girilen programı alır. Brainfuck olmayan karakterleri kaldırır ve her karakteri bir sayı ile temsil eder:

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

İle programın sonunu temsil eder 255.

Bölüm 5: Girişin yorumlanması

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
    [+<<->>]>
]

Programı yorumlar. Normal olandan tek fark, girişin giriş yerine kod bölümünün başından alınmasıdır.

Bölüm 6: Dönüş 0 değilse durdurma

>>[]

Programınızın bitiş hücresine gidin ve dönüş 0 değilse sonsuz bir döngü çalıştırın, 0 ise, döngüden çıkın ve aynı 0 üzerinde bitirin.

Test Girişleri:

Her zaman 0 döndürür (durur ve 0 döndürür)

(empty program)

Her zaman 1 döndürür (sonsuza kadar çalışır)

+

Birlikte eklenen tüm girişi döndürür, mod 256 (211 döndürür, böylece sonsuza kadar çalışır)

,[[->+<],]>

Bir kodun son iki karakteri sonsuz bir döngü ise ( 0 []) döndürür ( ) , programım verildiğinde programınız 0 döndürür , dolayısıyla programım durur)

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

Hala okuyanlar için eğlenceli bilgiler

Bu programın girişi bu programın kaynak koduysa, tekrarlamaya başlayacaktır, tekrar tekrar bu programı çalıştıran ve sonra da aynı programı tekrar veren kendi kendine tercümanlar oluşturacak şekilde tekrarlayacaktır. Bu bana beyin fırtınasında gerçek özyinelemeli programlar oluşturma konusunda bazı ilginç fikirler verir. Dönüş değerini kontrol etmek ve bu sorudaki gibi sonsuz bir döngü başlatmak yerine, dönüş değeri kaydedilip hareket edilebilir. Basit bir örnek, giden bir faktoring programı olacaktır.

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

Tabii ki, bu özyinelemeli öz-tercümanlar çalıştırmanın katlanarak çalışma zamanını artıracağı düşünüldüğünde, bu tamamen beyin fırtınasını kodlamanın çılgınca bir yolu.


Yuppi! Btw bu golf oynamak istiyorsanız, iade konvansiyonu verilen bence destek bırakabilirim .. Bu artık bir kod-golf sorusu olmadığı halde, tüm dili desteklemek daha etkileyici olabilir.
Ørjan Johansen

@ ØrjanJohansen, sadece farklı bir veri oluşturma yöntemine geçerek muhtemelen bin baytlık golf oynayabilirim. Ayrıca, kendi kendine tercüman, negatif hücreleri desteklediği için yazabileceğim en küçüğü değil.
Jo King,

Bu ödül kazanmalı gibi görünüyor, ama kendim BF uzmanı olmak için zamanımı ayırmak istiyorum. Gelecek hafta biraz zaman alamazsan bana ping edebilir misin?
Nathaniel

1
Bunun söyleyebileceğim kadarıyla şartnameye uygun olduğunu onaylıyorum. Bir ödül kısa bir süre içinde size yol gösterecek. (Sistem ödüllendirmeme izin vermeden önce bir gecikme var.) Cevabınız için teşekkür ederim, çok memnun oldum.
Nathaniel

1
Muriel ile ilgilenebilirsin .
PyRulez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.