Yasadışı Dize Bulma


81

Meydan karakter dizesi bulmaktır olamaz görünür herhangi seçtiğiniz programlama dilinde hukuki programı. Bu, yorumları, dizeleri veya diğer "çalıştırılamaz" bölümleri içerir.

Meydan okuma

  • Programınız, dilinizin derleyici / tercüman / çalışma zamanı ortamının belirli bir sürümüne veya uygulamasına özgü olabilir. Eğer öyleyse, lütfen detayları belirtin.
  • Yalnızca standart derleyici / tercüman / çalışma zamanı seçeneklerine izin verilir. Belirli bir sonuç elde etmek için derleyicinize tuhaf bir bayrak aktaramazsınız (örneğin, uyarıları hatalara dönüştürmek için bir bayrak geçirerek).
  • Programlama diliniz belirli bir kodlama gerektiriyorsa (örn. UTF-8), dizginizin de doğru bir şekilde kodlanması gerekir (yani yalnızca karakter kod çözme hataları nedeniyle başarısız olan dizelere izin verilmez).
  • Gönderiminizdeki her karakter, yasal bir programda kabul edilebilir olmalıdır; yani, her zaman reddedilen bir karakteri kullanamazsınız.
  • Derleyiciyi alt dize olarak içeren herhangi bir kaynak kodu verildiğinde, derleyici / yorumlayıcı / çalışma zamanı bir hata vermelidir . Hata, programlar arasında aynı olmak zorunda değildir; dizginin bir gömülmesi sözdizimi hatasına, diğeri çalışma zamanı hatasına neden olabilir.

