Một số chương trình và phương trình một lớp lót hoặc hai lớp nổi tiếng là gì? [đóng cửa]


22

Tôi đang thử nghiệm một nền tảng mới và tôi đang cố gắng viết một chương trình liên quan đến các chuỗi không dài hơn 60 ký tự và tôi muốn đưa vào kho lưu trữ dữ liệu với một số đoạn mã nhỏ nổi tiếng hoặc nổi tiếng và phương trình, vì lập trình và toán học đi cùng với chủ đề của phần mềm của tôi. Mã này có thể bằng bất kỳ ngôn ngữ nào và các phương trình từ bất kỳ môn toán học nào, miễn là chúng có độ dài dưới 60 ký tự. Tôi nghi ngờ mọi người sẽ thoát ra khỏi một số Brainfuck cho thế này.

Ví dụ,

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

Chính xác là 60 ký tự!

Cảm ơn rất nhiều cho sự khôn ngoan của bạn!


22
Tại sao brainf k bị kiểm duyệt? Chúng ta không thể là người lớn và không nói cho mọi người biết những gì họ có thể và không thể đọc? Trong bối cảnh này brainf k không phải là một sự tục tĩu.
ChaosPandion

2
Tôi nghi ngờ câu hỏi này sẽ được đóng lại. Hãy cố gắng cải thiện nó để có tính xây dựng hơn. Xem: blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Maniero

8
@bigown: Đây là một chủ quan tốt và mang tính xây dựng. Nó không khác gì yêu cầu trích dẫn nổi tiếng. Trong thực tế, nó tốt hơn, bởi vì nó yêu cầu "trích dẫn" mã / phương trình nổi tiếng. :-)
Macneil

@Macneil: Tôi cũng nghĩ như vậy, nhưng câu hỏi rất kém, nó có thể được cải thiện.
Maniero

3
@bigown: thành thật mà nói, tôi thực sự không thể thấy câu hỏi này có thể mang tính xây dựng hơn thế nào. Không nghi ngờ bạn hoặc như vậy, nhưng rất thắc mắc, bạn có thể đề xuất một cải tiến cho @BeachRunnerJoe? Tôi thực sự rất thích câu trả lời và học được rất nhiều từ họ. Tôi muốn thấy câu hỏi này mở lại.
Joris Meys

Câu trả lời:


34

Thói quen sao chép chuỗi C cổ điển được biết đến bởi ngày càng ít người hơn trong các ngày:

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

3
vâng, rất nổi tiếng ... với các cựu chiến binh!
BeachRunnerJoe

13
Mặc dù tôi hiểu rằng nó có giá trị "lịch sử", đó là mã khủng khiếp khủng khiếp, vì vậy thực tế là nó không được sử dụng là một điều tốt =)
Thomas Bonini

9
Cựu chiến binh AC sẽ nhận ra mô hình ngay lập tức. Đó là thành ngữ C.
Barry Brown

6
Luôn luôn nghĩ rằng điều này là vô cùng mát mẻ.
Maulrus

5
Tôi phải nói rằng, tôi đồng ý với @Kop. Chỉ trong một vài ký tự, nó cho thấy những sai sót đáng kể của lib tiêu chuẩn và ngữ nghĩa của nó. Một trong những điều vô lý nhất là các chuỗi bị chấm dứt 0 thay vì tiền tố có độ dài (an toàn hơn và giúp xác định độ dài của chuỗi O (1)). Điều thứ hai là C không có giá trị boolean thực tế (sửa lỗi if (alarm = red) launchNukes();-trap). Dijkstra sẽ xem xét mã này nhiều hơn có hại. Tôi đồng ý rằng bắt buộc một lập trình viên C ít nhất phải hiểu mã này, nhưng tôi nghĩ điều quan trọng hơn đối với anh ta là làm thế nào để làm điều đó tốt hơn.
back2dos

26

không phải một dòng, nhưng tôi trình bày Lỗi C cuối cùng của Thế giới:

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

2
Đó là một trong những "Oh sh * t!" lỗi.
Tin Man

3
đó làLaunchNukes();
hasen

1
nếu điều đó đã được viết là: if (GetRadarInfo () = 1) {...}, chúng tôi sẽ không gặp lỗi này vì nó không được biên dịch. Vì vậy, không phải lúc nào cũng giới thiệu biến trung gian.
chiến thuật

22

Tôi thấy Trò chơi cuộc sống của Conway trong APL trôi nổi rất nhiều:

