Tạo chương trình hữu ích nhất trong vòng 100 ký tự [đã đóng]


13

Trong tác vụ này, bạn được phép tạo một chương trình hữu ích để làm bất cứ điều gì bạn có thể viết trong vòng 100 ký tự. Bạn được phép sử dụng ít ký tự hơn, nhưng không nhiều hơn.

Các quy tắc, chỉ để bảo vệ khỏi các sơ hở tiêu chuẩn không còn buồn cười:

  1. Chương trình của bạn không thể truy cập internet, trừ khi nó thực sự phải. Ví dụ: chương trình hiển thị câu hỏi được đánh giá cao nhất trên trang web này có thể sử dụng Internet để kiểm tra câu hỏi này. Tuy nhiên, nó không được phép duyệt Internet để tìm nguồn thực của nó và chạy nó.

  2. Chương trình của bạn không thể là trình thông dịch cho ngôn ngữ được viết. Tuy nhiên, trình thông dịch Brainfuck bằng ngôn ngữ không phải Brainfuck sẽ ổn.

  3. Chương trình của bạn không thể thực thi các chương trình bên ngoài thực hiện chính xác những gì chương trình của bạn làm. Ví dụ: bạn không thể chạy vimvà tuyên bố rằng chương trình của bạn đang được vimtriển khai.

  4. Chương trình của bạn không thể gây nguy hiểm cho máy tính đang chạy và các máy tính khác. Bạn không được phép viết chương trình như rmdir /(ví dụ ở đây cố ý không hoạt động, không sửa nó) và tuyên bố đây là chương trình hữu ích để xóa tất cả các tệp trên máy tính.

  5. Chương trình của bạn có thể chậm như bạn muốn và sử dụng nhiều tài nguyên như bạn muốn, miễn là bạn có thể chứng minh nó làm những gì nó có nghĩa.

  6. Bạn không được phép tạo ngôn ngữ cụ thể cho nhiệm vụ này. Tuy nhiên, bạn được phép tạo trình thông dịch cho ngôn ngữ được phát minh của mình bằng một số ngôn ngữ lập trình khác.


Tôi có thể đăng nhiều hơn một câu trả lời cho cuộc thi này không?
TrungDQ

@TrungDQ: Chắc chắn rồi.
Konrad Borowski

1
Điều này đã trở thành một trong những câu hỏi hay nhất cho đến nay;)
Timtech

13
Đây là cách quá mở, ngay cả đối với một trang web như thế này, ngay cả đối với một cuộc thi phổ biến. Nghĩa đen là bất kỳ câu trả lời nào là hợp lệ, không có khung tham chiếu nào để so sánh chúng.
Aaronaught

3
Câu hỏi này là ăn thịt người chơi golf. 100 ý tưởng nhân vật thú vị sẽ có thể được đưa vào các câu hỏi mã vàng tuyệt vời. Tôi khuyến khích người trả lời dành thêm vài phút để biến câu trả lời của họ thành câu hỏi mới.
gnibbler

Câu trả lời:


26

C - 47 byte

Chương trình sau đây đưa ra mọi tài liệu từng được viết trong lịch sử loài người, cùng với mọi tài liệu sẽ được viết và vô số văn bản thú vị mà không con người nào nghĩ ra được (cùng với một chút "rác" ở giữa). Chỉ cần cho nó một chút thời gian. Hơn nữa, mỗi khi bạn chạy nó, nó sẽ xuất ra các văn bản khác nhau trước! Nếu điều đó không hữu ích! (Và tất cả điều đó trong một nửa giới hạn ký tự!)

main(){srand(time(0));while(1)putchar(rand());}

Nếu bạn không quan tâm đến việc xuất ra thứ gì khác mỗi lần, bạn chỉ cần 41 byte !

main(){srand(0);while(1)putchar(rand());}

Không hoàn toàn phù hợp với C99, nhưng nó biên dịch trơn tru với gcc.exe (GCC) 4.7.0 20111220.

Các quy tắc nhà nước

Chương trình của bạn có thể chậm như bạn muốn và sử dụng nhiều tài nguyên như bạn muốn, miễn là bạn có thể chứng minh nó làm những gì nó có nghĩa.

Không vấn đề gì.