puanlama

  • Her dil için en kısa yasadışı dize kazanır.
  • Dizinizin neden yasadışı olduğunu açıklamalısınız (neden yasal bir programda hiçbir yerde görünemediğini).
  • Yorumlarda yanlış çözümler anlaşmazlık. Daha spesifik olarak, önerilen altlığı içeren yasal bir program gösteren (yani herhangi bir hata üretmeyen) TIO ya da eşdeğer bir bağlantı sağlamalısınız.
  • Bazı diller (örneğin Bash, Batch, Perl), geçerliliği etkilemeden bir programa isteğe bağlı ikili verilerin eklenmesine izin verir (örneğin __DATA__Perl'de kullanılır). Bu diller için, sadece böyle bir takip bölümünde görünebilecek bir çözüm sunabilirsiniz Cevabınıza not aldığınızdan emin olun. (Bu "izleyen bölümün" tanımı dile bağlıdır, ancak genel olarak ayrıştırıcı komut dosyasını okumayı tamamen bıraktıktan sonra herhangi bir metin anlamına gelir).

Örnek

Python'da gönderebilirim

x
"""
'''

ancak bu daha büyük programa gömülebilir

"""
x
"""
'''
y
'''

bu yüzden kabul edilebilir değil.


2
Bir karşı-örnek STDIN'den girdilere dayanabilir mi?
Zacharý

5
Bu iyi bir CnR yapar mı?
CalculatorFeline

2
Şimdi çok geç sanırım ama bu bir polis ve soyguncular mücadelesi olmuş gibi görünüyor. Geçerli programlar yapma girişimlerinde belirgin bir beceri var, ayrıca ilk sırada dizelerle geliyor.
user2390246

4
Perl’e başsağlığı dilerim. :)
Kaz

2
Okuryazar yorumlar sayesinde okuryazar olmayan Haskell'de tamamen imkansız olduğundan eminim.
dfeuer

Yanıtlar:


57

Değişen , 2 bayt




Bu iki satır besleme. Geçerli Değiştirme, her zaman kusursuz bir yazdırılabilir ASCII karakter karesi oluşturmalıdır, bu nedenle arka arkaya iki satır besleme içeremez.

Hata her zaman bir ayrıştırıcı hatası ve her zaman aynıdır:

This shape is unpleasant.

çıkış kodu 1 ile birlikte verilir .

Çevrimiçi deneyin!


Bu aynı zamanda 2Col ile çalışır . Çevrimiçi deneyin! . Fakat bunun 2Col'de kırılmasının nedeni, her satırın tam olarak 2 karakterden oluşması gerektiği, ancak boş satır bunu bozmasıdır.
Kritixi Lithos,

2
+1 çünkü otomatik olarak kazanan, 1 baytlık çözümlere izin verilmediğinden, çünkü "her zaman reddedilen bir karakteri kullanamazsınız."
Zacharý

1
@Cowsquack tfw Kendi dilimi unuttum
Skidsdev

1
Ben @Skidsdev TfW kendi dili hakkında yeniden unuttum ve kendi dili hakkında unutmadan beni unuttuğunu
Skidsdev

@ Zacharý Peki ya 0 baytlık çözümler?
PyRulez

32

Java, 4 bayt

;\u;

Çevrimiçi deneyin!

Bu geçersiz bir Unicode kaçış dizisidir ve derleyicide bir hataya neden olur.

error: illegal unicode escape

İşe yaramıyor - birinin bir kelime değişkeni gibi olabilir "\\u;".
feersum

@feersum Bir bayt pahasına sabit
Kritixi Lithos

21
@TheLethalCoder: Java , başka bir şey\uXXXX yapmadan önce kaçışları değiştirmek için kaynak kodunu önceden işler , bu yüzden evet, bu comments.za içinde bile çalışacaktır
nneonneo 20:17

3
Sanırım bu hala bu sitenin tarihindeki en kısa Java cevabı .. ..
Magic Octopus Urn

1
@MagicOctopusUrn Aslında, bu 0 bayt Java cevabı var (şu anki metada artık geçerli değil, çünkü STDOUT yerine STDERR'ye çıktı). Her ikisi de oldukça şaşırtıcı ve zekice olsa da. :)
Kevin Cruijssen

25

COBOL (GNU) , 8 bayt


THEGAME

Öncelikle, sözümü yorumlanmış bir satıra koymanızı önleyen bir satır beslemesi.

Daha sonra, tarihsel olarak, COBOL programları kodlama sayfalarına basıldı, derleyici yoğun olarak 80 karakterlik sınırlı satırlara dayanıyor, çok satırlı yorum yok ve ilk 6 karakter yorum (genellikle düzenlenebilir satır numaraları olarak kullanılıyor), hemen hemen her şeyi koyabilirsiniz , BİLDİĞİM KADARIYLA. Bir THEGAMsonraki satırın başında seçtim .

Sonra, herhangi bir satırdaki 7. sembol sadece çok kısıtlı bir karakter listesini kabul eder: Boşluk (efekt yok), Yıldız (satırın geri kalanını yorumlar), Tire, Slash, başkaları olabilir, ama kesinlikle değil E.

Örneğin, GnuCobol tarafından verilen hata:

error: invalid indicator 'E' at column 7

Çevrimiçi deneyin!

Ayrıca, oyunu daha yeni kaybettin.


30
Also, you just lost the game.Neredeyse düşürdüm
Stephen

24

JavaScript, 7 bayt


;*/\u)

Baştaki yeni satırı not alın.

  • \u) geçersiz bir Unicode kaçış dizisidir ve bu nedenle bu dize geçersizdir
  • //Başında bir satır eklemek , yeni satır satırının ikinci satırını açık bırakmadan bıraktığı için
  • Bir ekleme eklemek, /*onu tamamlayan kapanma nedeniyle açığa */çıkacak şekilde tamamen dizgeyi açmayacaktır\u)
  • @Tsh tarafından belirtildiği gibi, alt satır bir dizgeden sonra girilerek regex'e çevrilebilir, bu /nedenle ), önünde yer \ualarak regex değişmezinin daima geçersiz olmasını sağlayabiliriz.
  • @Asgallant tarafından belirtildiği gibi, regex'i 1||1(string)/değerlendirmekten kaçınmak mümkün olabilir . İkinci satırın başındaki yarı-kolon, ifadenin 1||1ikinci satıra çarpmadan önce sonlandırılması ve böylece bir SyntaxError ile ;*.

Dene!


2
/* */\u0045 = 3geçerli bir JavaScript kodu gibi görünüyor.
tsh

2
3 */\u;/hala geçerli.
tsh,

3
İlginç (bu yılın sonuna kadar resmi olmayacak) ES2018 itibariyle sadece nedeniyle ters tırnakların içinde her şey sarmak dikkat etmek bu . Muhtemelen bunu ancak sonradan sonra bir geri döndürme çubuğu yerleştirerek çözebilirsiniz /(düzeltmeniz gerekmiyor). (Ayrıca, ;kötü regex ayrıştırma zorlamaz, o ile bir SyntaxError zorlar *.)
ETHproductions

1
@Leushenko Ama bu #if 0burada görüldüğü gibi işe yaramaz : Çevrimiçi deneyin!
Kritixi Lithos,

3
Daha yeni JS sürümlerinde, String.raw bir şablon dizesiyle geçersiz hale gelmeyeceği için bunu bozmaz . Olabilir: String.raw`code here`
iovoid

15

Python, 10 bayt (cpython değil)


?"""?'''?

Baştaki yeni satırı not alın. Newline nedeniyle yorumlanamıyor ve doğru düşünürsem üçlü alıntı dizelerinin hiçbir kombinasyonu işe yaramaz.

Yorumlarda @feersum, 0x1A karakterini bir dosyanın başlangıcına ekleyerek söyleyebileceğim kadarıyla Windows'ta herhangi bir cpython programını tamamen kırmış görünüyor. Belki de (?) Bu, bu karakterin işletim sistemi tarafından ele alınma biçiminden kaynaklandığı, görünüşe göre eski bir DOS standardı nedeniyle stdin'den geçerken bir EOF'ye çevrildiği anlaşılıyor.

Çok gerçek anlamda, bu python ile değil, işletim sistemiyle ilgili bir sorun. Dosyayı okuyan ve compileüzerinde yerleşik olanı kullanan bir python betiği oluşturursanız , sözdizimi hatası atma daha fazla beklenen davranışı verir. Pypy (muhtemelen sadece bunu dahili yapar) bir hata da verir.

Düzenle:

@ Feersum'un Python yorumlayıcısını kırmak için belirsiz yollar bulma konusundaki titizliği nedeniyle, bu cevap söyleyebileceğim kadarıyla herhangi bir tipik cpython ortamı için tamamen geçersizdir! (Hem Windows hem de Linux için Python 2 ve 3) Bu çatlakların Pypy için hiçbir platformda (test ettiğim diğer Python uygulamalarında) çalışmayacağına hala inanıyorum.


1
@officialaimm think"""?'''"""
KSab

3
Makinemde çalışan bu alt dizeyle bir program yaptım. Ancak, pek çok tercüman / platform / versiyonda çalışmadığını düşünüyorum. Bu cevabın hangi Python yorumlayıcı ve işletim sistemi sürümünü hedeflediğini belirtebilir misiniz?
feersum

1
Windows 7'deki Python 3 tam olarak çatlağımın çalıştığı yer olur. Base64 ile kodlanmış bir programın
Pastebin'i

1
Bunu da kırabilirim. Basitçe dosyanın başına bir 0x1A karakteri koyun ve geri kalanı yoksayılır (bu aslında Python 3 için de geçerlidir).
feersum

1
Bunun gerçekten eski olduğunu biliyorum, ancak Python Discord'taki bazı kişilerle çalıştıktan sonra, bu çatlağı bulduk , ancak kodlamanın değiştirilmesinin hile olduğu düşünülebilir mi bilmiyorum
EdgyNerd

14

C (clang) , 16 bayt

 */
#else
#else

Çevrimiçi deneyin!

*/herhangi bir /*yorumu kapatır ve öncü alan sadece bir tane başlamadığımızdan emin olur. Newline, herhangi bir //yorumu kapatır ve herhangi bir dizgeyi değiştirir. Sonra bir hataya #else without #ifveya #else after #elsehataya neden oluruz ( #if 0içeride kaç tane olduğumuzdan bağımsız olarak ).



2
Ayrıca C ++ 11 ham dizeleri iş görüyor gibi göründüğü için gcc ile bir çözüm mümkün değildir.
feersum

@feersum Huh, GCC'nin C kodundakileri kabul ettiği TIL. Ben belirtebilirsiniz -std=c99, ama en tınlamak geçmeyi deneyelim.
Anders Kaseorg

3
Gcc'nin C ++ 11 ham dizgilerini kabul etmesine gerçekten şaşırdım. Derleyici sürümünü veya uygulamasını belirtmek tamamen tamamdır, bu nedenle Clang'da yasa dışıysa, bu adil bir oyundur.
nneonneo

1
@ l4m2 Sorunuzu ayrıştıramam (kim onlar ve tekrar ne demek istiyorsun?), fakat bir C ++ ham dize değişmezinin özel bir sınırlayıcıyı desteklediğini unutmayın: R"foobar(...)foobar"ve yalnızca eşleşen sınırlayıcı ve alıntı onu kapatacak.
Anders Kaseorg

11

Pyth, 6 bayt

¡¡$¡"¡

¡Aplike olmayan bir karakterdir, yani Pyth ayrıştırıcısı bunu değerlendirirse, bir PythParseError ile hata yapar. Kod bunun bir birinde gerçekleşmesini sağlar ¡.

Bir Pyth programında bir bayt bulunmasının ve çözümlenmemesinin üç yolu vardır: Bir dizgenin tam anlamıyla ( "veya ."eşit olarak ayrıştırılır), bir Python değişmezinde ( $) ve hemen ardından a \.

Bu kod \, hatasız değerlendirilmesini önler , çünkü sadece hemen sonraki baytı ve ikinci ¡hataları etkiler .

$kodu $s'nin içine derlenmiş Python koduna doğrudan yerleştirir. Orada neler olabileceğine dair hiçbir varsayımda bulunmuyorum.

Program bu koda bir $bağlamda ulaşırsa , bitecek $ve ¡hemen sonra ayrıştırıcı hata yapacaktır. Pyth'in Python değişmezleri $, Python kodunun ne yaptığından bağımsız olarak daima bir sonrakinde biter .

Program bir "bağlamda başlarsa ", dize sonlanır ve son ¡ayrıştırıcı hatası yapar.


11

Ada - 2 bayt

Bunun çalışması gerektiğini düşünüyorum:


_

Bu yeni çizgi alt çizgi. Newline, yorumları sonlandırır ve bir dizeye izin verilmez. Bir alt çizgi boşluk bırakamaz; sadece harflerden ve sayılardan sonra izin verilirdi, ancak Unicode'un tanıtılması işleri karmaşıklaştırdı.


2
Siteye Hoşgeldiniz! :)
DJMcMayhem

9

x86 32 bit makine kodu, 11 bayt (ve geleceğe dayanıklı 64 bit)

90 90 90 90 90 90 90 90 90 0f 0b

Bu times 9 nop/ ud2. Temelde bir NOP kızağıdır , bu nedenle hala 0 veya daha fazla nops olarak çalışır ve daha sonra baytların ud2kaçının 0x90önceki bir opcode'a işlenen olarak tüketildiğine bakılmaksızın bir istisna oluşturmak için kullanılır . Diğer tek baytlık talimatlar (gibi times 9 xchg eax, ecx) da işe yarayabilir.

x86 64 bit makine kodu, 10 bayt (mevcut CPU)

Gelecekteki ISA uzantıları, bunları 64 bit modundaki ön ekleri veya çoklu bayt opkodlarının parçaları olarak değiştirmelerini isteyinceye kadar, 64 bit modda bazı 1 baytlık yasadışı yönergeler vardır. 0x0eolan push cs32 bit modunda, ancak mevcut CPU'lar yasadışı 64 bit (Intel Skylake üzerinde test).

0e 0e 0e 0e 0e 0e 0e 0e 0e 0e

Yürütülebilir makine kodu için kuralların yorumlanması :

  • Baytlar atlanamaz ("ayrıştırılmayan" kısıtlama gibi), çünkü CPU'lar kod çözme / yürütme (spekülatif olmayan) işlemlerini gerçekleştirene kadar istisnalar ortaya koymaz.

  • Yasadışı araçlar her zaman bir istisnayı ortaya çıkarır, örneğin yasa dışı talimat istisnası. (Gerçek programlar bunu, çıplak metal üzerinde bir istisna işleyicisi ile yakalayabilir veya bir OS sinyal işleyicisi kurabilir, ancak bunun zorluğun ruhunu yakaladığını düşünüyorum.)


Çalışır, çünkü biten daha kısa bir bayt dizisi ud2başka bir komut için adresleme modunun bir imm32 ve / veya bir parçası olarak görünebilir veya bir komut boyunca bölünebilir . Bayt'ı komutun bir parçası olarak "tüketmek" için dizgiden önce koyabileceğiniz şeyler hakkında düşünmek ve hataya yol açmayacak bir şey bırakmak en kolay yoldur.

Bir komutun en fazla 9 baytlık keyfi şeyi tüketebileceğini düşünüyorum: bir SIB baytı, bir disp32 ve bir imm32. yani, bu talimatın ilk 2 baytı 8 NOP ve bir ud2 tüketebilir, ancak 9 tüketemez.

c7 84 4b 00 04 00 00 78 56 34 12        mov dword [rbx+rcx*2+0x400],0x12345678

9 nops'u geçemiyorum:

    db 0xc7, 0x84   ; opcode + mod/rm byte: consumes 9 bytes (SIB + disp32 + imm32)
    times 9 nop          ; 1-byte xchg eax, ecx or whatever works, too
    ud2
  ----
   b:   c7 84 90 90 90 90 90 90 90 90 90        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0x90909090
  16:   0f 0b                   ud2    

64 bit modu:

 c7 84 0e 0e 0e 0e 0e 0e 0e 0e 0e        mov    DWORD PTR [rsi+rcx*1+0xe0e0e0e],0xe0e0e0e
 0e                      (bad)  

Ancak, 8 NOP + ud2 (veya times 9 db 0x0e) baytı diğer eklerin bir parçası olarak görülebilir:

    db 0xc7, 0x84   ; defender's opcode + mod/rm that consumes 9 bytes

    times 8 nop          ; attacker code
    ud2

    times 10 nop    ;; defenders's padding to be consumed by the 0b opcode (2nd half of ud2)
----
  18:   c7 84 90 90 90 90 90 90 90 90 0f        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0xf909090
  23:   0b 90 90 90 90 90       or     edx,DWORD PTR [rax-0x6f6f6f70]
  29:   90                      nop
  2a:   90                      nop
  ...

Buradaki kurallar, bir asm / makine kodu yanıtı göndermeyi düşünmem için yeterince net değildi. Mesela neden yapamıyorsun ud2? Kuralları baytların üstünden atlamayı yasaklamak olarak yorumladığınızı söylüyorsunuz, bu yüzden ud2kendi başına iyi çalışacak, değil mi? Oh… sanırım sorunun ud2geçerli bir talimatın öneki olarak görünebileceğini söylüyorsunuz ? Bu cevabın ikinci kısmı anlamak benim için biraz zordu.
Cody Gray

@CodyGray: Doğru, kodlayan 2 bayt herhangi bir komutta ud2görünebilir imm32. Bunu, hangi kodu bayt olarak koyabileceğiniz 0f 0byerine daha önceki bir talimatın parçası olarak "tüketen" bir dizgeye koyabileceğiniz konusunda düşünüyordum ud2. Sunumu nasıl yaptığımla tamamen mutlu değildim, ancak neden sadece 8 nopsaniyenin yeterli olmadığını ve 9 nopsn + ile olanları göstermek istedim ud2.
Peter Cordes

@CodyGray: Bir asm kaynak programı tamamen farklı bir cevap olacaktır. Bu, assembler tarafından kullanılan ayrıştırıcıyı hatalı hale getirmek zorundadır, hatalı makine kodu üretmez. Bu nedenle , normal olarak herhangi bir geçersiz metni ayrıştırılmaya karşı koruyabilecek %else/ %elsemağlup etmek gibi bir şey olabilir %if 0. (Bir CPP cevabından fikir)
Peter Cordes

Tamamen tatmin etmeyin. Çözümünüz sadece veride olabilir. (Her ne kadar imkansız olsa da)
l4m2

@ l4m2: Soruyu cevaplandırılabilir / ilginç hale getirmek için, onu yürütülen kodla sınırlamak zorunda kaldım (atlamadım ). Cevabımdaki kuralların yorumlanmasıyla ilgili mermi noktalarına bakın. Bu elbette statik verileri de dışlar. Çünkü o zaman makine kodu değil, sadece veridir. Bu soru, bir makine kodu yanıtının mantıklı olması için çoğundan daha fazla uyarlamayı gerektiriyordu, çünkü ayrıştırıcıyı hataya sokabileceğiniz bir derleme / montaj aşaması yok, sadece bellekteki baytlardan bahsediyoruz.
Peter Cordes

7

C #, 16 bayt


*/"
#endif<#@#>

Çünkü işe yarıyor:

  • // yorum yeni satır nedeniyle işe yaramayacak
  • /* yorum nedeniyle çalışmaz */
  • Yalnızca kodda sabitler olamaz
  • #if falseBaşlangıcına eklemek nedeniyle işe yaramazsa#endif
  • "Herhangi dize kapatır
  • Bu <#@#>isimsiz bir direktif olduğundan T4 şablonları için başarısız olur.
  • Yeni çizgi /, başında olması gerektiği gibi kandırıyor.*/

Her varyasyon bir derleme hatasıyla başarısız olur.


1
Kodunuza T4 şablonları eklemeye karar vermeniz çok garip. T4 ayrı bir dil olarak kabul edilmiyor mu?
Arturo Torres Sánchez

1
@ ArturoTorresSánchez Bunları hiç duymadığımı bilmiyorum. Birisi T4 şablonları eklediğinizde bu işe yaramadığını söyledi, ben de düzeltmeyi ekledim.
TheLethalCoder,


5

Okuryazar Haskell , 15 bayt

Bir tamir silinmiş girişimi niml'de tarafından.


\end{code}
5
>

Çevrimiçi deneyin!

nimi'nin orijinal girişimi, Literatür Haskell'in >stil okuryazar kodunun bir okuryazar yorum satırına ( 5burada) komşu bir hatta olmasına izin vermemesine dayanan son iki satırdır . Alternatif ("LaTeX") okuryazar kodlama stilinde bir yoruma gömülü olabileceği için başarısız oldu:

\begin{code}
{-
5
>
-}
\end{code}

Ancak, \begin{code}Okuryazar Haskell tarzı yapar değil kendi içinde ne de içinde ne, yuva {- -}ile bir çizgi koyarak bu yüzden, çok satırlı yorumlar \end{code}sadece paralel önce 5, o geçici çözüm başarısız olur ve ben farklı birini görmüyorum.


4

Ücretsiz Pascal, 18 bayt


*)}{$else}{$else}

Önce olası tüm yorumları kapattıktan sonra koşullu derlemeyi ele alın.

Bir şey unuttuysam lütfen buraya yorum yapın.


3
@ user902383 Örneğiniz, snippet'inin önde gelen yeni satırını içeriyor mu?
Brian J,

@BrianJ hayır, sadece biçimlendirme sorunu olduğunu düşündüm, benim kötü
user902383

Özgür Pascal'da mümkün olduğunu sanmıyorum. Sadece onları sonra koy begin end..
jimmy23013

@ jimmy23013, ancak end.geçerli olduktan sonra kodlara soru tarafından izin verildiği anlaşılıyor .
tsh

4

Commodore 64 Basic, 2 bayt


B

(bu "B" harfini izleyen yeni bir satırdır).

Commodore 64 programındaki herhangi bir satır, bir satır numarasıyla veya bir BASIC anahtar sözcüğüyle başlamalıdır ve depolanan programlar yalnızca satır numaralarına izin verebilir. "B" (veya "H", "J", "K", "Q", "X", "Y" veya "Z" ile başlayan hiçbir anahtar kelime yoktur.


Eğer eklersem, =0bu sadece bir ödev ifadesi haline gelir ...
Neil

1
@Neil, bu geçerli bir anlık mod komutu olurdu, ancak geçerli bir program değil.
Mark,

4

Brain-Hack ( Brain-Flak'ın bir varyasyonu ), 3 2 bayt

Buğday Sihirbazı sayesinde Brain-Hack'un yorumları desteklemediğini ve beni bir bayt kurtardığını belirtti.

(}

Çevrimiçi deneyin!


Brain-Flak'ta nasıl yorum yaparsınız? Bunları yapmanın bir yolunu bilmiyorum.
Outgolfer Erik,

@EriktheOutgolfer # TIO
Riley

Huh belgesiz davranış.
Outgolfer Erik,

@EriktheOutgolfer Her zaman bir yerde belgelendiklerini varsaydım. Onları eklemeye bakacağım.
Riley,

BrainHack veya Craneflak'taki yeni hatta ihtiyacınız yok, Rain-Flak, yorum yapan üç versiyondan sadece bir tanesi. Her ne kadar Craneflak anında ayrışsa da Craneflak'ta bunu çözmek imkansız olsa da, herhangi bir çözelti hazırlayarak yenilebilir (()){()}.
Buğday Sihirbazı,


3

VBA, 2 Bayt

Bir çizgi beslemenin ardından bir alt çizgi - _VBA'da çizginin devam karakteri olarak işlev görür ve doğrudan çizginin içinde sola veya çizginin üstünde hiçbir şey olmadığından, VBA'nın çok satırlı yorumların olmaması zaman hatasıCompile Error: Invalid character


_

Yeni bir satıra başlayan kalıbınıza bağlısınız ... bu yüzden yeni bir satır ekleyin.
Deduplicator

@Deduplicator zaten yeni bir çizgiye sahip, - ne izleyeceği önemli değil _, sadece solda veya üzerinde geçerli bir çizgi olmadığı
Taylor Scott

Ne böyle gömülü olduğu takdirde: myfunction( \n_ )?
Deduplicator

@Deduplicator, satır devam karakteri, devam edenle aynı satırda olmalıdır, yani Public Function Foo( ByVal bar as Integer, _ (yeni satır) bas as long) as double- yani, tanımladığınız işlevi çağırırsanız, bir hataya neden olabilir
Taylor Scott

Tamam, bu durumda daha fazla gibi myfunction( _ \n_ ). Karışıklık için özür dilerim. Başka bir deyişle, iki yeni satır kullanmalıydın.
Deduplicator

3

SmileBASIC, 2 bayt


!

Bir çizginin sonundan hiçbir şey devam etmez, bu yüzden tek ihtiyacınız olan bir satır sonu ve ardından bir ifadenin başlangıcı olamaz. !mantıksal işleç değildir, ancak bir ifadenin sonucunu yoksaymanıza izin verilmez, bu nedenle bir şey bile !10geçersiz sayılır (iş sırasında X=!10, elbette)

Benzer şeyler, bir satırın sonunda her şeyin bittiği herhangi bir dilde çalışacaktır, çalıştırmadan önce kodu ayrıştırdığı sürece.

Burada kullanılabilecek birçok alternatif karakter var, bu nedenle geçerli KOŞULLARIN listelenmesinin daha ilginç olacağını düşünüyorum.

@örneğin bir etiketin başlangıcıdır @DATA; nedense izin verilen (bir ifadenin parçası olabilir (X)=1; herhangi bir harf veya _değişken bir isim X=1, işlev çağrısı LOCATE 10,2veya anahtar kelime olabilir WHILE 1; 'bir yorumdur; ve ?için kısa PRINT.


oh, bazı nedenlerden dolayı,
yazıyı

3

INTERCAL , 12 bayt

DOTRYAGAINDO

İnternetten kırmaya çalışın!

INTERCAL'in sözdizimi hatalarına yaklaşımı biraz özeldir. Temel olarak, program yürütmeye çalışmadığı sürece geçersiz bir ifade aslında hata vermez. Aslında, yorumların deyimsel sözdizimi, onların PLEASE NOTEgerçekten yeni bir deyim başlatan, bunun yürütülmeyeceğini bildiren ve sonra da harfle başladığına başlamaktır E. Eğer kodunuz DODObunun ortasındaysa DOABSTAINFROM(1)(1), sonuna kadar geçerli bir ifade hazırlayabilir ve DODODObunları çözebilirsiniz ve bunun gibi bir işlem yapıp yapamayacağınıza karar verebilirsiniz (1)DON'TDODODOCOMEFROM(1). INTERCAL, onlardan kaçmak için dize değişmez sözdizimine sahip olmasa da, geçersiz bir dize oluşturmak için sözdizimi hatalarını kullanmak mümkün değildir, hatta her olası satır numarasını tüketen(1)DO(2)DO...(65535)DODODOÇünkü COME FROM, bunlardan herhangi biriyle çalışmak için çift satır numaralarına sahip olmak çok mümkün .

Yasadışı dize olmak için, aslında tamamen geçerli deyimi kullanmak gerekir: TRY AGAIN. Yürütülmese bile, eğer programda ise, programdaki son ifade kesinlikle olmalıdır. 12 bayt, bildiğim TRY AGAINkadarıyla yasadışı bir dizgenin kullanabileceği en kısa yoldur , çünkü bundan sonra (yürütülür veya edilmez) bir ifade olduğunu garanti etmesi gerekir, bu yüzden DOTRYAGAINsadece normal koddur ve tüm ifadenin olduğundan emin olmak zorundadır. aslında TRY AGAIN, bu yüzden TRYAGAINDOişe yaramaz çünkü kolayca yok sayılan, normal bir sözdizimi hatasına dönüştürülebilir:, DON'TRYAGAINDOGIVEUPveya PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK. Ne olursa olsun her iki tarafında ne koymak DOTRYAGAINDO, ya birlikte, hata edersiniz ICL993I I GAVE UP LONG AGO, ICL079I PROGRAMMER IS INSUFFICIENTLY POLITEya da ICL099I PROGRAMMER IS OVERLY POLITE.


Daha önce ateş edebilecek başka derleme zamanı hataları olabilir ICL993I I GAVE UP LONG AGO.
İlişkili Dize

Her satır etiketini kullanırken, ayrıca COME FROMher satır etiketini de kullanıyorsanız, kontrol akışını bloğun etrafına yönlendirmek biraz zor olabilir, ancak sizi tamamen durduracak hiçbir şey yok GIVING UP!
İlişkili Dize

3

AWK , 4 bayt



/

Çevrimiçi deneyin!

Yana AWKçok hatlı bir yorum yapmak için bir yöntem yoktur sonrasında önce ve 1, 2 yeni satır ihtiyaç /eklemek örneğin dışarı yorum yapabilir veya regex dönüştürüyorsun engellemek için 1/. En sık karşılaşılan mesaj, beklenmeyen yeni satır veya dizgenin sonu.

Önceki çatlak ile


2

Fortran, 14 bayt


end program
e

Fortran'da çok satırlı yorum veya ön işlem yönergesi yok.


1
Bunu çevrimiçi olarak test etmenin iyi bir yolu var mı? Ayrıca, Fortran hangi sürüm / derleyici?
Robert Benson,

2

JavaScript (Node.js) , 9 8 bayt

`*/
\u`~

Çevrimiçi deneyin!

Bunun yeterince yasadışı olması gerektiğini düşünüyorum.

Önceki JS diğer cevaplarda dener

, * / \ U)

@Cows quack tarafından

Bir ES5 cevabı olarak bunun geçerli olması gerekir, ancak ES6'da kodu bir çift backticks ile sarmalamak bunu mahveder. Sonuç olarak geçerli ES6 cevapları backticks içermelidir.

'
`* /} '" `\ U!

@İovoid Tarafından

Bu backticks içeren geliştirilmiş bir versiyondur. Bununla birlikte /, kodun kırılmasından sonra bir tek (Bir regex ile çarpılan, kullanışsız ancak sözdizimsel olarak geçerli bir şablon haline gelir.) @Neil, değişen bir öneride !bulundu ). Bunun teorik olarak çalışması gerekir çünkü /sonunda ekleme artık işe yaramaz (hatalı biçimlendirilmiş regex nedeniyle).

açıklama

`*/
\u`~

Bu tek başına yasa dışıdır ve tüm tek ve çift tırnak işaretlerini de engeller \;

//`*/
\u`~

ve

/*`*/
\u`~

Yasadışı kaçış dizileri ekleyerek yorumları engeller

``*/
\u`~

Sonlandırılmamış RegExp değişmezi tanıtımıyla ilk geri tepmeyi engeller

console.log`*/
\u`~

İki geri tepme arasında beklenen bir işleç tanıtımıyla etiketlenmiş hazır bilgi öğelerini engeller


2

Rockstar , 4 5 bayt

Geçti 4 hala 4 :(

)
"""

Rockstar çok ... wordy bir dildir. Bir dize tanımlamak için kullanılabilir
olsa "da Put "Hello" into myVar, bildiğim kadarıyla bir yorumun dışında 3 alıntı görünmenin bir yolu yoktur ve yakın paranın da gerçekleşmemesini sağlar (Rockstar'daki Yorumlar parantez içine alınır) bu).

Rockstar ayrıca noktalama işaretinin dikkate alınmadığı şiirsel bir sözdizimine de sahiptir, bu nedenle yeni satır 3 alıntıdan her zaman geçersiz olması gereken bir kod satırının başlangıcı olmasını sağlar.


Peki ya (()"""), bu no-op olmaz mı?
21:18,

@BMO ilk paren bir yorum açar, 2. paren yorum yapıldığından hiçbir şey yapmaz, 3. paren yorumu kapatır, daha sonra """)kod olarak ayrıştırılırsınız, geçersizdir
Skidsdev

Hmm, iç içe geçmiş yorumlar şartnamelerde bulunmuyor. Yorumlar zaten vazgeçilmez görünmektedir. Ancak , herhangi bir dizgiye izin veren şiirsel yazı dizisi değişmezlerini denetlediniz , bu yüzden Goethe says )"""geçerli .
17'de

@BMO iyi nokta, arasına yeni bir satır ekleyerek düzeltilebilir )ve"""
Skidsdev

