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 3 x y- y- 2 (yani y( 3 x - 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( 3 x - 1 ) - 2 = 238363505302130098723162537059 , yani y( 3 x - 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 , 3 x - 1 şeklinde ifade edilebilir ( ( 3 × 711170237403706 ) - 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 3 x - 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)
1
7
0
6
66
12345
3123451234512345