Penghapusan baris kosong pada kode sumber yang menyebabkan fungsionalitas yang tidak diharapkan [ditutup]

38

Tulis skrip yang berfungsi dengan baik ketika baris kosong hadir dalam alur logika program, tetapi hancurkan atau menyebabkan perilaku yang tidak terduga saat baris tersebut dihapus.

Hindari celah standar dan jawaban bodoh. Program Anda harus melakukan sesuatu yang "berguna," bahkan jika yang dilakukannya hanyalah menambah beberapa bilangan bulat.

Menghapus baris kosong dari string multiline tidak masuk hitungan, kecuali jika output yang diharapkan dari string multiline itu seharusnya tidak berubah secara teknis (yaitu: jika Anda menghapus semua baris kosong yang cocok ^$).

Kebodohan ruang kosong juga tidak diizinkan; jangan lakukan hal-hal aneh dengan carriage return, tab, spasi, dll.

Naftuli Kay
sumber
11
Saya pikir Anda harus mengecualikan Whitespace.
nneonneo
17
Saya pikir Whitespace adalah " celah standar "
core1024
5
nneonneo berbicara tentang Whitespace , yang merupakan bahasa yang hanya menggunakan spasi sebagai sintaksnya.
Kyle Kanos
4
"fungsi tak terduga" adalah ungkapan yang sangat bagus.
Kaz
3
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena tantangan curang tidak lagi pada topik di situs ini. meta.codegolf.stackexchange.com/a/8326/20469
cat

Jawaban:

62

Javascript

Membuka sembulan peringatan dengan "Halo, Dunia!" jika ada baris kosong, jika tidak ada peringatan "0".

(function(){
    alert(~(arguments.callee+[]).indexOf('\n\n') && "Hello, World!");

})();

Demo

Penjelasan:

arguments.callee adalah referensi ke fungsi anonim yang dijalankan sendiri.

Menambahkan array kosong ( []) melemparkan fungsi ke string, yang memberi Anda kode sumbernya.

indexOfkembali -1jika string tidak ditemukan.

Melakukan operasi bitwise not ( ~) menghasilkan -1diubah menjadi 0, yang merupakan nilai falsey.

nderscore
sumber
2
Tipuan apa ini ?!
Kroltan
1
arguments.calleeberisi sumber fungsi.
Matius
2
Perhatikan bahwa ini tidak lagi berfungsi dalam mode ketat (yang sebagian besar kode modern akan gunakan). Mode ketat melarang penggunaan arguments.callee.
Daniel Lo Nigro
1
@ Michael: Tidak, spec tidak mengatakan apa-apa tentang format yang tepat. Bahkan , ada mesin yang berjalan di sekitar yang tidak mempertahankan ruang putih.
Bergi
2
@DanielLoNigro Anda hanya bisa memberikan fungsi ekspresi nama dan menggunakannya arguments.callee. Bahkan membuatnya lebih pendek.
kucing
42

C

Program 8 bola ajaib ini akan tetap bekerja tanpa garis kosong, tetapi akan sedikit lebih menentukan - tidak ada jawaban netral yang akan muncul di output.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
  int x, t;
  char *quotes[] = {
        // Positive :-)
        "It is certain", "It is decidedly so", "Without a doubt", "Yes definitely", "You may rely on it",
        "As I see it, yes", "Most likely", "Outlook good", "Yes", "Signs point to yes",
        // Indifferent :-\

        "Reply hazy try again", "Ask again later", "Better not tell you now", "Cannot predict now", "Concentrate and ask again",
        // Negative :-(
        "Don't count on it", "My reply is no", "My sources say no", "Outlook not so good", "Very doubtful" };
  srandom(time(NULL)); // Initialize random number generator
  x = random() % (sizeof(quotes) / sizeof(char*)); // Choose a random outcome
  printf("The Magic Eight Ball says...\n%s\n",quotes[x]);
  return 0;
}

Penjelasan

Ketika parser C melihat garis miring terbalik diikuti oleh karakter baris baru, ia mengabaikan keduanya dan memperlakukan baris kedua sebagai kelanjutan dari baris pertama. Tanpa baris kosong, jawaban "acuh tak acuh" semua akan diperlakukan sebagai bagian dari komentar sebelumnya.

