Apa saja program dan persamaan satu-liner atau dua-liner yang terkenal? [Tutup]


22

Saya sedang bereksperimen dengan platform baru dan saya mencoba untuk menulis sebuah program yang berkaitan dengan string yang tidak lebih dari 60 karakter dan saya ingin mengisi penyimpanan data dengan beberapa potongan kode yang terkenal atau terkenal. persamaan, karena pemrograman dan matematika sejalan dengan tema perangkat lunak saya. Kode dapat dalam bahasa apa pun dan persamaan dari disiplin matematika apa pun, asalkan panjangnya kurang dari total 60 karakter. Saya curiga ada orang yang akan melakukan brainfuck untuk yang ini.

Sebagai contoh,

#include<stdio.h>
int main(){printf ("Hi World\n");return 0;}

60 karakter tepatnya!

Terima kasih banyak atas kebijaksanaan Anda!


22
Mengapa brainf k disensor? Tidak bisakah kita menjadi orang dewasa dan tidak memberi tahu semua orang apa yang bisa dan tidak bisa mereka baca? Dalam konteks ini brainf k bukanlah kecabulan.
ChaosPandion

2
Saya menduga pertanyaan ini akan ditutup. Coba tingkatkan untuk menjadi lebih konstruktif. Lihat: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@ Bigown: Ini adalah subyektif yang baik dan konstruktif. Tidak ada bedanya dengan meminta kutipan terkenal. Sebenarnya, ini lebih baik, karena meminta kode / persamaan "kutipan" yang terkenal. :-)
Macneil

@ Macneil: Saya pikir sama, tapi pertanyaannya buruk, bisa diperbaiki.
Maniero

3
@ Bigown: jujur, saya benar-benar tidak bisa melihat bagaimana pertanyaan ini bisa lebih konstruktif. Bukan untuk meragukan Anda atau lebih, tetapi dengan sangat tulus bertanya, dapatkah Anda menyarankan peningkatan ke @BeachRunnerJoe? Saya sebenarnya sangat menikmati jawaban dan belajar banyak dari mereka. Saya ingin melihat pertanyaan ini dibuka kembali.
Joris Meys

Jawaban:


34

Rutin menyalin string C klasik diketahui oleh semakin sedikit orang tesis hari:

while (*d++ = *s++);

3
ya, sangat terkenal ... untuk para veteran!
BeachRunnerJoe

13
Sementara saya mengerti itu memiliki nilai "historis" itu kode mengerikan yang mengerikan, sehingga fakta bahwa itu tidak digunakan adalah hal yang baik =)
Thomas Bonini

9
Veteran AC akan segera mengenali polanya. Ini idiomatis C.
Barry Brown

6
Selalu berpikir ini sangat keren.
Maulrus

5
Saya harus mengatakan, saya setuju dengan @Kop. Hanya dalam beberapa karakter, ini menunjukkan kelemahan signifikan dari lib standar dan semantiknya. Salah satu hal yang paling absurd adalah string yang diakhiri 0 bukannya panjang-awalan (yang lebih aman dan membuat menentukan panjang string O (1)). Yang kedua adalah bahwa C tidak memiliki nilai boolean aktual (yang memperbaiki if (alarm = red) launchNukes();-trap). Dijkstra akan menganggap kode ini lebih dari berbahaya. Saya setuju bahwa sangat penting bagi seorang programmer C untuk setidaknya memahami kode ini, tetapi saya pikir lebih penting baginya untuk mengetahui bagaimana melakukannya dengan lebih baik.
back2dos

26

tidak satu baris, tapi saya menyajikan Bug C Terakhir di Dunia:

    status = GetRadarInfo();
    if (status = 1)
      LaunchNukes();

2
Itu salah satu dari "Oh sh * t!" kesalahan.
the Tin Man

3
it'sLaunchNukes();
hasen

1
jika itu telah ditulis sebagai: jika (GetRadarInfo () = 1) {...}, kami tidak akan mendapatkan bug ini karena tidak dikompilasi. Jadi jangan selalu mengenalkan variabel perantara.
tactoth

22

Saya melihat Conway's Game of Life di APL banyak beredar:

Bonus tambahan adalah ini akan memastikan Anda menangani unicode dengan benar.


2
Ha! itu hal pertama yang saya pikirkan ketika saya melihat kode Anda, bagus!
BeachRunnerJoe

