Temukan String Ilegal

81

Tantangannya adalah menemukan serangkaian karakter yang tidak dapat muncul dalam program hukum apa pun dalam bahasa pilihan Anda. Itu termasuk komentar, string, atau bagian "tidak dapat dieksekusi" lainnya.

Tantangan

  • Program Anda mungkin khusus untuk versi tertentu atau implementasi lingkungan kompiler / juru bahasa / runtime bahasa Anda. Jika demikian, harap jelaskan keterangannya.
  • Hanya opsi kompiler / interpreter / runtime standar yang diizinkan. Anda tidak dapat mengirimkan beberapa flag aneh ke kompiler Anda untuk mendapatkan hasil tertentu (mis. Melewati flag untuk mengubah peringatan menjadi kesalahan).
  • Jika bahasa pemrograman Anda memerlukan penyandian khusus (mis. UTF-8), string Anda juga harus disandikan dengan benar (mis. String yang gagal semata-mata karena kesalahan pengodean karakter tidak diperbolehkan).
  • Setiap karakter individu dalam kiriman Anda harus diterima dalam program hukum; yaitu, Anda tidak bisa hanya menggunakan karakter yang selalu ditolak.
  • Compiler / interpreter / runtime harus memberikan kesalahan ketika diberi kode sumber apa pun yang berisi string Anda sebagai substring. Kesalahan tidak harus sama di seluruh program - satu penyisipan string Anda dapat menyebabkan kesalahan sintaks, sementara yang lain mungkin menyebabkan kesalahan runtime.

Mencetak gol

  • String ilegal terpendek untuk setiap bahasa menang.
  • Anda harus menjelaskan mengapa string Anda ilegal (mengapa tidak dapat muncul di mana pun dalam program hukum).
  • Sengketa solusi yang salah dalam komentar. Lebih khusus lagi, Anda harus memberikan tautan ke TIO atau yang setara dengan menunjukkan program hukum (yaitu program yang tidak menghasilkan kesalahan) yang berisi substring yang diajukan.
  • Beberapa bahasa (misalnya Bash, Batch, Perl) memungkinkan data biner sewenang-wenang ditambahkan ke program tanpa mempengaruhi validitas (misalnya menggunakan __DATA__dalam Perl). Untuk bahasa seperti itu, Anda dapat mengirimkan solusi yang hanya dapat muncul di bagian trailing tersebut. Pastikan untuk mencatatnya dalam jawaban Anda. (Definisi "bagian tambahan" ini tergantung pada bahasa, tetapi umumnya berarti teks apa pun setelah pengurai sepenuhnya berhenti membaca skrip).

Contoh

Dengan Python, saya bisa mengirimkan