lubang keras melengking
sumber
51
Saya memberi +1, tetapi melihat komentar C yang diakhiri dengan garis miring terbalik mulai menjadi celah standar, IMO.
Tim S.
2
Itu adalah referensi untuk posting "celah standar" ini , jadi mungkin tidak secara harfiah "celah".
Tim S.
5
@TIM. jika Anda bosan dengan "solusi" ini, mengapa Anda merasa sedih?
John Dvorak
8
Jawaban backslash-the-next-line-to-a-comment (trigraph atau tidak trigraph) membuat saya berharap saya punya reputasi. Saya terus melihat mereka dan mereka mulai sangat berulang, benar-benar tembus pandang, dan tidak lagi pintar atau lucu. (Yang disayangkan bagi mereka yang menggunakannya, seperti mual di sini, karena mereka sama sekali tidak pantas marah dan kadang-kadang sama sekali tidak menyadari hal ini - tetapi triknya adalah menghasilkannya.)
doppelgreener
4
@Jan mulai menjadi standar tidak sama dengan standar panjang / berlebihan ... penggunaannya cukup pintar di sini, tidak terlihat tidak pada tempatnya (tidak seperti beberapa yang pernah saya lihat, yang entah kenapa memiliki karakter di akhir komentar, atau akhiri komentar mereka dengan karakter awal komentar untuk melakukan sesuatu yang tidak biasa). Jadi: Saya memilih solusinya, bukan terus menggunakan triknya.
Tim S.
37

Befunge-93

v
&
&
+
#

.
@

Program befunge pertama saya :)

Bunyinya dua angka dari input dan mencetak jumlahnya. Jika Anda menghapus baris kosong, itu tidak akan mencetak apa pun.

Penjelasan:

vmenetapkan arah ke bawah untuk mengeksekusi kode
&membaca integer
+menambahkan angka bersama-sama
#melompati perintah selanjutnya
.mencetak integer dari tumpukan
@berakhir program

Seperti yang tertulis, #lompati baris kosong dan ikuti .. Beli ketika Anda menghapus garis kosong, .dilewati.

Tampaknya ada juru bahasa yang bagus di http://befunge.aurlien.net/

aditsu
sumber
Ah, yang pintar.
seequ
1
Befunge 98 juga melakukan ini. Pemikiran yang bagus. Dan penerjemah ini memiliki beberapa manfaat (saya belum banyak menggunakan milik Anda, jadi saya tidak tahu manfaatnya).
Justin
32

Ruby / Shell

​​​​​​
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#!   The Amazing Integer Adder             !
#! Adds 1 and 1, and displays the result   !
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

p 1+1

Berfungsi dengan baik jika baris baru di atas, jika tidak, baris komentar pertama ditafsirkan oleh shell sebagai shebang cacat.

histokrat
sumber
3
Tidakkah ini selalu berhasil atau selalu tidak berhasil? Misalnya, jika Anda menjalankannya sebagai ruby youranswer.rb, itu tidak akan mencari shebang karena sudah dijalankan di interpreter ruby, tetapi jika Anda menjalankannya sebagai ./youranswer.rbtidak akan berjalan sama sekali karena tidak ada shebang ..
Masukkan kembali Monica
6
Setidaknya dengan ruby ​​saya, shebang dihormati bahkan jika Anda menjalankannya ruby youranswer.rb, yang dapat berguna untuk mengatur switch baris perintah yang diperlukan dalam file. Jadi tanpa baris baru yang saya dapatkanruby: no Ruby script found in input (LoadError)
histokrat
29

Scala

case class IntWrapper(i: Int)

{
  val answer = (IntWrapper(0) /: (1 to 100)){(x, y) => IntWrapper(x.i + y)} // Add up ints
  println(s"Sum of wrapped integers is $answer")
}

Jika Anda menghapus garis kosong, tidak ada output yang akan dicetak. Yang terbaik, karena tumpukan Anda akan meluap jika Anda benar-benar menelepon IntWrapper.

Ini adalah kasus sudut inferensi titik koma Scala. Biasanya baris baru mendapatkan titik koma setiap kali kode yang dihasilkan akan valid. Namun, para pengembang Scala tidak ingin memaksa orang untuk menggunakan tanda kurung Mesir , jadi itu sah untuk menempatkan tanda kurung untuk definisi kelas pada baris segera setelah - tidak ada tanda titik koma ditambahkan, meskipun orang bisa. Namun, sebuah baris kosong mencabut tanda kurung dari definisi kelas. Dengan baris kosong dihapus, kode berubah dari menjadi definisi kelas dan blok, ke definisi kelas dengan konstruktor - dan konstruktor rekursif pada saat itu!

