Hata (veya uyarı) sorgusu da normal bir sorgudur [kapalı]


9

( Eski bir soru hakkındaki bu yorumdan esinlenilmiştir .)

Arka fon

Bir hata sorgusu ("Kimian sorgusu" olarak da bilinir), derlendiğinde veya çalıştırıldığında, derleyicinin / yorumlayıcı / çalışma zamanının, programın kendisine aynı metni içeren bir hata iletisi yazdırmasına ve başka bir şey yazdırmamasına neden olan bir programdır. Bu zorluğun amaçları doğrultusunda, uyarıları da içerecek şekilde geniş bir şekilde "hata" tanımlarız.

Görev

Bu meydan okumada, bu da bir hata sorgusu. Yürütüldüğünde, program normal olarak kendi kaynak kodunu yazdırmalıdır (yani hata / uyarı mesajı olarak değil); bu uygun bir quine olmalıdır (yani programın bir kısmı çıktının farklı bir kısmını kodlamalıdır). Ayrıca, derlenmesi ve programlanmalıdır yürütme de programın kaynak kodunu neden - ve başka bir şey - hata olarak basılacak veya uygulanmasıyla uyarı mesajları. (Bunun, programın normal şekilde yürütülmesini engellediği dillerde derleme zamanı hatalarını kullanamayacağınız anlamına geldiğini unutmayın.) Başka bir deyişle, programın kaynak kodu her yöntemle bir kez olmak üzere iki kez yazdırılacaktır.

