Neredeyse quine yapın


12

Ona vererek bir arkadaş aptal istediğini Quine o neredeyse çalıştı, ancak sloppier ve sloppier oldu.

Çalıştırıldığında, programın çıktısını alan ancak bir karakter kapalı olan bir program oluşturun. Bir karakter eklenebilir, kaldırılabilir veya her ikisi birden (bir karakter değişir). Ama sadece bir karakter.

Puanınız (length of your program) / floor(sqrt(number of times the program almost quines))( / 0Sonsuzluk nerede )

number of times the program almost quinesstdout'ta yalnızca bir karakter değiştirirken programınızın kaç kez çalıştığıdır. Programınız giriş kabul etmeyebilir. Ayrıca önceden yazdırmış olduğu bir programı da yazdırmayabilir.

Ayrıca olabilir değil daha önce daha önce eklemiş olduğu bir karakter eklemek veya aynı dizinden bir karakteri kaldırın. Örneğin, daha 1önce eklediyseniz ve 1tekrar eklerseniz , burası number of times the program almost quinesdurur. İlk karakteri kaldırırsanız, ilk karakteri bir daha kaldıramazsınız. Üçüncü karakteri a olarak değiştirdiyseniz, üçüncü karakteri 2ekleyemez 2veya kaldıramazsınız.


bir soru nedir?
Abr001am

@ Agawa001 bir quine bir program ekrana kendisi bu.

Yanıtlar:


7

CJam, 0.000884

{_,6/[{64md}6*](124+\+'�f++`"1$~"}""1$~

Burada, kod noktası 128 ile yazdırılamaz karakteri gösterir . Çevrimiçi deneyin.

Fikir

Bu yaklaşım, kod bloğunu izleyen ilk boş dizeye U + 4000000 ve U + 7FFFFFFF arasındaki kod noktaları olan tüm UCS karakterlerini (orijinal belirtim) ekler.

Bu karakterlerin her birini 6 baytlık bir dize kullanarak kodlayan UTF-8'i seçiyoruz :

1111110u₂     10vvvvvv₂     10wwwwww₂     10xxxxxx₂     10yyyyyy₂     10zzzzzz₂

252 + u       128 + vvvvvv  128 + wwwwww  128 + xxxxxx  128 + yyyyyy  128 + zzzzzz

Böylece, 64 nolu tabandaki en az 6 önemli basamağını hesaplayarak ve en anlamlı olana 252 ve geri kalanlara 128 ekleyerek bu aralıktaki n'inci karakteri kodlayabiliriz .

puanlama

Orada 2 ** 31 = 2,147,483,6486 bayt UTF-8 karakter ve skor böylece orijinal kodunun uzunluğu, 39 olduğunu 39 / floor(2 ** 15.5) = 39 / 46340 = 0.0008416055243849806.

Nasıl çalışır

{                                }""    e# Push the code block and an empty string.
                                    1$~ e# Execute a copy of the code block.
 _,                                     e# Push the length of the string.
   6/                                   e# Divide by 6 to get the number of chars.
      {64md}6*                          e# Perform modular division six times.
     [        ]                         e# Collect the results in an array.
               (124+\+                  e# Add 124 to the first element.
                      '�f+              e# Add 128 to all and cast each to Char.
                          +             e# Concatenate the strings.
                           `            e# Push a string representation.
                            "1$~"       e# Push '1$~' to complete the quine.

İlk (düşük) puanınız nedeniyle bunu kabul ediyorum . İzin vereceğim.

6

CJam, 46 bayt, 65504 ekleme, 65505 del, Puan 0.127424

{`-2<_0c#)!{'#/~(_)\+\+S+]'#*}*W<"
}_~"e# 
}_~

Burada test edin.

Temel form standart bir genelleştirilmiş CJam kininidir. "Neredeyse quine" için, e#kod bloğunun sonunda, kodu etkilemeden karakterleri özgürce ekleyebileceğim bir yorum var . Yorumun başlangıçta tek bir boşluk içerdiğini unutmayın.

Program , ASCII değerinden başlayıp sırayla devam ederek yorumun önüne karakterler eklemeye devam eder !. CJam'ın karakter kodları 2 16'dan sonra dolanır , bu nedenle bir noktada bu bir boş bayt ekleyecektir. Bu gerçekleştiğinde, program yorum bitene kadar baytları yorumun sonuna kadar kaldırır (kaldırılan karakterin konumu her zaman farklı olur).


5

CJam, 19 bayt, 65536 ekleme, 0 del, Puan 0.074219

"a"{\)_)++`\"_~"}_~

Daha basit daha iyidir.

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.