James_pic
sumber
6
Sangat baik dari mereka untuk tidak memaksa Kurung Mesir. Tapi kesimpulan titik koma adalah ide yang buruk, menurut saya.
Almo
Inferensi titik koma mendapat nama yang buruk, sebagian besar karena JavaScript. Ini sedikit kurang menyakitkan jika Anda mendesain bahasa dengan mengingatnya (tidak ada yang mengeluh tentang hal itu dengan Python, misalnya). Sayangnya Scala menyertakan beberapa fitur yang tidak cocok dengan inferensi titik koma. Ada ini, dan operator postfix (yang saya tergoda untuk digunakan dalam jawaban saya, tapi agak ketinggalan jaman).
James_pic
2
@ James_pic: AFAIK tidak ada yang mengeluh tentang hal itu di Python karena tidak ada di Python. Dalam JS, titik koma adalah bagian penting dari sintaksis, dan dapat dimasukkan (disimpulkan) pada titik-titik tertentu. Dalam Python, titik koma bukan bagian penting dari sintaks, tetapi dapat digunakan secara opsional. Itu perbedaan besar.
Mason Wheeler
Ini mungkin tampak seperti perbedaan besar, tetapi jika Scala menghapus beberapa fitur, yang saat ini membuat batas pernyataan ambigu, itu akan berpindah dari sisi pagar JavaScript ke Python.
James_pic
1
@James_pic: Apa yang membuat python berbeda adalah bahwa ada baris baru yang mengakhiri pernyataan kecuali lolos atau di dalam segala jenis braket. Artinya tidak ada aturan lengkap / tidak lengkap.
Jan Hudec
27

GolfScript

~{.@\%:

}do;

Menghitung GCD dari dua bilangan bulat bukan nol. Menghapus garis kosong akan merusak program.

Cobalah online.

Bagaimana itu bekerja

Ini adalah implementasi GolfScript dari algoritma Euclidean:

      # STACK: "15 24"
~     # Interpret the input string.
{     # STACK: 15 24
  .@  # Duplicate the topmost integer and rotate the other on top of both copies.
      # STACK: 24 24 15
  \   # Swap the topmost integers.
      # STACK: 24 15 24
  %   # Calculate the modulus.
      # STACK: 24 15
}do   # If the modulus is non-zero, repeat the loop.
;     # Discard the last modulus.

Hanya ada satu masalah kecil:

{}domuncul modulus dari stack untuk memeriksa apakah itu benar, sehingga harus diduplikasi pada akhir loop. Ini biasanya dilakukan oleh. , tetapi :\n\nmemiliki efek yang sama: Ini menyimpan item tumpukan paling atas dalam variabel LF ( :\n), kemudian mendorong konten dari variabel itu.