2

Powershell, 10 8 12 14 13 14 16 bayt

Mazzy sayesinde -2 byte , IsItGreyOrGray sayesinde +4 -1 byte kırmanın daha iyi bir yolunu
buluyor

$#>
'@';
"@";
@=

Umarım bu işe yarar. 've ", tırnak karşı korumak için #>blok-yorumunu kırmaya, yeni hatlar, hem tek satırlı bir yorum durdurmak '@ve "@dizeleri başka bir stil yakalamak ve sonra bir sözdizimi hatası atmak uygunsuz bir dizi başlıyor.

Mantık, içeri girmek için her iki alıntı kümesini de kullanamaz, engelleyemez, yorum yapamaz @", Kullanılırsa, daha sonra belirteci bulunamayacak bir here-string oluşturur. onu rahat bırak, kırık bir dizi yapmaya çalışacağım. Bu ifade çok zor yaşamak istiyor, zırhta daha fazla delik bulmaya devam ediyorum.


1
Ya koruyucuları +@=
Mazzy

1
@IlGreyOrGray AAAAAAAAAAAh heck.
Veskah

2
Görünüşe göre #> 'dan # #' a değiştirmek "bir cmdlet'in adı olarak tanınmıyor ..." olarak bozulacak. Yine de bir şekilde yasal olabilir, ancak bir yolum yok. Hala. :)
GreyOrGray