x
"""
'''

tetapi ini dapat tertanam ke dalam program yang lebih besar

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

jadi tidak bisa diterima.

nneonneo
sumber
2
Bisakah contoh tandingan mengandalkan input dari STDIN?
Zacharý
5
Apakah ini akan menghasilkan CnR yang baik?
CalculatorFeline
2
Terlambat sekarang saya kira, tapi sepertinya ini bisa menjadi tantangan polisi dan perampok. Ada banyak keterampilan yang jelas dalam upaya untuk membuat program yang valid, serta memunculkan string di tempat pertama.
user2390246
4
Belasungkawa atas upaya Perl. :)
Kaz
2
Saya cukup yakin itu benar-benar mustahil di Haskell yang tidak melek huruf, berkat komentar bersarang.
dfeuer

Jawaban:

57

Changeling , 2 byte




Itu dua umpan garis. Valeling Changeling harus selalu membentuk kuadrat sempurna karakter ASCII yang dapat dicetak, sehingga tidak dapat berisi dua baris baris secara berturut-turut.

Kesalahan selalu merupakan kesalahan parser dan selalu sama:

This shape is unpleasant.

disertai dengan kode keluar 1 .

Cobalah online!

Dennis
sumber
Ini juga berfungsi dengan 2Col . Cobalah online! . Tetapi alasan ini istirahat di 2Col adalah bahwa setiap baris harus terdiri dari tepat 2 karakter, tetapi baris kosong istirahat itu.
Kritixi Lithos
2
+1 karena ini adalah pemenangnya secara otomatis, karena solusi 1-byte tidak diperbolehkan karena "Anda tidak bisa hanya menggunakan karakter yang selalu ditolak."
Zacharý
1
@Cowsquack tfw Saya lupa bahasa saya sendiri
Skidsdev
1
@Skidsdev tfw Saya kembali lupa tentang bahasa saya sendiri, dan lupa tentang saya lupa tentang bahasa saya sendiri
Skidsdev
@ Zacharý Bagaimana dengan solusi 0-byte?
PyRulez
32

Java, 4 byte

;\u;

Cobalah online!

Ini adalah urutan keluar Unicode yang tidak valid dan akan menyebabkan kesalahan dalam kompiler.

error: illegal unicode escape
Kritixi Lithos
sumber
Tidak berfungsi - seseorang dapat memiliki string seperti literal "\\u;".
feersum
@feersum Tetap dengan biaya satu byte
Kritixi Lithos
21
@TheLethalCoder: Java kode sumber preprocesses untuk mengubah \uXXXXlolos sebelum melakukan hal lain, jadi ya, ini akan bekerja bahkan di dalam comments.za
nneonneo
3
Saya pikir ini adalah jawaban Java terpendek dalam sejarah situs ini masih ..
Magic Octopus Mm
1
@MagicOctopusUrn Sebenarnya, ada 0 byte jawaban Java ini (yang tidak relevan lagi dalam meta saat ini, karena ini output ke STDERR bukan STDOUT). Meskipun keduanya cukup luar biasa dan pintar. :)
Kevin Cruijssen
25

COBOL (GNU) , 8 byte


THEGAME

Pertama, umpan baris untuk mencegah Anda meletakkan kata saya di baris komentar.

Kemudian, secara historis, program COBOL dicetak pada lembar pengkodean, kompiler sangat bergantung pada garis terbatas 80 karakter, tidak ada komentar multiline dan 6 karakter pertama adalah komentar (sering digunakan sebagai nomor baris yang dapat diedit), Anda dapat meletakkan hampir apa saja di sana , AFAIK. Saya memilih THEGAMdi awal baris berikutnya.

Kemudian, simbol ke-7 di setiap baris hanya menerima daftar karakter yang sangat terbatas: Spasi (tidak ada efek), Asterisk (komentar pada sisa baris), Hyphen, Slash, mungkin ada yang lain, tetapi tentu saja tidak E.

Kesalahan yang diberikan oleh GnuCobol, misalnya, adalah:

error: invalid indicator 'E' at column 7

Cobalah online!

Juga, Anda baru saja kehilangan permainan.

PhilDenfer
sumber
30
Also, you just lost the game.Saya hampir kalah suara
Stephen
24

JavaScript, 7 byte


;*/\u)

Perhatikan baris baru terkemuka.

  • \u) adalah urutan jalan keluar Unicode yang tidak valid dan inilah sebabnya string ini tidak valid
  • Menambahkan a //di awal masih tidak akan berfungsi karena baris baru terkemuka, meninggalkan baris kedua tidak dikomentari
  • Menambahkan /*tidak akan menghapus tanda komentar string sepenuhnya karena penutupan */yang menyelesaikannya, meninggalkan \u)terbuka
  • Seperti yang dinyatakan oleh @tsh, intinya dapat diubah menjadi regex dengan memiliki /setelah string, jadi dengan memiliki )di depan \u, kita dapat memastikan bahwa regex literal akan selalu tidak valid
  • Seperti yang dinyatakan oleh @asgallant, orang bisa melakukannya 1||1(string)/untuk menghindari keharusan mengevaluasi regex. Semi-titik dua di awal baris kedua menghentikan hal itu terjadi dengan mengakhiri ekspresi 1||1sebelum menyentuh baris kedua, sehingga memaksa SyntaxError dengan ;*.

Cobalah!

Kritixi Lithos
sumber
2
/* */\u0045 = 3tampaknya kode JavaScript yang valid.
tsh
2
3 */\u;/masih valid
tsh
3
Menarik untuk dicatat bahwa pada ES2018 (yang tidak akan resmi hingga akhir tahun ini) Anda bisa membungkus semuanya dengan backtick karena hal ini . Anda mungkin dapat memperbaiki ini meskipun hanya dengan memasukkan backtick setelah /(bukan bahwa Anda perlu memperbaikinya). (Juga, yang ;tidak memaksa penguraian regex yang buruk, itu memaksa Sintaksis dengan *.)
ETHproduksi
1
@Leushenko Tapi ini tidak berhasil melawan #if 0seperti yang terlihat di sini: Cobalah online!
Kritixi Lithos
3
Dalam versi JS yang lebih baru, String.raw dengan string templat dapat membuat ini tidak rusak, karena gagal melarikan diri gagal. Adalah: String.raw`code here`
iovoid
15

Python, 10 byte (bukan cpython)


?"""?'''?

Perhatikan baris baru terkemuka. Tidak dapat dikomentari karena baris baru, dan tidak ada kombinasi dari string yang dikutip tiga kali jika saya memikirkan hal ini dengan benar.

@feersum di komentar tampaknya telah benar-benar merusak program cpython di Windows sejauh yang saya tahu dengan menambahkan karakter 0x1A ke awal file. Tampaknya mungkin (?) Ini disebabkan cara karakter ini ditangani oleh sistem operasi, tampaknya diterjemahkan ke EOF saat melewati stdin karena beberapa standar DOS lama.

Dalam arti yang sangat nyata ini bukan masalah dengan python tetapi dengan sistem operasi. Jika Anda membuat skrip python yang membaca file dan menggunakan builtin compiledi dalamnya, itu memberi perilaku yang lebih diharapkan dari melemparkan kesalahan sintaksis. Pypy (yang mungkin hanya melakukan ini secara internal) juga melempar kesalahan.

Sunting:

Karena ketekunan @ feersum dalam menemukan cara-cara yang tidak jelas untuk memecahkan interpreter Python, jawaban ini benar-benar tidak berlaku untuk lingkungan cpython khas sejauh yang saya tahu! (Python 2 dan 3 untuk Windows dan Linux) Saya masih percaya bahwa celah ini tidak akan berfungsi untuk Pypy pada platform apa pun (satu-satunya implementasi Python lain yang telah saya uji).

KSab
sumber
1
@officialaimm pertimbangkan"""?'''"""
KSab
3
Saya membuat program dengan substring ini yang berjalan di komputer saya. Namun, saya pikir itu tidak berjalan pada banyak interpreter / platform / versi. Bisakah Anda menentukan versi interpreter Python dan OS mana yang ditargetkan oleh jawaban ini?
feersum
1
Python 3 pada Windows 7 kebetulan persis di tempat crack saya bekerja. Pastebin program yang disandikan base64
feersum
1
Saya bisa memecahkan yang ini juga. Sederhananya karakter 0x1A di awal file, dan semua sisanya diabaikan (ini sebenarnya berfungsi untuk Python 3 juga).
feersum
1
Saya tahu ini benar-benar tua, tetapi setelah bekerja dengan beberapa orang di Python Discord, kami menemukan celah ini , meskipun saya tidak tahu apakah mengubah penyandian dapat dianggap curang
EdgyNerd
14

C (dentang) , 16 byte

 */
#else
#else

Cobalah online!

*/menutup /*komentar apa pun , dan ruang utama memastikan kami tidak hanya memulai satu. Baris baru menutup setiap //komentar dan memecah string literal apa pun. Kemudian kita menyebabkan kesalahan #else without #ifatau #else after #else(terlepas dari berapa banyak #if 0kita mungkin berada di dalam).

Anders Kaseorg
sumber
5
Retak lagi.
feersum
2
Juga karena string C ++ 11 tampaknya berfungsi, solusi tidak mungkin dilakukan dengan gcc.
feersum
@feersum Huh, TIL yang diterima GCC dalam kode C. Saya bisa menentukan -std=c99, tapi mari kita coba beralih ke dentang.
Anders Kaseorg
3
Saya benar-benar terkejut bahwa gcc menerima string mentah C ++ 11. Menentukan versi kompilator atau implementasinya sangat oke, jadi jika itu ilegal di Dentang, itu adalah permainan yang adil.
nneonneo
1
@ l4m2 Saya tidak dapat menguraikan pertanyaan Anda (siapa mereka, dan apa maksud Anda lagi?), tetapi perhatikan bahwa literal string baku C ++ mendukung delimeter khusus:, R"foobar(...)foobar"dan hanya paren kanan yang diikuti oleh delimeter yang cocok dan sebuah kutipan akan menutupnya.
Anders Kaseorg
11

Pyth, 6 byte

¡¡$¡"¡

¡adalah karakter yang tidak diimplementasikan, yang berarti bahwa jika parser Pyth pernah mengevaluasinya, itu akan kesalahan keluar dengan PythParseError. Kode memastikan ini akan terjadi pada salah satu dari ¡.

Ada tiga cara byte dapat hadir dalam program Pyth, dan tidak diuraikan: Dalam string literal ( "atau .", yang diuraikan secara setara), dalam Python literal ( $) dan segera setelah a \.

Kode ini mencegah \dari membuatnya mengevaluasi tanpa kesalahan, karena itu hanya mempengaruhi byte berikut segera, dan ¡kesalahan kedua .

$embed kode dalam $s ke kode Python dikompilasi secara langsung. Saya tidak membuat asumsi tentang apa yang mungkin terjadi di sana.

Jika program mencapai kode ini dalam $konteks, itu akan berakhir di $, dan ¡setelah itu akan membuat kesalahan parser. Literal Python Pyth selalu berakhir di berikutnya $, terlepas dari apa yang mungkin dilakukan kode Python.

Jika program dimulai dalam "konteks, "kehendak membuat akhir string, dan final ¡akan membuat kesalahan parser.

isaacg
sumber
11

Ada - 2 byte

Saya pikir ini harus berhasil:


_

Itu garis bawah-garis bawah. Newline mengakhiri komentar dan tidak diizinkan dalam sebuah string. Garis bawah tidak dapat mengikuti spasi putih; dulu hanya diizinkan setelah huruf dan angka, tetapi pengenalan Unicode membuat segalanya menjadi rumit.

xaambru
sumber
2
Selamat datang di situs ini! :)
DJMcMayhem
9

x86 kode mesin 32-bit, 11 byte (dan 64-bit masa depan-bukti)

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

Ini adalah times 9 nop/ ud2. Ini pada dasarnya kereta luncur NOP , sehingga masih berjalan sebagai 0 atau lebih nopdan kemudian ud2untuk meningkatkan pengecualian, terlepas dari berapa banyak 0x90byte yang dikonsumsi sebagai operan ke opcode sebelumnya. Instruksi byte tunggal lainnya (seperti times 9 xchg eax, ecx) juga akan berfungsi.

x86 kode mesin 64-bit, 10 byte (CPU saat ini)

Ada beberapa instruksi ilegal 1-byte dalam mode 64-bit, sampai beberapa ekstensi ISA di masa depan mengolahnya kembali sebagai awalan atau bagian dari multi-byte opcodes dalam mode 64-bit saja, terpisah dari artinya dalam mode 32-bit. 0x0eadalah push csdalam mode 32-bit, tapi ilegal pada CPU saat ini (diuji pada Intel Skylake) di 64-bit.

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

Interpretasi aturan untuk kode mesin yang dapat dieksekusi :

  • Bytes tidak dapat dilompati (seperti pembatasan "tidak diuraikan"), karena CPU tidak menaikkan pengecualian sampai mereka benar-benar mencoba untuk mendekode / mengeksekusi (non-spekulatif).

  • Berarti ilegal selalu menimbulkan pengecualian, misalnya pengecualian instruksi ilegal. (Program nyata dapat menangkapnya dengan handler pengecualian pada logam kosong, atau menginstal handler sinyal OS, tapi saya pikir ini menangkap semangat tantangan.)


Ini berfungsi karena byte-string yang lebih pendek yang diakhiri ud2dapat muncul sebagai imm32 dan / atau bagian dari mode pengalamatan untuk instruksi lain, atau dibagi menjadi sepasang instruksi . Paling mudah untuk memikirkan hal ini dalam hal apa yang dapat Anda masukkan sebelum string untuk "mengonsumsi" byte sebagai bagian dari instruksi, dan meninggalkan sesuatu yang tidak akan salah.

Saya pikir sebuah instruksi dapat mengkonsumsi paling banyak 9 byte dari hal-hal yang berubah-ubah: byte SIB, disp32, dan imm32. yaitu 2 byte pertama dari instruksi ini dapat mengkonsumsi 8 NOP dan ud2, tetapi tidak 9.

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

Tidak bisa mengalahkan 9 nops:

    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    

Mode 64-bit:

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

Tetapi byte untuk 8 NOPs + ud2 (atau times 9 db 0x0e) dapat muncul sebagai bagian dari insns lain:

    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
  ...
Peter Cordes
sumber
Aturan di sini tidak begitu jelas bagi saya untuk mempertimbangkan memposting jawaban kode asm / mesin. Misalnya, mengapa Anda tidak bisa begitu saja melakukannya ud2? Tampaknya Anda mengatakan bahwa Anda menafsirkan aturan sebagai melarang melompati byte, jadi ud2akan bekerja dengan baik sendiri, bukan? Oh ... Saya kira Anda mengatakan masalahnya adalah apakah itu ud2dapat muncul sebagai awalan untuk instruksi yang valid? Bagian kedua dari jawaban ini agak sulit bagi saya untuk mengerti.
Cody Grey
@CodyGray: Benar, 2 byte yang menyandikan ud2dapat muncul dalam imm32instruksi apa pun. Saya sedang memikirkan hal ini dalam hal byte apa yang dapat Anda tempatkan sebelum string yang "mengkonsumsi" 0f 0bsebagai bagian dari instruksi sebelumnya dan bukan decoding sebagai ud2. Saya tidak sepenuhnya senang dengan bagaimana saya akhirnya mempresentasikannya, tetapi saya ingin menggambarkan mengapa hanya 8 nopdetik saja tidak cukup, dan apa yang terjadi dengan 9 nopdetik + ud2.
Peter Cordes
@CodyGray: Program sumber asm akan menjadi jawaban yang sama sekali berbeda. Itu harus kesalahan parser yang digunakan oleh assembler, tidak menghasilkan kode mesin yang salah. Jadi sesuatu seperti %else/ %elsemungkin berhasil dikalahkan %if 0, yang biasanya dapat melindungi teks yang tidak valid agar tidak diuraikan. (ide dari jawaban CPP)
Peter Cordes
Tidak cukup memuaskan. Solusi Anda mungkin hanya dalam. Data. (meskipun itu membuatnya tidak mungkin)
l4m2
@ l4m2: Untuk membuat pertanyaan dapat dijawab / menarik, saya harus membatasinya pada kode yang dieksekusi (dan tidak melompati). Lihat aturan poin poin interpretasi dalam jawaban saya. Itu juga akan mengesampingkan data statis, tentu saja. Karena itu bukan kode mesin sama sekali, itu hanya data. Pertanyaan ini membutuhkan lebih banyak adaptasi daripada sebagian besar jawaban mesin-kode masuk akal, karena tidak ada tahap kompilasi / assemble di mana Anda dapat kesalahan parser, kami hanya berbicara tentang byte yang sudah ada dalam memori.
Peter Cordes
7

C #, 16 byte


*/"
#endif<#@#>

Berfungsi karena:

  • // komentar tidak akan berfungsi karena baris baru
  • /* komentar tidak akan berfungsi karena */
  • Anda tidak dapat memiliki konstanta dalam kode saja
  • Menambahkan #if falseke awal tidak akan berhasil karena#endif
  • The "menutup setiap string literal
  • Ini <#@#>adalah direktif tanpa nama sehingga gagal untuk template T4.
  • Baris baru menipu itu sehingga memiliki /di awal tidak akan menipu*/

Setiap variasi gagal dengan kesalahan kompilasi.

TheLethalCoder
sumber
1
Aneh bahwa Anda memutuskan untuk memasukkan template T4 dalam kode Anda. Bukankah T4 dianggap bahasa terpisah?
Arturo Torres Sánchez
1
@ ArturoTorresSánchez Saya tidak tahu saya belum pernah mendengar tentang mereka. Seseorang berkomentar ini tidak berfungsi ketika Anda memasukkan template T4 jadi saya menambahkan perbaikannya.
TheLethalCoder
5

Literate Haskell , 15 bytes

Memperbaiki upaya yang dihapus oleh nimi.


\end{code}
5
>

Cobalah online!

Upaya asli nimi adalah dua baris terakhir, berdasarkan Literate Haskell yang tidak mengizinkan >kode gaya melek huruf berada di garis tetangga ke baris komentar melek (di 5sini). Gagal karena dapat disematkan dalam komentar dengan gaya pengkodean literasi alternatif ("LaTeX"):

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

Namun, \begin{code}gaya Literate Haskell tidak bersarang, baik dalam dirinya sendiri maupun dalam {- -}komentar multiline, jadi dengan meletakkan garis \end{code}tepat sebelum baris dengan 5, penyelesaiannya gagal, dan saya tidak melihat yang berbeda.

Ørjan Johansen
sumber
4

Gratis Pascal, 18 byte


*)}{$else}{$else}

Pertama tutup semua komentar yang mungkin, kemudian tangani kompilasi bersyarat.

Beri komentar di sini jika saya lupa sesuatu.

tsh
sumber
3
@ user902383 Apakah contoh Anda berisi baris baru dari cuplikannya?
Brian J
@BrianJ tidak, saya pikir itu hanya masalah format, saya buruk
user902383
Saya tidak berpikir itu mungkin dalam Free Pascal. Taruh saja setelahnya begin end..
jimmy23013
@ jimmy23013 tetapi tampaknya kode setelah end.valid menjadi diizinkan oleh pertanyaan.
tsh
4

Commodore 64 Basic, 2 byte


B

(itu baris baru diikuti oleh huruf "B").

Setiap baris dalam program Commodore 64 harus dimulai dengan nomor baris atau kata kunci BASIC, dan program yang disimpan hanya mengizinkan nomor baris. Tidak ada kata kunci yang dimulai dengan "B" (atau "H", "J", "K", "Q", "X", "Y", atau "Z").

Menandai
sumber
Jika saya menambahkan =0maka ini hanya menjadi pernyataan tugas ...
Neil
1
@ Neil, itu akan menjadi perintah mode langsung yang valid, tetapi bukan program yang valid.
Tandai
4

Brain-Hack (variasi Brain-Flak ), 3 2 byte

Terima kasih kepada Wheat Wizard karena menunjukkan bahwa Brain-Hack tidak mendukung komentar, menyelamatkan saya satu byte.

(}

Cobalah online!

Riley
sumber
Bagaimana Anda melakukan komentar di Brain-Flak? Saya tidak tahu cara untuk melakukan itu.
Erik the Outgolfer
@EriktheOutgolfer # TIO
Riley
Huh perilaku tidak berdokumen.
Erik the Outgolfer
@EriktheOutgolfer Saya selalu berasumsi mereka didokumentasikan di suatu tempat. Saya akan melihat menambahkan mereka.
Riley
Anda tidak memerlukan baris baru di BrainHack atau Craneflak, Rain-Flak adalah satu-satunya dari tiga versi yang memiliki komentar baris. Meskipun Craneflak mem-parsing dengan cepat sehingga tidak mungkin untuk menyelesaikannya di Craneflak, solusi apa pun dapat dikalahkan dengan mendahului (()){()}.
Wheat Wizard
3

VBA, 2 Bytes

Linefeed diikuti oleh garis bawah - _berfungsi sebagai karakter kelanjutan garis dalam VBA, dan karena tidak ada apa pun di baris langsung ke kiri atau di atas kelanjutan garis, ditambah dengan kurangnya komentar multiline VBA berarti bahwa ini akan selalu membuang kompilasi kesalahan waktuCompile Error: Invalid character


_
Taylor Scott
sumber
Anda memang bergantung pada pola Anda mulai dari baris baru ... jadi, tambahkan baris baru.
Deduplicator
@Dupuplikator itu sudah memiliki baris baru, - tidak masalah apa yang mengikuti _, hanya saja tidak ada garis yang valid ke kiri atau di atasnya
Taylor Scott
Bagaimana jika tertanam seperti ini myfunction( \n_ ):?
Deduplicator
@Dupuplikator karakter kelanjutan baris harus berada pada baris yang sama dengan yang sedang berjalan yaitu Public Function Foo( ByVal bar as Integer, _ (baris baru) bas as long) as double- jadi ya, itu akan menghasilkan kesalahan jika Anda memanggil fungsi yang Anda jelaskan
Taylor Scott
Ok, dalam hal ini lebih seperti myfunction( _ \n_ ). Maaf bila membingungkan. Dengan kata lain, Anda harus menggunakan dua baris baru.
Deduplicator
3

SmileBASIC, 2 byte


!

Tidak ada yang berlanjut melewati akhir baris, jadi yang Anda butuhkan hanyalah istirahat baris diikuti oleh sesuatu yang tidak bisa menjadi awal dari sebuah pernyataan. !adalah operator logis bukan, tetapi Anda tidak diizinkan untuk mengabaikan hasil ekspresi, sehingga bahkan sesuatu seperti !10tidak valid (saat X=!10bekerja, tentu saja)

Hal serupa akan bekerja dalam bahasa apa pun di mana semuanya berakhir di akhir baris, asalkan kode tersebut diurai sebelum dijalankan.

Ada banyak karakter alternatif yang dapat digunakan di sini, jadi saya pikir akan lebih menarik untuk mendaftar karakter yang BISA valid.

@adalah awal label, misalnya @DATA,; (dapat menjadi bagian dari ekspresi seperti (X)=1yang diizinkan karena alasan tertentu; huruf apa pun atau _bisa berupa nama variabel X=1, panggilan fungsi LOCATE 10,2, atau kata kunci WHILE 1; 'adalah komentar; dan ?merupakan kependekan dari PRINT.

12Me21
sumber
oh, untuk beberapa alasan ketika saya mengedit posting itu telah digandakan ...
12Me21
3

INTERCAL , 12 byte

DOTRYAGAINDO

Cobalah untuk memecahkannya secara online!

Pendekatan INTERCAL untuk kesalahan sintaks agak istimewa. Pada dasarnya, pernyataan yang tidak benar tidak akan benar-benar salah kecuali program mencoba untuk mengeksekusinya. Faktanya, sintaksis idiomatis untuk komentar adalah memulainya PLEASE NOTE, yang benar-benar baru memulai pernyataan, menyatakan bahwa itu tidak akan dieksekusi, dan kemudian mulai dengan surat E. Jika kode Anda ada DODOdi tengah-tengahnya, Anda bisa menambahkan DOABSTAINFROM(1)(1)dan menempelkan pernyataan yang valid di bagian akhir dan Anda akan baik-baik saja, jika DODODOAnda bisa membengkokkan eksekusi di sekitarnya sebagai (1)DON'TDODODOCOMEFROM(1). Meskipun INTERCAL tidak memiliki sintaks literal string untuk menghindarinya, tidak ada cara untuk menggunakan kesalahan sintaks untuk membuat string ilegal, bahkan melelahkan setiap kemungkinan nomor baris dengan(1)DO(2)DO...(65535)DODODO, karena tampaknya sangat mungkin untuk memiliki nomor baris duplikat dengan COME FROMbekerja dengan mereka.

Untuk membuat string ilegal, kita benar-benar perlu menggunakan pernyataan sempurna berlaku: TRY AGAIN. Bahkan jika itu tidak dieksekusi, itu harus menjadi pernyataan terakhir dalam sebuah program jika itu ada di dalam program sama sekali. 12 byte adalah, sepengetahuan saya, string terpendek yang dapat digunakan TRY AGAIN, karena harus menjamin bahwa ada pernyataan setelah itu (dieksekusi atau tidak) jadi DOTRYAGAINhanya kode normal, dan perlu memastikan bahwa seluruh pernyataan memang TRY AGAIN, jadi TRYAGAINDOtidak berfungsi karena dapat dengan mudah diubah menjadi kesalahan sintaksis normal yang diabaikan:, DON'TRYAGAINDOGIVEUPatau PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK. Tidak peduli apa yang Anda masukkan di kedua sisi DOTRYAGAINDO, Anda akan kesalahan, dengan baik ICL993I I GAVE UP LONG AGO, ICL079I PROGRAMMER IS INSUFFICIENTLY POLITEatau ICL099I PROGRAMMER IS OVERLY POLITE.

String yang tidak terkait
sumber
Mungkin ada beberapa kesalahan waktu kompilasi lain yang dapat diaktifkan sebelumnya ICL993I I GAVE UP LONG AGO.
String Tidak Terkait
Jika, saat menggunakan setiap label garis, Anda juga COME FROMsetiap label garis, mungkin agak sulit untuk mengalihkan aliran kontrol di sekitar blok, tetapi sama sekali tidak menghentikan Anda dari hanya GIVING UP!
String yang tidak terkait
3

AWK , 4 byte



/

Cobalah online!

Karena AWKtidak memiliki metode untuk melakukan komentar multi-baris, perlu 2 baris baru sebelum dan 1 setelah /untuk mencegah komentar keluar atau mengubahnya menjadi sebuah regex, misalnya menambahkan 1/. Pesan yang paling umum adalah `baris tak terduga atau akhir string.

Dengan celah sebelumnya

Robert Benson
sumber
2

Fortran, 14 byte


end program
e

Tidak ada komentar multiline atau arahan preprosesor di Fortran.

Steadybox
sumber
1
Apakah ada cara yang baik untuk menguji ini secara online? Juga, versi / kompiler Fortran mana?
Robert Benson
2

JavaScript (Node.js) , 9 8 byte

`*/
\u`~

Cobalah online!

Saya pikir ini cukup ilegal.

Upaya JS sebelumnya dalam jawaban lain

; * / \ u)

Dengan @Cows dukun

Sebagai jawaban ES5 ini harus valid, tetapi dalam ES6 membungkus kode dengan sepasang backticks merusak ini. Sebagai hasilnya jawaban ES6 yang valid harus melibatkan backticks.

`
`* /} '" `\ u!

Oleh @iovoid

Ini adalah versi yang disempurnakan yang melibatkan backticks. Namun satu /setelah kode istirahat ini (Ini menjadi templat literal dikalikan dengan regex, tidak berguna tetapi valid secara sintaksis.) @ Neil membuat saran yang berubah !menjadi ). Ini secara teoritis harus bekerja karena menambahkan /pada akhirnya tidak lagi berfungsi (karena regex cacat.)

Penjelasan

`*/
\u`~

Ini dengan sendirinya ilegal, dan juga memblokir semua tanda kutip tunggal dan ganda karena tanda kutip itu tidak dapat melewati garis tanpa \di akhir baris

//`*/
\u`~

dan

/*`*/
\u`~

Memblokir komentar dengan memperkenalkan urutan pelarian ilegal

``*/
\u`~

Memblokir backtick awal dengan memperkenalkan huruf RegExp yang tidak diakhiri

console.log`*/
\u`~

Blok tag templat literal dengan memperkenalkan operator yang diharapkan antara dua backticks

Shieru Asakoto
sumber
2

Rockstar , 4 5 byte

Dicoret 4 masih 4 :(

)
"""