Dennis
sumber
7
Wow, bahkan itu variabel? : O
aditsu
@aditsu: Hanya #, {dan }tidak dapat digunakan sebagai nama variabel, karena mereka adalah bagian dari sintaks. Setiap token lainnya baik-baik saja, termasuk string.
Dennis
@ Dennis wow. String bahkan TIL dapat digunakan sebagai variabel. Apakah itu berguna untuk apa pun?
John Dvorak
@JanDvorak: Selain dari beberapa kasus tepi (kode palindrom, kode curang , mungkin tidak. Saya pikir ini hanya efek samping ( didokumentasikan ) tentang bagaimana penerjemah GolfScript membagi kode menjadi token.
Dennis
@ Dennis apakah itu berarti .:-1menyimpan input ke -1, bukan tanda minus itu sendiri? Hmm ...
John Dvorak
23

Sintaks Templat MediaWiki

Tentukan Templat: Foo as

{{{a

b|Uh-oh!}}}

Di halaman lain,

{{Foo|a

b=Works!}}  <!-- outputs "Works!" -->

{{Foo|a


b=Works!}}  <!-- outputs "Uh-oh!" -->

{{Foo|a
b=Works!}}  <!-- outputs "Uh-oh!" -->

Di MediaWiki, nama parameter dapat berisi baris baru.

Ypnypn
sumber
1
Bagus, ini sesuai dengan apa yang saya cari, kasus tepi aneh seperti ini.
Naftuli Kay
16

LaTeX (backref)

Kode LaTeX berikut menggunakan kutipan dan kutipan berisi daftar halaman, di mana entri tersebut dikutip. Ini dia halaman pertama. Paket hyperrefjuga menambahkan tautan PDF, referensi halaman belakang berwarna merah, tautan kutipan berwarna hijau.

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.

\end{thebibliography}
\end{document}

Hasil

Tetapi LaTeX tidak memerlukan baris kosong, baris kosong terlihat berlebihan dan contohnya masih akan bekerja tanpanya hyperrefdan baris kosong:

\documentclass{article}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

Hasil tanpa hyperref

Namun tautan dan referensi kembali hilang, jadi kami masukkan kembali:

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

Tetapi sekarang contohnya rusak dan tidak dapat dikompilasi lagi:

Runaway argument?
 Donald E. Knuth: \textit {The \TeX book}; Addison Wesley, 1984. \end \ETC.
! File ended while scanning use of \BR@@bibitem.
<inserted text> 
                \par 
<*> knuth

?

Apa yang terjadi? Paket hyperref(atau paket yang lebih tepat backref, yang diambil oleh hyperref) ingin mendapatkan di akhir entri bibliografi untuk menambahkan daftar referensi kembali. Tetapi sintaks di LaTeX hanya menyediakan awal entri dengan \bibitem, akhirnya bisa di mana saja. Dalam paket darurat ini backreftelah ditambahkan batasan yang \bibitemharus mengakhiri entri dengan garis kosong. Kemudian paket tersebut dapat didefinisikan ulang \bibitemuntuk menempatkan referensi kembali di akhir entri.

Karena baris kosong tidak ada, TeX terus mencarinya, tetapi malah menemukan akhir file dan mengeluarkan pesan kesalahan.

Heiko Oberdiek
sumber
12

C (semi-dikaburkan)

Program kecil ini mengambil nomor pada baris perintah dan menghitung faktorialnya. Namun, ini juga berisi fungsionalitas mutakhir AI untuk verifikasi runtime yang diikuti oleh standar pengkodean perusahaan, termasuk penggunaan spasi kosong dan baris kosong yang benar. Menghapus baris kosong akan memicu algoritme untuk menolak program yang tidak terpelihara dengan baik.

Tidak ada garis lanjutan atau trigraph di mana pun. Saya percaya itu adalah ANSI C99 yang valid.

Karena matematika canggih yang terlibat, jika Anda kompilasi dengan gcc, ingatlah untuk menggunakan -lm.

#include <setjmp.h>
#include <stdio.h>
#define max(x,y) ((x<y?y:x))
#define swap(x,y) ((x^=y,y^=x,x^=y))
#include <stdlib.h>
#include <math.h>
#define vfry(x,p,z,y,i) (!!y&((z##z##L##I##p##x##z##z)))
#define NDEBUG

/* 
 * Proper use of whitespace is essential!
 * Please do not remove any blank lines.
 */

const double E = 2.71828182845904523536;

int vrfy(double epsilon, int magic, const char *key, long int L) {
  /* You are not expected to understand this */
  double x=284.2891,u=2.34e56;
  while (rand()+magic*pow(epsilon,sin(x-E))!=log(u*L))
    x*=vrfy(1.0/epsilon,(int)u,&key[swap(L,magic)],L++);
  return u/lgamma(x);
}

int main(int argc, char *argv[]) {
  int N_=831293812; /* do not change, see Knuth 1987 */
  if (!vfry(E, N,_, "M=&;VT=I!9", 0xfe86ddcaL)) {
    fprintf(stderr, "Code standards violation detected!\n");
    abort();
  }
  if (argc < 2) {
    fprintf(stderr, "Usage: %s n\nComputes n!\n", argv[0]);
    exit(1);
  }
  int m=1, n=atoi(argv[1]), i;
  for (i=1; i <= n; i++)
    m *= i;
  printf("%d! = %d\n", n, m);
  return 0;
}

Spoiler

Fungsi rumit vrfytidak pernah disebut, melainkan vfrymakro yang tampak lucu . Penggunaan fitur penggabungan string preprocessor menyembunyikan fakta bahwa kita benar-benar hanya memeriksa paritas __LINE__.

Nate Eldredge
sumber
Juga bekerja dengantcc -run
Vi.
Ini sangat rapi. Itu vfrytidak diperluas dalam definisi fungsi yang benar-benar membuat saya bingung.
FUZxxl
11

C

Program ini berfungsi seperti yang diharapkan (seperti yang dijelaskan dalam komentar) kecuali baris kosong sebelumnya foo = 5;dihapus.

Sayangnya, saya mengalami kesalahan hampir persis seperti ini dalam kode produksi sekali.

#include <stdio.h>

int main()
{
    int foo = 0;

    #define FROB(x) do {                                            \
        x++;                                                        \
        printf("%d\n", x);                                          \
    } while (0);                                                    \

    foo = 5;
    FROB(foo); /* prints 6 */
    FROB(foo); /* prints 7 */
    FROB(foo); /* prints 8 */

    return 0;
}