Wow, itu mengesankan!
FinnNk


15
Dan saya pikir Perl tampak seperti garis kebisingan.
the Tin Man

1
@Greg, tunggu saja, APL menggunakan lebih dari huruf latin dan yunani karena tidak ada cukup huruf dan simbol; backspace (lebih tepat disebut "overstrike") juga digunakan karena beberapa karakter perlu diketik di atas karakter lain. Salah satunya adalah simbol bagi di atas kotak, yang mewakili inversi matriks (jika operator unary, atau penggandaan oleh matriks terbalik jika digunakan sebagai operator biner).
Tangurena

19

Versi modifikasi dari Perl one-liner terkenal:

/^.?$|^(..+?)\1+$/

Ekspresi reguler ini cocok dengan string yang panjangnya prima.

Versi aslinya adalah:

/^1?$|^(11+?)\1+$/

yang cocok dengan string yang terdiri dari bilangan prima 1s.


14

Quicksort:

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

Jika daftar kosong, hasil yang diurutkan adalah daftar kosong.

Jika daftar dimulai dengan elemen x, dan sisanya dari daftar adalah xs, maka hasil yang diurutkan adalah daftar yang terdiri dari daftar yang diurutkan yang terdiri dari semua elemen dalam x kurang dari x yang digabungkan dengan elemen x yang dipadukan dengan daftar yang diurutkan dari semua elemen dalam xs lebih besar dari x.

(atau dengan kata lain - bagi dalam dua tumpukan, semua kurang dari x dan semua lebih besar dari x, urutkan keduanya dan buat daftar dengan tumpukan yang kurang dari itu, elemen x, dan yang lebih besar dari tumpukan).

Mengalahkan dimengerti versi C cukup mudah.


1
Ini Standar ML? Atau Haskell?
Barry Brown

3
Haskell. Saya suka pola pikir bahasa.

Saya suka alternatif partisiqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins

1
Apakah ada versi ini yang menggunakan pivot acak dan bukan kepala daftar? Itu akan membuatnya lebih dekat dengan CAR asli Hoare.
Macneil

1
Hoare mengatakan "Item yang dipilih [sebagai elemen pivot] ... harus selalu merupakan item yang menempati lokasi paling tinggi dari segmen yang akan dipartisi. Jika dikhawatirkan hal ini akan memiliki hasil yang non-acak yang berbahaya, sebuah item yang dipilih secara acak pada awalnya harus ditempatkan di lokasi dengan alamat tertinggi ". Jadi jujur ​​pada Hoare, kita harus bekerja dengan elemen terakhir, bukan yang pertama.


13

Ketika saya pertama kali menemukan garpu bash, saya pikir itu benar-benar manis.

:(){ :|:& };:

Wow, itu jahat sekali!
Macneil

Lihatlah semua smilies! Anda bisa menyebutnya "Bom Smiley!"
Mark C


10

Karena Anda menyebutkan persamaan, ini termasuk dalam daftar Anda:

e^{i\pi}+1=0

( Wolfram Alpha render : ei pi + 1 = 0)


Ya itu! Bagus Euler, bagus lagi!
BeachRunnerJoe

Saya ingat ini sebagaie^{i/pi} = i^2
Josh K

@Josh K: Itu karena i² == -1, sehingga Anda dapat menyeimbangkan persamaan dengan mengurangi satu dari kedua sisi, menghapus +1dan mengubah =0ke -1atau
Daenyth

7

Cara mendeteksi angka genap:

x % 2 == 0

3
Atau !(x%2)dalam bahasa yang waras.
Christian Mann

8
Atau !(x & 1)dalam bahasa tanpa mengoptimalkan kompiler.
jfs

1
@Christian, angka seharusnya bukan boolean - terlalu mudah untuk membuat kesalahan.

7

import this dalam Python.


Sunting sebagai komentar tidak dapat berisi jeda baris: Bagi mereka yang tidak memiliki juru bahasa Python, ini adalah hasilnya

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Saya seorang pemula Python. Apa yang akan dicapai ini?
Richard

1
@ Richard: Coba tulis ini dalam interpreter interaktif Python :).
MAK

Ini mencerahkan hari Minggu sore saya :)
Richard

@Richard Pertanyaan serius: Jika Anda menjalankan ini, apakah itu memberi Anda stack overflow?
Mark C

6