1
@IIIGreyOrGray Sonofagun. Şimdi yarı kolon zırhlı mı?
Veskah

1
Güzel! Hiçbir şeyim yok Denediğim her şey başarısız oldu.
GreyOrGray

2

Runik Büyüleri, 3 bayt

Mümkün olan birçok varyasyondan biri.

Çevrimiçi deneyin!

Runic, unicode karakterlerini " Mdavranışını değiştirir C" (burada Cbir komuttur) komutunu kullanır. Dolayısıyla, iki değiştiricinin aynı komutu değiştirmesine izin verilmez ve böyle bir olay bulunursa ayrıştırıcı bir hata atar.

Benzer şekilde, IP'yi yönlendiren belirli komutlar, değiştirici karakterlerin yön değiştirici karakterlerinin varlığından dolayı hiçbir şekilde değiştirilemez (ve her ikisi de aynı hücrede anlam ifade etmez).

Geçerli olması için dizgiden kaçmanın veya tam anlamıyla izole etmenin bir yolu yoktur. Tio bağlantısı ;, yüksek öncelikli "sonlandırıcı yok" hatasını atlamak için bir giriş içerir .


2

TI-Basic (83 + / 84 + / SE, 24500 bayt)

A

(24500 kez)

TI (-83 + / 84 + / SE) -Basic, yalnızca ulaştığı ifadeleri sözdizimi denetimi yapar, hatta 5000 End , bir satırda ifade a ile atlanabilir Return. Bu, aksine, bir TI-83 + / 84 + / SE RAM'ine sığamaz, bu nedenle hiçbir program bu dizgiyi içeremez. Burada karakter sayısı ile biraz muhafazakar olmak.