Contoh ini menggunakan do { ... } while (0)idiom untuk membuat pernyataan multiline dalam makro (lihat https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for ). Ini juga menggunakan karakter backslash untuk menyebarkan #definelebih dari beberapa baris, mudah berbaris jauh dari pandangan. Namun, itu juga melakukan dua hal yang salah:

  • Ada titik koma setelahnya while (0), sedangkan idiom biasanya menghilangkan ini
  • Ada garis miring terbalik setelah baris terakhir #define

Dengan ini di tempat, menghapus baris kosong sebelum foo = 5;penyebab yang tugas akan dieksekusi setelah itu printf, tetapi juga setelah setiap doa dari FROBmakro. Akibatnya, output setelah menghapus baris kosong adalah:

1
6
6
Greg Hewgill
sumber
1
Pada dasarnya duplikat codegolf.stackexchange.com/a/31662/20356
seequ
@ TheRare Tapi itu kurang jelas.
Ypnypn
6
Ini hanya kurang jelas jika Anda tidak melihat backslash yang melayang sangat mencolok ke kanan. (Tapi karena mereka melayang di sana dengan sangat mencolok ke kanan, mereka akan melihatnya.)
doppelgreener
3
Namun, semua kecuali satu dari mereka dibenarkan
QuadmasterXLII
6
@ QuadmasterXLII, secara teknis, mereka semua dibenarkan - benar, tepat.
Tandai
9

C / C ++

int main(){

    return __LINE__ - 3;
}

Mengembalikan kesuksesan dan dapat digunakan sebagai implementasi untuk true . Jika baris kosong dihapus, Anda dapat menggunakannya sebagai implementasi untuk false .

nwp
sumber
8

PowerShell

Fungsi ini akan menambah dua angka.

