Radyasyon Dedektörü!


26

Radyasyonla sertleştirilmiş bir program, kodun herhangi bir karakterinin çıkarılması durumunda programın aynı şekilde çalışacağı bir programdır. Bu soru için, ne zaman ışınlandığını algılayan bir program yazacağız.

Herhangi bir tek bayt kaldırıldığında, ortaya çıkan programın bu baytı ve yalnızca bu baytı çıkartacağı bir program veya işlev yazın . ( Başka bir byte çıkmadığınız sürece, bu byte'ı birçok kez yazdırabilirsiniz )

Kurallar:

  • Program en az 2 ayrı bayt içermelidir. (Sadece 0s çözümü yok;)
  • Orijinal programın ne yaptığı önemli değil
  • Kendi kaynak kodunu okumak yok.
  • Kod, en yüksek miktarın kazandığı farklı bayt sayısına göre puanlanır. Örneğin, abc= 3 puan, ababba= 2 puan, abckazanır.
    • Tie-breaker daha küçük bayt sayısıdır, bunu daha önce sunma süresi takip eder.

İyi şanslar!



Bu çizgiyi özledim. Ayıp bana!
Mego

5
"Kod, en yüksek miktarın kazandığı farklı karakter sayısına göre puanlanacak." Çözümlerin çoğunun (hepsi olmasa da) bir çözümü, aslında çözümü değiştirmeden sadece rastgele karakterlerle doldurabilecekleri bir dizge biçiminde olmasını beklerim (bu nedenle dilinizin ASCII ile sınırlı olup olmadığı, genişletilmiş ASCII veya Unicode) .
Martin Ender,

3
... Kum havuzu mükemmel değil. :( / Karakterlerin kodlama ve diğer problemlerle ilgili olması nedeniyle sadece "farklı karakterler" yerine "farklı baytları" ölçebilirsiniz.
user202729

1
Program herhangi bir giriş alabilir mi?
gggg

Yanıtlar:


15

05AB1E , 9 7 bayt (3 puan)

22'''rr

Çevrimiçi deneyin!

Bir çıkarma '

Herhangi bir 'kaldırılmasıyla birlikte, 22''rr22 yığında ilk şey ve yığında 'en son iki kez sonuçlanan, iki kez tersine döndüğünde sonuçlanacaktır '.

Bir çıkarma r

Herhangi biri rçıkarıldığında, 22'''r22'nin yığıntaki ilk şey, yığıntaki 'ikinci şey ve yığıntaki rson şey olmasıyla sonuçlanır. Bu r, ancak, bir, başında olduğu 'o değişmez dize yapar "r"(aynı komuta karşı reverse stackörtülü yazdırılır).

Bir çıkarma 2

Herhangi ile 2kaldırılan, 2'''rrbir sonuçlanacaktır 2, yığının üzerine 1 şey olması 'yığın 2 şey olmak ve nihayet rsonuçların kez ters yığını, son şey olmak 2.

Bu nedenle, bu cevap geçerlidir. Hiçbir şey çıkarılmadığında ', bunun alakasız olduğu çıktılar . Bu 2 dışında herhangi bir sayı için de geçerlidir.


Bir geçerlilik denetleyicisi oluşturduktan sonra, 05AB1E * 'de rekabet etmek için kullanabilirsiniz.

* 05AB1E'de kaç çözümün mümkün olabileceğinden% 100 emin değilim ...


Daha Kötü veya Aynı Olan Daha Geçerli Çözümler

  • 1 Puan (geçersiz)
  • 2-noktalı
    • '''''''VV, '''''''XXveya'''''''<any command that pops a without pushing>x2
    • 'Yukarıdaki 3'ün herhangi bir tek sayısı, ardından syukarıdaki 1'in herhangi bir çiftinden (EG '''''''''ssss).
    • '''..1'in üzerinde herhangi bir periyod sayısı ve '2'nin üzerinde tek bir sayı olması .
  • 3-noktalı
    • '\\'''rr- aynı fikri 22'''rrancak \'son yığın öğeyi kaldırmak' olduğunu.

Normal çıktısı, 'dediğiniz gibi kurallarla alakasız. Ancak, biraz komik olan anomalileri tespit etmenin asıl hedefini geçersiz kılıyor.
gggg

1
@gggg En azından alternatiflerimden BİRİNİ lol yazmıyor.
Magic Octopus Urn,

1
@ MagicOctopusUrn Bir şey değil. Sadece yorum yapmak yerine düzenleme yapabileceğimi düşündüm.
boboquack

@boboquack orijinal etiketim (@boboquack) işe yaradı mı, yoksa yazıyı tekrar görüntüleyerek mi buldunuz? Kullanıcı hiçbir zaman lol yorum yapmadığında etiketlerin nasıl çalıştığını anlamaya çalışıyorum.
Magic Octopus Urn,

@boboquack "Teşekkür ederim" den bir bildirim aldınız mı demek istedim? Ayrıca, bu konuyu "Hoş Geldiniz" için + 1'ime kadar silmeliyiz.
Magic Octopus Urn

9

Brainfuck, Puan 3

Çıktı yalnızca bir bellek dökümü üzerinden görüldüğü için rakipsiz olabilir.

+++++++++++++++++++++++++++++++++++++++++++++,-

Girişin boş olduğunu ve EOF'nin hücreyi değişmeden bıraktığını varsayalım. Belleği bu gibi bir çıkışa sürükleyen bir tercüman kullanır .

Bir artıyı kaldırın ve bellek "+" için unicode değeri, yoksa "," için unicode değeridir. Bir kuraldan daha çok bir kural bükücü olsa da. "-" ile hemen hemen aynı. Unicode karakter kümesinde bu üç karakterin peş peşe olduğu gerçeğini kötüye kullanır.


Akıllı, tamamen dürüst olmak gerekirse, bunun bir boşluk olduğunu düşünmeyin.
Magic Octopus Urn

EOF'nin hücreyi değişmeden bıraktığını varsayıyorsunuz, değil mi?
Jo King,

Evet, ve hiçbir girdi olmadığı sürece, iyi olmalı 😊
Håvard Nygård

Buna izin için cazip, ancak do sahip EOF o çıktılayacaktır sadece değişmiş hücreler ve yapraklar hücre değişmeden bir bellek dökümü olan bir tercüman?
Jo King,

1
copy.sh/brainfuck Bu iyi çalışması gerekir. Sadece çalıştırın ve "belleği görüntüle" ye basın.
Håvard Nygård

9

Bir Armut Ağacı, 256 farklı bayt, 975 bayt

Ne yazık ki, hemen hemen soru, bir yerde bir NUL baytı içerecek şekilde en uygun çözümü gerektirir (bir yerde tüm 256 baytı içermesi gerektiği için). Bunun anlamı şudur: a) Size bir TIO bağlantısı veremem (çünkü TIO programlardaki NUL'dan hoşlanmıyor ya da en azından, tarayıcımın başa çıkabileceği şekilde yazmanın bir yolunu bulamadım) ve b) Programı tam anlamıyla Stack Exchange'e yapıştıramazsınız. Bunun yerine, xxdaltındaki "kod pasajı" bağlantısının arkasına gizlenmiş bir geri dönüşümlü hexdump yerleştirdim.

açıklama

Bu program üç özdeş bölümden oluşmaktadır. (Bir programın birden fazla özdeş bölümünü birleştirmek, benim için bir temadan başka bir şey değildir. programlarda .) Her Bir Armut Ağacı, tercümanın programın hangi bölümlerini çalıştıracağını bilmesini sağlamak için bir yerlerde bir sağlama toplamı gerektirir; Programın sağlama toplamı çalıştırmadan önce başarılı olduğu programın herhangi bir bölümünü döndürür (veya yazdırır)a partridge sağlama toplamı uyuşmuyorsa ). Bu durumda, üç parçanın her birinde bir sağlama toplamı vardır ve bu nedenle ışınlanmamış bir parça başlangıcına doğru hareket eder. Bu nedenle, programın değiştirilmemiş bir bölümden oluştuğunu, ardından da iki bölümden (biri değiştirilmiş olabilir) oluştuğunu varsayabiliriz.

Her bölüm yeni bir satırla başlar, sonra aşağıdaki kodla devam eder (aşağıda boşluk ve yorumlar ekledim):

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

Bundan sonra, programda şu ana kadar kullanılmamış her sekizlinin bir kopyası (yalnızca puanlamayı çalıştırmak için) ve en sonunda sağlama toplamı gelir. (Sondaki yeni satır yok; parçalar yeni satırla başlar, ancak bir satırla bitmez.)

Burada üç ayrı durum var:

  • Yeni satır dışındaki bir karakter silindi . Bu durumda, ikinci ve üçüncü bölümlerde tuhaf sayıda görünecektir. Bu %z, sonunda karma tabloya son verecek kadar çok sayıda eklenip / veya kaldırılacağı anlamına gelir . Aslında, o olacak karma tablosundaki tek anahtar (dize ikinci bölümün yeni satırından sonra üçüncü bölümün sonuna kadar devam eder ve karma tablo yalnızca tek bir yeni satırla başlar), sadece kendi kendine basılacaktır.
  • Birinci veya üçüncü satırsonu silindi . Bu durumda, program, ikinci ve üçüncü bölümleri etkin bir şekilde tek bir çizgide birleştiren, eksik olan yeni çizgilerin üçüncüsü olacak şekilde döndürülecektir. Kelimenin tam anlamıyla erişilen dizgisi <DATA>, her karakteri eşit sayıda içerir, bu nedenle karma tablo orijinal içeriğine, tek bir yeni satıra sahip olur ve yazdırılır.
  • İkinci yeni satır silindi . Bu durumda, program döndürülmez (ilk bölüm geçerli bir sağlama toplamı olduğu için), ikinci bölüm ilk bölümle aynı çizgiye taşınır. <DATA>sadece aşağıdaki satırdan okumaya başlar __DATA__, bu yüzden sadece üçüncü kısmı görür. Bu, kaç kez tuhaf görünen beşten fazla karakter içeriyorsa, yeni bir satır yazdırmak için özel durumu tetikler.

Doğrulama

Hemen hemen tüm radyasyonla sertleştirilmiş bir Armut Ağacı programı için kontrol edilmesi gereken son bir şey, silme işleminin rastgele bir şekilde kodun istenmeyen bir bölümünün checksum'un doğru bir şekilde sağlama ve kodun yanlış yere dönmesine neden olup olmayacağıdır; 32 bit sağlama toplamı kullandığımızı göz önüne alındığında, bu olası değildir ancak imkansız değildir. Bunun herhangi bir silme işleminde gerçekleşmemesini sağlamak için aşağıdaki kaba kuvvet komut dosyasını kullandım:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

Doğrulama betiği bu programın doğru çalıştığını onaylar.


7

Stax , 11 bayt (4 puan)

'''cc'~~'dd

Çevrimiçi çalıştırın ve hata ayıklayın!

Bu meydan okumaya ilk (kronolojik olarak) bir cevabı 4 veya daha yüksek bir puanla vermek benim için bir onurdur. Belki de puan daha yüksek olabilir.

Stax'ta, tek bir karakterden oluşan bir dize değişmezi ile birlikte yazılır ', yani '', 'c, 'd, '~hepsi dize değişmezleridir. Karşılık gelen komutlar c dve ~araçlar, ana yığının tepesini çoğaltır, ana yığının tepesini çıkarır ve ana yığının tepesini çıkar ve sırasıyla giriş yığına itir. Bu zorluk için, girdi yığını çıktıyı etkilemez ve önemli değildir, dolayısıyla söyleyebiliriz dve ~aynıyız.

açıklama

Kodu birkaç parçaya bölmek ve ayrı olarak değerlendirmek en iyisidir.

Tahrif edilmediğinde, '''cchazır bilgiyi 've hazır bilgiyi cana yığına iter ve üst kısmı çoğaltır, böylece yığın (alttan aşağıya) olur c,c,'.

Tahrif edilmediğinde '~~, değişmeze basar ~ve sonra çıkar (ve giriş yığınına itilir), bu temel olarak ana yığın için işlem yapmaz.

Tahrif edilmediğinde 'dd, değişmezi iter dve sonra çıkar, ana yığın için başka bir işlem yapmaz .

Programın sonunda, açık bir çıktı olmadığından, ana yığının üstü örtük bir şekilde yazdırılır.

Program olduğu gibi çalışıyorsa, son yığın hala çalışır c,c,'ve çıkacaktırc .

İlk kısım olursa, ''ccbir hazır bilgimiz var 've iki kopya talimatı var, final yığını olacak ',','. Diğer iki parçanın çalışmadığı göz önüne alındığında, sonuç' .

İlk kısım olursa, '''csonuç temelde engellenmemiş olanla aynıdır, ancak cçoğaltılmaz. Yani yığın olacak c,'. İki tane ameliyat dışı kaldıktan sonra yığının tepesic .

Böylece ilk bölümde radyasyonu tespit edebiliriz.

İkinci kısım ve üçüncü kısım tamamen aynı şekilde çalışır. Üçüncü kısmı örnek olarak alacağım.

Üçüncü parça tahrif edilmişse, ilk iki parça olduğu gibi tutulur ve üçüncü parça çalıştırılmadan önce istif c,c,'

Üçüncü parça olursa, 'dhazır bilgi dana yığının üstüne itilir ve daha fazla bir şey yapılmaz. Ana yığının tepesi şimdi çıkılacak dolandır.

Üçüncü parça olursa, ddana istiften iki eleman çıkarılır ve şimdi istifin üst kısmı çıkar 've çıkar.

Bu yüzden üçüncü bölümde radyasyonu tespit edebiliriz. Aynı sebepten dolayı ikinci bölümde radyasyon tespit edebiliyoruz.


5

05AB1E , skor 2, 6 bayt

„"""„„

Bazen kaldırılan karakteri iki kat basar. İçermez '.

Nasıl çalışır:

İlk çıkarılıyor

"""„„

Çevrimiçi deneyin!

Öncelikle, boş bir dizgiyi birebir sıkıştırın. Sonra „„, basılır şekilde basılır.

Bir çıkarma "

„""„„

Çevrimiçi deneyin!

İlk önce, talimatla ""yığına 2-char stringitiyoruz. Sonra 2 karakterli bir dize daha almaya çalışırız, ancak bu iptal edildi (neden olduğundan emin değilim) ve"" basılır.

İkinci veya üçüncü çıkarma

„"""„

Çevrimiçi deneyin!

İlk önce, talimatla ""yığına 2-char stringitiyoruz. Sonra , basılır şekilde basılır.


5

Jöle , 5 bayt, skor 2

”””ḷḷ

Çevrimiçi deneyin!

Herhangi biri kaldırıldıysa:

””ḷḷ

Çevrimiçi deneyin!

Karakter , bir baytlık karakter değişmeziyle başlar. Bu programlar ””dizgeyi veren ile başlar . Dyad'ın 's sol argüman alır. Dize sadece iki örneğinden geçer .

Herhangi biri kaldırıldıysa:

”””ḷ

Çevrimiçi deneyin!

Bu program içinde ””verim karakter ardından ”ḷkarakterini verir ve yalnızca bu çıkıştır.


Diğer çözümler

  • Bu gönderi için olduğu gibi aveya oyerine başka birçok karakter de işe yarayabilirdi.
  • ⁾⁾⁾⁾FFF. Bu benzer şekilde çalışır. gibidir ancak iki baytlık bir dize değişmezi başlatır . "Işınlanmış" programlar, silinen baytın iki kez çıktısını alır ve yorumlarda geçerli sayılır.

İşte Sihirli Ahtapot urn geçerlilik denetleyicisi bir (daha az fantezi) Jöle sürümüdür. Çıktının sol sütunu silinen karakter ve sağ sütun, sonuçta ortaya çıkan programın çıktısıdır.


Geçerlilik kontrolcüm değil thaaat fantezi. Gönderilen diğer çözüm için başarısız olur;).
Magic Octopus Urn
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.