Một số điều, chương trình này sẽ xuất ra:

  • một giải pháp cho mọi vấn đề thiên niên kỷ
  • bài báo ngày mai
  • các tác phẩm hoàn chỉnh của Shakespeare (tất nhiên)
  • bí mật đen tối nhất của bạn
  • tất cả các câu trả lời khác cho câu hỏi này

Không thực sự, bởi vì (như ace đã đề cập chính xác trong bình luận), rand () chỉ là một trình tạo giả ngẫu nhiên, sẽ bao quanh một lúc nào đó - có lẽ là quá sớm để tạo ra nhiều văn bản có ý nghĩa. Nhưng tôi nghi ngờ rằng việc lấy dữ liệu từ một trình tạo số ngẫu nhiên (phần cứng) thực sự có thể điều khiển từ xa trong vòng 100 ký tự. Mặc dù vậy, tôi sẽ để nó ở đây vì niềm vui của nó.

Như Dennis lưu ý, tính ngẫu nhiên của thuật toán, có thể được cải thiện phần nào (trong giới hạn ký tự), bằng cách sử dụng rand()^rand()>>16thay vì rand().


10
Không cần thiết. rand()chỉ là giả danh - nó có thể không tạo ra bất kỳ văn bản hữu ích nào trước khi nó lặp lại.
dùng12205

1
@Dennis may mắn là vẫn nằm trong quy tắc của câu hỏi này! :)
Martin Ender

1
@ m.buettner: Với rand glibc của () , có một mối quan hệ đại số đơn giản giữa byte đầu ra của chương trình của bạn: Xem đầu ra như là một mảng x, bạn phải x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, nơi c[i]là 0 với xác suất 0,75 và 1 với xác suất 0,25. Điều này khá nhiều có nghĩa là nó không thể tạo ra bất kỳ điều gì bạn đã đề cập.
Dennis

1
@ m.buettner: Nó sẽ không làm cho PRNG tốt hơn nhiều, nhưng bạn có thể loại bỏ tuyến tính bằng cách sử dụng rand()^rand()>>16thay vì đơn giản rand(). Nếu bạn đang tìm cách tiết kiệm byte, hãy xóa int%256.
Dennis


18

BBC BASIC, 84 ký tự

MODE 6:INPUT T,A,B,A$,B$:FOR X=0 TO 1279:A=A+EVAL(A$):B=B+EVAL(B$):DRAW X,A+500:NEXT

Vẽ các giải pháp cho phương trình vi phân bậc nhất và thứ hai.

Lấy làm đầu vào của người dùng:

Title (does nothing)
Start value for A (plotted value)
Start value for B (not plotted)
Expression for dA/dX
Expression for dB/dX

Lấy cảm hứng từ một phần mềm giải phương trình vi phân có tên Polymath mà tôi đã sử dụng khi học làm kỹ sư hóa học. Chúng tôi sẽ nhập các phương trình khác nhau cho các chất phản ứng và sản phẩm và xem toàn bộ hệ thống phản ứng thay đổi theo thời gian như thế nào. Một phần mềm rất đơn giản (không phức tạp hơn nhiều so với điều này) nhưng thuận tiện hơn nhiều cho mục đích này so với Excel. Thật không may, tôi không thể tạo một bản sao hoàn chỉnh của Polymath trong 100 ký tự.

nhập mô tả hình ảnh ở đây


10

Toán học 76

Chương trình này xây dựng một applet hiển thị thông tin liên quan đến các thuộc tính khác nhau cho bất kỳ 240 quốc gia nào. Nó mở ra với thông tin về dân số trưởng thành của Afghanistan. Người dùng có thể thay đổi cài đặt quốc gia và thuộc tính thông qua danh sách thả xuống.

Mathematica tương tác trơn tru với WolframAlpha.
Vì lý do này, tôi tin rằng bài nộp đáp ứng yêu cầu số 1 của thử thách: "Chương trình của bạn không thể truy cập internet, trừ khi nó thực sự phải ".

Applet khá khiêm tốn này chỉ đơn giản là sử dụng các chức năng hiện có trong ngôn ngữ Mathicala. Một đoạn video ngắn cung cấp một số thông tin bổ sung về applet.

