Yuvarlanan Quine Zar


19

Kendini çıktısı alan bir program oluşturun.

Ancak, kaynak kod n kez tekrarlanırsa (kaynak kodun bir kopyasını n-1 kez bitirmek anlamına gelir) , orijinal kaynak kodunu çıkış 1 / n olasılığı, çıkış 1 / n olasılığı olmalıdır iki kez tekrarlanan kaynak kodu, üç kez tekrarlanan kaynak kodunun çıkışının 1 / n olasılığı, ... ve n kez kaynak kodunun çıkışının 1 / n olasılığı.

Örneğin, programınız foobarher zaman tam olarak çıktı almalıdır foobar. Koşarsan Ancak foobarfoobarfoobarfoobar, o zaman çıkışının her bir ¼ şans olmalı foobar, foobarfoobar, foobarfoobarfoobarve foobarfoobarfoobarfoobar.

  • Her olası çıktının dağılımı eşit olmalıdır
  • Standart G / Ç yöntemlerinin uygulanmasına ve standart boşlukların yasak olmasına ek olarak, standart quine kuralları uygulanır (kendi kaynağına erişemez, vb.)
  • Bu kod golf bayt kazanır çok kısa cevap kazanır

Sözde yeterince iyi mi?
wastl

1
@wastl Evet, sorun değil
JMigst

2
Tanımınız biraz kapalı. 1 kez tekrarlarsanız (yani foobarfoobar) sadece yazdırırfoobar
Veskah

1
@Veskah foobarfoobaredilir foobarbir kez değil iki kez, tekrarladı.
Nit

@Nit Kaynakla başlarsınız. Tekrar kullanırsanız, sadece bir kez tekrarladınız, ancak iki örneğiniz var.
Veskah

Yanıtlar:



9

Jöle , 24 22 bayt

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ

Çevrimiçi deneyin!

Deneyin x4!

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ
“Ṿ;ẋŻɼLX¤¤µ”              String literal: Ṿ;ẋŻɼLX¤¤µ
            Ṿ             Uneval. Return “Ṿ;ẋŻɼLX¤¤µ” (with quotes)
             ;            Append the initial string. Yields the source code. 
                ɼ         Apply the preceding link to the register and store the 
                          result in the register.
               Ż          Prepend 0. 
                          Each time Żɼ is used when the source code is repeated
                          the register's length increases by one. 
                          We can't use ‘ because it closes string literals.
                 L        Length. Returns the number of times the source code has
                          been repeated up till now.
                  X       Random element. If ɼ results in n, X returns a random 
                          integer between 1 and n.
                   ¤      Combines ŻɼLX as a nilad. 
              ẋ           Repeat the source code a random number of times between
                          1 and n.
                    ¤     Close everything from the initial string literal as a
                          nilad. 
                     µ    Start a new monadic chain. The register gets updated
                          once for time the code is repeated but only the final
                          repetition will result in output.

5

05AB1E , 32 bayt

"34çìDJ¼32ôн¾L×Ω"34çìDJ¼32ôн¾L×Ω

Çevrimiçi deneyin!

açıklama

"34çìDJ¼32ôн¾L×Ω"                   # push this string
                 34ç                # push a "-character
                    ì               # prepend it to the string
                     DJ             # duplicate and join the copy to the string
                       ¼            # increment the counter
                        32ô         # split the string into pieces of size 32
                           н        # take the first one
                            ¾L×     # repeat it for each in [1 ... counter]
                               Ω    # pick one at random

Şansın olduğunda açıklama ekleyebilir misin?
Shaggy

@Shaggy: Bana hatırlattığın için teşekkürler :)
Emigna

2

Gol> <> , 21 bayt

:QoaonC|P\Sx*F2ssS"
0

Çevrimiçi deneyin!

Açıklama:

:Q     |     If the top of stack is 0, skip to next |
             Top of stack is implicitly 0
        P    Increment top of stack
         \   Redirect pointer down]
0:QoaonC|P\Sx*F2ssS"  Increment for each copy of the source code
0:QoaonC|P\Sx*F2ssS"


         \   Redirect back to the right
          Sx*  Multiply the number of copies of the source code by a random number between 0 and 1
             F      Repeat that many times
              2ss   Push a double quote
                 S" Print the source code minus the quote, newline and 0
 :Q       If top of stack is not 0
   oaonC  Print the quote, a newline and a 0 to complete the source code and continue the loop
        \Sx*   Error on the * for some reason

1

Alice , 35 bayt

"d3a*h-&;adddd12h&}Uh*t&w.odt,k@
 !

Çevrimiçi deneyin!

açıklama

"

2D dillerdeki pek çok sorguda olduğu gibi, bu "kendi kendine dolanan ve kendisi hariç tüm ilk satırı iten bir ile başlar ".

d3a*h-&;

Kaynak kodun bir veya daha fazla ek kopyasının eklenmesi, dizgi değişmezinin sonuna bazı örtülü boşluklar yerleştirir. Bunu gerçekten bir kınamak için, yığını 31 karakterde kesiyoruz.

addd

Bir satırsonu, sonra yığın yüksekliğini üç kez itin. Yığın yüksekliği olarak itilen değerler 32 (ikinci satırdaki boşluk), 33 (ikinci satırdaki boşluk !) ve 34'tür (başlangıç ").

d

Yığın yüksekliğini bu sefer orijinal kaynak kodunun uzunluğu olarak tekrar itin (35).

1

1'de bir sayaç başlatın. Bu, kaynak kodun kaç kez tekrarlanacağını sayar.

2h&}

Üç kez sağa döndürün (yani sola dönün). Kaynak kodun her ek tekrarı, bununla haynı sütuna katkıda bulunacak ve }böylece sayacı artıracaktır . IP geri döndüğünde }, aynı yönde devam etmek için tekrar sağa dönün.

Uh

0'dan n-1'e eşit rastgele bir sayı alın, ardından orijinal kaynağın çıkış sayısını almak için 1 ekleyin.

*t&w

Önceden itilmiş yığın yüksekliğiyle (kod uzunluğu) çarpın, ardından birkaç kez eksi bir dönüş adresine basarak aşağıdakileri tekrarlayın.

.o

Yığının üstünü yok etmeden çıktı alın.

dt,

Alt yığın girişini en üste taşıyın.

k@

Tekrarlayın, sonra döngü bittikten sonra sonlandırın.



1

Kömür , 58 bayt

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θ

Çevrimiçi deneyin! Deverbosifier şu anda boğulduğu için ayrıntılı bir sürüm yok "´". Çoğunlukla Golf Kömür quine size büyük iyi bir quine dayalı ! . Açıklama:

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ

Literal dizesi atama θ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θiçin θ.

Yalnızca önceki çıktının geçerli olması için önceki çıktıları silin.

×⊕‽L⊞Oυω

Boş dizeyi önceden tanımlanmış diziye itin. Bu, dizi uzunluğunu şimdiye kadar işlenen tekrar sayısına eşit hale getirir, bu nedenle uzunluğunu alın, örtülü özel aralıkta rastgele bir sayı alın, 1 ekleyin ve aşağıdaki dizeyi birçok kez tekrarlayın.

⁺⪫⁺´≔θ´´θ

Değişmez dizeyi başına θekleyin, ardından ´her karakter arasına değişmez değerler ekleyin, ardından öğesinin başka bir kopyasını ekleyin θ.

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.