Rockstar adalah bahasa yang sangat ... bertele-tele.
Meskipun "dapat digunakan untuk mendefinisikan string, seperti Put "Hello" into myVar, setahu saya tidak ada cara untuk 3 kutipan muncul di luar komentar, dan paren dekat memastikan itu tidak akan terjadi juga (Komentar di Rockstar terlampir dalam tanda kurung, seperti ini).

Rockstar juga memiliki sintaks literal puitis, di mana tanda baca diabaikan, sehingga baris baru memastikan bahwa 3 tanda kutip adalah awal dari baris kode, yang harus selalu tidak valid

Skidsdev
sumber
Bagaimana (()"""), bukankah itu no-op?
ბიმო
@BMO paren pertama membuka komentar, paren kedua tidak melakukan apa-apa karena berkomentar, paren ketiga menutup komentar, maka Anda telah """)diuraikan sebagai kode, yang tidak valid
Skidsdev
Hmm, komentar bersarang tidak ada dalam spesifikasi. Komentar sepertinya tidak dianjurkan. Tapi Anda mengawasi literal string puitis yang memungkinkan string apa pun, jadi Goethe says )"""valid .
ბიმო
@BMO poin bagus, bisa diperbaiki dengan memasukkan peralihan baris baru )dan"""
Skidsdev
2