function add ($a, $b) {
    $numbers = @($a `

            $b)
        $numbers| measure -sum| select -expand sum
}

Menghapus baris kosong akan menyebabkan fungsi gagal dengan: Unexpected token '$b' in expression or statement.

Penjelasan

Elemen array dapat dipisahkan oleh baris baru dan / atau koma. Menempatkan karakter kelanjutan garis ( `) setelah $amemerlukan baris baru ekstra untuk memisahkan $adan $b. Kalau tidak, penerjemah melihat kode sebagai $numbers = @($a $b)(tidak ada elemen pemisah).

Rynant
sumber
7

TeX

\noindent\everypar{$\bullet$ hello }

world
\bye

Tanpa baris kosong, "halo" tidak akan dicetak.

Penjelasan

TeX memperlakukan baris kosong sebagai istirahat paragraf, dan \everypardieksekusi pada awal paragraf baru.

Stephan Lehmke
sumber
6

Jawa

import java.util.Scanner;

public class BlankLine
{
    public static void main( String[] args )
    {
        //This calculates 2^ given number
        //if you remove blank line after the next line it will always print 1
        int x = new Throwable().getStackTrace()[0].getLineNumber();

        int y = new Throwable().getStackTrace()[0].getLineNumber() - x;
        System.out.println("Number:");
        Scanner scanner = new Scanner(System.in);
        int r = 1;
        int n = scanner.nextInt();

        for(int i = 0; i < n; i++){
            r *= y;
        }
        System.out.println("2^number: "+r);
    }
}

x adalah nomor baris saat ini, y adalah nomor baris saat ini - x. Jika ada garis kosong di antara keduanya, hasilnya adalah 2. Jadi kodenya menghitung 2 ^ angka.

barteks2x
sumber
1
Memberi +1 hanya karena Java, meskipun sebagai pengunjung yang sering mengunjungi Peninjauan Kode, saya ingin tahu mengapa Anda tidak menggunakannya Math.pow?
Simon Forsberg
Karena kode saya harus melakukan sesuatu. Menambahkan 2 angka agak terlalu sederhana.
barteks2x
Menggunakan Math.powdan mencetak hasilnya juga melakukan sesuatu bukan?
Simon Forsberg
Dan sekarang saya menyadari bahwa saya benar-benar dapat menggunakan. Ny. Pow. Saya tidak tahu mengapa saya pikir saya perlu melakukannya dengan cara itu ... Matbe saya ingin melakukannya dengan cara yang lebih "licik".
barteks2x
7
Anda terlalu banyak bermain golf. Anda harus mengunjungi Peninjauan Kode di tempat kami melakukan hal yang benar!
Simon Forsberg
6

Perl 5

print(<<""
Hello, World!

);

Kode ini dicetak Hello, World!. Menghapus baris kosong malah memberikan kesalahan sintaksis.

Penjelasan:

Sintaks di sini-doc Perl string multi-line memungkinkan string terminator kosong. Itu bahkan secara eksplisit didokumentasikan. Menghapus baris kosong menyebabkan tanda kurung tutup (dan segala sesuatu yang lain hingga baris kosong berikutnya, jika ada) ditafsirkan sebagai bagian dari string, menyebabkan kesalahan sintaksis.

Pesan kesalahan yang Anda dapatkan sebenarnya cukup baik, untuk fitur sintaks yang aneh. Jika tidak ada baris kosong sama sekali dalam program setelahprint(<<"" baris, Perl hanya mengatakan:

Tidak dapat menemukan terminator string "" di mana pun sebelum EOF di foo.pl baris 1.

Jika ada yang sebuah baris kosong di akhir program, Anda mendapatkan sesuatu seperti ini sebagai gantinya:

kesalahan sintaks di foo.pl baris 4, di EOF
  (Mungkin menjadi multi-jalur pelarian << string yang dimulai pada baris 1)
Eksekusi foo.pl dibatalkan karena kesalahan kompilasi.

Ilmari Karonen
sumber
5

Batch

@echo off
setLocal enableDelayedExpansion
set NL=^


echo Hello!NL!World

Kode ini akan menampilkan Hellodan di baris berikutnya World. Ketika salah satu atau kedua baris kosong dihapus, tidak menghasilkan apa-apa sama sekali.

Ada penjelasan di sini .

hapus clemeat
sumber
4

Rubi

Penghapusan baris pertama akan menyebabkan kesalahan:

line = IO.readlines($0).first.chomp if line.empty? puts 34+4 else raise "Please add a newline at the beginning of the program." end
Mhmd
sumber
2
Saya suka pesan kesalahan. Ingin melihat reaksi seseorang yang mencoba menjalankan program dan mendapatkan respons itu.
mulai
4

Python

Tidak tahu apakah ini termasuk dalam celah standar, saya melihat daftar itu dan tidak melihat ini.

src = open(__file__, 'r')
code = src.readlines()
src.close()

if code[3] == '\n':
    print 'Hello World!'

Menjalankan ini secara teratur kembali

Hello World!

Menjalankannya tanpa baris kosong pada baris 4, yaitu seperti di bawah ini:

src = open(
__file__, 'r')
code = src.readlines()
src.close()
if code[3] == '\n':
    print 'Hello World!'

tidak mengembalikan apa pun.

Zaxvo
sumber
3

Python 2.x

Program ini menghasilkan karakter kelima dari string yang dimasukkan.

import inspect

text = raw_input()
print 'Fifth character of the string:', text[inspect.getlineno(inspect.currentframe())]

Ini sama sekali tidak tersembunyi. Jika Anda menghapus baris kosong, itu memberi karakter keempat dan keenam jika Anda menambahkan satu.

seequ
sumber
3

Tcl

Fungsi yang menambahkan dua angka (dan memeriksa apakah baris baru telah dihapus):

proc add {a b} {
    if {[llength [split [info body add] \n]] < 5} {error "function has been modified"}

    return [expr $a+$b]
}

Tidak ada yang disembunyikan di sini, ia melakukan apa yang dikatakannya, jadi saya tidak membuat spoilerisasi penjelasannya. Fungsinya infoadalah pisau introspeksi tentara swiss (apa bahasa lain menyebut refleksi). info bodymengembalikan kode sumber suatu fungsi (jika tidak ditulis dalam C atau assembly).

Saya harus mengakui bahwa ini membuat saya bingung sampai saya melihat solusi javascript.

Slebetman
sumber
3

C

#include <stdio.h>


int main() {
    const char* a = "You love blank lines.";
    #define print_out(a) \

    printf("%s\n", a);
    a = "You don't seem to love blank lines";
    print_out(a);
    return 0;
}

Dengan baris kosong, aadalah variabel lokal a dan tanpa itu parameter makro ...

urzeit
sumber
3

Secara teknis bukan masalah "kode", tetapi masalah server. Jika ini dikirim ke Apache dari skrip CGI (yang dapat dihasilkan dengan bahasa apa pun yang Anda suka), itu akan mengirim respons HTTP ke klien:

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8

Hello world!

Di sisi lain, ini akan gagal karena tidak ada ruang kosong setelah header.

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8
Hello world!
cwallenpoole
sumber
2

JavaScript

Fungsi whereamimerespons dengan posisi saluran panggilan, relatif terhadap posisinya sendiri dalam kode sumber.

console.log (whereami ()) //3 line(s)  before me 


function whereami () {
    var a=function a(e){try{to}catch(c){for(var d=c.stack.split("\n"),b=0;b<d.length&&!~d[b].indexOf("a");b++);return c.stack.split("\n")[b+~~e].match(/:(\d+)/)[1]-~~window.hasOwnProperty("__commandLineAPI")}},a1=a(1),i


    i= a(2)>a(1)+4?a(1):a(1)>a1+2?a1-1:a/a1



    return ((i=(a(2)<i?i-1:a(1)>i+3?a(2)-a(1)-1:a/1)) + " line(s) "   ) + (i<a(2)?" after":(i>=a(2)?" before":"confusing")) + " me";
}


console.log (whereami ()) //3 line(s)  after me

Jika ada baris kosong dalam whereamifungsi dihapus. Outputnya adalah NaN line(s) confusing me. (Menambahkan garis tidak merusaknya)

Sebenarnya hanya menghitung berapa banyak baris antara idan baris pertama dan terakhir masing-masing. Jika mereka berada di bawah nilai yang diberikan. Garis referensi diatur ke NaNyang tidak memuaskan NaN<callingLinejuga NaN>=callingLine. Saya mencoba menyembunyikannya sedikit dalam ekspresi ternary yang tidak dapat dibaca.

C5H8NNaO4
sumber
1
Keren. Saya tidak pernah berpikir untuk menggunakan tumpukan pengecualian seperti itu.
nderscore
2

Perl

#!/usr/bin/perl

use strict;
use warnings;

open IN, "<".$0 or die "Did not find input files!";
while (<IN>) {
        m/blabla/ && ((<IN> =~ /\}/ && print "tra-la-la...\n") || print "ti-ri-li\n");

}
close IN;

Skrip perl ini akan membaca file skrip dan memeriksa apakah setelah baris yang berisi "blabla" ada braket penutup.

urzeit
sumber
2

Eskrip

Karena bug dalam escriptimplementasi, eskrip yang valid harus memiliki panjang setidaknya tiga baris dan baris pertama harus berupa baris shebang atau baris kosong. Jadi skrip berikut harus memiliki dua baris kosong di mana yang pertama harus yang pertama:

main(_) -> io:format("Hello world!~n", []), halt().

Atau harus rusak dalam dua baris tetapi masih harus memiliki garis kosong pertama.

main(_) ->
    io:format("Hello world!~n", []), halt().

Kalau tidak, Anda akan mendapatkan

escript: Premature end of file reached
Hynek -Pichi- Vychodil
sumber
2

Rubi

print %q
2+2=

p(2+2)

Mencetak 2+2=4, tetapi memberikan kesalahan sintaksis tanpa baris ketiga kosong. %qmemungkinkan setiap karakter non-kata berfungsi sebagai pembatas string, bahkan karakter baris baru. Jadi tiga baris pertama kode sebenarnya setara dengan print %q"2+2=", atau adil print "2+2=". Karena baris baru setelah 2+2=digunakan sebagai pembatas kutipan, itu juga tidak diuraikan sebagai pembatas baris , jadi Anda perlu yang lain segera setelah itu.

histokrat
sumber
1

Insomnia (kedua versi)!

Þyoo

â

Kode ini mencetak ~ (jangan tanya kenapa, susah tidur itu aneh). Jika Anda menghapus garis kosong, itu mencetak a sebagai gantinya.

Ngomong-ngomong surat pertama itu adalah duri .

pppery
sumber
1
Hore, duri! Belum pernah melihat karakter itu di usia, +1.
Addison Crump
0

C ++

Ini adalah trik klasik dan agak bodoh. Anda akan tahu apa itu ketika Anda melihatnya, ini hanya ada di sini demi penyelesaian. Karena itu, saya menandai ini sebagai jawaban wiki komunitas.

int main() {
    //This program won't work without the next line, why??/

    return 1;
}

Mengapa ini berhasil?

CrazyM4n
sumber
13
Ini sebenarnya salah satu celahnya.
Mhmd
@Mhmd saya tidak sadar. Either way, saya tahu orang selalu menggunakan ini dalam pertanyaan semacam ini, dan saya hanya ingin meninggalkan ini di sini supaya seseorang tidak merasa pintar untuk melakukan ini.
Aearnus
1
Jawaban ini salah karena dua alasan. Yang pertama ??/artinya \​, ??//artinya \/, dan karena garis tidak berakhir \​, tidak ada kelanjutan garis. Yang kedua adalah bahwa perilaku itu persis sama terlepas dari apakah return 0;dieksekusi, karena itu adalah perilaku standar ketika eksekusi mainmencapai penutupan }.
hvd
@ hvd Di sana. Aku telah memperbaikinya.
Aearnus
3
@ra, I know people always use this in these kinds of questionitulah sebabnya kami menjadikannya celah standar
undergroundmonorail
0

Tempel ini ke file html, dan buka di browser Anda. Ini cukup sederhana, tetapi sedikit rumit karena dibutuhkan jumlah baris kosong dalam dokumen dan membuat indeks array untuk memanggil fungsi yang menunjukkan peringatan.

<body>
<script>
[null, function(){alert("GIVE ME MY LINE BACK")}, function(){alert("2 + 2 = " + (2+2))}][document.body.innerHTML.split("\n\n").length]()

</script>
</body>

Yang ini melanggar aturan batas. Secara teknis JavaScript tidak memiliki string multiline, yang merupakan satu-satunya alasan ini berfungsi.

Karena Anda dapat memiliki kesalahan sintaksis dalam satu tag skrip tanpa mengganggu tag skrip lainnya, ini menunjukkan hasil positif hanya jika ada kesalahan pada halaman. Kesalahan mencegah peringatan kedua agar tidak menyala karena ada di tag skrip yang sama.

<body>
<script>
window.onerror=function(){
  alert("2 + 2 = " + (2+2));
}
</script>
<script>
var a = "\

";
alert("GIVE ME MY LINE BACK!");
</script>
</body>
Perampok
sumber
0

Rubi

puts (% #{ARGV[0].to_i + ARGV[1].to_i}

)

Rahasianya adalah baris baru, benar-benar tab, kemudian baris baru. Saya tidak tahu apakah ini penting tetapi saya pikir itu golok. Karakter setelah %tab juga merupakan tab, tetapi karena alasan tertentu tidak muncul seperti tab. Saya menggunakan notasi persen Ruby untuk membuat string, yang menambahkan 2 argumen pertama yang diteruskan ke skrip. Ada lebih banyak tentang itu di sini: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/

addison
sumber
Sebenarnya tidak masuk hitungan, baca instruksi: "Tidak ada kebodohan." Tepatnya, seseorang \nharus hadir dan harus penting agar program berjalan seperti yang diharapkan.
Naftuli Kay
Ah ok :( baik saya mencoba
addison
1
Saya pikir Anda dapat memperbaikinya, meskipun: baris baru itu sendiri dapat menjadi pembatas persen.
histokrat