Açıklamalar

  • Çoğu durumda, bir hata / uyarı mesajının ne olduğu ve ne olmadığı açıktır; burada ikisini birbirinden ayırmıyoruz. Belirsiz durumlarda, bir hata / uyarı iletisini uygulama tarafından çıkarılan herhangi bir metin olarak tanımlayın: 1. bir komut yürütmekten başka bir şeyin sonucu olarak (veya dilde en yakın eşdeğeri varsa); veya 2. bu, onu çıktı olarak üreten komuta girdinin bir parçası değildi.
  • Ayranın hata / uyarı kısmının uygun bir ayraç olması gerekmez (çoğu durumda tesadüfen olacaktır, çünkü çoğu hata ve uyarı mesajı önemli miktarda sabit metin içerir).
  • Programın, bir araya getirildiğinde programın kaynağını oluşturan birden fazla hata / uyarı vermesi kabul edilebilir. Kaynakta görünmeyen hataların / uyarıların çıkarılması kabul edilemez.
  • Pek çok zorluğun aksine, derleyiciye verilen anahtarlar ve program dosya adı bu zorlukla büyük olasılıkla büyük önem taşır. Zorluk başka türlü mümkün olmayabilir göz önüne alındığında, burada esnek olmaya hazırım, ancak uygulamayı alışılmadık bir şekilde çalıştırırsanız, PPCG kurallarının bunu yapmak için bir bayt cezası aldığını unutmayın (ek karakter sayısına eşittir). bir programı çalıştırmak için komut satırına en kısa "normal" yol üzerinden eklemeniz gerekir) ve bu nedenle yayınınızdaki cezanın boyutunu belirtmeniz gerekir. (Örneğin, kullandığınız yorumlayıcı programı bir dosyadan okursa ve dosya adında belirli bir kısıtlaması yoksa, programı çalıştırmanın en kısa normal yolu 1 karakterli dosya adına sahip bir dosyadan olur;
  • Kullandığınız derleyici / yorumlayıcı sürümü alakalı olabilir, bu nedenle gönderiminizin bir parçası olarak, lütfen programınızın çalıştığı ve hangi sürümün gerekli olduğu belirli bir derleyici veya yorumlayıcı belirtin. (Örneğin, bir C gönderimi başlıkta "C (gcc 6.2.0)" ifadesini verebilir.)
  • Bu görevin tüm dillerde mümkün olmayabileceğini unutmayın. Bulunduğu dilde, en kolay yöntem muhtemelen metnin bazı alt kümelerini özelleştirmenin mümkün olduğu bir hata veya uyarı mesajı bulmak olacaktır (mesajda alıntılanan bir şeyin adını değiştirerek; dosya adları ortak bir seçimdir burada, ama tek değil). Birisi sadece metni düzeltilmiş hata ve uyarı mesajlarını kullanarak bunu yapmanın bir yolunu bulursa özellikle etkilenirim (ve şaşırırım) .

Zafer koşulu

Bu bir Bu nedenle, bir girişin daha küçük bayt sayısı varsa daha iyi olduğu düşünülür. Bu nedenle, programınızı çalıştırdıktan sonra, bayt sayısını mümkün olduğunca azaltmak için programı optimize etmek istersiniz. (Ancak, daha kısa bir giriş varsa, özellikle de farklı bir dilde ise cesaretiniz kırılmayın; burada gerçekten aradığımız, bir programın arkasındaki belirli bir algoritmayı veya fikri mümkün olduğunca kısaltmak, ancak birden fazla görmek farklı dillerde veya farklı ilkelere dayanan çözümler her zaman faydalıdır.)


2
Sohbette söylediğim gibi, ilk kurşun noktasının belirsiz olduğunu düşünüyorum. Çoğu durumda, bir hata / uyarı mesajının ne olduğu ve neyin olmadığı açıktır , tartışmalar ve dil-avukatlık için bir başlangıç ​​noktasıdır.
Dennis

@Dennis: Prensipte durumun harika olmadığını kabul ediyorum, ancak öte yandan durumu iyileştirmek için somut bir yol düşünemiyorum; açıkça hata mesajları olan şeyler için istisnanın kaldırılması, bazı dillerde çok istenmeyen bazı durumlara yol açabilir ve bu da iyileştirdiğinden daha fazla hasara neden olabilir; Soruyu geliştirebileceğinizi düşünüyorsanız, düzenlenmesine hiçbir itirazım yok (ve PPCG ile ilgili soruların zaten farklı bir sorun olmasına rağmen "sahiplik" olması gerektiğini düşünmüyorum)

Olduğu gibi, sorunun belirsiz olduğunu ve nesnel bir geçerlilik ölçütünden yoksun olduğunu düşünüyorum. Önerdiğim değişikliğin işleri daha da kötüleştirebileceğini kabul ediyorum. Muhtemel bir eylem, meydan okumayı beklemeye almak ve onu kum havuzuna geri göndermek olacaktır.
Dennis

1
Şimdilik zorluğu beklemeye aldım. Umarım onu ​​kum havuzuna tekrar göndermeyi düşünürsün. Bu çok ilginç bir fikir ve boşa gitmesine izin vermek utanç verici olurdu.
Dennis

1
Korumalı alan yayını burada . (Bunu soruya göre düzenlemeyi düşünüyordum, ancak bu, postayı yeniden açmak sırasına

Yanıtlar:


9

JavaScript (Firefox 50), 153 bayt

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

açıklama

Buradaki fikir, henüz bulduğum en kolay değiştirilebilir JS quine ile başlamaktı :

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

throwAnahtar kelimenin sıra kendi kodunu atmak yapmak için basit bir yoludur:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

Ancak, küçük bir sorun var: Firefox atılan mesajı öneriyor Error:. Neyse ki, Error: mycodeaslında geçerli bir JavaScript! (Bununla ilgili daha fazla bilgi edinmek için MDN'yi ziyaret edin .)

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

Hata! Bu yanlış şeyi uyarıyor:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

Tırnak işareti artık kodun başında uneval(x)+xolmadığından, bize doğru sonucu vermeyecektir. Bunu düzeltmenin en iyi yolu, iç içe dizenin yerine bir yer tutucu eklemektir:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

Ah-oh, şimdi Error:hata mesajında fazladan bir şey var . Dizeyi dilimleyerek düzeltelim:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

Ve son olarak, hem çıktı hem de hata mesajı kodla aynıdır! Bir Yığın Snippet'i eklerdim, ancak herhangi bir tarayıcıdaki bir snippet'te çalışmıyor gibi görünüyor.


5

Python 2, 217 80 51 bayt

Sondaki satır beslemesi gerekiyor.

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

Çevrimiçi deneyin

Basit bir soru ile başladım:

s='s=%r;print s%%s';print s%s

Sonra raiseucuna bir atmak için ekledim IOError.

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

Ne yazık ki, geri izleme sorunlara neden oluyordu (tamamen IOError: <code here>uzaklaştıramadım) ve geri izlemeyi kaldırmış olsam bile istisna adı her zaman ön tarafa basıldı.

Sonra bu yararlı SO cevabı buldum ve benim amacım için değiştirdim.

Daha sonra kendi sınıfımı oluşturmayı atlayabildiğimi ve sadece sys.exitkodumu daha kısa hale getirerek kullanabileceğimi buldum.


1
Bunun komut specindeki hatanın tanımına uygun olduğunu düşünmüyorum çünkü bir komut yürütmekten başka bir şeyin sonucu değil ya da çıktı olarak üreten komutun girdisinin bir parçası değildi . Yani, düz exitburada iyi çalışıyor. Gerek yok sys.
Dennis

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.