Một phần thưởng bổ sung là điều này sẽ đảm bảo bạn xử lý unicode chính xác.


2
ha! đó là điều đầu tiên tôi nghĩ đến khi tôi thấy mã của bạn, thật tuyệt!
BeachRunnerJoe

Wow, thật ấn tượng!
FinnNk


15
Và tôi nghĩ Perl trông giống như tiếng ồn đường.
Tin Man

1
@Greg, đợi đã, APL sử dụng nhiều hơn bảng chữ cái La Mã và Hy Lạp vì chưa có đủ chữ cái và ký hiệu; backspace (được gọi đúng hơn là "overstrike") cũng được sử dụng vì một số ký tự cần được gõ lên trên các ký tự khác. Một trong số đó là một biểu tượng chia trên đỉnh một hình vuông, đại diện cho nghịch đảo ma trận (nếu toán tử đơn nguyên hoặc nhân với ma trận đảo ngược nếu nó được sử dụng như một toán tử nhị phân).
Tangurena

19

Một phiên bản sửa đổi của một lớp lót Perl nổi tiếng:

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

Biểu thức chính quy này khớp với các chuỗi có độ dài là số nguyên tố.

Phiên bản gốc là:

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

phù hợp với các chuỗi bao gồm số nguyên tố 1s.


14

Sắp xếp nhanh chóng:

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

Nếu danh sách trống, kết quả được sắp xếp là danh sách trống.

Nếu danh sách bắt đầu bằng phần tử x và phần còn lại của danh sách là xs, thì kết quả được sắp xếp là danh sách bao gồm danh sách được sắp xếp bao gồm tất cả các phần tử trong xs nhỏ hơn x được nối với phần tử x được nối với danh sách được sắp xếp của tất cả các phần tử trong xs lớn hơn x.

(hay nói cách khác - chia thành hai cọc, tất cả đều nhỏ hơn x và tất cả lớn hơn x, sắp xếp cả hai và tạo một danh sách với cọc nhỏ hơn, phần tử x và cọc lớn hơn).

Đánh bại sự dễ hiểu của phiên bản C khá dễ dàng.


1
Đây là ML chuẩn? Hay Haskell?
Barry Brown

3
Haskell. Tôi thích tư duy của ngôn ngữ.

Tôi thích giải pháp thay thế phân vùngqsort (x:xs) = qsort lesser ++ equal ++ qsort greater where (lesser,equal,greater) = part x xs ([],[x],[])
Kendall Hopkins

1
Có phiên bản nào sử dụng trục ngẫu nhiên thay vì đầu danh sách không? Điều đó sẽ làm cho nó gần hơn với bản gốc của CAR Hoare.
Macneil

1
Hoare nói "Mục được chọn [làm phần tử trụ] ... phải luôn luôn là mục chiếm vị trí địa chỉ cao nhất của phân khúc sẽ được phân vùng. Nếu sợ rằng điều này sẽ có kết quả không ngẫu nhiên có hại, a mục được chọn ngẫu nhiên ban đầu nên được đặt ở những vị trí có địa chỉ cao nhất ". Vì vậy, để đúng với Hoare, chúng ta nên làm việc với yếu tố cuối cùng chứ không phải đầu tiên.


13

Khi tôi lần đầu tiên tìm ra bash fork, tôi nghĩ rằng nó thực sự ngọt ngào.

:(){ :|:& };:

Wow, thật là ác!
Macneil

Nhìn vào tất cả các mặt cười! Bạn có thể gọi đây là "Bom Smiley!"
Đánh dấu C


10

Bởi vì bạn đề cập đến các phương trình, cái này thuộc về danh sách của bạn:

e^{i\pi}+1=0

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


Có nó làm! Good ol 'Euler, một cái tốt khác!
BeachRunnerJoe

Tôi nhớ điều này nhưe^{i/pi} = i^2
Josh K

@Josh K: Đó là bởi vì i² == -1, vì vậy bạn có thể cân bằng phương trình bằng cách trừ đi một bên từ cả hai bên, loại bỏ +1và thay đổi =0thành -1hoặc
Daenyth

7

Cách phát hiện số chẵn:

x % 2 == 0

3
Hoặc !(x%2)trong các ngôn ngữ lành mạnh.
Christian Mann

8
Hoặc !(x & 1)trong các ngôn ngữ mà không tối ưu hóa trình biên dịch.
jfs