Orijinal TI-83 27000 byte RAM'e sahiptir, bu nedenle 27500’e ihtiyacınız olacaktır. A durumda s .

TI-Basic (89 / Ti / 92 + / V200, 3 bayt)

"

Newline, alıntı, newline. Newline, AFAIK çok satırlı dize sabitlerine izin verilmediğinden, herhangi bir yorumu kapatır (ve yasadışı karakteri bir dizginin içine koyan izinler), diğer newline dize kapanmasına izin vermez ve alıntı bir sözdizimi hatası verir.

2 bayt ile alabilirsiniz

±

newline olmadan, ancak ±sayılacağından emin değilim, çünkü yalnızca string sabitlerinde geçerlidir.


Yapıldı, teşekkürler :)
bb94

2

6 bayt git


*/```

İnternetten kırmaya çalışın!

Mezar aksanı (`), içinde` yeni satırlar ve ters eğik çizgiler de dahil olmak üzere tüm karakterlerin kelimenin tam anlamıyla dizginin bir parçası olarak yorumlandığı, ham dizgiyi belirtir. Arka arkaya üç ` 'ın çekirdek gibidir: Bitişik dize hazır daima kapatır` geçersizdir ve ` dize, bu yüzden onları mantıklı bir yolu yoktur. Çevrelemeye karşı koruma için 3 bayt, bir satırsonu kullanmak zorunda kaldım, bu yüzden tek satırlı bir yorumda ya da normal alıntı bir dizgede olamıyoruz, ve * / çok satırlı bir yorumda yer alamayız.