Tidak cukup 2 baris tapi saya akan mengatakan ini cukup terkenal:

void swap(float* x, float* y)
{
    float t;
    t = *x;
    *x = *y;
    *y = t;
}

Sebenarnya beberapa bahasa dapat menggambarkannya dalam satu baris. Lua muncul dalam pikiran tetapi ada lebih banyak.

x, y = y, x

pasti terkenal!
BeachRunnerJoe

7
dengan ints: a ^ = b ^ = a ^ = b;
JulioC

Saya hanya ingin tahu bagaimana ini diterapkan? apakah itu membuat tabel sementara (y, x), lalu menetapkan x elemen 1 dan y elemen 2?
tactoth

Saya juga bertanya-tanya seberapa sering orang bertukar nilai dalam program kehidupan nyata.
tactoth

1
@tactoth - Swapping umumnya digunakan untuk menerapkan penugasan aman yang sangat pengecualian di C ++.
Kaz Dragon

6

Contoh kalkulus lambda favorit saya adalah kombinasi Y:

Y = λf.(λx.f (x x)) (λx.f (x x))

6

Dari latihan di K&R, berikut adalah fungsi yang akan mengembalikan berapa banyak bit yang diatur dalam angka yang diberikan. Pada 58 karakter:

int bits(int n){int b=0;while(n){n=n&(n-1);b++;}return b;}

Dibutuhkan waktu sebanding dengan jumlah bit yang ditetapkan. Bagian "ah ha" di sini adalah itu

n = n & (n - 1)

Menghapus bit set paling kanan dari n.


Referensi K&R yang mengagumkan dan menyenangkan!
BeachRunnerJoe

6

Segitiga Pascal Rekursif dalam Satu Baris (Haskell)

  r n=take(n+1)$iterate(\a->zipWith(+)(0:a)$a++[0])[1]

Lima puluh dua karakter, tambahkan spasi sesuai selera. Atas perkenan "Ephemient" dalam komentar di sini .

Saya pikir ini adalah contoh yang lebih baik daripada solusi samar dan singkat di J dan K (meskipun saya belum pengguna Haskell).


6

Roulette Unix (Bahaya!)

Atas perkenan Bigown di utas lelucon (dan komentar):

[ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo Click #Roulette

(Panjangnya 62 karakter, sehingga Anda dapat menghapus komentar (apakah akan berfungsi seperti itu?) Atau beberapa ruang yang tidak penting.)


2
Harap tandai ini sebagai berbahaya.
Chinmay Kanchi

Saya menggunakan zsh dan tidak berfungsi kecuali s / == / - eq / :-)
defhlt


4
DO 10 I=1.3

Ini adalah salah satu bug paling mahal dalam sejarah. Pernyataan Fortran ini memberikan nilai float 1,3 ke variabel bernama DO10I.

Kode yang benar - header pernyataan berulang berulang sampai pernyataan berlabel 10 dan variabel loop Imenerima nilai 1, 2, 3:

DO 10 I=1,3

1
Mengapa ini bug yang mahal?
Barry Brown

2
Bug ini berada di subrutin yang menghitung lintasan orbital untuk penerbangan luar angkasa Merkurius 1961. Namun, itu ditangkap dan diperbaiki sebelum diluncurkan, dan karenanya bukan bug yang mahal. Ada bug serupa pada misi Mariner yang memang menyebabkan kegagalan misi. (sumber: Pemrograman C Ahli , halaman 31-32.)
Darel

4

Perangkat Duff :

void send(short *to, short *from, int count)
{
    int n = (count +7 ) / 8;

    switch (count % 8) {
    case 0: do {    *to = *from++;
    case 7:         *to = *from++;
    case 6:         *to = *from++;
    case 5:         *to = *from++;
    case 4:         *to = *from++;
    case 3:         *to = *from++;
    case 2:         *to = *from++;
    case 1:         *to = *from++;
        } while(--n > 0);
    }
}

Tom Duff membuka porta yang dipetakan di memori menjadi salah satu konstruksi C paling aneh yang pernah ada di dunia.


Itu tidak masuk ke dalam 60 karakter, tetapi itu keren. Saya ingat merasa ngeri melihat namanya lewat di kredit ke beberapa film Pixar.
Macneil

2

Apa pun yang berkaitan dengan Hello World terlintas dalam pikiran. Anda bisa menggunakan variasi yang berbeda jika Anda berencana menyimpan banyak bahasa.