1
@Christian, các số không phải là booleans - quá dễ để mắc lỗi.

7

import this trong Python.


EDIT dưới dạng nhận xét không thể chứa ngắt dòng: Đối với những người không có trình thông dịch Python tiện dụng, đây là đầu ra

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!

Tôi là người mới bắt đầu Python. Điều này sẽ đạt được điều gì?
Richard

1
@Richard: Hãy thử viết điều này trong trình thông dịch tương tác Python :).
MAK

Điều này làm sáng lên chiều chủ nhật của tôi :)
Richard

@Richard Câu hỏi nghiêm túc: Nếu bạn chạy cái này, nó có cung cấp cho bạn một ngăn xếp tràn không?
Đánh dấu C

6

Không hoàn toàn 2 dòng nhưng tôi sẽ nói điều này khá nổi tiếng:

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

Trên thực tế một số ngôn ngữ có thể mô tả nó trong một dòng. Lua đến với tâm trí nhưng có nhiều hơn.

x, y = y, x

chắc chắn nổi tiếng!
BeachRunnerJoe

7
với số nguyên: a ^ = b ^ = a ^ = b;
JulioC

Tôi chỉ tò mò làm thế nào điều này được thực hiện? nó có tạo một bảng tạm thời (y, x) không, sau đó gán x phần tử thứ 1 và y phần tử thứ 2?
chiến thuật

Ngoài ra tôi đang tự hỏi tần suất mọi người trao đổi giá trị trong lập trình thực tế.
chiến thuật

1
@tactoth - Hoán đổi thường được sử dụng để thực hiện chuyển nhượng an toàn ngoại lệ mạnh mẽ trong C ++.
Kaz Dragon

6

Ví dụ tính toán lambda yêu thích của tôi là tổ hợp Y:

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

6

Từ một bài tập trong K & R, đây là một hàm sẽ trả về số lượng bit được đặt trong số đã cho. Với 58 ký tự:

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

Phải mất thời gian tỷ lệ thuận với số lượng bit được thiết lập. Phần "ah ha" ở đây là

n = n & (n - 1)

Loại bỏ bit thiết lập ngoài cùng bên phải từ n.


Tuyệt vời, tham khảo K & R tốt đẹp!
BeachRunnerJoe

6

Tam giác Pascal đệ quy trong một dòng (Haskell)

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

Năm mươi hai ký tự, thêm không gian để nếm thử. Phép lịch sự của "Ephemient" trong bình luận ở đây .

Tôi nghĩ rằng đây là một ví dụ tốt hơn so với các giải pháp khó hiểu nhưng ngắn gọn trong JK (mặc dù tôi chưa phải là người dùng Haskell).


6

Unix Roulette (NGUY HIỂM!)

Phép lịch sự của câu trả lời của Bigown trong chuỗi trò đùa (và bình luận):

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

(Đó là 62 ký tự, vì vậy bạn có thể xóa nhận xét (nó có hoạt động theo cách đó không?) Hoặc một số không gian không cần thiết.)


2
Hãy đánh dấu điều này là nguy hiểm.
Chinmay Kanchi

Tôi sử dụng zsh và nó không hoạt động trừ khi s / == / - eq / :-)
defhlt

5

Chuỗi Fibonacci vô hạn (Haskell)

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Tại sao không fibs = 0 : scanl (+) 0 fibs?
FUZxxl

4
DO 10 I=1.3

Đây là một trong những lỗi đắt nhất trong lịch sử. Câu lệnh Fortran này gán giá trị float là 1.3 cho biến có tên DO10I.

Mã chính xác - tiêu đề của các câu lệnh lặp lại vòng lặp cho đến khi câu lệnh có nhãn 10 và biến vòng lặp Ichấp nhận các giá trị 1, 2, 3:

DO 10 I=1,3

1
Tại sao nó là một lỗi đắt tiền?
Barry Brown

2
Lỗi này nằm trong chương trình con tính toán quỹ đạo quỹ đạo cho chuyến bay vào vũ trụ năm 1961 của Sao Thủy. Tuy nhiên, nó đã bị bắt và sửa trước khi ra mắt, và do đó không phải là một lỗi tốn kém. Tuy nhiên, có một lỗi tương tự trên một nhiệm vụ Mariner đã gây ra sự thất bại của nhiệm vụ. (nguồn: Chuyên gia lập trình C , trang 31-32.)
Darel

4