Powershell, 10 8 12 14 13 14 16 byte

-2 byte terima kasih kepada Mazzy menemukan cara yang lebih baik untuk memecahkannya
+4 -1 byte terima kasih kepada IsItGreyOrGray

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

Saya harap ini berhasil. 'dan "untuk menjaga terhadap tanda kutip, #>untuk memecah blok-komentar, baris baru untuk menghentikan komentar satu baris, keduanya '@dan "@untuk menangkap gaya string lain, dan kemudian memulai array yang tidak tepat untuk melempar kesalahan sintaksis.

Logikanya adalah mereka tidak dapat menggunakan salah satu set kutipan untuk masuk, mereka tidak dapat memblokir-berkomentar, Jika @"digunakan, itu akan membuat string di sini yang tidak dapat memiliki token setelahnya, dan jika mereka biarkan saja, itu akan mencoba membuat array yang rusak. Pernyataan ini ingin hidup begitu keras, saya terus menemukan lebih banyak lubang di baju besi.

Veskah
sumber
1
Atau pelindung +@=
mazzy
1
@IsItGreyOrGray AAAAAAAAAAAAw.
Veskah
2
Sepertinya mengubah #> menjadi $ #> akan mematahkannya sebagai "tidak dikenali sebagai nama cmdlet ..." Entah bagaimana itu bisa dibuat legal lagi, tapi saya tidak punya cara. Namun. :)
GreyOrGray
1
@IsItGreyOrGray Sonofagun. Sekarang menampilkan baju besi semi-kolon?
Veskah
1
Bagus! Saya tidak punya apa-apa. Semua yang saya coba telah gagal.
GreyOrGray
2