1

SILOS , 4 bayt

Silolar rekabetçi / o /


x+

SILOS iki geçişli bir tercüman / derleyici üzerinde çalışır. Uygulamadan önce bir "derleyici" kaynağı kaynağı tanımlayan bir dizide basitleştirmeye çalışır Her satır ayrı olarak ele alınır. x + a, x değerine ea ekleyen ve onu x'e depolayan bir atama işlecidir. Ancak "derleyici" kırılacak. Bu nedenle, bu dizgiyi alıp kendi satırında olduğundan emin olduktan önce ve sonra yeni bir satır ekleyerek derleyiciyi kırarız.

Çevrimiçi deneyin!


Neden ax+hata vermiyor ?
Outgolfer Erik,

tanımlanmamış derleyici davranışı @EriktheOutgolfer
Rohan Jhunjhunwala

1

AutoHotkey , 5 bayt

`kaçış karakteridir. Bir değişkene yalnızca atamadan "" kaçabilirsiniz.

\ n * / yorum yapmamasını veya bir değişkene atanmasını önler.


*/`"

1

JavaScript, 11 karakter

`
`*/}'"`\u)

Backtick'ler şablon dizgileri öldürdüğünden emin olur, tırnaklar dizelerden kurtulur, yeni satır yorum satırlarından kaçınır, yorum sonu blok yorumlarından kaçınır ve son backtick ve kaçış (a ile! dize.

Çevrimiçi deneyin!



ES5 cevabı daha )sonra kullanıldı \u, belki bu işe yarar mı?
Neil
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.