Kılık Değiştirme Transformatörleri (Polisler Konusu)


10

Soyguncunun ipliği burada

Polislerin görevi, kendilerine bir girdi verildiğinde, sınırlı bir deterministik dize çıktısı veren bir fonksiyon veya program yazmaktır. Programa farklı bir giriş verilirse, farklı bir çıkış döndürmelidir.

Kurallar:

  • Başvurular
    • Dil adı
      • Herhangi bir bayrak kullanılırsa, açıklanmalıdır.
    • Programın bayt sayısı
    • Bayt çıktı sayısı
    • Çıktı
      • Özellikle uzunsa, lütfen bir hamur veya benzeri bir şey sağlayın
      • Yazdırılamazlar içeriyorsa, lütfen bir hexdump girin.
      • Çıktının sonuna satırsonu ve boşluk eklenmelidir
    • Giriş nereden geliyor (STDIN, komut satırı, vb. )
  • Mümkünse, programınızda bu baytı kullanmadığınız sürece, EOF'u temsil eden baytın girişte bulunmadığını varsayabilirsiniz.
  • Programınız çatlamışsa, başlığınızdaki soyguncunun iş parçacığındaki ilgili cevaba bir bağlantı ekleyin.
  • Bir hafta geçene kadar programınız güvenli değildir ve siz onu işaretlersiniz.
  • Giriş veya kriptografik hash fonksiyonları ile rastgele tohumlama gibi teknikleri onaylamıyorum. Onları durduramıyorum, ancak bunlardan herhangi birini kullanan bir çözümü kabul etmeyeceğim . Ayrıca, bu tekniklerin bazılarının, farklı bir dizenin aynı çıktıyı ürettiği çarpışmalar olabileceğini unutmayın.
  • Amacınız en kısa çıktıyı elde etmektir. Bu soruyu gönderdikten sonra üç hafta içinde gönderilen en kısa güvenli çözüm kazanır!

Soyguncunun görevi, yukarıdaki kurallara da uyan, orijinaline eşit veya daha küçük boyutlu bir program bulmaktır.

Bir hırsız programınızı amaçlanandan farklı bir çözümle çatlatırsa, hırsız çözümünün yanlış olduğunu kanıtlayarak programı 'kırma' şansına sahipsiniz. Bunu, soyguncunun programına aynı çıktıyı üretecek bir girdi bularak yapabilirsiniz.

Örnek Gönderme:

brainfuck, 10 bayt, Puan: 10

]<.[<],>[,

Bu çözüm, girişi basitçe tersine çeviren [>,] <[. <]

İyi şanslar!


"Programa farklı bir giriş verilirse, farklı bir çıkış döndürmelidir." Bu, programın diğer girdiler için asla aynı şeyi vermemesi gerektiği anlamına mı geliyor? Yoksa bu, girdiye bakılmaksızın programın sürekli bir şeyler çıkarmaması gerektiği anlamına mı geliyor? (EXIST girişi kendisine eşit değildir, vs. FORALL girişleri kendisine eşit değildir, farklı bir çıkış döndürür.)
tsh

@tsh Yalnızca kendi girdisinin benzersiz bir çıktısı olmalıdır. Örneğin, geçerli bir başvuru , kendisi ve başka şekilde çıktı veren kendini tanımlayan bir program olabilir10
Jo King

@JoKing Python 3 örneğiniz geçersiz mi? Çünkü obvoiusly 1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941başka dizeleri de çıkarır .
Lynn

@lynn Haklısın. Bu örneği kaldırdım
Jo King

Yanıtlar:


4

7 , 31 karakter, 30 puan, güvenli ama muhtemelen kırık?

Bir 7 programı normalde sadece bir sayıdır, ancak beyaz alanı birden fazla sayıya bölerek içerebilir. Bu nedenle, bu başvuru iki sayıdan oluşur (7 yorumlayıcı tarafından örtük olarak birleştirilir) ve program aynı şekilde standart girdi yoluyla girdi olarak iki sayı alır. (Üstbilgideki "31 karakter", iki sayının toplam uzunluğu artı bir ayırma boşluk karakteri; sayıları oluşturan basamaklar program olarak kullanıldığında sekizli, giriş olarak kullanıldığında ondalık olarak ve iki durumda aynı olan rakamlar, gerçek sayılar değil.Bir program olarak işlendiğinde ya da girdi olarak işlendiğinde, ister boşlukla, ister yeni satırla ayırın, ilgisiz olduğuna dikkat edin; sunumu geçersiz kılmaz.)

Beklenen çıktı aşağıdaki sayıdır (burada 7 yorumlayıcının kullandığı çıktı biçimi olduğu için ondalık olarak ifade edilir):

238363505302130098723162537059

Esolang wiki'sine bağlanan 7 yorumlayıcının sayıları içsel olarak sakladığını, yani ne yaptığını görmek için programı kendi başına çalıştırmak için yeterli belleğe sahip olmanız pek mümkün olmadığını unutmayın. Programın davranışını manuel olarak çalıştırarak ve yapmasını beklediğimden emin olmak için küçük girdiler üzerinde test ederek doğruladım. Alternatif bir yaklaşım, sayıları depolamak için daha verimli bir yöntem kullanan bir tercüman yazmak olacaktır.

Burada çatlaklardan kaçınmak acı verici bir şeydi, ancak sonunda programın kendisinden başka iki sayının 238363505302130098723162537059 çıktı olarak üretemediğinden memnunum. ( 1 hafta sonra DÜZENLE: Soruyu nasıl yorumladığınıza bağlı olarak yanılmış olabilirim; aşağıya bakın. )

Çözüm

Orijinal program:

711170237403706
111723603700633
Bu program iki x ve y sayısını alır ve 3xy-y-2 (yani y(3x-1)-2 ) ifadesinin sonucunu hesaplar . Biz de, bu hesaplama yapmak durumunda x=711170237403706 ve y=111723603700633 , biz bir sonuç elde 238363505302130098723162537059 gerektiği gibi .

Başka hiçbir girdinin istenen sonucu vermemesi amaçlanmıştır, çünkü:

Giriş, y(3x-1)-2=238363505302130098723162537059 , yani y(3x-1)=238363505302130098723162537061 (her iki tarafa 2 ekleyerek ) seçilmelidir . Bu sayı, sadece iki faktöre sahip bir yarı 111723603700633 : 111723603700633 ve 2133510712211117 . Bu numaralardan sadece biri olan 2133510712211117 , 3x-1 şeklinde ifade edilebilir ( (3x711170237403706)-1=2133510712211117 ). Böylece hangi sayınınx ve hangisininy olduğunu benzersiz bir şekilde belirleyebiliriz, yani yalnızca bir giriş çalışır.

Bununla birlikte, soruyu nasıl yorumladığınıza bağlı olarak, istenen çıktıyı üreten ikinci bir giriş olabilir (bu nedenle bu çözümü geçersiz kılar):

Ne yazık ki, bir yarı-yarığın iki çarpımsal bölümü iki faktöre ayrılır: biri onu iki ana faktöre bölmektir, ancak diğeri 1 ve sayının kendisinden oluşan önemsiz bölümdür . 1 şeklinde yazılır edilemez 3x-1 tam sayı ile x , ancak istenen çıkış olabilir; dolayısıyla potansiyel bir meta-çatlak, girdinin 79454501767376699574387512354 ve 1 olarak verilmesini içerir . Ancak, buradaki ilk sayı karakterleri içerir ( 8 ve 9) 7 program için karakter kümesinde olmayanlar. Dolayısıyla, giriş programla aynı karakter kümesiyle sınırlıysa, bu çözüm geçerlidir; ancak programın karakter kümesinin dışından karakterler içeren girdiye izin verilirse, bu çözüm geçersizdir.

açıklama

Amaçlanan çözüm şu şekilde çalışır:

711170237403706 111723603700633
7 7 7 İstif elemanı ayırıcılar
 111 023 403706 111723603700633 İlk yığın elemanları
 111 Sayı 3, tekli
     023 "Bir numara girişi" için G / Ç DSL
         403706 111723603700633 Ana program
(Örtük: orijinali koruyarak ana program öğesinin bir kopyasını yürütür )
         40 {program} 'ın üzerinde {023} değiştirin,
           3 {023} kullanarak I / O yapın; pop {program}
     0 G / Ç: sayısal
      23 Bir sayı girin, {111} kopyalayın.
            706 Numaraya "6" ekle (azaltarak)
                11 İki boş yığın elemanını itin
                  17236 Bir yığın elemanını "23" itin (boş)
                       0 Boş bir eleman tüketerek {23} kaçış
                        3 {23} kullanarak G / Ç yapın; pop {aşağıdaki öğe}
                    23 Yığın girişinin üstünü birçok kez kopyalayın
                         7006 "66" ifadesini ekleyin (örn. 2 çıkartın)
                             3 Çıktı {sayı olarak}
                              3 Programdan çıkın (düşük yığın nedeniyle)
170666123453123451234512345



3

Armut Ağacı , ASCII 46 bayt, skor 0, Kırık

Giriş standart girişten alınır. Beklenen çıktı (standart çıktıda) boş bir dizedir (yani programın kendisine bağımsız değişken olarak verildiğinde çıktı yazdırılmamalıdır).

Başka bir deyişle, buradaki zorluk, standart girdide kendisine verildiğinde standart çıktıda hiçbir şey vermeyen ve standart girdi üzerinde kendisinden başka bir şey verildiğinde standart çıktıda bir şey çıkaran ve hiç kullanılmayan bir Armut Ağacı programı yazmaktır. 46 bayttan fazla. (Sıkça ASCII olmayan ve yazdırılamayan karakterler kullanan A Armut Ağacı'na rağmen programı yazdırılabilir ASCII'ye basılı tutarak da yapmayı başardım.) Bu, belirli bir çıktı formatıyla kendini tanımlayan bir program yazma görevidir. (yani, öz tanımlama başarılı olduğunda null dize); ancak, bir Armut Ağacı, bu özel dilde yapıldığında görevi göründüğünden biraz daha zorlaştıran en az iki bükülmeye sahiptir (bu yüzden polis gönderimi için seçtim).

Çözümüm

Benim çözümüm çatlaktan biraz farklı:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

Çevrimiçi deneyin!

Kullanmak yerine, bir eşleşme varsa (ve eşleşme yoksa) null dizeye (örtük çıktı) ve (örtük çıktı da dahil olmak üzere çıktıdan sonra newline) null dizesini exitayarladım . A yine de gereklidir, çünkü örtük çıktı yalnızca en az bir bayt girdi varsa etkinleştirilir (bu nedenle, girdi olarak programdan farklı olan boş bir dize verilirse bir şeyi açıkça yazdırmamız gerekir).$_$\1print

Her Armut Ağacı programının bir yerde bir sağlama toplamı içermesi gerekir ( MZpabu çözümde budur). Hem benim çözümüm hem de çatlak, sağlama toplamının tamamen ASCII harflerinden oluşması için değişken adları seçer (ve kodun diğer küçük ayrıntılarını değiştirir).



3

Perl 5 -p0777, 10 bayt, skor 10, güvenli

W)9r46<(k

Buradaki son karakter "dışarı kaydır", karakter kodu 14 (ondalık) / 0E (hex). Diğerlerinin tamamı yazdırılabilir ASCII'dir.

Perl'in örtük G / Ç argümanını kullandığımız için -p0777, girdi standart girdiden geliyor ve çıktı standart çıktıya gidiyor.

Çözüm

Program aşağıdakileri yapar:

NUL, girdiyi en az 10 karaktere doldurur, ardından dizeyle XOR'lar svgOUT_TOP

yani istenen çıktıyı üreten tek girdi olan programın kendisi:

$ _ ^ = Abc | $ ^

Çevrimiçi deneyin!

açıklama

Perl'in bir dizi özel amaçlı değişkeni vardır. Örneğin, -p0777örtük G / Ç için kullanılırken $_, programın başlangıcında girilir ve programın sonunda çıkar.

Bu değişkenlerin çoğunun varsayılan değeri çok basittir. Ancak, o $^anda seçili olan sayfanın üstü biçimi olan varsayılan değer çok daha uzun bir dizedir STDOUT_TOP. Bu nedenle, XORing yoluyla $^, gizlemek istediğimiz değerle (bu durumda program) çok kısa bir gizleme yöntemi olarak kullanabiliriz .

Sonunda anlatımı gizlemek için _TOP, programın kendisini bir karakter ekleyerek 10 karaktere doldurdum abc|, yani tüm karakterleri bir STDOUT_TOPşeyle XORed olurdu; başlangıçtaki seçim abc|, çıktıyı çoğunlukla yazdırılabilir tutmanın kolay bir yoluydu (ve çoğunlukla büyük harflerden oluşan bir dizeyle XORing olduğumu fark etmeyi zorlaştırmaktı, çünkü ASCII'de küçük XOR büyük harf küçük harf).


3

Python 3, 50 bayt çatlamış

Stdin / -out giriş ve çıkışları. Çıktı, her farklı girdi için farklıdır. Kaynak kodu verildiğinde benzersiz çıktı:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(Bu 150 haneli)

İyi şanslar!


Tüh! Görüyorum ki bu meydan okuma çoktan bitti ... Zaman tünelimde / feed'imde ortaya çıkması garip. Kimsenin buna cevap verip vermediğini merak ediyorum ...
agtoever



2

Cubix , 18 bayt, Skor 18, güvenli

Bu zorluğun daha fazla dikkat çekmemesi utanç verici, ama bazen böyle gidiyor. Bunu güvensiz bırakacaktım, ama unutmadan önce çözümü paylaşmaya karar verdim.

Bu çatlamak oldukça kolay olmalı.

Giriş danstdin

Çıktı

$`*2aJPJ#74(o);89

Düzenle: Bu kaynak kısaltılmış formda beklediğini belirtmek gerekir ... ve şimdi ben yayınladığım zaman kırdı sonuçtan eksik bir bayt (yazdırılamaz) olduğunu fark ettim. Şimdi kopyalayın. Onaltılık değerler24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39

Kavram, ilk karakteri yazdırmak ve ardından ters dizini karakterden kaldırmaktı, örneğin [karakter] - [0, len ([karakter]) .. 2]

Kod

$r;#AoW\U-@</u.?;;

Aşağıdaki küp üzerinde eşlenen

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

Burada deneyin


2

Jelly , 14 bayt, Puan: 21, Güvenli

Hem program hem de çıktı boyutu Jelly kod sayfası kullanılarak sayılır.

Giriş

İlk komut satırı argümanı.

Çıktı

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

Çözüm

ØJiⱮÄÆNPḃØ⁵ịØJ

Çevrimiçi deneyin!


Jöle kod sayfasından / Jöle kod sayfasına dönüştürmek zor olduğundan, bir doğrulayıcıya sahip olmak yararlı olacaktır (bir program alır, UTF8'den Jelly'e dönüştürün, kendisiyle besleyin, Jelly'den UTF8'e dönüştürün ve beklenen değere eşit olup olmadığını kontrol edin. output)
user202729

@ user202729 Bu jöle programıv⁼ , verecektir 1girişinin bir giriş ile jöle kodu olarak değerlendirilmiştir giriş girişe eşit ve her iki verim eğer 0(giriş geçersiz jöle kodu ise) değilse veya hata.
Jonathan Allan

1

JavaScript Firefox, <10 bayt, Puan: 52, işlev bağımsız değişken girişinden, Cracked

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) aşağıdaki dizeyi kodlar:

function btoa() {
    [native code]
}

hangi verir:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

sadece kopyalandı


Her şeyden önce, bariz yaptıktan sonra, bu gerçek kod değil mi? İkinci olarak, girdinin nereden geldiğini belirtmezsiniz. Bir çatlak gönderirim ama dürüstçe bu gönderimin geçerli olup olmadığından emin değilim.
Quintec


Çatlak direğini bu yazıya eklemenin gerekli olduğunu düşünmüyorum - insanlar çatlamayı görüntülemek için bağlantıyı tıklayabilirler.
user202729

1

GCC 61-> 61 bayt

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

Tam program, stdin'den girdi alın ve stdout'a çıktı alın


Peki, sondan sonra boşluk var 50mı?
tsh

@tsh Bu bir hex dökümü
l4m2

1

Perl 6, 43 bayt, Puan: 15, nereden stdin

49671296789805

2
Sadece kontrol edin, önceki cevabınız giriş olarak programınız için benzersiz bir çıktıdaki kuralları takip etmediğinden, bu gönderimin yaptığını doğrulayabilir misiniz?
Jo King

Evet bencede.
donaldh


1

J , 26 bayt, Puan: 52, Güvenli

Program bir REPL değil, kabul eden stdinve açıkça yazdıran bir komut dosyasıdır stdout.

Giriş

Standart giriş.

Çıktı

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

Hayır, bir şifreleme yöntemi değil.


Çözüm

echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

Çevrimiçi deneyin!


1

Fıçı , 6 bayt, Puan: 6

Giriş

Gönderen stdin, kullanarak?

Çıktı

5\x1c"\x1c"9

Bunların yazdırılamayan baytlar için kaçış dizileri olduğunu unutmayın. Kaçışları değişmez karakterlerle değiştirin. Ham metin burada bulunabilir

Bunda iyi şanslar! Gelecek hafta görüşürüz!


0

 Perl 6, 31 bayt, Puan: 39, nereden stdin - Çatlak

Burada kırık

().1111111111112222235abcegijkmnorstvy

Ham çözüm. Hayatta kalabilir.


Çözümünüzü çözdüğümden eminim ve programınızın farklı girdilerin farklı çıktılar üretmesi gerektiği kuralına uymadığından şüpheleniyorum.
nwellnhof
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.