Pesona Rise, 3 byte

Salah satu dari banyak variasi yang mungkin.

Cobalah online!

Runic menggunakan unicode yang menggabungkan karakter dalam " Mmemodifikasi perilaku C" (di mana Cadalah perintah). Dengan demikian, tidak ada dua pengubah yang diizinkan untuk mengubah perintah yang sama dan parser akan melempar kesalahan jika kejadian tersebut ditemukan.

Demikian pula, perintah tertentu yang mengarahkan ulang IP tidak dapat dimodifikasi dengan cara apa pun, karena keberadaan pengubah arah memodifikasi karakter (dan keduanya di sel yang sama tidak masuk akal).

Tidak ada cara untuk melarikan diri atau menyesuaikan ukuran string agar valid. Tio tautan berisi ;untuk memotong kesalahan "tidak ada terminator" prioritas tinggi.

Draco18s
sumber
2

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

A

(24500 kali)

TI (-83 + / 84 + / SE) -Basic melakukan sintaks hanya memeriksa pernyataan yang Enddicapai , sehingga bahkan 5.000 pernyataan dalam satu baris dapat dilewati dengan a Return. Ini, sebaliknya, tidak dapat masuk ke dalam RAM TI-83 + / 84 + / SE, jadi tidak ada program yang dapat memuat string ini. Menjadi sedikit konservatif dengan jumlah karakter di sini.