Untuk sesuatu yang lebih sepele, ada Fibbonacci .


1
Fibbonacci, bagus! Inilah kodenya ... jika (k <2) mengembalikan k; jika tidak kembalikan fib (k-1) + fib (k-2);
BeachRunnerJoe

1
@BeachRunnerJoe: Anda mungkin ingin menggabungkan itu dengan operator bersyarat;)
back2dos

3
ya memang! kembali (k <2)? k: fib (k-1) + fib (k-2);
BeachRunnerJoe

2
val (minors, adults) = people.partition(_.age < 18)

Baris di atas partisi kode Scala people(daftar Persons) menjadi dua daftar berdasarkan usia masing-masing.

Dibutuhkan banyak kode berikut untuk melakukan hal yang sama di Jawa:

List<Person> minors = new ArrayList<Person>();
List<Person> adults = new ArrayList<Person>();
for(Person p : people) {
  if(p.age < 18) {
    minors.add(p);
  } else {
    adults.add(p);
  }
}

2

Menukar nilai dua variabel tanpa menggunakan variabel ketiga. Ini adalah salah satu hal pertama dalam pemrograman yang saya diberitahu dan berpikir "Hmm ... itu keren"

int a,b; 
b=a-b;
a=a-b;
b=a+b;

Saya tahu Anda dapat melakukan ini menggunakan XORs, tapi ini sedikit nostalgia saya untuk hari ini :)
Jonathon

XOR tidak memiliki masalah dengan overflow. Melakukan hal ini?
Pekerjaan

2

Ilmu hitam dari John Carmack

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the ****?
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//  y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

    return y;
}

2

Jumlah terbesar yang dapat diwakili oleh 8 Byte (Python)

print '\n'.join("%i Byte = %i Bit = largest number: %i" % (j, j*8, 256**j-1) for j in (1 << i for i in xrange(8)))

1
  1. Operator bersyarat :

    minVal = (a <b)? a: b;

  2. Ganti kasing

  3. untuk-setiap loop [Jawa]


1
Sebenarnya, operator kondisional adalah nama yang benar. Operator ternary jika membutuhkan tiga argumen.
back2dos

@ back2dos - Memang, C # dan JavaScript menyebut ini operator bersyarat.
ChaosPandion

@ back2dos - The: operator? tidak mengambil tiga argumen, yang mengapa hal itu disebut operator ternary. Ini adalah terminologi yang benar dari C dan seterusnya. (rupanya mulai dari BCPL, menurut Wikipedia ...)
grkvlt

@ grkvlt: Saya tidak pernah mengatakan tidak butuh tiga argumen. Hanya saja Anda tidak akan memanggil !operator unary atau +operator biner. Itu tidak tepat.
back2dos

1
@ back2dos - Saya pikir ini adalah masalah kita - saya akan menyebut apel sebagai "buah" dalam situasi itu, tapi saya pikir kita sedang memperdebatkan tata bahasa, bukan sintaksis bahasa pemrograman, dan Anda benar bahwa itu ?:adalah operator bersyarat;)
grkvlt

1

Quine ini dari File Jargon di C:

char * f = "char * f =% c% s% c; main () {printf (f, 34, f, 34,10);}% c"; main () {printf (f, 34, f, 34,10);}

Ada juga versi LISP di sana juga, tetapi Anda dapat menemukan banyak lainnya melayang-layang, dalam hampir semua bahasa yang dapat Anda gambar ...


1

identitas euler yang menghubungkan angka-angka paling indah di alam semesta matematika: 1, 0, e, i dan π: e ^ i (π) + 1 = 0



1
int gcd(int a, int b)
{
   while(b>0)
   {
      int t = a%b;
      a=b;
      b=t;
   }
   return a;
}

Mungkin tidak terkenal, tetapi salah satu favorit saya. Bagi kebanyakan orang, tidak segera jelas mengapa itu berhasil.


1

Ini sedikit lebih dari 60 karakter tetapi sangat tergantung pada penamaan variabel (jadi saya termasuk itu!)

biarkan readLines (rdr: StreamReader) =
      seq {sementara tidak rdr.EndOfStream lakukan
                hasil rdr.ReadLine ()}

Fungsi kecil yang bagus untuk membaca file menjadi baris demi baris dalam F #.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.