Thiết bị của 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 đã hủy một cổng được ánh xạ bộ nhớ ghi vào một trong những cấu trúc C kỳ quái nhất mà thế giới đã thấy.


Nó không phù hợp với 60 ký tự, nhưng nó rất tuyệt. Tôi nhớ đã nhận được sự ớn lạnh khi thấy tên anh ta lướt qua trong các khoản tín dụng cho một số bộ phim Pixar.
Macneil

2

Bất cứ điều gì để làm với Hello World đến với tâm trí. Bạn có thể đi với các biến thể khác nhau nếu bạn có kế hoạch lưu trữ nhiều ngôn ngữ.

Đối với một cái gì đó không tầm thường hơn, có Fftimeacci .


1
Fftimeacci, một trong những tốt đẹp! Đây là mã ... if (k <2) return k; other return return (k-1) + fib (k-2);
BeachRunnerJoe

1
@BeachRunnerJoe: Bạn có thể muốn kết hợp điều đó với toán tử có điều kiện;)
back2dos

3
đúng vậy trở về (k <2)? k: sợi (k-1) + sợi (k-2);
BeachRunnerJoe

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

Dòng phân vùng mã Scala ở trên people(một danh sách Persons) thành hai danh sách dựa trên độ tuổi tương ứng của chúng.

Phải mất nhiều mã sau đây để làm điều tương tự trong Java:

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

Hoán đổi các giá trị của hai biến mà không sử dụng biến thứ ba. Đây là một trong những điều đầu tiên trong lập trình mà tôi được nói và nghĩ rằng "Hmm ... thật tuyệt"

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

Tôi biết bạn có thể làm điều này bằng cách sử dụng XORs, nhưng đây là chút hoài niệm của tôi cho ngày hôm nay :)
Jonathon

XOR không có vấn đề với tràn. Thực hiện điều này?
Công việc

2

Ma thuật đen từ 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

Số lớn nhất có thể được biểu thị bằng 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. Toán tử có điều kiện :

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

  2. Trường hợp chuyển đổi

  3. cho mỗi vòng lặp [Java]


1
Trên thực tế, toán tử có điều kiện là tên chính xác. Một toán tử là ternary nếu nó có ba đối số.
back2dos

@ back2dos - Thật vậy, cả C # và JavaScript đều gọi đây là toán tử có điều kiện.
ChaosPandion

@ back2dos - Các: nhà điều hành? làm mất ba đối số, đó là lý do tại sao nó được gọi là các nhà điều hành ternary. Đây là thuật ngữ chính xác từ C trở đi. (dường như bắt đầu từ BCPL, theo Wikipedia ...)
grkvlt

@grkvlt: Tôi chưa bao giờ nói rằng nó không mất ba đối số. Chỉ là bạn sẽ không gọi !toán tử đơn nguyên hoặc toán tử +nhị phân. Nó đơn giản là không chính xác.
back2dos

1
@ back2dos - Tôi nghĩ đây là vấn đề của chúng tôi - Tôi sẽ gọi quả táo là "trái cây" trong tình huống đó, nhưng tôi nghĩ chúng ta đang tranh luận về ngữ pháp, không phải cú pháp ngôn ngữ lập trình và bạn nói đúng đó ?:là toán tử có điều kiện;)
grkvlt

1

Quine này từ tập tin Jargon trong C:

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

Ngoài ra còn có một phiên bản LISP ở đó, nhưng bạn có thể tìm thấy nhiều phiên bản khác trôi nổi, gần như bất kỳ ngôn ngữ nào bạn có thể chụp ảnh ...


1

danh tính của euler liên kết các số đẹp nhất trong vũ trụ toán học: 1, 0, e, i và π: e ^ i (π) + 1 = 0


1

Tôi đã có một cái tốt và tôi đã viết nó xuống lề.


2
Nice một Fermat
Richard

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

Có lẽ không nổi tiếng, nhưng một trong những yêu thích của tôi. Đối với hầu hết nó không rõ ràng ngay tại sao nó hoạt động.


1

Đây là hơn 60 ký tự nhưng nó thực sự phụ thuộc vào cách đặt tên biến (vì vậy tôi bao gồm nó!)

hãy readlines (RDR: StreamReader) =
      seq {while không rdr.EndOfStream làm
                năng suất rdr.ReadLine ()}

Hàm nhỏ xinh để đọc tệp thành một chuỗi theo từng dòng trong F #.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.