TI-83 asli memiliki 27000 byte RAM, jadi Anda perlu 27500 Adalam hal ini.

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

"

Baris baru, kutipan, baris baru. Baris baru menutup komentar apa pun (dan melarang menanamkan karakter ilegal ke dalam string, karena konstanta string multiline AFAIK tidak diperbolehkan), baris baru ini melarang menutup string, dan kutipan tersebut memberikan kesalahan sintaksis.

Anda bisa mendapatkan 2 byte dengan

±

tanpa baris baru, tapi saya tidak yakin apakah ini diperhitungkan karena ±hanya valid dalam konstanta string.

bb94
sumber
Selesai, terima kasih :)
bb94
2

Pergi , 6 byte


*/```

Cobalah untuk memecahkannya secara online!

Aksen kubur (`) menandai string string literal, di dalamnya semua karakter kecuali`, termasuk baris baru dan garis miring terbalik, ditafsirkan secara harfiah sebagai bagian dari string. Tiga `s berturut-turut adalah intinya: string literal yang berdekatan tidak valid dan` selalu menutup string ` , jadi tidak ada cara untuk memahaminya. Saya harus menggunakan 3 byte lagi untuk anti-circumvention, sebuah baris baru sehingga kita tidak bisa berada di dalam komentar baris tunggal atau string yang dikutip normal, dan tanda * / jadi kita tidak bisa berada di dalam komentar multi-baris.

