Hata Tespit Kendini Onarma Programı


14

Göreviniz, herhangi bir karakter silindiğinde hangi karakterin silindiğini algılayacak ve ardından silinen karakteri kendi kaynak dosyasına tekrar ekleyeceği bir program oluşturmaktır.

Örneğin, programınız RadiationHardeneddeğiştirilmişse ve değiştirilmişse RadiaionHardened, programınızın 5. baytın (0 dizinli) değiştirildiğini ve program kaynağının RadiationHardenedyürütüldükten hemen sonra olması gerektiğini belirtmesi gerekir .

Notlar ve kurallar

  • Yürütmeden önce kaynak kodda tam olarak bir karakterin silindiğini varsayabilirsiniz. Değiştirilmemiş programın davranışı tanımlanmamıştır.
  • Değiştirilen baytın silineceğini, aktarılmadığını, eklenmeyeceğini veya değiştirileceğini varsayabilirsiniz.
  • Aynı karakterin birden fazla çalıştırılması durumunda, çalışmanın ilk veya son dizinini bildirebilirsiniz, ancak hangisini kullandığınız konusunda tutarlı olabilirsiniz. Örneğin , 1 veya 3'ü (sıfır dizinli) bildirmek baaadiçin silinmekle baadbirlikte tüm program boyunca aynı olmalıdır.
  • Tüm kaynağı kendi dosyasına yazmanıza gerek yoktur. Yalnızca silinen baytı yeniden eklemeniz gerekir.
  • Radyasyonla sertleştirilmiş ayıkların tipik kurallarının aksine, programın kendi kaynak kodunu okumaktan değiştirilen baytı tespit etmek adil bir oyundur.
  • Değiştirilen bayt dizinini herhangi bir makul formatta çıktılayabilirsiniz. 0 dizinli veya 1 dizinli veya başka bir gösterim olup olmadığı konusunda tutarlı olun. Hatta bir şablon dizginin içinde bir sayı çıktısı alabilirsiniz.

Bu bu yüzden en kısa program kazanır.

İyi şanslar!

EDIT1: değiştirilmeden silinmeye kadar değişen gereksinim

EDIT2: yinelenen çalıştırmalar için kural eklendi


4
Bu, keyfi silme işlemlerinden çok daha zordur . Esolan olmayanların çoğu açıktır ( herhangi bir tek baytlık değişiklik altında sözdizimsel olarak geçerli kalan herhangi bir program yazmak genellikle imkansızdır ). Fungeoidler bile çoğunlukla engellenir (0. bayt bir programdan çık komutuna dönüştürülürse hiçbir şey yapamazlar ). Belki de iki IP'den birinin Fission gibi bir şeyde hayatta kalabileceğini düşündüm, ancak komutu tüm IP'leri öldürüyor. Kardinal de bunu yapamaz . *@
Lynn

Bu code-challenge, her programın radyasyona karşı korunan bir bayt listesi bildirmesine izin verilen bir yere dönüştürülebilir (ancak toplam boyutun% 50'sinden fazlasını değil). Basit bir puanlama sistemi, radyasyondan korunan her baytı 10 bayt veya bunun gibi bir şey olarak saymak olabilir.
Arnauld

(Ama bu bazı önemsiz ve çok ilginç olmayan cevaplara yol açabilir.)
Arnauld

1
@JoKing, tutarlı olduğu sürece eksik olarak raporlamak iyidir.
Beefster

2
"Dosyanın belirli bir adla adlandırılmasını ve belirli bir dizinden çalıştırılmasını isteyebilirsiniz" - dikkatli olun, birileri sadece dosya adının doğru program olmasını isteyebilir ...
ASCII-sadece

Yanıtlar:


9

Befunge-98 (FBBI) , 344 296 248 bayt

20020xxnngg33%%!!2200gg''00--3300gg33%%!!4400gg55%%!!22kk++55##rr55kk::00gg\\11pp00gg\\11++11pp22++00::pp00gg\\11++00gg--!!zz!!22**++00::gg00gg8844**--!!55++jj..''gg::00rr00::gg\\--..''220011''0011::''002211''223311''00441144kkppgg11001100::99oo@@

Çevrimiçi deneyin!

Doğrulama!

Befunge-98, hem 2D hem de dosya çıktısı olan bulabildiğim ilk ezoterik dil. Bu, sekme karakteri olarak adlandırılan bir dosyada depolanan tam bir çözümdür (son satırsonu ile birlikte). 0 dizinli olarak çıktı verir ve bir karakter dizisindeki ilk dizini çıktılar (yalnızca çiftler olmasına rağmen).

Özellikle birkaç no-ops , şimdi sadece bir no-op olduğu gibi , yapılması gereken birkaç golf var ! 200 bayta ulaşmak veya altına inmek için bunu kısaltmaya çalışacağım.


Vay canına! Bunun mümkün olduğunu düşünmüyordum
MilkyWay90

3

Unefunge-98 (PyFunge) , 118 bayt

22xx00##rr33kk::gg\\11--pp22++00ppgg\\11++gg--!!zz!!22**--00gg::gg8844**--!!22++jj##''rr++..gg''2200pp0011--00::99oo@@

Çevrimiçi deneyin!

Doğrulama!

Befunge-98 cevabımı golf yaparken, Unefunge'ye taşıyarak bazı baytları kurtarabileceğimi fark ettim, çünkü ikisi yerine sadece bir boyut hakkında endişelenmem gerekecekti. Bu aynı zamanda yeni çözümü çok daha küçük hale getiren birçok olası kısayol ve golf açtı .

Açıklama (çoğaltılmış):

2x        Set the delta of the movement to 2
          This means the pointer moves 2 cells every step
          This will also initialise a counter as 2 (unless a 2 has been removed)
  0       Create the cell counter  (This will be stored at cell 0)
   #r     Enter the loop
     3k:                 Create 3 more copies of the counter
        g                Get the cell at the counter's position
         \1-p            Put it in the cell before that position
             2+0p        Add 2 to the counter and put it in cell 0
                 g       Get the cell at the counter's position
                  \1+g   Get the next cell
                      -!z!2*      If they are identical, push two, else 0
                            --    Subtract it from the total counter
                              0g:g84*-!   If the next character is a space
                                       2+j  r   Exit loop
                                         j#'    Else jump back to the start

Once the loop is over
+      Add the negative counter to the total counter
 .     And print
   '20p          Replace the 2 in cell 0 that was overwritten
             o   Write to a file named
            9    Tab
       01-       The cells from -1 to
  g              The total number of cells
              @  And exit the program
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.