d = CountryData; Manipulate[WolframAlpha[p <> " " <> c], {p, d["Properties"]}, {c, d[]}]

alpha


Dưới đây là danh sách 20 thuộc tính đầu tiên (trong số 223) liên quan đến các quốc gia. Với một chương trình bổ sung, người ta có thể có được thông tin bổ sung về các quốc gia và phân tích thông tin này trong Mathematica.

CountryData["Properties"][[;; 20]]

{"AdultPopulation", "Nông sản", "Nông nghiệpValueAdded", "Sân bay", "AlternateNames", "AlternateSt ChuẩnNames", "AMRadioStations", "thường niên", "thường niên", "thường niên", "thường niên" Khu vực "," Sinh tử thu nhỏ "," BorderingCountries "," Biên giới "," Ranh giới "," CallingCode "," CapitalCity "," CapitalLocation "}


Tôi không thấy chương trình của bạn "phải" truy cập internet như thế nào. Dữ liệu bạn trình bày không thay đổi thường xuyên mà bạn sẽ cần dựa vào nguồn bên ngoài.
shiona

1
Cho dù nguồn bên trong hay bên ngoài là mở để tranh luận. Tôi đã xem xét yêu cầu cung cấp thông tin về WolframAlpha (mã mà nó tạo ra) là một trường hợp (cần thiết) "truy cập internet", mặc dù mã trực tiếp truy cập máy chủ dữ liệu Wolfram và không yêu cầu sử dụng trình duyệt như FireFox. Nó đòi hỏi người ta phải có kết nối mạng hoặc WIFI
DavidC

1
-1 nếu tôi có thể - điều này chỉ đơn giản là cấu trúc dữ liệu từ một dịch vụ có sẵn.
l0b0

@ l0b0 Tôi cho rằng bạn có thể thấy nó theo cách đó. Hoặc bạn có thể nói rằng nó khai thác chức năng của ngôn ngữ. Rốt cuộc, WolframAlpha được thiết kế từ đầu để phối hợp chặt chẽ với Mathicala.
DavidC

1
" Thông tin trong WolframAlpha là một phần không thể thiếu của Mathicala và Ngôn ngữ Wolfram " là một tình trạng khá đáng báo động. Điều đó phải làm cho nó trở thành ngôn ngữ lập trình kém ổn định nhất trong sự tồn tại.
Peter Taylor

9

bash, 100 byte

head -c${1--1} /dev/zero |
openssl enc -aes-128-ctr -pass file:/dev/random 2>/dev/null |
tail -c+17

Kịch bản lệnh này in một luồng byte bảo mật bằng mật mã. Nó nhận một đối số tùy chọn chỉ định số lượng byte cần in. Theo mặc định, đầu ra sẽ là vô hạn.

Hữu ích trong trường hợp đọc từ /dev/urandomquá chậm.

Điểm chuẩn

$ time head -c 1G /dev/urandom > /dev/null
Real    59.75
User    0.03
Sys     59.68
$ time random 1G > /dev/null
Real    0.68
User    0.64
Sys     0.86

Kịch bản này tạo ra tới 1,5 GiB mỗi giây trên i7-3770 của tôi.

Ngược lại, đọc từ /dev/urandomquản lý để tạo ra chỉ 1 GiB mỗi phút .

Làm thế nào nó hoạt động

  • head -c${1--1} /dev/zeroxuất ra số lượng byte bằng không. Nếu không có số lượng được chỉ định, ${1--1}bằng -1 và đầu ra một số lượng vô hạn.

  • openssl enc -aes-128-ctr -pass file:/dev/randomsử dụng AES-128 trong chế độ truy cập để mã hóa các byte bằng 0, đọc mật khẩu từ đó /dev/random.

  • tail -c+17 thoát khỏi tiêu đề 16 byte của đầu ra.


Lưu ý rằng luồng này có thể được phân biệt với luồng ngẫu nhiên "thực" bằng cách xem xét 2 byte đầu ra đầu tiên (một luồng ngẫu nhiên thực sự nên có các khối trùng lặp ở đó, luồng này sẽ không có).
Paŭlo Ebermann

@ PaŭloEbermann: Rõ ràng là bạn đúng. Sau đó, một lần nữa, sẽ mất hơn 6.000 năm để tạo ra nhiều byte trên máy của tôi ...
Dennis

7

Javascript

Giải bất kỳ phương trình nào (tốt, không phải tất cả, nhưng nên hoạt động với các hàm chung ...)

r=s=>{for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

Không có ES6 (105 ký tự):

function r(s){for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

Chỉ cần đưa ra bên trái của phương trình giả sử rằng bên phải bằng không.

Thí dụ :

  • r("x*x-9") trả lại 3
  • r("Math.sin(x)-1")trả về 1.5707963394347828(pi / 2)
  • r("Math.pow(2,x)-512") trả lại 9

Cảnh báo: có thể phân kỳ trên một số chức năng (hoặc nếu không có giải pháp) và đóng băng tab trình duyệt của bạn hoặc trả lại NaN.


6

C - 99 ký tự

i;main(int c,char**a){for(a+=2;1+(c=getchar());)putchar(c+(**(a-1)-69?1:-1)**(*a+i++%strlen(*a)));}

Chương trình này cho phép mã hóa và giải mã bất kỳ loại dữ liệu nào.

Sử dụng

Đầu tiên ... biên dịch nó!

gcc crypto.c crypto

Nếu bạn muốn mã hóa nội dung mypreciousdata.txtbằng khóa mysecretkeyvà lưu kết quả vào myprotecteddata.txt:

cat mypreciousdata.txt | ./crypto E mysecretkey > myprotecteddata.txt

Bây giờ, nếu bạn muốn lấy nội dung được giải mã của myprotecteddata.txt:

cat myprotecteddata.txt | ./crypto D mysecretkey > mypreciousdata.txt

Chìa khóa càng dài thì càng an toàn!

Giải trình

Vui lòng tìm mã mở rộng và nhận xét bên dưới:

int main(int argc, char** argv)
{   
    // retrieve the first argument passed to the program (action)
    char action = argv[1][0];

    // retrieve the second argument passed to the program (key)
    char* key = argv[2];

    // initialize character position in the key
    int i = 0;

    // initialize the current input character
    char c = 0;

    // loop until we reach the end of input
    while (c != -1){
        // get a character from stdin
        c = getchar();
        if (action == 'E'){
            // encode the current character
            putchar(c + key[i]);
        } else{
            // decode the current character
            putchar(c - key[i]);
        }
        // increment the position in the key, without overflow
        i = (i + 1) % strlen(key);
    }
}

Đây là một biến thể của mật mã Vigenère được điều chỉnh cho một bảng chữ cái có kích thước của charloại của bạn (thường là 256).
Paŭlo Ebermann

5

GolfScript

Tôi quản lý để ép nó thành chính xác 100 ký tự!

{{}/]{97-}%}:b~:|;"etaoinshrdlcumwfgypbvkjxqz"b:f,:&,{:x[|{&x-+&%f?}%{+}*\]}%$0=1=:x|{&x-+&%97+}%''+

Nó nhận đầu vào của văn bản được mã hóa ROT-n và xuất ra văn bản được giải mã. (Lấy từ đây .) Ví dụ, khi được đưa vào đầu vào pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom, đầu ra là 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.


5

JavaScript

Để tạo một id duy nhất trong javascript
Math.random().toString(30).slice(2);

Sản xuất một cái gì đó như: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

chuỗi 30-32 ký tự chữ và số

Math.random().toString(36).slice(2)

Sản xuất một cái gì đó như: 'uq2sze67hsacq5mi'

Chuỗi có độ dài 14-16.



3

Fortran - 85 byte

l=0;read(*,*)n;do while(n>0);i=mod(n,10);l=l+i;n=n/10;enddo;print*,"digit sum=",l;end

Đọc một số và in ra tổng các chữ số . Hữu ích cho các vấn đề Project Euler .


Làm thế nào điều này giúp cho các vấn đề Euler dự án?
Paŭlo Ebermann

@ PaŭloEbermann: Có lẽ tôi nên thêm "một số" trước Project Euler. Tôi biết chắc chắn Các vấn đề 16, 20 & 119 sử dụng tổng số chữ số, không chắc chắn về những người khác, nhưng nhiều vấn đề của họ không cần đến vấn đề này.
Kyle Kanos
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.