Ungu P
sumber
1

SILOS , 4 byte

Silo kompetitif \ o /


x+

SILOS beroperasi dengan interpreter / kompiler dua pass Sebelum dieksekusi, "kompiler" mencoba menyederhanakan sumber menjadi sebuah array yang menggambarkan sumber. Setiap baris diperlakukan secara terpisah. x + a adalah operator penugasan yang akan menambahkan ea ke nilai x dan menyimpannya ke x. Namun "kompiler" akan rusak. Oleh karena itu, kami mengambil string ini dan menambahkan baris baru sebelum dan setelah memastikan itu pada barisnya sendiri dan merusak kompiler.

Cobalah online!

Rohan Jhunjhunwala
sumber
Mengapa tidak ax+salah?
Erik the Outgolfer
perilaku compiler terdefinisi @EriktheOutgolfer
Rohan Jhunjhunwala
1

AutoHotkey , 5 byte

`adalah karakter pelarian. Anda hanya bisa keluar dari "ketika menugaskannya ke variabel.

\ n * / mencegahnya agar tidak dikomentari atau ditugaskan ke variabel.


*/`"
nelsontruran
sumber
1

JavaScript, 11 karakter

`
`*/}'"`\u)

Backtick memastikan untuk membunuh string template, kutipan menghilangkan string, baris baru menghindari komentar baris, akhir komentar menghindari komentar blokir, dan backtick terakhir dan melarikan diri (dengan! Untuk menghindari menambahkan nomor) mencoba untuk memulai tidak valid tali.

Cobalah online!

iovoid
sumber
Jawaban ES5 digunakan )setelah \u, mungkin itu akan berhasil di sini?
Neil