Giới thiệu ngôn ngữ


507

Ghi chú

  • Chủ đề này được mở và mở khóa chỉ vì cộng đồng quyết định tạo một ngoại lệ . Vui lòng không sử dụng câu hỏi này làm bằng chứng cho thấy bạn có thể đặt câu hỏi tương tự ở đây. Xin vui lòng không tạo thêm câu hỏi .

  • Đây không còn là một , cũng không phải là độ dài đoạn giới hạn bởi kiểm phiếu bầu chọn. Nếu bạn biết chủ đề này từ trước, hãy chắc chắn rằng bạn làm quen với các thay đổi.

Chủ đề này được dành riêng để thể hiện các tính năng thú vị, hữu ích, tối nghĩa và / hoặc độc đáo mà ngôn ngữ lập trình yêu thích của bạn phải cung cấp. Đây không phải là một thách thức cũng không phải là một cuộc cạnh tranh, mà là một nỗ lực hợp tác để thể hiện càng nhiều ngôn ngữ lập trình càng tốt càng tốt.

Làm thế nào điều này hoạt động

  • Tất cả các câu trả lời phải bao gồm tên của ngôn ngữ lập trình ở đầu bài, có tiền tố là a #.

  • Câu trả lời có thể chứa một (và chỉ một) factoid, nghĩa là một vài câu không có mã mô tả ngôn ngữ.

  • Ngoài factoid, các câu trả lời phải bao gồm các đoạn mã, có thể (nhưng không phải là) các chương trình hoặc chức năng.

  • Các đoạn không cần phải liên quan. Trong thực tế, các đoạn quá liên quan có thể là dư thừa.

  • Vì đây không phải là một cuộc thi, tất cả các ngôn ngữ lập trình đều được chào đón, bất cứ khi nào chúng được tạo.

  • Câu trả lời có chứa nhiều hơn một đoạn mã nên sử dụng Stack Snippet để thu gọn mọi thứ trừ factoid và một trong các đoạn mã.

  • Bất cứ khi nào có thể, chỉ nên có một câu trả lời cho mỗi ngôn ngữ lập trình. Đây là một wiki cộng đồng, vì vậy hãy thoải mái thêm đoạn trích vào bất kỳ câu trả lời nào, ngay cả khi bạn không tự tạo ra nó. Có một Stack Snippet để nén các bài đăng , điều này sẽ làm giảm tác dụng của giới hạn 30.000 ký tự.

Câu trả lời có trước những hướng dẫn này nên được chỉnh sửa. Hãy giúp cập nhật chúng khi cần thiết.

Câu trả lời hiện tại, được sắp xếp theo thứ tự abc theo tên ngôn ngữ

$.ajax({type:"GET",url:"https://api.stackexchange.com/2.2/questions/44680/answers?site=codegolf&filter=withbody",success:function(data){for(var i=0;i<data.items.length;i++){var temp=document.createElement('p');temp.innerHTML = data.items[i].body.split("\n")[0];$('#list').append('<li><a href="/a/' + data.items[i].answer_id + '">' + temp.innerText || temp.textContent + '</a>');}}})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><base href="http://codegolf.stackexchange.com"><ul id="list"></ul>

Câu trả lời:


414

Toán học

Bạn có thể muốn đọc từ dưới lên trên vì đây là thứ tự được viết và một số giải thích sẽ đề cập đến các đoạn trước hoặc giả sử giải thích từ phía dưới.

Danh sách đang phát triển khá dài. Tôi đã bắt đầu loại bỏ các đoạn ít thú vị hơn và tôi sẽ bắt đầu bỏ qua các đoạn mã ngay bây giờ. Xem lịch sử sửa đổi để biết danh sách đầy đủ các đoạn trích lên đến 41. Đối với một số đá quý thực sự, hãy xem đoạn trích 81 , 64 , 44 , 23 , 19 , 128 .

Độ dài 143 và 144 đoạn

Cuối cùng ... tôi đã chờ đợi điều này trong một thời gian (và đã chơi golf trong khoảng thời gian dài, vì vậy tôi không phải đợi lâu hơn nữa). Tôi đã đề cập trước đó rằng bạn cũng có thể phương trình số và bạn cũng có thể giải phương trình vi phân. Tôi muốn thể hiện một ví dụ không tầm thường về điều đó.

Xét một con lắc đôi trên một thanh (tức là một con lắc gắn với một cái khác). Mỗi thanh có chiều dài đơn vị và mỗi trọng lượng của hai con lắc có khối lượng đơn vị. Tôi cũng đã sử dụng trọng lực đơn vị để rút ngắn phương trình. Đoạn mã 143 ký tự sau đây giải quyết các phương trình chuyển động Lagrangian cho một hệ thống như vậy (về các góc của con lắc và mô men góc). Một dẫn xuất có thể được tìm thấy trong bản PDF này , mặc dù đây là một bài tập khá đơn giản nếu bạn quen thuộc với cơ học Lagrangian.

Nó khá khó đọc, vì tôi đã phải đánh nó xuống rất nhiều:

d@t@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]

Điều thú vị là Mathicala ngay lập tức hiển thị một sơ đồ thu nhỏ về các giải pháp đại khái trông như thế nào:

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

Được rồi, nhưng đó là một chút khập khiễng. Chúng tôi muốn biết chuyển động của con lắc thực sự trông như thế nào. Vì vậy, đây là một đoạn mã 144 ký tự, hoạt hình con lắc trong khi tìm ra quỹ đạo của con lắc dưới:

Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}

Hoạt hình kết quả trông như thế này:

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

Tôi đã phải gian lận một chút: nếu bạn âm mưu vượt ra ngoài t = 30, ParametricPlottheo mặc định sử dụng quá ít điểm cốt truyện và dòng trở nên khá lởm chởm. Nhưng hầu hết các động lực thú vị xảy ra sau thời gian đó, vì vậy tôi đã sử dụng tùy chọn PlotPoints -> 200để làm cho nửa sau của hình ảnh động trông mượt mà hơn. Không có gì khác biệt đáng kể, và nửa đầu sẽ trông không thể phân biệt được.

Tôi nghĩ rằng đây sẽ là đoạn trích cuối cùng của tôi, trừ khi tôi nghĩ ra thứ gì đó thực sự gây chú ý. Hy vọng bạn thích điều này!

Độ dài 100 đoạn

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

Tôi đã suy nghĩ về một số Geochức năng hay cho 100 đoạn trích, nhưng cuối cùng tôi đã tìm thấy một cái gì đó thực sự tiện lợi trên Tweet-a-Program , thứ mà tôi vừa phải ăn cắp. Ở trên tạo ra một bản đồ mặt trời trông rất đẹp của Trái đất cho thời gian và ngày hiện tại, bằng cách phủ lên một hình dạng bán mờ của bán cầu đêm trên bản đồ cứu trợ:

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

Đoạn dài 81

CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]

Tôi hứa đó là máy tự động di động cuối cùng. Nhưng quyền đó có Wireworld với 81 ký tự. Lần này tôi đã không mã hóa quy tắc trong một số duy nhất, a) bởi vì tôi nghĩ rằng nó sẽ rất lớn một cách lố bịch (tôi không bận tâm tìm ra nó) và b) để cho bạn thấy cách sử dụng khác CellularAutomaton. Lần này, quy tắc được chỉ định đơn giản là một hàm thuần túy, nhận một vùng lân cận ô và trả về giá trị mới của ô. Đây là một cách tiếp cận khả thi hơn nhiều đối với automata di động với hơn 2 màu / trạng thái.

Dù sao, tôi đã thiết lập ví dụ từ Wikipedia trong i(hai đồng hồ tạo tín hiệu và cổng XOR) và để nó chạy trong khoảng 50 bước:

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

Nếu bạn quan tâm, cốt truyện và hoạt hình thực tế có thể là đoạn 77:

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

Độ dài 69 đoạn

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

Quay lại một cái gì đó hữu ích. Ngoài các hệ phương trình thông thường, Mathematica cũng có thể giải các hệ phương trình vi phân. Trên đây về mặt kỹ thuật chỉ là một phương trình vi phân với các điều kiện biên, nhưng bạn cũng có thể cung cấp nó như là một hệ thống gồm ba phương trình. Tương tự như các hàm tích hợp DSolvelà cho các giải pháp chính xác trong khi NDSolvesẽ giải quyết hệ thống bằng số. Trên đây mang lại một giải pháp duy nhất

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

mà bây giờ có thể dễ dàng sử dụng để tính toán thêm hoặc vẽ.

Độ dài 64 đoạn

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

Tôi đã hứa với bạn nhiều CellularAutomatonphép thuật hơn ! Đoạn trích này tính toán Trò chơi cuộc sống của Conways với điều kiện ban đầu icho ncác bước và cung cấp cho bạn kết quả cho tất cả các dấu thời gian trung gian.

Một vài từ về các tham số: 2là số lượng trạng thái ô. {{2,2,2},{2,1,2},{2,2,2}}đưa ra các trọng số cho 9 ô trong vùng lân cận 3x3. Nó đảm bảo rằng chính tế bào có thể phân biệt được với tổng của 8 hàng xóm. {1,1}nói rằng quy tắc CA phụ thuộc vào các ô cách 1 bước theo một trong hai hướng. Cuối cùng, 224là quy tắc cập nhật thực tế được mã hóa trong một số duy nhất. Tìm ra con số này có thể hơi khó khăn, nhưng có một hướng dẫn khá hữu ích trong tài liệu . Đối với automata phức tạp hơn, một số duy nhất sẽ không cắt nó (vì số đó sẽ rất lớn). Có lẽ chúng ta sẽ đến đó vào ngày mai! ;)

Dù sao, nếu tôi cung cấp một lưới ngẫu nhiên vào ivà 200 vào n, và gửi kết quả qua một hình ảnh động ArrayPlot, chúng ta có thể thấy rằng nó thực sự hoạt động:

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

Độ dài 59 đoạn

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

Bạn còn nhớ cốt truyện cực từ đoạn 26 không? Chúng ta có thể làm điều tương tự trong 3D! (Trên thực tế, có hai chức năng: RevolutionPlot3Dcho các hình trụ và SphericalPlot3Dcho các hình cầu hình cầu.) Giống như Graphics3Dtất cả các ô ba chiều có thể tự động xoay trong Mathicala, vì vậy bạn không phải lo lắng về góc quay camera tốt. Các sơ đồ trên giống như một điều hòa hình cầu (mặc dù không hoàn toàn) và trông giống như:

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

Độ dài 52 đoạn

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

Điều này là khá tiện lợi. Manipulatenhận bất kỳ biểu thức nào , tham số hóa nó với một loạt các biến và sau đó cung cấp cho bạn một widget, nơi bạn có thể điều chỉnh các tham số và xem trực tiếp biểu thức thay đổi như thế nào. Như một biểu thức, bạn thường sẽ có một số loại cốt truyện. Điều này đặc biệt hữu ích nếu bạn đang sử dụng Mathicala trong các bài giảng để chứng minh cách các gia đình của các giải pháp phản ứng với việc sửa đổi các tham số. Các chương trình trên như thế nào abhệ số quy mô và chuyển sang một parabol:

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

Độ dài 48 đoạn

Import["http://www.google.com/doodles","Images"]

Importlà một lệnh khá mạnh mẽ. Nó được sử dụng cả để tải tập tin từ đĩa và từ web. Nó biết khá nhiều định dạng tệp khác nhau và đối với một số trong số chúng (như các trang HTML), nó thực sự có thể trích xuất dữ liệu ngay lập tức. Ở trên tải xuống tất cả hình ảnh từ trang doodle của Google.

Độ dài 45 đoạn

EdgeDetect@ExampleData@{"TestImage","Splash"}

Thời gian để xử lý một số hình ảnh. Mathematica đi kèm với một loạt các dữ liệu mẫu, bao gồm hình ảnh (như Lena), kết cấu, mô hình 3D và đoạn âm thanh. Đầu tiên, chúng tôi tải một trong những thứ đó:

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

Bạn muốn phát hiện các cạnh? Đó là một cuộc gọi chức năng duy nhất:

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

Độ dài 44 đoạn

ArrayPlot@CellularAutomaton[110,{{1},0},100]

Cuối cùng, tôi đã có đủ ký tự để sử dụng CellularAutomatonvà cũng hiển thị kết quả. :) Theo như tôi biết, CellularAutomatonlà chức năng duy nhất trong Mathicala liên quan đến CA. Nhưng Stephen Wolfram dường như tự coi mình là anh chàng số một khi nói đến automata di động, vì vậy chức năng này cực kỳ mạnh mẽ. Trên đây cho thấy khá nhiều cách sử dụng đơn giản nhất của nó. Điều này mô phỏng một máy tự động di động 1D trong 100 bước - và nó thực sự sẽ trả về trạng thái của máy tự động ở mỗi bước đó, vì vậy kết quả là hai chiều. Quy tắc là tham số đầu tiên, có thể được chỉ định chi tiết thông qua danh sách hoặc chỉ được mã hóa trong một số duy nhất. Trong ví dụ này, tôi đã chọn Quy tắc 110 khá nổi tiếng, hoàn chỉnh, Quy tắc 110 . {{1},0}xác định điều kiện ban đầu: một1ở phía trước một nền của số không. Có lẽ tôi sẽ thể hiện một số tính năng khác CellularAutomatontrong tương lai khi tôi có sẵn nhiều nhân vật hơn: nó có thể mô phỏng CA ở kích thước cao hơn, sử dụng các vùng lân cận lớn hơn và có nhiều hơn hai trạng thái.

ArrayPlotlà một tiện ích vẽ đồ họa đẹp khác, chỉ vẽ một danh sách 2D dưới dạng một lưới các màu đơn sắc biểu thị giá trị của chúng. Trong trường hợp đơn giản nhất, 0ánh xạ thành màu trắng và 1màu đen. Kết quả của đoạn trích là:

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

Độ dài 43 đoạn

HighlightGraph[graph,FindVertexCover@graph]

Đã được một thời gian kể từ khi tôi đề cập đến đồ thị. Có rất nhiều vấn đề lý thuyết đồ thị phổ biến được tích hợp sẵn trong Mathicala, cùng với các công cụ trực quan đẹp. Ở trên, đối với một cái nhất định graph, sẽ tìm thấy một đỉnh đỉnh tối thiểu của đồ thị, và sau đó kết xuất đồ thị với các đỉnh đó được tô đậm. Ví dụ nếu graphPetersenGraph[7,2]trở lại từ đoạn 18, chúng ta nhận được:

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

Độ dài 42 đoạn

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

Nó khá đơn giản để làm sinh động mọi thứ trong Mathematica (và chúng thậm chí không phải là hình ảnh). Bạn chỉ cần cung cấp cho nó biểu thức được ước tính cho từng khung và một loạt các tham số nên thay đổi trên các khung. Ở trên chỉ đơn giản là hoạt hình một âm mưu của một sóng hình sin di chuyển. Hoạt hình sẽ trông giống như GIF sau:

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

Độ dài 40 đoạn

SortBy[PlanetData[#, "EscapeVelocity"]&]

SortBythực hiện những gì bạn mong đợi: nó sắp xếp một danh sách dựa trên các giá trị thu được bằng cách ánh xạ một hàm đã cho vào từng thành phần của danh sách. Nhưng chờ đã, cuộc gọi trên hoàn toàn không chứa danh sách. Kể từ Mathematica 10, có hỗ trợ cho currying hoặc ứng dụng một phần đối với một số chức năng. Đây không phải là một tính năng ngôn ngữ như trong các ngôn ngữ chức năng thuần túy hơn, mà chỉ được triển khai thủ công cho toàn bộ các chức năng trong đó điều này thường hữu ích. Điều đó có nghĩa là đoạn mã trên trả về một hàm mới, chỉ lấy một danh sách và sau đó sắp xếp theo hàm đã cho. Điều này có thể rất hữu ích nếu thứ tự sắp xếp này là thứ bạn sẽ sử dụng thường xuyên hơn trong toàn bộ mã của mình.

Và vâng, có một *Datachức năng hay khác - ở trên sẽ sắp xếp tên hành tinh theo vận tốc thoát của các hành tinh .

Độ dài 39 đoạn

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

Tôi đã hứa sẽ làm cho hàm Fibonacci hiệu quả hơn. Đoạn trích này cho thấy sự phân biệt tầm thường trong Mathicala. Lưu ý rằng tất cả những gì đã thay đổi là một bổ sung f[n]=trong dòng thứ ba. Vì vậy, khi fđược gọi cho một giá trị mới (nói f[3]), sau đó f[3]=f[3-1]+f[3-2]sẽ được đánh giá. Điều này sẽ tính toán f[2]+f[1], sau đó gán nó cho f[3](với =, chứ không phải với :=!) Và cuối cùng trả về giá trị cho cuộc gọi ban đầu của chúng tôi. Vì vậy, gọi hàm này thêm một định nghĩa mới cho giá trị này, rõ ràng là cụ thể hơn quy tắc chung - và do đó sẽ được sử dụng cho tất cả các cuộc gọi trong tương lai fvới giá trị đó.

Hãy nhớ rằng hàm Fibonacci khác mất 4 giây cho 30 giá trị? Điều này cần 3 giây cho 300.000 giá trị.

Độ dài 37 đoạn

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

Trong đoạn trích cuối tôi đã đề cập đến các mẫu. Chúng thường được sử dụng trong các quy tắc , trong đó (trong số những thứ khác) có thể được sử dụng để sửa đổi các cấu trúc phù hợp với một mẫu nhất định. Vì vậy, hãy nhìn vào đoạn trích này.

{a___,x_,b___,x_,c___}:>{a,x,b,c}là một quy tắc. x_với một dấu gạch dưới duy nhất là một mẫu đề cập đến một giá trị tùy ý (có thể là một danh sách hoặc tương tự). a___là một mẫu trình tự (xem thêm đoạn 15), đề cập đến một chuỗi từ 0 hoặc nhiều giá trị. Lưu ý rằng tôi đang sử dụng x_hai lần, điều đó có nghĩa là hai phần của danh sách phải có cùng giá trị. Vì vậy, mô hình này phù hợp với bất kỳ danh sách, trong đó có một giá trị gấp đôi, gọi yếu tố đó xvà gọi ba chuỗi xung quanh hai yếu tố a, bc. Điều này được thay thế bởi {a,x,b,c}- đó là thứ hai xđược bỏ.

Bây giờ //.sẽ áp dụng một quy tắc cho đến khi mô hình không phù hợp nữa. Vì vậy, đoạn trích trên sẽ loại bỏ tất cả các bản sao khỏi danh sách l. Tuy nhiên, nó mạnh hơn thế một chút: //.áp dụng quy tắc ở tất cả các cấp. Vì vậy, nếu lbản thân nó chứa các danh sách (đến bất kỳ độ sâu nào), các bản sao từ các danh sách phụ đó cũng sẽ bị xóa.

Độ dài 36 đoạn

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

Thời gian cho các tính năng ngôn ngữ mới! Mathematica có một vài điều hay về việc xác định hàm. Để bắt đầu, bạn có thể cung cấp nhiều định nghĩa hàm cho cùng một tên, cho các số hoặc loại đối số khác nhau. Bạn có thể sử dụng các mẫu để mô tả loại đối số mà một định nghĩa áp dụng cho. Hơn nữa, bạn thậm chí có thể thêm định nghĩa cho các giá trị đơn. Mathicala sau đó sẽ chọn định nghĩa áp dụng cụ thể nhất cho bất kỳ lệnh gọi hàm nào và không để lại các cuộc gọi không xác định. Điều này cho phép (trong số những thứ khác) viết các hàm đệ quy theo cách tự nhiên hơn nhiều so với sử dụng một Ifcông tắc cho trường hợp cơ sở.

Một điều khác cần lưu ý về đoạn trích trên là tôi đang sử dụng cả hai =:=. Sự khác biệt là phía bên phải của chỉ =được đánh giá một lần, tại thời điểm định nghĩa, trong khi đó :=được đánh giá lại mỗi lần bên trái được nhắc đến. Trong thực tế :=thậm chí hoạt động khi gán các biến, sau đó sẽ có một giá trị động.

Vì vậy, ở trên, tất nhiên, chỉ là một hàm Fibonacci. Và một điều rất không hiệu quả ở đó. Tính toán 30 số đầu tiên mất khoảng 4 giây trên máy của tôi. Chúng ta sẽ sớm thấy cách chúng ta có thể cải thiện hiệu suất mà không cần phải thoát khỏi định nghĩa đệ quy.

Độ dài 35 đoạn

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

Một cốt truyện rất gọn gàng, đưa ra các dòng tinh giản của trường vectơ 2D. Điều này tương tự như một biểu đồ vectơ bình thường, trong đó mỗi mũi tên tiếp xúc với trường vectơ. Tuy nhiên, các mũi tên không được đặt trên lưới cố định mà được nối thành các dòng (các dòng tinh giản). Ý nghĩa của các đường này là chúng chỉ ra quỹ đạo của hạt (trong chất lỏng, nói) nếu trường vectơ là trường vận tốc. Các đầu vào trên trông giống như:

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

Độ dài 34 đoạn

Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]

Mathematica cũng có thể giải các phương trình (hoặc hệ phương trình, nhưng chúng ta chỉ có rất nhiều ký tự ngay bây giờ). Kết quả sẽ, như thường lệ, là tượng trưng.

{
  {x -> 0}, 
  {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}

Lưu ý rằng các giải pháp được đưa ra dưới dạng quy tắc , có thể tôi sẽ hiển thị chi tiết hơn trong một số đoạn trong tương lai.

Độ dài 33 đoạn

Dynamic@EdgeDetect@CurrentImage[]

Cảm ơn benwaff cho ý tưởng này. CurrentImage[]tải hình ảnh hiện tại của webcam của bạn. EdgeDetectbiến một hình ảnh thành một hình ảnh đen trắng trong đó các cạnh là màu trắng và phần còn lại là màu đen (xem đoạn 45 để biết ví dụ). Những niềm vui thực sự đi kèm với Dynamicđó làm cho biểu thức cập nhật chính nó. Vì vậy, kết quả của việc này sẽ thực sự truyền hình ảnh từ webcam của bạn và thực hiện phát hiện cạnh trực tiếp trên chúng.

Độ dài 32 đoạn

NumberLinePlot[x^2<2^x,{x,-2,5}]

Một loại cốt truyện khá bất thường. Nó có thể vẽ một loạt các thứ khác nhau dọc theo dòng số, như các điểm và khoảng. Bạn cũng có thể đưa ra điều kiện và nó sẽ hiển thị cho bạn khu vực nơi điều kiện đó là đúng:

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

Mũi tên chỉ ra rằng khu vực tiếp tục vô cùng. Các vòng tròn màu trắng chỉ ra rằng đó là những khoảng mở (điểm cuối không phải là một phần của khoảng). Đối với kết thúc kín, các vòng tròn sẽ được lấp đầy.

Độ dài 28 đoạn

Graphics3D@{Sphere[],Cone[]}

Thời gian cho một số đồ họa 3D. Ở trên biểu thị một hình cầu và hình nón siêu áp với các tham số mặc định, trông giống như quả cầu pha lê:

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

Trong Mathematica, bạn thực sự có thể nhấp và kéo tiện ích nhỏ này để xoay nó.

Độ dài 27 đoạn

CountryData["ITA", "Shape"]

Hơn nữa *Data! CountryDatalà khá điên rồ. Lấy hình dạng của một quốc gia thậm chí không phải là đỉnh của tảng băng trôi. Có quá nhiều dữ liệu về các quốc gia, có lẽ bạn có thể viết cả một cuốn sách về chức năng này. Giống như ... có FemaleLiteracyFraction. Bạn cũng có thể truy vấn dữ liệu đó cho các thời điểm khác nhau. Để biết danh sách đầy đủ, xem tài liệu tham khảo.

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

Độ dài 26 đoạn

PolarPlot[Sin[5θ],{θ,0,π}]

Thời gian cho một cốt truyện thú vị hơn. PolarPlotchỉ đơn giản là một âm mưu trong tọa độ cực. Thay vì chỉ định y cho một x cho trước, bạn chỉ định bán kính r cho một góc đã cho:

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

Độ dài 25 đoạn

{{1,5},{2,3},{7,4}}.{8,9}

Cuối cùng chúng ta đã có đủ ký tự cho một số toán học vectơ. Ở trên tính toán nhân ma trận của ma trận 2x3 và vectơ 2 hàng:

{53, 43, 92}

Độ dài 23 đoạn

Rotate[Rectangle, Pi/2]

Heh. Hehe. Bạn nghĩ rằng bạn biết những gì nó làm. Nhưng bạn thì không. Rectanglebởi chính nó chỉ là một chức năng được đặt tên. Để thực sự có được một đối tượng đại diện cho một hình chữ nhật, bạn cần gọi hàm đó với một số tham số. Vì vậy, bạn nghĩ điều gì xảy ra, khi bạn cố gắng xoay Rectangle? Điều này:

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

Độ dài 22 đoạn

30~ElementData~"Color"

Một *Datachức năng tích hợp khác. Vâng, đối với các nguyên tố hóa học, bạn không chỉ cần lấy những thứ như số nguyên tử, điểm nóng chảy và tên ... bạn thực sự có thể có được màu của chúng ở nhiệt độ phòng. Ở trên cho màu của Kẽm:

SlateGray

Độ dài 21 đoạn

Integrate[E^(-x^2),x]

Chúng tôi đã có sự khác biệt một thời gian trước đây. Thời gian hội nhập. Mathematica có thể xử lý cả hai tích phân xác định và không xác định. Cụ thể, Integratesẽ cung cấp cho bạn một giải pháp chính xác và nó có thể xử lý hàng tấn tích hợp tiêu chuẩn và kỹ thuật tích hợp (đối với kết quả bằng số, có NIntegrate). Nếu bạn biết tính toán của mình, bạn sẽ nhận thấy rằng tích phân Gauss ở trên không thực sự có dạng đóng không xác định tích phân ... trừ khi bạn xem xét hàm đóng dạng lỗi , nghĩa là. Toán học trả về:

1/2 Sqrt[π] Erf[x]

Độ dài 20 đoạn

"Sun"~StarData~"Age"

Quay lại dữ liệu tích hợp . Phải có ít nhất hai chục *Datachức năng cho mọi thứ bạn có thể nghĩ tới. Mỗi người trong số họ lấy một mã định danh cho thứ bạn muốn dữ liệu và một thuộc tính (hoặc danh sách các thuộc tính) để truy xuất. Trên đây chỉ là một trong những ngắn nhất bạn có thể nhận được Sun, StarAgetất cả đều khá ngắn, vì tôi không thể chờ đợi để hiển thị tính năng này.

Ồ vâng, và tôi đã đề cập rằng Mathematica (kể từ 9) hỗ trợ số lượng với các đơn vị? (Thêm về điều đó sau.) Trên đánh giá:

Quantity[4.57*10^9, "Years"]

được hiển thị dưới dạng

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

Độ dài 19 đoạn

MandelbrotSetPlot[]

Vâng ... chức năng rất hữu ích ... Tôi sử dụng nó mọi lúc. (Đôi khi, mong muốn của họ để hỗ trợ bất cứ điều gì có thể tính toán được có thể đi hơi xa ...)

Đồ họa toán học

Trong phòng thủ của họ, chức năng này hữu ích hơn một chút: bạn có thể cung cấp cho nó một phần cụ thể của biểu đồ bạn muốn vẽ.

Độ dài 18 đoạn

PetersenGraph[7,2]

Kể từ Mathicala 8, nó hiểu biểu đồ là gì, do đó, nó đi kèm với tất cả các loại hàm liên quan đến lý thuyết đồ thị. Và đó không phải là Mathicala nếu nó không bao gồm hàng tấn tích hợp. Ở trên tạo ra dữ liệu biểu đồ cho biểu đồ Petersen tổng quát . Nó không tạo ra cấu trúc dữ liệu thực tế có thể được thao tác, nhưng Mathicala ngay lập tức hiển thị dữ liệu đồ thị đó ... bằng đồ họa:

Đồ họa toán học

Độ dài 17 đoạn

Plot[x^x,{x,0,2}]

Cuối cùng đủ nhân vật để làm một số âm mưu. Trên đây thực sự chỉ là ví dụ đơn giản nhất của cốt truyện một chiều. Tôi hứa sẽ thể hiện âm mưu mát mẻ sau này

Đồ họa toán học

Độ dài 15 đoạn

{##4,#,#2,#3}&

Điều này cho thấy hai trong số các tính năng mạnh mẽ hơn (và cũng là những tính năng hữu ích để chơi gôn). Toàn bộ là một hàm thuần túy chưa được đặt tên , có thể so sánh với lambdas trong Python hoặc Procs trong Ruby. Hàm thuần túy được kết thúc đơn giản bởi a &. Toán tử này có độ ưu tiên rất thấp, do đó nó thường bao gồm hầu hết mọi thứ còn lại của nó. Các đối số của một hàm thuần túy được đề cập đến #, đôi khi được theo sau bởi những thứ khác. Đối số đầu tiên là #hoặc#1 , thứ hai là #2, v.v.

Các tính năng khác là Sequences. Về cơ bản, chúng giống như các biểu tượng trong các ngôn ngữ khác. Một chuỗi giống như danh sách mà không có danh sách xung quanh nó - nó thực sự chỉ là một chuỗi các giá trị, có thể được sử dụng trong danh sách, đối số hàm, v.v. ##đặc biệt là một chuỗi tất cả các đối số hàm thuần túy. ##2là một chuỗi tất cả các đối số bắt đầu từ thứ hai. Vì vậy, nếu chúng ta đặt tên hàm trên fvà gọi nó là

f[1,2,3,4,5]

Chúng tôi sẽ nhận được

{4,5,1,2,3}

do đó hàm xoay các đối số đầu vào 3 phần tử sang trái. Lưu ý rằng tham ##4chiếu 4,5được làm phẳng trong danh sách.

Độ dài 12 đoạn

D[x^y^x,x,y]

Phân biệt một phần. Dsẽ phân biệt biểu thức đầu tiên liên tiếp với các đối số khác của nó, mang lại cho bạn một biểu thức tượng trưng như kết quả. Vì vậy, ở trên là d² (x ^ y ^ x) / dxdy (trong đó d s là một phần), mà Mathicala báo cáo là

x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + 
  x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])

Độ dài 9 đoạn

Exp[I*Pi]

Chúng tôi chưa thực hiện bất kỳ số học phức tạp nào! Như bạn có thể thấy, πthực ra chỉ là một bí danh cho Pi. Dù sao, ở trên sẽ thực sự trả về số nguyên -1 .

Độ dài 8 đoạn

Sunset[]

Vâng. Nói về điên được xây dựng. Không có tham số thực sự cung cấp cho bạn một đối tượng datetime của hoàng hôn tiếp theo tại vị trí hiện tại của bạn. Nó cũng lấy tham số cho các ngày khác, các vị trí khác, v.v ... Đây là giao diện của tôi ngay bây giờ:

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

Độ dài 7 đoạn

9!/43!!

Đoạn trích này cho thấy một vài điều thú vị.

Mathematica không chỉ có một toán tử giai đoạn tích hợp !, nó còn có một nhân tử kép !!(nhân với mọi số khác từ ndưới lên 1). Hơn nữa, nó hỗ trợ các số nguyên chính xác tùy ý. Các 43!!sẽ được đánh giá một cách chính xác, xuống đến chữ số cuối cùng. Hơn nữa, số hữu tỷ cũng sẽ được đánh giá chính xác. Vì vậy, vì cả tử số và mẫu số trong đó đều có số nguyên, Mathicala sẽ giảm các phân số càng xa càng tốt và sau đó trình bày cho bạn

128/198893132162463319205625

Tất nhiên, bạn có thể sử dụng phao bất cứ khi nào bạn muốn, nhưng nói chung, nếu đầu vào của bạn không chứa phao, kết quả của bạn sẽ chính xác.

Độ dài 4 đoạn

Here

Đã đến lúc chúng ta bắt đầu với sự giàu có của những người xây dựng điên rồ. Trên đây là những gì nó nói trên tin và (đối với tôi) đánh giáGeoPosition[{51.51, -0.09}] .

Độ dài 3 đoạn

x-x

Chỉ để giới thiệu Factoid ban đầu : các công việc trên ngay cả khi xchưa được xác định và thực sự sẽ dẫn đến 0trường hợp đó.

Độ dài 2 đoạn

3x

Nhân thông qua vị trí kề nhau! Nếu rõ ràng là một định danh kết thúc và một số nhận dạng khác bắt đầu, bạn không cần một* hoặc thậm chí khoảng trắng để nhân chúng lại với nhau. Điều này hoạt động với khá nhiều thứ, bao gồm cả chuỗi và biến chưa có giá trị. Rất thuận tiện cho việc chơi golf. ;)

Độ dài 1 đoạn

π

Đoán xem, đó là Pi. Và trên thực tế, đó không phải là một số biểu diễn dấu phẩy động gần đúng, chính xác là Pi - vì vậy tất cả các loại hàm lượng giác và lượng giác phức tạp này được sử dụng sẽ mang lại kết quả chính xác nếu chúng được biết.

Factoid

Mathematica có thể thực hiện thao tác tượng trưng, ​​vì vậy các biến không cần giá trị để làm việc với chúng.


19
Đoạn 23 khá tò mò. Nếu bạn đã làm Translate[Scale[Rectangle, 80], {0, 0, 100}]từ lớn Rectanglesẽ xuất hiện nổi trước màn hình của bạn?
Sở thích của Calvin

53
@ Calvin'sHobners Chỉ cần thử nó ... đã chọn một sự zbù đắp đáng tiếc ... đánh vào mặt tôi.
Martin Ender

45
Trang web chính thức của Mathicala nên hoàn toàn liên kết đến điều này.
Caridorc

7
@ durron597 Bằng cách giữ nó làm biểu tượng và làm cho tất cả các hàm lượng giác và phức tạp của bạn nhận thức được việc cần làm với một số thập phân.
Martin Ender

16
Khi tôi thấy rằng huyền thoại Martin Büttner đã đăng một câu trả lời Mathicala, tôi biết rằng tôi không có cơ hội chiến thắng trong một cuộc thi nổi tiếng. Bạn là một phù thủy thực sự.
Alex A.

187

Ngôn ngữ lập trình khét tiếng Shakespeare

Ngôn ngữ lập trình Shakespeare được tạo ra vào năm 2001 bởi hai sinh viên Thụy Điển, Karl Hasselström và Jon slund, và nó kết hợp, như các tác giả tuyên bố ,

tính biểu cảm của BASIC với sự thân thiện với người dùng của ngôn ngữ lắp ráp.

Câu trả lời đi từ trên xuống dưới. Ngoài ra, thường thấy tôi đề cập đến các đoạn cũ hoặc trước đó.

( liên kết cho chính tôi: chỉnh sửa )

Factoid:

Mã của Shakespeare giống như người ta mong đợi, một vở kịch của Shakespeare, trong đó các biến là các ký tự trong vở kịch và giá trị của chúng thay đổi khi chúng bị "xúc phạm" hoặc khen ngợi ".

Độ dài 1 đoạn:

I

Mã của Shakespeare được chia thành Công vụ và các hành vi được phân chia trong Cảnh, cho các nhân quả "nhảy tới". Xác định một Đạo luật Act Icó nghĩa là nó sẽ là đoạn mã đầu tiên được chạy, theo ví dụ - nhưng không chỉ.

Độ dài 2 đoạn:

as

Được sử dụng trong một so sánh giữa hai "ký tự".

Độ dài 3 đoạn:

day

Đến bây giờ, bạn có thể có cảm giác rằng SPL rất dài dòng. Và kỳ lạ. Và bạn đã thấy gì chưa. day, trong SPL, là 1. Tất cả các danh từ "tích cực" và "trung tính" được coi là 1, cũng như tất cả các danh từ "phủ định" -1.

Độ dài 4 đoạn:

rich

richgì Một tính từ. Trong SPL, tính từ làm cho giá trị của danh từ mà chúng được gắn vào nhân với hai. Xem thực hiện trên đoạn 14.

Độ dài 5 đoạn:

Act I

Thực hiện đoạn trích đầu tiên. Tất cả các hành vi có thể được đưa ra một tiêu đề, chẳng hạn như Act I: Hamlet must die!, vì mọi thứ sau chữ số La Mã bị bỏ qua bởi trình phân tích cú pháp.

Độ dài 6 đoạn:

better

Mọi ngôn ngữ đều có điều kiện và SPL cũng không ngoại lệ. Ngoại trừ, vì đây là một ngôn ngữ có cú pháp dài (và tôi đã đề cập đến nó có gì lạ không?), Các câu điều kiện của nó sẽ dài. Có Ophelia hỏi Juliet Am I better than you?giống như có if (Ophelia > Juliet)hầu hết các ngôn ngữ "bình thường". Và, tất nhiên, bạn có thể hỏi một cách khác: Am I not better than you?là tương đương với if (Ophelia < Juliet). Và bạn đã có thể đoán cách =dịch sang SPL: as good as- sử dụng đoạn mã 2.

Tuy nhiên, good/betterkhông phải là cách duy nhất để so sánh trong ngôn ngữ shakesperian này, bạn có thể sử dụng bất kỳ tính từ nào. Nguyên tắc tương tự của đoạn 3 cũng được áp dụng ở đây, với các tính từ "dương" có giá trị >, trong khi các tính từ "âm" có nghĩa <.

Độ dài 7 đoạn:

Juliet:

Đây là lời gọi của một biến; sau này, hướng dẫn / tuyên bố của anh ấy / cô ấy / bất cứ điều gì sẽ làm theo.

Một hạn chế của SPL là nó có số lượng biến giới hạn: Romeo, Juliet, Hamlet, Ophelia, MacBeth, v.v. là một vài ví dụ về "ký tự" sẽ xuất hiện trên chương trình Shakesperian.

Độ dài 8 đoạn:

[Exeunt]

[Exeunt]được đặt khi tất cả "nhân vật" rời khỏi "sân khấu". Hy vọng rằng tôi có thể giải thích thêm một chút về sau về sự tương tác giữa các nhân vật. Nói chung là hướng dẫn cuối cùng của bất kỳ chương trình SPL nào, mặc dù [Exeunt]không cụ thể là "ký tự" đầu cuối của ngôn ngữ. Để biết ví dụ khác, xem đoạn 27.

Độ dài 9 đoạn:

as bad as

Chín ký tự chỉ để đại diện cho một =đoạn - sử dụng đoạn trích 2. Tôi đã đề cập rằng SPL là lạ chưa? Xem đoạn trích 30 để biết ví dụ. (và vâng, có nhiều hơn một cách để xuất nó)

Độ dài 10 đoạn:

difference

Một cách đại diện lạ mắt -, một phép trừ. Bạn có thể có các phép toán trên SPL, mặc dù có thể bạn sẽ cần cả ngày để làm cho đúng.

Factoid (vì tôi đã xoay sở để đạt được mười đoạn mã, hãy nghỉ ngơi một chút và có một thông tin khác về SPL)

Nếu bạn muốn chạy mã shakesperian của mình trong tất cả vinh quang của nó, thì có trang web này - tôi vẫn đang thử nghiệm nó, vì tôi đã phát hiện ra nó thậm chí không năm phút trước. Cũng có một cách để dịch nó sang C bằng một trình dịch .

Một trang web khác để chạy mã SPL là trang này hoạt động bằng cách dịch nội bộ mã SPL sang ngôn ngữ bí truyền khác: Oracle PL / SQL.

Độ dài 11 đoạn:

[Exit Romeo]

Đúng! Cuối cùng tôi có thể nói về sự tương tác giữa các nhân vật! Để thay đổi giá trị của nó hoặc tương tác với người khác, một "nhân vật" phải ở trên sân khấu - bước vào [Enter Romeo]. Nếu một ký tự được gửi đến nhưng không có, có lỗi thời gian chạy và chương trình dừng lại. Bởi vì, trong SPL, giá trị của các biến được đặt theo số lượng tên mà chúng được khen ngợi - hoặc bị xúc phạm - bởi các nhân vật khác trên sân khấu. Tôi cảm thấy rằng tôi nên đưa ra một ví dụ để xóa một số nhầm lẫn mà lời giải thích khập khiễng của tôi có thể tạo ra, nhưng có lẽ tốt nhất là trì hoãn một vài đoạn.

Độ dài 12 đoạn:

Remember me.

SPL khá "cơ bản", ổn thôi - nhưng nó có ngăn xếp! Khi, ví dụ, Romeo bảo Juliet "nhớ anh ta", anh ta thực sự nói với người mình yêu để đẩy giá trị của Rome vào ngăn xếp của cô. Popping giá trị được thực hiện với Recall your happy childhood!, hoặc Recall your love for me, hoặc về cơ bản bất kỳ câu nào bắt đầu bằng Recall- phần còn lại chỉ là nghệ thuật, như đoạn 22.

Độ dài 13 đoạn

Let us return

Cách Shakesperian có a goto. Và đây là lúc Công vụ và Cảnh có ích. Nếu Romeo nói với Juliet we shall return to Act II(vâng, một lần nữa, có nhiều cách viết nó), chương trình sẽ chuyển đến phần cụ thể của mã. Nó cũng được nhìn thấy cùng với các tuyên bố có điều kiện.

Độ dài 14 đoạn

my little pony

Vâng, đó là một loạt trở lại trong những năm 80. Đây rồi 2*1. Tại sao? Bởi vì a ponylà một danh từ (phần nào) tích cực và littlelà một tính từ. Vì vậy, nhớ đoạn 3 và 4, chúng tôi có little = "2 *"pony = "1".

Độ dài 15 đoạn

Speak thy mind!

Trong một chương trình SPL, bạn sẽ thấy điều này (hoặc Speak your mind!, giống nhau) rất nhiều . Điều này về cơ bản xuất giá trị của từng "ký tự" bằng chữ số, chữ cái hoặc bất cứ thứ gì khác, tùy thuộc vào bộ ký tự được sử dụng bởi máy tính của bạn. Cũng có Open your mind.điều đó gần như tương tự, mặc dù chỉ xuất ra ở dạng số.

Độ dài 16 đoạn

You are nothing!

Khi ai đó nói với bạn điều này trong cuộc sống thực, bạn sẽ cảm thấy chán nản. Khi Ophelia nói điều này với Hamlet trong lập trình Shakespearian, Hamlet cảm thấy vô giá trị. Điều đó có nghĩa là gì? Đó Hamlet = 0.

Độ dài 17 đoạn

Ophelia, a wench.

Trong một kịch bản phim, trước khi vở kịch thực sự bắt đầu, các nhân vật phải được trình bày. Trong hầu hết các ngôn ngữ lập trình, các biến cũng phải được khai báo trước khi sử dụng. Thấy rằng SPL là ngôn ngữ lập trình giống với kịch bản phim, đây là cách bạn khai báo các biến của nó, bằng cách nêu rõ các biến xuất hiện trong chương trình.

Nhưng "a wench" nghĩa là gì? Có nghĩa là đó là một tên loại dữ liệu cụ thể (và mát mẻ)? Chà ... tôi ghét làm bạn thất vọng, nhưng điều đó chẳng có nghĩa gì cả: mọi thứ sau dấu phẩy đều bị người phân tích cú pháp coi thường, nghĩa là bạn có thể đặt ở đó những trò xấu xa nhất mà bạn có thể nghĩ ra.

Độ dài 18 đoạn

lying sorry coward

-4cho tất cả các sinh vật trên trái đất. Tại sao? Bởi vì 2*2*(-1) = -4.

Độ dài 19 đoạn

Romeo:
 Remember me.

Cuối cùng!!! Cuối cùng tôi có thể xuất ra một hướng dẫn cú pháp chính xác đầy đủ (mặc dù ngắn)! Đây là cách bạn sử dụng đoạn 12: đầu tiên bạn tuyên bố ai đang nói, sau đó trên dòng tiếp theo bạn viết "đoạn hội thoại". Thông thường, chỉ có hai "ký tự" trên sân khấu, để tránh làm cho trình phân tích cú pháp buồn và bối rối. Khi bạn cần một "nhân vật" khác, bạn lấy một cái từ sân khấu và thay thế anh ta bằng cái mới.

Độ dài 20 đoạn

cube of thy codpiece

Tôi muốn giải thích thêm một chút cho cái này, nhưng, sự thật mà nói, những điều tôi nghĩ ra vẫn còn quá ngắn cho chiều dài đoạn trích này. Và, vì vậy, tôi mang đến cho bạn cái này, kết thúc là -1- bởi vì (-1) 3 = -1 (và codpiecelà một danh từ "phủ định", vì chúng không thoải mái và tất cả). SPL hiểu một số phép toán số học phức tạp hơn như một số lũy thừa và căn bậc hai.

Factoid (một cái khác, vì chúng ta đã đạt được một cột mốc khác)

"Chương trình Hello World" trong Shakesperian có 89 dòng và dài hơn 2400 ký tự, như được thấy ở đây .

Độ dài 21 đoạn

Listen to your heart.

Trong đoạn 15 bạn đã xuất ra một cái gì đó; Ở đây, bạn nhập một số cho chương trình. Nếu bạn muốn nhập một ký tự, Open your mind.thay vào đó bạn sẽ sử dụng . Và, không cần phải nói, giá trị này sẽ được lưu trữ trong "ký tự" được nói đến.

Độ dài 22 đoạn

Recall your childhood!

Việc bật một số nguyên từ một ngăn xếp được thực hiện với điều này, như được giải thích trên đoạn trích 12. Khi, ví dụ, Ophelia nói với Hamlet câu đã nói ở trên, nó khiến Hamlet lấy một số nguyên từ ngăn xếp của mình và giả sử giá trị đó.

Tất nhiên, miễn là từ đó recallbắt đầu câu, bạn có thể điền vào phần còn lại với khá nhiều thứ mà tâm trí shakesperian sáng tạo của bạn mong muốn.

Độ dài 23 đoạn

Are you better than me?

Thực hiện đoạn trích 6. Khi một "nhân vật" đưa ra một câu hỏi như thế này cho câu hỏi khác, những gì anh / cô ấy đang làm tương đương với if (x > y)các ngôn ngữ lập trình phổ biến hơn. Việc theo dõi hướng dẫn này phải bị trì hoãn cho đến khi tôi có sẵn nhiều nhân vật hơn.

Độ dài 24 đoạn

[Enter Romeo and Juliet]

Có, "ký tự" có thể nhập theo cặp. Không bắt buộc phải có một "nhân vật" bước vào sân khấu, bị theo dõi bởi một người khác.

Độ dài 25 đoạn

remainder of the quotient

25 ký tự chỉ để viết a %. 25 ký tự để có phần còn lại của một bộ phận. Và để sử dụng nó? Chà, điều đó còn lớn hơn nữa - xem đoạn 75.

Độ dài 26 đoạn

Let us return to scene II.

Đây là, một gotoSPL, hoạt động như người ta mong đợi trong ngôn ngữ lập trình. Một điều là: bạn có thể nhảy giữa các cảnh trong cùng một hành động và giữa các hành vi; nhưng bạn không thể nhảy giữa các cảnh trong các hành vi khác nhau.

Độ dài 27 đoạn

[Exeunt Ophelia and Hamlet]

Khi có nhiều hơn một "nhân vật" rời khỏi sân khấu, thay vì Exitvà giữ truyền thống với bản chất sân khấu của SPL, từ "Latin" trong tiếng Latin được sử dụng. Đôi khi nó có thể được thay thế chỉ bằng đoạn 8.

Độ dài 28 đoạn

Scene I: Ophelia's flattery.

Tuyên bố một cảnh. Như bạn đã có thể mong đợi nếu bạn đã đối phó với tôi, điều quan trọng là Scene I, phần còn lại là lông tơ nghệ thuật.

Đã có một số trình biên dịch được thực hiện (như trình biên dịch này biên dịch từ SPL sang C, được viết bằng Python ) thay vào đó đề cập đến văn bản sau khi đánh số Act / Cảnh. Mặc dù logic hơn (sau tất cả, trong một vở kịch, việc các nhân vật nói những câu như "chúng ta hãy quay lại Act I" có thể bị coi là ngớ ngẩn), tôi vẫn theo cách ban đầu.

Độ dài 29 đoạn

You pretty little warm thing!

Có, một hằng số khác (vì chúng ta cần nhiều ký tự hơn để có các phép toán số học). Điều này là bằng 8, bởi vì 2*2*2*1 = 8.

Độ dài 30 đoạn

You are as cowardly as Hamlet!

Nói điều này với, ví dụ, Romeo, có nghĩa là Romeo = Hamlet. Giống như đoạn 9.

Factoid (vâng, một mốc khác đạt được!)

Ngôn ngữ này đã được tạo cho một bài tập trong khóa học Phân tích cú pháp - do đó, không có trình biên dịch SPL nào được tạo bởi các tác giả. Hơn nữa: có vẻ như các tác giả của SPL đã cắt đứt mối quan hệ với sáng tạo của họ, vì dường như không có gì được sửa đổi trong ngôn ngữ kể từ năm 2001 ...

Độ dài 31 đoạn

Am I as horrid as a flirt-gill?

Vâng, tôi biết, đó là phần lặp lại đoạn trích 23, mặc dù, ở đây, chúng tôi đang so sánh "nhân vật" nói chuyện với "flirt-gill" (của, nếu bạn thích, if (Ophelia == -1)). Vấn đề là ...

Độ dài 32 đoạn

If so, let us return to scene I.

... bây giờ tôi có thể giới thiệu thenSPL, và bước nhảy có điều kiện và cách thức thực hiện các vòng lặp của Shakesperian. Ví dụ, bạn có thể khiến Romeo đảm nhận giá trị 0, tăng giá trị của mình trong khi thực hiện một số nhiệm vụ khác và dừng lại khi đạt 10, tiếp tục với chương trình sau đó.

Độ dài 33 đoạn

If not, let us return to scene I.

Thay vào đó, chỉ cần nhắc nhở rằng, thay vào đó, chúng ta có thể chuyển sang cảnh khác nếu điều kiện chúng tôi đã kiểm tra là sai .

Độ dài 34 đoạn

Open your mind! Remember yourself.

Hai hướng dẫn liên tiếp, yippie! Người đầu tiên đọc một ký tự, người thứ hai đẩy nó vào ngăn xếp bộ nhớ của nhân vật kia.

Độ dài 35 đoạn

Act I: Death!

Scene I: Oh, shit.

Cách thích hợp để tuyên bố một Đạo luật và một Cảnh. Thêm nghệ thuật trang nhã.

Độ dài 36 đoạn

Thou art as sweet as a summer's day!

Một cách khác để nói rằng "nhân vật" được nói đến sẽ nhận được giá trị 1- bởi vì những ngày hè thật đẹp và dễ chịu.

Độ dài 37 đoạn

Art thou more cunning than the Ghost?

Ophelia đặt câu hỏi này cho Hamlet nghĩa là, dịch nó sang ngôn ngữ lập trình ít đọc hơn , if (Hamlet > the Ghost). Đó là đoạn trích 23 lần nữa, vâng - nhưng nó sẽ cho bạn thấy rằng không bắt buộc phải hỏi các "nhân vật" nếu họ tốt hơn nhau: bất kỳ câu hỏi nào khác cũng sẽ hoạt động.

Độ dài 38 đoạn

[Enter the Ghost, Romeo and the Ghost]

Có, tôi đang gọi một "nhân vật" hai lần - bởi vì tôi muốn chương trình gây ra lỗi cho tôi. Gọi một "nhân vật" đã có trên sân khấu hoặc nói với một người vắng mặt để thoát ra, sẽ gây ra sự đau buồn lớn cho trình phân tích cú pháp / trình biên dịch.

Độ dài 39 đoạn

the sum of a fat lazy pig and yourself!

Hướng dẫn đầy đủ sẽ tốt hơn khi tìm kiếm điều này, tôi sẽ cung cấp cho bạn điều đó, nhưng ... đây là hoạt động số học đầu tiên của chúng tôi! Tất cả có nghĩa là gì? Chà, piglà một con vật bẩn (mặc dù ngon), vì vậy nó tương đương với -1, có hai tính từ, nghĩa là fat lazy pigbằng nhau 2*2*(-1) = -4. Nhưng còn cái gì yourself? Đó là một đại từ phản xạ, không phải là tên hay tính từ. Chà, hãy nhớ rằng SPL dựa trên các cuộc đối thoại giữa các "nhân vật"; do đó, yourselfđề cập đến "nhân vật" khác trên sân khấu. Vì vậy, chúng tôi đến cuối cùng và chúng tôi phát hiện ra rằng "tổng của một con lợn lười béo và chính bạn", trên thực tế , -4 + x.

Độ dài 40 đoạn

the sum of a squirrel and a white horse.

Vâng, một khoản tiền khác, nhưng số tiền này đơn giản hơn đoạn 39. Đây chỉ là 1 + 2- 3nếu toán học của tôi đúng.

Factoid (vẫn còn với tôi sau bốn mươi đoạn phim nghệ thuật này? Bạn xứng đáng nhận được giải thưởng.)

SPL, trong phiên bản 1.2.1, có thể được tải xuống ở đây .

Độ dài 41 đoạn

Juliet:
 Speak thy mind!

[Exit Romeo]

Đôi khi, "nhân vật" chỉ được gọi trên sân khấu để thay đổi giá trị của họ - điều mà trên một vở kịch thực sự sẽ là một điều gì đó khá kỳ quái. Dù sao, ở đây, Juliet làm cho Romeo yêu dấu của mình in giá trị được lưu trữ của mình, sau đó anh rời khỏi sân khấu.

Độ dài 42 đoạn

Speak YOUR mind! You are as bad as Hamlet!

Một lần nữa hai hướng dẫn trong một dòng (chúng ta có thể có nhiều hướng dẫn, nhưng độ dài đoạn trích không cho phép điều đó); ở đây chúng ta có một "ký tự" bảo người khác xuất giá trị của nó và giả sử giá trị nào Hamlet có. Gây nhầm lẫn? Mayhap.

Độ dài 43 đoạn

Am I as horrid as a half-witted flirt-gill?

Juliet hỏi điều này không có nghĩa là cô ấy có lòng tự trọng thấp (mặc dù có thể trong đời thực); nó chỉ đơn giản là một thứ khác if, như đoạn trích 23 và 37. Ồ, tôi gần như quên mất: điều này dịch ra if (Juliet == -2).

Độ dài 44 đoạn

You are as evil as the square root of Romeo!

Vâng, căn bậc hai là xấu xa, bạn không biết? Dù sao, hướng dẫn này đủ đơn giản để hiểu những gì nó làm: thuộc tính "ký tự" được nói đến giá trị của căn bậc hai của giá trị được lưu trữ trong Romeo.

Độ dài 45 đoạn

Hamlet:
 Art thou more cunning than the Ghost?

Đoạn 37 được viết đúng với nhân vật đang nói lời thoại.

Độ dài 46 đoạn

the product of a rural town and my rich purse.

Được rồi ... dù sao đi nữa, SPL có thể là ngôn ngữ duy nhất trên thế giới cho phép bạn nhân thị trấn với ví. Điều này có nghĩa là (2*1)*(2*1), nếu tôi không nhầm lắm, thì bằng4 .

Độ dài 47 đoạn

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

Tôi sẽ cung cấp cho bạn rằng: nó có thể là một trong những cuộc đối thoại kỳ lạ nhất trong lịch sử. Nhưng đó là những gì bạn nhận được khi bạn chọn một ngôn ngữ kỳ lạ để giới thiệu. Tóm lại, Romeo và Juliet đang nói với nhau về việc đưa ra các giá trị của họ.

Độ dài 48 đoạn

You lying fatherless useless half-witted coward!

Dịch nó trực tiếp , 2*2*2*2*(-1). -16, đúng?

Độ dài 49 đoạn

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

Một ví dụ về cách chấm dứt một chương trình trong SPL. Bạn có thể khai báo một cảnh cụ thể cho cảnh đó (mặc dù không bắt buộc), sau đó Hamlet yêu cầu một "nhân vật" khác xuất giá trị của chúng, sau đó tất cả đều thoát khỏi giai đoạn. Và vâng, tất cả bọn họ phải rời khỏi sân khấu.

Độ dài 50 đoạn

Othello, a young squire.
Lady Macbeth, an old fart.

Trình bày "nhân vật" nhiều hơn, trước các hướng dẫn thích hợp. Như mọi khi, điều duy nhất quan trọng với trình biên dịch là OthelloLady Macbeth vì vậy, phần còn lại của dòng là dành cho ...

Một điều nữa: các "nhân vật" không cần phải liên quan với nhau để xuất hiện trong chương trình SPL - vì vậy bạn có thể có Romeo, Othello và Hamlet trong cùng một vở kịch.

Factoid (nửa thế kỷ của những điều này? Phew! Sau này tôi nghĩ rằng tôi sẽ ghét William Shakespeare ...)

Trình dịch SPL sang C, được đề cập trước đây và được phát triển bởi những người tạo SPL, dựa trên FlexBison .

Độ dài 51 đoạn

Othello:
 Recall your great dreams. Speak your mind!

(Quá mệt mỏi với Romeo, Juliet và Hamlet ... chúng ta hãy mang đến Othello, để thay đổi!)

Recall, như bạn có thể đoán, là chìa khóa ở đây. "Nhân vật" mà Othello đang giải quyết sẽ lấy một giá trị từ ngăn xếp của anh ấy / cô ấy, giả sử giá trị đó và sau đó, sẽ xuất ra nó.

Độ dài 52 đoạn

Thou art as pretty as the sum of thyself and my dog!

Một khoản tiền khác. Ngáp Giả sử điều này được gửi đến Hamlet, có nghĩa là Hamlet = Hamlet + 1. Hoặc Hamlet += 1. Hoặc làHamlet++ .

Độ dài 53 đoạn

Romeo:
 You are as vile as the sum of me and yourself!

À, vâng, một điều mà tôi đã quên đề cập trước đây: các "nhân vật" biết nói có thể tự đề cập đến chính họ.

Độ dài 54 đoạn

Juliet:
 Is the sum of Romeo and me as good as nothing?

Một ví dụ khác về đoạn trích trước, được bao gồm trong một điều kiện. Vì vậy, những gì chúng ta có ở đây là if (Romeo + Juliet == 0).

Độ dài 55 đoạn

Juliet:
 You are as lovely as the sweetest reddest rose.

Vì vậy, ở đây, Juliet đang ca ngợi "nhân vật" mà cô ấy đang nói đến (giả sử đó là Romeo, vì lợi ích của Shakespeare), tuyên bố rằng anh ấy / cô ấy là 4. Vâng, một sự gán giá trị khác.

Độ dài 56 đoạn

Othello:
 You lying fatherless useless half-witted coward!

Đoạn 48 được thực hiện đúng cách, với một "ký tự". Nếu bạn quá lười để cuộn lên (như tôi muốn), điều này có nghĩa là người bị xúc phạm đang nhận giá trị -16.

Độ dài 57 đoạn

Romeo:
 If not, let us return to Act I. Recall thy riches!

Tôi đã giải thích cách các điều kiện hoạt động trên SPL trên cơ sở chung; tuy nhiên, một phân tích nội tuyến hơn là cần thiết. Chúng ta không có elseở đây: ví dụ, trong ví dụ này, nếu điều kiện không thành công, chương trình sẽ trở lại Act I; nhưng nếu nó là sự thật, nó sẽ tiếp tục hướng dẫn tiếp theo, đó là mộtRecall - một pop từ ngăn xếp, đó là.

Độ dài 58 đoạn

Romeo:
 You are as disgusting as the square root of Juliet!

Lấy đoạn trích 44 và trình bày cách trình bày hướng dẫn. Nếu đây là cuộc đối thoại giữa Romeo và Othello, thì chúng ta có thể dịch nó sang Java dưới dạng Othello = Math.sqrt(Juliet).

Độ dài 59 đoạn

Othello:
 You are as vile as the sum of yourself and a toad!

Được rồi, nếu Othello đang nói chuyện với Romeo, điều này sẽ tương đương với Romeo+(-1); Romeo--, cho ngắn gọn. Khá cơ bản đúng không? Đó là SPL dành cho bạn.

Độ dài 60 đoạn

Is the quotient between the Ghost and me as good as nothing?

Nói tóm lại, if (The Ghost/Hamlet == 0)giả sử "cái tôi" thuộc về Hamlet.

Độ dài 61 đoạn

Thou art as handsome as the sum of yourself and my chihuahua!

Khi bạn bóc lớp và lớp từ và lời lăng mạ, bạn nhận thấy rằng SPL gần như là một điều cơ bản, không có chức năng và công cụ tuyệt vời. Vì vậy, chúng tôi có tải và tải các hàm số học trên cơ thể của chương trình. Vì vậy, nếu cái này được gửi đến Juliet, nó sẽ tương đương với Juliet++.

Độ dài 62 đoạn

twice the difference between a mistletoe and a oozing blister!

Vâng, vâng, nhiều hoạt động số học. Một cách thô bạo, 62 byte SPL này có thể được dịch sang 2*(1-2*(-1)). Đây sẽ là một ngôn ngữ chơi golf khá tuyệt vời, phải không? Đúng.

Độ dài 63 đoạn

You lying stupid fatherless rotten stinking half-witted coward!

Đoạn 48 xuất ra -16, đoạn này bằng -64 : 2*2*2*2*2*2*(-1).

Độ dài 64 đoạn

your coward sorry little stuffed misused dusty oozing rotten sky

Từ những gì tôi hiểu về SPL, điều này là hoàn toàn hợp pháp. Bạn có rất nhiều tính từ xúc phạm những gì tiến hành một danh từ "tích cực". Vì tính từ không có sự phân biệt đặc biệt cho dù chúng có âm hay không (giá trị duy nhất của chúng là nhân số ở bên phải của chúng với hai), chúng ta có thể có những câu hoàn toàn ngớ ngẩn như thế này. Mà tương đương với 256. Bởi vì 2*2*2*2*2*2*2*2*1=256.

Độ dài 65 đoạn

You are nothing! You are as vile as the sum of thyself and a pig.

Hmm, rất ghét, phải không? Vì vậy, những gì chúng ta có ở đây tương đương với y=0; y=y+(-1);Có lẽ có thể đã bị "đánh gôn" You are a pig!, nhưng heh.

Độ dài 66 đoạn

You are as beautiful as the difference between Juliet and thyself.

Vì vậy, trừ Juliet khỏi chính mình, heh? Điều này khá đơn giản để giải mã: Romeo=Juliet-Romeo;giả sử Romeo đang được nói đến.

Độ dài 67 đoạn

Juliet:
 Am I better than you?

Romeo:
 If so, let us proceed to Act V.

Làm thế nào hầu hết các điều kiện làm việc trên SPL. Bạn kiểm tra biểu thức và, nếu nó đúng (hoặc không: xem đoạn 33), bạn chuyển sang phần khác của chương trình; nếu không, bạn sẽ tiếp tục câu tiếp theo.

Độ dài 68 đoạn

The Ghost:
 You are as small as the sum of yourself and a stone wall!

Vâng, vâng, tôi đang nhận được một chút đơn điệu. Nhưng SPL là như thế. Như tôi đã nói trước đó một chút, các biểu thức của nó là một hỗn hợp của các phép toán số học. Vì vậy, đây là một sự gia tăng khác - vì stone walllà một "danh từ" trung tính.

Độ dài 69 đoạn

Thou art as disgusting as the difference between Othello and thyself!

Thay vì một khoản tiền, chúng tôi có phép trừ giữa hai nhân vật, Othello và bất cứ ai đang được nói chuyện.

Độ dài 70 đoạn

You are as handsome as the sum of Romeo and his black lazy squirrel!

Chúng tôi trở lại bổ sung, vâng - gọi tôi là công thức, heh. Chúng tôi dịch cái này sang Romeo + 2*2*1.

Độ dài 71 đoạn

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

Một cảnh có thể nhỏ như thế này. JulietBước vào sân khấu, Othello bảo cô xuất ra giá trị được lưu trữ của mình, sau đó cô lại bước ra khỏi sân khấu.

Độ dài 72 đoạn

twice the difference between a mistletoe and an oozing infected blister!

Thêm một phép toán số học - bởi vì SPL được đánh đố với chúng. Chúng tôi có thể dịch cái này sang 2*(1-2*2*(-1)).

Độ dài 73 đoạn

You are nothing! Remember me. Recall your unhappy story! Speak your mind!

Bốn hướng dẫn liên tiếp?! Tôi thực sự tự hào về bản thân mình. Dù sao đi nữa, giả sử đây là cuộc đối thoại giữa Romeo và Juliet (và anh ấy đang nói): điều này có nghĩa là giá trị của Juliet bắt đầu từ 0; sau đó, Juliet sẽ đẩy giá trị của Romeo vào bộ nhớ của cô ấy, bật nó lên và xuất nó ở dạng đã nhập. Đơn giản phải không?

Độ dài 74 đoạn

You are as sweet as the sum of the sum of Romeo and his horse and his cat!

Vâng, vâng, ví dụ nhàm chán, tôi biết. Nhưng đây là X = (Romeo + 1) + 1.

Độ dài 75 đoạn

Is the remainder of the quotient between Othello and me as good as nothing?

Vâng, điều này là khá đơn giản. Nếu kỹ năng giải mã của bạn bị trục trặc, nó chuyển thành if (Othello % X == 0).

Độ dài 76 đoạn

Thou art as rich as the sum of thyself and my dog! Let us return to scene I.

Nhảy từ đoạn 26 với một biểu thức trước nó. A gototrên SPL không phải lúc nào cũng được tìm thấy gần một điều kiện, nó có thể giống như thế này - và tất nhiên, loại này gotosẽ luôn được tìm thấy ở cuối Đạo luật hoặc Cảnh, vì các hướng dẫn sau sẽ không bao giờ được biên dịch / thực hiện. Hướng dẫn đầu tiên khá đơn giản : x=x+1.

Đoạn dài 77

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

Vì vậy, chúng tôi có Juliet và Hamlet trên sân khấu; nhưng chúng tôi cần giá trị từ Romeo. Do đó, để giải phóng trình biên dịch khỏi cơn đau đầu rất khó chịu, trước tiên, chúng tôi loại bỏ Hamlet khỏi sân khấu (mặc dù đó có thể là Juliet là người đi), chúng tôi nói với Romeo lên sân khấu, Juliet cho anh ta một hướng dẫn để xuất ra một số (xem phần giải thích của đoạn trích 21), sau đó Romeo rời khỏi sân khấu và Hamlet trở lại. Khá đơn giản và đơn giản.

Độ dài 78 đoạn

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

Vì vậy, Ghost (người cha quá cố của Hamlet) đang bảo Lady Macbeth đưa ra giá trị của mình, trong khi cô ra lệnh cho Ghost đọc một số và đẩy nó vào ngăn xếp của mình.


32
Điều này cực kỳ thú vị và hình ảnh hồ sơ của bạn là một sự phù hợp hoàn hảo, anh ấy trông giống hệt như những gì tôi tưởng tượng về một lập trình viên SPL sẽ như thế nào.
overactor

3
@overactor Tôi không biết nên bị xúc phạm hay tự hào khi được ví như Gumby. ^ _ ^
Rodolfo Dias

9
Điều kỳ lạ là đây KHÔNG phải là ví dụ khó đọc nhất ở đây ... và dường như bị ràng buộc vì "ít thực tế nhất".
HRRambler

6
ROFL ở đây +1 để giúp bạn trên đường - Một lần nữa cho đến khi vi phạm Rodolfo!
HRRambler

3
@RodolfoDias Bạn có thể bắt đầu. Tôi đang chờ đợi để xem chúng. Bạn có 120 phiếu bầu.
ghosts_in_the_code

176

Thành phố

Factoid

Piet là một ngôn ngữ lập trình trong đó mã nguồn bao gồm các hình ảnh. Luồng chương trình bắt đầu với pixel trên cùng bên trái và di chuyển xung quanh hình ảnh giữa các pixel và các nhóm pixel cho đến khi nó kết thúc.

Đối với mức độ dễ đọc, các chương trình Piet thường được hiển thị trong một phiên bản mở rộng. Trong trường hợp như vậy thuật ngữcodel này được sử dụng để mô tả một nhóm các pixel có cùng màu tương ứng với một pixel riêng lẻ trong ảnh nguồn.

Đối với thử thách này, vì Piet không sử dụng các ký tự, một codel trên mỗi phiếu sẽ được sử dụng cho các chương trình mẫu.

1 Codel

1 Codel

Đây là một chương trình hợp lệ, nó không làm gì và chấm dứt. Luồng điều khiển bắt đầu ở pixel trên cùng bên trái (chỉ) và không có lối thoát, kết thúc chương trình.

Pixel trong trường hợp này có thể là bất kỳ màu nào cho cùng một hiệu ứng chính xác.

2 mã

2 mã

Điều này sẽ liên tục đọc các ký tự từ stdin và giữ tổng cộng các giá trị unicode của chúng (mặc dù không có gì được thực hiện với tổng số này và nó không được hiển thị).

Luồng progam di chuyển qua lại giữa 2 codel, vì cách duy nhất thoát ra khỏi cái này là vào cái kia. Các lệnh trong piet được thực thi bằng cách di chuyển từ một codel hoặc vùng này sang vùng khác, tùy thuộc vào sự khác biệt về màu sắc và độ sáng của 2 vùng. Các inputlà lệnh di chuyển ngay từ trái sang và sau đó addlà từ phải sang trái. Trên addlệnh đầu tiên , sẽ không có gì xảy ra vì chỉ có một giá trị trên ngăn xếp và đặc tả nói rằng các lệnh không có đủ giá trị khả dụng sẽ bị bỏ qua.

Chương trình này là một vòng lặp sẽ không bao giờ kết thúc, vì hầu hết các chương trình piet sẽ có kích thước cực kỳ nhỏ, vì phải mất ít nhất một vài codel để "bẫy" chính xác luồng chương trình và kết thúc nó.

3 loại tiền

3 loại tiền

Đây là một chương trình loại tiếng vang cơ bản, nó sẽ đọc một ký tự tại một thời điểm từ stdin và in nó ra thiết bị xuất chuẩn.

Một lần nữa đây là một vòng lặp vô hạn. Chương trình này bắt đầu bằng cách đi du lịch trái sang phải, mà hiện inputsau đó output. Chương trình sẽ tiếp tục chảy theo cùng một hướng bất cứ khi nào có thể. Tại codel màu xanh nhạt, lối thoát duy nhất là bắt đầu di chuyển ngược lại. Khi di chuyển ngược từ phải sang trái, nó cố gắng thực hiện subtractaddra lệnh, nhưng ngăn xếp trống để chúng trở thành không hoạt động.

4 loại tiền

4 loại tiền

In ra 2 đến stdout vô thời hạn.

Không phải là một chương trình đặc biệt thú vị về mặt chức năng, nhưng bây giờ cuối cùng chúng ta cũng có một số lượng lớn các loại tiền mã hóa, chúng ta có thể thể hiện dòng chảy nâng cao hơn một chút so với từ trái sang phải. Khi luồng chương trình cố gắng thoát khỏi một codel, đầu tiên nó sẽ thử hướng hiện tại. Nếu không thể (trong trường hợp này là do cạnh của hình ảnh), nó sẽ xoay 90 độ theo chiều kim đồng hồ và cố gắng thoát ra một lần nữa. Trong trường hợp này, chương trình đi xung quanh theo chiều kim đồng hồ 1 codel một lần, đưa push1 vào stack hai lần,add ing các cái lại với nhau, sau đó outputing kết quả.

5 loại tiền

5 loại tiền

Lặp đi lặp lại đọc một ký tự tại một thời điểm từ stdin và theo dõi tổng các giá trị unicode của chúng.

Đây thực chất là chức năng tương tự như phiên bản 2 codel, nhưng thách thức này là về cách thể hiện ngôn ngữ, và một trong những điều thú vị về piet là làm thế nào bạn có thể có những bức ảnh trông khác nhau làm điều tương tự.

Ở đây chúng ta thấy codel trắng lần đầu tiên, cho phép dòng chương trình trượt qua nó mà không cần thực hiện các hướng dẫn. Các codel đỏ và xanh làm tất cả các công việc ở đây. Đi từ màu xanh sang màu đỏ không làm gì cả vì nó băng qua con cá tuyết trắng ở giữa. Hai cái màu đỏ chỉ pushlà số 1 trên ngăn xếp và popnó quay trở lại khi nó di chuyển từ trái sang phải sau đó từ phải sang trái qua chúng, và sau đó qua codel trắng để không có lệnh nào được thực thi.

6 loại tiền

6 loại tiền

Một lần nữa, lặp lại chức năng trước đó với một cái nhìn khác. Đây là một chương trình echo khác đọc một ký tự tại một thời điểm từ stdin đến stdout.

Ở đây chúng tôi thấy codel đen đầu tiên của chúng tôi. Luồng chương trình không thể vào một codel đen, do đó, từ codel ánh sáng ở phía trên bên phải, chương trình sẽ không thoát ra được do cạnh hình ảnh, không thoát ra được do codel đen và bị trả lại trái vào codel đỏ . Các codel màu xanh và màu xanh lá cây là hoàn toàn trang trí, chương trình sẽ không bao giờ nhập chúng.

7 loại tiền

7 loại tiền

Một chương trình echo khác với một cái nhìn khác.

Ở đây chúng ta thấy các khối codel đầu tiên của chúng ta lớn hơn kích thước 1. Trong piet, bất kỳ khối codel liền kề nào có cùng màu được coi là một khối duy nhất. Kích thước của khối không quan trọng ngoại trừ khi thực hiệnpush lệnh, vì vậy chương trình này được xử lý chính xác như phiên bản 3 codel, ngoại trừ các màu khác nhau.

8 loại tiền

8 loại tiền

Đọc một số từ stdin và xuất ra hình vuông thành thiết bị xuất chuẩn, lặp đi lặp lại.

Luồng điều khiển là một mẫu theo chiều kim đồng hồ cơ bản giống như trong chương trình 4 codel. Bắt đầu từ trên cùng bên trái, các thao tác theo thứ tự là input, duplicate(đẩy một bản sao bổ sung của giá trị trên cùng của ngăn xếp lên ngăn xếp) multiply, output. Sau đó, nó pushđặt giá trị 1 lên ngăn xếp, trượt trên màu trắng để không có lệnh nào được thực thi và sau đó poptắt 1 ngăn xếp đó khi di chuyển từ codel phía dưới bên trái sang phía trên bên trái. Điều này đưa nó trở lại đầu chương trình với một ngăn xếp trống và nó lặp lại.

9 mã

9 mã

Thêm 1 + 2 = 3, rồi chấm dứt.

Bây giờ chúng ta có một chương trình có lớn hơn 2 codel ở cả hai chiều, cuối cùng chúng ta cũng có thể thiết lập một vùng sẽ bẫy chương trình và kết thúc chương trình thay vì lặp đi lặp lại mãi mãi. Hoạt động đầu tiên chuyển từ codel đỏ sang vùng đỏ sẫm là push1, sau đó chương trình quay và chảy xuống codel đỏ nhạt ở giữa và pushes có giá trị là 2. Chuyển từ màu đỏ nhạt sang màu vàng nhạt một addhoạt động. Thanh màu vàng nhạt phía dưới làm cho chương trình kết thúc vì không có cách nào để nó chảy ra vì tất cả các góc bị chặn.


Các chương trình cao 1 và 2 đang nhanh chóng trở nên xấu xí và không thú vị, vì vậy kể từ thời điểm này, tôi sẽ tập trung vào các con số cho phép ít nhất một vài codel theo mỗi hướng.

12 loại tiền

12 loại tiền

Cuối cùng, một chương trình làm một cái gì đó có thể được tranh luận là hữu ích (mặc dù nó vẫn còn một chút kéo dài). Đọc 2 số từ stdin liên tục và sau đó xuất tổng của chúng và thực hiện điều này nhiều lần.

Chương trình chảy từ trái sang phải qua 4 vạch màu 2 inputs nối tiếp theo addlệnh. Sau đó, nó di chuyển vào codel phía dưới bên phải và thực hiện mộtoutput , và sau đó rẽ trái qua vùng trắng trở lại điểm bắt đầu.

Điều này có thể đã được thực hiện trong 8 codel, nhưng vì chúng ta có thêm không gian, chúng ta có thể tạo ra thứ gì đó lấy cảm hứng một chút từ màn hình TV không có tín hiệu cũ.

15 mã

15 mã

Đọc một số từ stdin và xuất ra hình vuông của nó.

Điều này sử dụng một vài thủ thuật để có được một cái nhìn đối xứng với một chương trình thực sự làm một cái gì đó. Thanh màu đỏ ngoài cùng bên trái là một màu khác trên bảng mã phía dưới so với phần còn lại, lợi dụng thực tế là (ít nhất là đối với tôi) 2 màu đỏ này trông rất giống nhau. chương trình sẽ chuyển từ vùng màu đỏ nhạt hơn sang codel màu xanh nhạt, rồi đi thẳng qua giữa chương trình sang màu xanh nhạt ở phía bên phải nơi nó bị kẹt. Nó thực hiện input, duplicate, multiply, vàoutput các hoạt động.

Các codel đỏ đậm hơn, cùng với các codel xanh trung bình ở trên cùng và dưới cùng của cột giữa, là trang trí và chương trình sẽ không bao giờ đạt được chúng.

20 mã

20 mã

Đọc các số từ stdin cho đến khi 0 được đọc, tại đó nó xuất ra tổng của tất cả các số đã nhập và thoát.

Cuối cùng chúng tôi có đủ chỗ để thực hiện kiểm soát dòng chảy dưới dạng pointerhoạt động. 4 codels cùng đầu thực hiện input, duplicatenotcác hoạt động, và sau đó mộtnot hoạt động chuyển từ màu đỏ tươi ở phía trên bên phải sang 2 codel màu vàng bên dưới nó. Các nothoạt động bật giá trị đầu ra của ngăn xếp và đẩy một 1 nếu giá trị hàng đầu là 0, và 1 khác. Do đó, một notgiá trị kép thay thế bất kỳ giá trị khác nào bằng 1. Chuyển từ thanh màu vàng xuống màu xanh đậm thực hiện mộtpointer thao tác, bật giá trị trên cùng của ngăn xếp và di chuyển con trỏ chỉ theo chiều kim đồng hồ nhiều lần.

Nếu giá trị trên cùng là 1 (nghĩa là chúng tôi không nhập số 0), con trỏ hướng sẽ chỉ sang trái, di chuyển đến các mã màu đỏ tươi cho một addthao tác (sẽ bị bỏ qua lần đầu tiên do chỉ có một giá trị trên ngăn xếp) và sau đó thông qua trở lại màu trắng để bắt đầu chương trình.

Nếu giá trị trên cùng của ngăn xếp là 0 tại hoạt động con trỏ, con trỏ hướng sẽ không thay đổi và chương trình sẽ tiếp tục đi xuống. Di chuyển vào dải màu xanh nhạt hơn sẽ poplà 0 được nhập vào ngăn xếp, chỉ để lại tổng của các số tích lũy. Di chuyển vào thanh màu lục lam ở phía dưới sẽ outputtính tổng đó, và sau đó kết thúc do luồng chương trình bị kẹt.

25 loại tiền

25 loại tiền

Đếm ngược! Đọc một số từ stdin, sau đó in một đếm ngược thành 1 để xuất ra một số tại một thời điểm. Ví dụ: nếu 5 được đọc, sẽ in 54321.

Các hoạt động đầu tiên từ màu lục lam đến màu vàng là input. Sau đó, màu vàng là nơi chương trình "vòng lặp" bắt đầu. Vàng> Magenta> Blue là một duplicatesau đó output, vì vậy nó in giá trị hàng đầu trên ngăn xếp nhưng vẫn giữ một bản sao. Di chuyển xuống phía bên phải, chúng ta pushgiá trị 1 vào stack sau đó thực hiện một subtraction, giảm giá trị nhập vào của chúng tôi bằng 1. Tiếp theo là duplicate, not, và một người khác notdi chuyển từ đỏ tươi sáng ở phía dưới cùng bên phải để màu vàng đậm bên cạnh nó. Đây là kiểm tra zero / nonzero giống như chương trình trước. Di chuyển sang trái vào codel màu xanh nhạt thực hiện một pointerthao tác, nó sẽ di chuyển sang trái màu lục lam để kết thúc chương trình nếu chúng ta hoàn thành hoặc lên màu vàng để bắt đầu lại vòng lặp của chúng tôi mà không cần đầu vào ban đầu nhưng giá trị ban đầu giảm bởi 1.

Cả 3 codel đỏ đều trang trí và có thể là bất kỳ màu nào.

30 mã

30 mã

Máy phát điện Fibre. In ra các điều khoản của chuỗi Fibonacci đến thiết bị xuất chuẩn và không dừng lại.

Đây là lần giới thiệu đầu tiên của rolltoán tử, cũng như lần đầu tiên kích thước vùng lớn hơn 1 được sử dụng với pushtoán tử để có được một giá trị cụ thể trên ngăn xếp.

Như luôn luôn bắt đầu ở phía trên bên trái di chuyển bên phải. 2 đầu tiên vận hành push1 trên ngăn xếp và sau đó outputlà vì chuỗi Fibonacci bắt đầu bằng hai 1, nhưng vòng lặp chương trình chính sẽ chỉ in 1 lần. Sau đó, pushthêm 2 giây nữa vào ngăn xếp để kết thúc trong màu đỏ sẫm ở góc trên bên phải để bắt đầu vòng lặp chương trình chính.

Di chuyển xuống phía bên phải chúng tôi duplicateoutputin ra thuật ngữ tiếp theo của chuỗi, sau đó duplicatemột lần nữa để có được một bản sao của giá trị chuỗi hiện tại. Di chuyển sang trái trên dưới thực hiện 2 pushhoạt động. Vì vùng màu đỏ nhạt ở phía dưới bên phải có kích thước 3 codel, nên đầu tiên pushsẽ đẩy 3 lên ngăn xếp thay vì 1.

Di chuyển lên màu xanh nhạt là một rollhoạt động. Điều này sẽ bật 2 giá trị trên cùng của ngăn xếp và thực hiện một số cuộn bằng với giá trị đầu tiên được bật, đến độ sâu bằng với giá trị thứ hai được bật. Trong trường hợp này, nó sẽ thực hiện 1 cuộn đến độ sâu 3. Một cuộn đến độ sâu nlấy giá trị trên cùng của ngăn xếp (giá trị hiện tại trùng lặp của chúng tôi) và chôn nsâu nó . Ngăn xếp của chúng tôi chỉ sâu 3 ngay bây giờ vì vậy nó sẽ chôn giá trị hàng đầu ở phía dưới.

Di chuyển lên một lần nữa thực hiện một addthao tác cộng giá trị chuỗi hiện tại với giá trị chuỗi trước đó. Ngăn xếp của chúng ta bây giờ có giá trị chuỗi tiếp theo (hiện tại mới) trên đầu và giá trị cuối cùng bên dưới nó. Chương trình bây giờ di chuyển ngay qua màu trắng vào màu đỏ sẫm để bắt đầu lại vòng lặp.

Các mẫu màu vàng ở giữa không bao giờ được sử dụng.

54 mã

54 mã

In "hi!" xuất tinh

Không phải là một thông điệp đặc biệt dài, nhưng in bằng piet chiếm một số lượng đáng ngạc nhiên. Việc in được thực hiện bằng cách sử dụng các giá trị unicode và các số nguyên được đẩy lên ngăn xếp bằng cách sử dụng kích thước của vùng đang được thoát. Vì chúng tôi có số lượng codel rất hạn chế cho thử thách này, chúng tôi sử dụng một số phép toán để đạt đến phạm vi có thể in mà chúng tôi muốn.

Chương trình bắt đầu với push5 trên từ vùng lục lam bên trái. Từ đây, nó chảy thẳng dọc theo đỉnh với 6 duplicatethao tác để tạo thành stack với một loạt 5s. Tiếp theo là push1, subtractđể đặt số 4 lên trên cùng của ngăn xếp, sau đó 2 multiplythao tác để đặt 4 * 5 * 5 = 100 lên trên cùng của ngăn xếp. Sau đó, một duplicatetrong 2 100 giây.

Bây giờ chương trình bật ra khỏi màu đen và bắt đầu hoạt động bên trái dọc theo phía dưới. Pushcác thao tác của 3 và 2 và sau đó a rollđể chôn 2 100 dưới một 5. Tiếp theo là push1, trừ và thêm để có được 100 + 5-1 = 104 trên đỉnh của ngăn xếp, đó là unicode "h". 2 thao tác tiếp theo là push1 và pointerđể di chuyển quanh góc và bắt đầu di chuyển ngay dọc giữa, sau đó outputin "h".

Tiếp theo là add100 + 5 = 105 trên đỉnh của ngăn xếp và outputđể in "i". Bây giờ ngăn xếp chứa hai 5s. Push1, add, multiplycung cấp cho (1 + 5) * 5 = 30. Cuối cùng là push3 và add33, và outputcho dấu "!". Chương trình sau đó đi qua khoảng trắng còn lại để kết thúc bằng màu xanh bên phải.


5
Hah vâng, đã chờ đợi điều này :)
Sp3000

Làm thế nào khác với ngôn ngữ nhân vật 2D? Đó chỉ là cách bạn truyền đạt các giá trị di động.
JDługosz

25
@jdlugosz Nhiều ngôn ngữ lập trình bí truyền, khi bạn truy cập vào nó, chỉ là một vài lệnh thao tác ngăn xếp cơ bản với cách mã hóa các lệnh duy nhất. Cá nhân tôi nghĩ rằng mã hóa chúng trong một hình ảnh là một ý tưởng gọn gàng.
Spencer

13
Nếu chúng ta đang nói về sự tương đương về chức năng, bạn có thể hỏi "Làm thế nào khác với máy Turing?" nhưng sau đó bạn có thể đưa ra câu hỏi tương tự ở một con mèo, hoặc hành tinh Jupiter, hoặc bất kỳ ngôn ngữ nào khác ...
trichoplax

3
Ví dụ 9 codel trông giống như một quả bóng mini. Đẹp.
The_Basset_Hound

155

> <> (Cá)

(Lưu ý: Một số đoạn trích được xây dựng trên các đoạn trước đó, vì vậy không giống như hầu hết các câu trả lời tôi đã quyết định đặt chúng từ sớm nhất đến mới nhất.)

Factoid:

Giống như Befunge,> <> là ngôn ngữ 2D dựa trên ngăn xếp. Điều này có nghĩa là các lệnh không được thực thi tuyến tính như hầu hết các ngôn ngữ truyền thống - luồng chương trình có thể lên, xuống, trái hoặc phải!

Độ dài 1 đoạn:

X

Xlà một lệnh không hợp lệ trong> <>, vì vậy thông báo lỗi something smells fishy...được in. Trên thực tế, đây là thông báo lỗi duy nhất trong> <>, cho dù nguyên nhân được chia cho 0 hay cố gắng bật một ngăn xếp trống.

Độ dài 2 đoạn:

1n

Luồng chương trình trong> <> bắt đầu từ trên cùng bên trái và ban đầu bên phải. 1đẩy số 1 lên ngăn xếp, sau đó nin nó dưới dạng số (trái ngược với ký tự ASCII). Nhưng các chương trình> <> có hình xuyến, có nghĩa là con trỏ lệnh bao bọc xung quanh khi nó đến cuối dòng. Vì vậy, sau khi nchúng ta bắt đầu, bắt đầu in 1, in, gói lại từ đầu, ấn 1, in ... và chúng ta sẽ in 1mãi mãi!

Độ dài 3 đoạn:

"o;

Đây " là phân tích chuỗi, oxuất ra dưới dạng char ASCII và ;chấm dứt chương trình. Nhưng chương trình thực sự làm gì nói chung?

Vâng, trước tiên chúng ta bắt đầu phân tích chuỗi, đẩy mọi char mà chúng ta thấy lên ngăn xếp cho đến khi chúng ta tìm thấy một đóng ". Chúng tôi đẩy một o, rồi một ;... và quấn con trỏ lệnh trở lại điểm bắt đầu. Nhưng bây giờ chúng tôi đang ở trên một "vì vậy chúng tôi dừng phân tích chuỗi và cuối cùng chúng tôi thực hiệno;như bình thường để in phía trên cùng của ngăn xếp (các ;) và chấm dứt.

Có, chúng tôi vừa sử dụng cùng một trích dẫn char để bắt đầu và kết thúc một chuỗi!

Độ dài 4 đoạn:

42n;

Dựa trên những gì chúng ta đã thấy cho đến nay, bạn có thể mong đợi điều này sẽ đẩy 42, đầu ra dưới dạng một số sau đó chấm dứt. Nhưng tất cả các hướng dẫn trong> <> là các ký tự đơn, vì vậy điều này thực sự đẩy 4 và 2 , sau đó xuất ra đỉnh của ngăn xếp dưới dạng số (chỉ có 2) và chấm dứt.

Độ dài 5 đoạn:

<v
;>

Hãy nhớ rằng,> <> là ngôn ngữ 2D. Điều này có nghĩa là phải có cách thay đổi hướng của dòng chương trình!

Giống như Befunge, một cách bạn có thể làm điều này là thông qua các mũi tên >^v<. Để minh họa cách họ làm việc, hãy xem chương trình trên:

  • Luồng chương trình ban đầu là đúng
  • < làm cho chương trình chảy sang trái - chúng tôi đi bên trái và quấn quanh v
  • v làm cho chương trình chảy xuống - chúng tôi đi xuống >
  • > làm cho chương trình chảy thẳng về phía bên phải - chúng tôi đi bên phải và quấn quanh ;
  • Cuối cùng, chúng tôi chấm dứt.

Độ dài 6 đoạn:

";"00p

Một tính năng thú vị khác của> <> là tính phản xạ - chương trình có thể sửa đổi mã nguồn của chính nó một cách nhanh chóng!

Ở đây chúng tôi đẩy a ;, theo sau là hai số không. psau đó bật ba yếu tố hàng đầu y, x, v( ylà đỉnh của ngăn xếp) và những nơi vtại vị trí x,y. Nói cách khác, ptrong chương trình này đặt dấu chấm phẩy ở vị trí 0,0, biến mã thành ;;"00p. Điều này sau đó cho phép chương trình chấm dứt, vì con trỏ lệnh bây giờ bao bọc xung quanh và thực thi lệnh mới được đặt ;.

Độ dài 7 đoạn:

\7*n;
6

Không giống như Befunge,> <> cũng có gương ( \/|_#) phản ánh hướng của luồng chương trình. Vì vậy, ở đây chúng tôi:

  • Bắt đầu ngay, nhưng \phản ánh chúng ta đi xuống
  • Đẩy 6 và quấn
  • Nhấn vào mặt sau của \và phản xạ trở lại phải
  • Đẩy 7
  • Nhân hai số trên cùng của ngăn xếp
  • Đầu ra và chấm dứt

Di chuyển theo chiều ngang qua _gương hoặc theo chiều dọc qua |gương là không có tác dụng.

Độ dài 8 đoạn:

"r00g>o<

Rất có thể là đơn giản nhất> <> quine nếu một lỗi được phép ném. Hai hướng dẫn mới ở đây là:

  • r: Đảo ngược ngăn xếp
  • g: Nhận - pop y, xvà đẩy các nhân vật ở x,yvào stack (đối với p)

Sử dụng thủ thuật gói chuỗi từ trước đó, chương trình ban đầu đẩy r00g>o<sau đó nhấn lại trích dẫn đầu tiên. Các ngăn xếp sau đó được đảo ngược, cho <o>g00r. Sau đó, chúng tôi đẩy char tại 0,0, the ", để cung cấp <o>g00r". Cuối cùng, chúng tôi bẫy một ogiữa hai mũi tên, xuất ra đỉnh của ngăn xếp cho đến khi không còn gì và chúng tôi gặp lỗi.

Độ dài 9 đoạn:

x0\>
\1n>

x(chữ thường) di chuyển con trỏ lệnh theo hướng ngẫu nhiên và chương trình hiển thị chức năng này bằng cách in các bit ngẫu nhiên mãi mãi. Hãy thử làm theo các mũi tên và gương để tìm hiểu làm thế nào điều này hoạt động! (Đừng quên kiểm tra tất cả bốn hướng, bao gồm cả lên và trái)

Độ dài 10 đoạn:

;a comment

Không có cú pháp nhận xét trong> <> - nó không cần một cú pháp. Chỉ cần viết những gì bạn muốn ở bất cứ đâu và đảm bảo nó không được thực thi dưới dạng mã!

Độ dài 11 đoạn:

1!X2!X+!Xn;

!là một tấm bạt lò xo bỏ qua hướng dẫn. Nó đặc biệt hữu ích khi được sử dụng với ?, một điều kiện tấm bạt lò xo có bật lên trên cùng của ngăn xếp và thực hiện lệnh tiếp theo nếu phần tử được bật là khác không. Chúng ta sẽ thấy cách thức hoạt động sau này.

Đoạn mã trên in 3 bằng cách bỏ qua Xs, chỉ thực thi1! 2! +! n; .

Độ dài 12 đoạn:

01v
ao>:@+:n

In các số Fibonacci mãi mãi bắt đầu từ số thứ hai 1, một trên mỗi dòng. Các lệnh mới là:

  • a: Đẩy 10, mà chúng tôi cần cho dòng mới. a-fđẩy 10 đến 15 tương ứng.
  • :: Sao chép đỉnh ngăn xếp
  • @: Xoay ba yếu tố trên cùng của ngăn xếp, ví dụ [5 4 3 2 1] -> [5 4 1 3 2].

Theo dõi trong vài lần lặp đầu tiên:

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

Độ dài 13 đoạn:

i:d=?v
l?!;o>

Một chương trình "tac" đọc trong một dòng đầu vào và đầu ra nó đảo ngược. Cảm ơn @tomsmeding cho đoạn trích.

=bật hai phần tử trên cùng và đẩy 1 nếu chúng bằng nhau, 0 khác. Dòng đầu tiên tiếp tục đọc đầu vào cho đến khi ASCII char 13 (trở về vận chuyển) được tìm thấy, tại đó nó di chuyển đến dòng thứ hai.

Các l?!;ovòng lặp là một cấu trúc quan trọng trong> <> mà kết quả đầu ra toàn bộ stack. Không giống như >o<, nó không gây ra bất kỳ lỗi nào. Đây là cách nó hoạt động:

  • l đẩy chiều dài của ngăn xếp
  • Chúng tôi kiểm tra độ dài với ?:
    • Nếu độ dài là khác không, thì lệnh tiếp theo !được thực thi, bỏ qua;
    • Nếu chiều dài zero, thì chúng ta không thực hiện !và chấm dứt do;

Lưu ý rằng không có đầu ra thực sự xảy ra cho đến khi bạn quay trở lại vận chuyển.

Độ dài 14 đoạn:

32.

   X67*n;

Ngoài việc thay đổi hướng của dòng chương trình, bạn thực sự có thể di chuyển con trỏ lệnh bất cứ nơi nào bạn muốn!

.pops y, xvà dịch chuyển con trỏ hướng dẫn để x,yduy trì hướng. Tuy nhiên, lưu ý rằng bạn cần di chuyển đến một ô vuông trước khi bạn muốn đi - con trỏ lệnh được cập nhật trước khi lệnh tiếp theo được thực thi. Vì vậy, ở đây con trỏ lệnh hạ cánh không hợp lệ X, nhưng tất cả đều ổn vì con trỏ di chuyển đến6 trước khi tiếp tục thực hiện.

.làm cho nó có thể chuyển đổi hầu hết các chương trình> <> thành một lớp lót, nhưng tại sao bạn lại muốn mất đi sự thú vị của 2D? :)

Độ dài 15 đoạn:

01+:aa*=?;:nao!

In các số 0đến 99, một trên mỗi dòng. Chương trình này cho thấy việc sử dụng !trampoline gọn gàng - để đảm bảo rằng 0 ban đầu chỉ được đẩy một lần.

Độ dài 16 đoạn:

"r00g!;oooooooo|

Một quine thích hợp mà không ném lỗi, lấy cảm hứng từ quine trên trang esolang .

Nếu bạn băn khoăn về cách sửa đổi câu hỏi trước đó (đoạn số 8) để nó không gây ra lỗi và nghĩ "tại sao tôi không thêm một tấn ohướng dẫn?", Thì bạn có thể nhận ra rằng với mỗi lần obạn thêm , bạn cần phải xuất khác o! Câu hỏi này giải quyết gọn gàng vấn đề bằng cách đặt một |chiếc gương ở cuối, cho phép mỗi chiếc ođược sử dụng hai lần .

Nếu chúng ta chuyển sang dấu ngoặc đơn (cũng là để phân tích chuỗi), thì một câu hỏi thay thế không sử dụng g

'r3d*!;oooooooo|

Độ dài 17 đoạn:

b2,63,.

   17,n;

Chúng ta có phép cộng ( +), phép trừ ( -), phép nhân ( *), modulo ( %) ... nhưng còn phép chia thì sao? Nó ở đó, nhưng vì /đã là một tấm gương, bộ phận đã được chỉ định ,biểu tượng thay thế. Thật thú vị, phân chia là nổi , không phân chia số nguyên!

Chương trình trên khám phá một số hành vi không xác định bằng cách cố gắng nhảy tới 11/2, 6/3. Các Python intepreter có vẻ okay nếu là người đầu tiên phối hợp không phải là một số nguyên (mặc dù nó nhảy đến chỗ sai), nhưng nghẹn nếu thứ hai là không.

Độ dài 18 đoạn:

123456${{$}nnnnnn;

Chúng ta đã thấy rcái nào đảo ngược ngăn xếp và @cái nào xoay ba phần tử trên cùng. Dưới đây là một vài lệnh di chuyển các phần tử trên ngăn xếp:

  • $: Hoán đổi hai yếu tố hàng đầu
  • {: Chuyển toàn bộ ngăn xếp sang trái
  • }: Chuyển toàn bộ ngăn xếp sang phải

Để hiển thị cách thức hoạt động, đây là theo dõi chương trình:

123456 ------> 123465 ------> 234651 ------> 346512 ------> 346521 ------> 134652
       $ Swap        { L shift      { L shift       $ Swap        } R shift

Sau đó, chúng tôi đầu ra, cho 256431.

Độ dài 19 đoạn:

"reward"4[roooo]oo;

Cho đến bây giờ tôi đã nói "ngăn xếp", "ngăn xếp" ...

Mặc dù hầu hết các chương trình chỉ sử dụng một ngăn xếp,> <> thực sự có thể có nhiều ngăn xếp! Dưới đây là các hướng dẫn liên quan:

  • [: Pops xvà di chuyển đầux phần tử sang ngăn xếp mới
  • ]: Loại bỏ ngăn xếp hiện tại và di chuyển các giá trị của nó sang ngăn xếp bên dưới.

Đây là dấu vết cho chương trình trên:

       [r e w a r d]       Push "reward"
4[     [r e] [w a r d]     Move four elements to a new stack
r      [r e] [d r a w]     Reverse the current stack
oooo   [r e] []            Output "ward"
]      [r e]               Remove the current stack, no values to move
oo     []                  Output "er", giving "warder" altogether

Lưu ý rằng chỉ cần đẩy rewardvà sau đó xuất ra một lần nữa oooooosẽ indrawer , do tính chất "đầu vào, cuối ra" của ngăn xếp.

Độ dài 20 đoạn:

aa*5+\
7a*2+\
oo;  \

Một tính năng ít được biết đến của> <> là, giống như Python, dấu gạch chéo ngược có thể được sử dụng để tiếp tục dòng trong nhiều trường hợp. *

Đoạn mã trên có chức năng giống như

aa*5+7a*2+oo;

* Khước từ trách nhiệm: Lý do tại sao công việc này có thể hoặc không thể vì một lý do hoàn toàn khác

Độ dài 22 đoạn:

1&fv ;n&<
&1->:0=?^:&*

Ngoài ngăn xếp,> <> cũng có các thanh ghi (một cho mỗi ngăn xếp) có thể được sử dụng để lưu trữ các giá trị. Gọi &lần đầu tiên sẽ di chuyển giá trị trên cùng của ngăn xếp vào thanh ghi và thực hiện &lại sẽ di chuyển giá trị trở lại. Điều này có thể rất hữu ích khi tích lũy một giá trị, ví dụ tổng và các giai thừa.

Chương trình trên tính toán giai thừa của f(15), in 1307674368000. Đây là dấu vết để fthay thế bằng 4:

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

Độ dài 24 đoạn:

"Hello, World!"rl?!;of0.

Chúng tôi có đủ ký tự cho chương trình yêu thích của mọi người! Ở đây chúng tôi sử dụng. dịch chuyển tức thời cho vòng lặp đầu ra.

Độ dài 25 đoạn:

0i:0(?v$a*$"0"-+!
   ;n~<

Thật không may> <> chỉ cho phép đọc từ STDIN một char mỗi lần, điều này làm cho việc đọc theo số hơi khó khăn. Đối với đầu vào bao gồm các chữ số 0-9, chương trình này về cơ bản là atoi, chuyển đổi một chuỗi các chữ số từ STDIN thành một số trên ngăn xếp (sau đó được in).

Một lưu ý khác là trên EOF, iđẩy -1 lên ngăn xếp. Điều này giúp kiểm tra EOF dễ dàng bằng cách so sánh với 0 bằng cách sử dụng (hoặc "ít hơn".

Đoạn mã này cũng sử dụng ~, nó bật và loại bỏ phần tử trên cùng của ngăn xếp.

Độ dài 33 đoạn:

i>:nao:1=?;\
 ^  ,2v?%2:/
 ^+1*3<

Cho đến nay, hầu hết các đoạn trích đều tương đối tuyến tính hoặc chỉ là các ví dụ đơn giản thể hiện chức năng của <>. Bây giờ tôi có thể đưa ra một ví dụ làm nổi bật việc dễ dàng hình dung luồng chương trình trong> <> với một chương trình được bố trí hợp lý.

Chương trình đọc theo một ký tự ASCII duy nhất và chạy 3x+1thuật toán trên điểm mã của nó (Trong> <>, các ký tự về cơ bản là các số nguyên). Mỗi bước của thuật toán được in cho đến khi chúng ta đạt 1.

Dưới đây là dấu vết cho một vài lần lặp đầu tiên với đầu vào a(mã điểm 97):

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

Độ dài 44 đoạn:

a&>i:0(?v"+"$\
/&^?=0l< "a*"/
\:1+&2p/\0
n
;

Tôi không cảm thấy như mình đã thực hiện pcông lý chỉ huy, chỉ sử dụng nó một lần trong suốt đoạn 6, vì vậy đây là một chức năng atoi khác. Điều gì tuyệt vời về điều này? Chương trình viết biểu thức cần thiết để tính số khi nó đọc đầu vào!

Vì vậy, đối với đầu vào như 573sau, sau khi tất cả các ký tự được đọc, cuối dòng thứ ba sẽ trông như thế \0a*5+a*7+a*3+, ước tính là 573!

Một lần nữa, đầu vào dự kiến ​​chỉ là chữ số. Theo dõi GIF ở đây .

Độ dài 74 đoạn:

>i:'A'(?v:'N'(?v:'['(?v\
  :'a'(?v:'n'(?v:'{'(?v\
^      o<    +d<  -d-d<o

Nếu bạn đã quản lý để xuống đây, thì bạn có thể đồng ý với tôi khi tôi nói rằng đây là một chương trình ROT13 rất dễ đọc. Cho một char c1, chúng tôi tìm thấy những char đầu tiên c2trong AN[an{, như vậy c1 < c2, sau đó áp dụng thích hợp bù đắp bằng cách thêm / trừ d(13). Lưu ý rằng [{là các ký tự trực tiếp sau Zz tương ứng.

Hãy thử nó trong bảng điều khiển và xem các chữ cái biến đổi khi bạn gõ!

(Bạn cũng có thể chuyển đổi đầu vào, nhưng vì tôi thiếu kiểm tra EOF, :0(?;nó sẽ dừng với một lỗi khi nó cố in -1 dưới dạng char)


Một ý tưởng cho đoạn trích 13: i:d=?v NEWLINE o;!?l<- in dòng đầu vào ngược
tomsmeding

12
Tôi ước tôi có thể bỏ phiếu nhiều hơn, bây giờ tôi có cảm hứng để bắt đầu học> <> ...
Robobenklein

6
+1 để bắt đầu từ trên xuống và đi xuống (và cũng chỉ vì nó thú vị để đọc).
mbomb007

5
@ mbomb007, thật đáng tiếc, tuy nhiên, thứ tự không thể đi sang trái / phải và gói xuống cuối trang: P
krs013

Đoạn trích dài 8 của bạn sẽ là một câu hỏi thực sự nếu bạn viết something smells fishy...trên dòng tiếp theo.
wizzwizz4

148

C - chỉnh sửa

Cảm ơn đã bình chọn! Khi so sánh với các ngôn ngữ khác và những gì họ có thể làm trong các byte giới hạn, C trông lỗi thời, cầu kỳ và quá phụ thuộc vào nhà phát triển. Theo nhiều cách, đó là: các ngôn ngữ cấp cao và cấp cao hơn với quản lý bộ nhớ tự động sẽ biểu cảm hơn và sản xuất nhanh hơn nhiều so với C từng có.

Vậy tại sao tính năng C?

Bí mật ẩn đằng sau tất cả các ngôn ngữ kịch bản lệnh đó là các trình thông dịch có khả năng được viết bằng C (hoặc gần đây hơn là C ++ hoặc Java). Trình biên dịch C ++ đầu tiên thực sự được biên dịch thành mã C. Trong thực tế, cho đến khi có một thị trường cho trình biên dịch trực tiếp, việc viết một trình biên dịch để tạo C thường sẽ hiệu quả hơn về mặt chi phí.

Nếu bạn đang làm việc trên các nền tảng rất nhỏ, thậm chí có thể không có hệ điều hành khả dụng, thì có khả năng bạn đang làm việc ở C. Ngày nay, mọi thiết bị đều có vi điều khiển được nhúng trong đó, chắc chắn sẽ được lập trình trong C. Khi họ cần nhỏ và nhanh, C là con đường để đi. (Cũng FORTH, dành cho những người bạo dâm.)

Biết C đưa bạn đến gần với kim loại như bạn có thể đi mà không cần vào trình biên dịch, và giúp bạn trong các ngôn ngữ khác. Bạn có một ý tưởng tốt về cách một chức năng ảo C ++ có thể hoạt động. Bạn biết khi bạn viết các hàm đệ quy pass-by-value đó trong PHP, rằng bên trong nó đang thực hiện nhiều phân bổ bộ nhớ và sao chép, do đó, bạn theo bản năng thử tham chiếu qua. Các cuộc gọi lại và tài liệu tham khảo không làm phiền các nhà phát triển C, có lẽ Haskell cũng vậy.

Như Kernighan và Ritchie đã đề cập trong lời nói đầu của họ về Ngôn ngữ lập trình C cổ điển , ấn bản thứ 2, C không phải là một ngôn ngữ lớn và nó không được phục vụ tốt bởi một cuốn sách lớn. Tôi đang cố gắng làm theo lời khuyên này: các ví dụ thực hiện nhiệm vụ gấp đôi, gấp ba hoặc nhiều hơn nếu có thể.

Tất cả các đoạn trích ít nhất là có thể tự biên dịch. Những người có thể liên kết và thực thi được chỉ định như vậy. Tôi biết đây không phải là một yêu cầu, nhưng nó đơn giản hơn việc cố gắng giải thích khung cần thiết để làm cho bất kỳ đoạn mã nào hoạt động.

Tôi cũng đã cố gắng đảm bảo mỗi đoạn mã càng ngắn càng tốt để tôi không giới thiệu thêm khoảng trắng chỉ để đệm đến một độ dài nhất định. Trong trường hợp mã được thụt lề, các thụt lề không được bao gồm trong độ dài, chỉ có một ký tự cho mỗi dòng mới.

Factoid

C đá.

Độ dài 0 đoạn

Chương trình tự tái tạo ngắn nhất thế giới http://www.ioccc.org/1994/smr.hint

Độ dài 1 đoạn

;

C làm cho một sự phân biệt giữa biên dịch và liên kết. Nhiều thực thể trong C chỉ được biên dịch và liên kết sau - một ví dụ là tất cả các thư viện tĩnh và động.

Các thực thể khác chỉ được bao gồm và tự tạo không có mã.

Dấu chấm phẩy ở trên chắc chắn sẽ biên dịch thành mã đối tượng, và không làm gì cả!

Độ dài 2 đoạn

x;

C, là một ngôn ngữ lập trình cũ hơn, đã trải qua nhiều lần lặp lại. Việc sử dụng rộng rãi sớm nhất được phát triển bởi Kernighan và Ritchie và viết tắt là K & R. K & R C là đáng chú ý để đưa ra nhiều giả định về mã của bạn nếu bạn không cung cấp chúng một cách rõ ràng.

Cụ thể, trong K & R C, mã ở trên được coi là số nguyên toàn cầu được xkhởi tạo thành 0. Biên dịch nó trong chế độ K & R sẽ tạo ra một tệp đối tượng cung cấp bất kỳ chương trình nào liên kết với biến này để sử dụng.

Độ dài 3 đoạn

??/

C phổ biến đến mức nó cần cung cấp các tính năng tương thích cho các hệ thống không có tất cả các ký tự mà nó sử dụng. Trên đây là một biểu đồ cho dấu gạch chéo ngược, được sử dụng trong C làm ký tự tiếp tục dòng. Ở trên sẽ biên dịch, có khả năng với một cảnh báo rằng không có dòng nào theo sau.

Một văn hóa phổ biến trong C là bỏ qua các cảnh báo biên dịch và nhiều cơ sở mã lớn luôn có một vài cảnh báo trở lên khi chúng được xây dựng.

Độ dài 4 đoạn

f();

Một lần nữa với K & R, phần trên được "điền" có nghĩa là khi biên dịch rằng "Có tồn tại, với liên kết toàn cầu, một hàm f, sẽ được cung cấp sau, sẽ lấy một số lượng đối số cố định nhưng không xác định và trả về một số nguyên."

Lưu ý sự khác biệt cơ bản giữa điều này và f;.

Độ dài 5 đoạn

s="";

K & R C đáng chú ý vì thực sự tha thứ. Sau khi biên dịch, mã này sẽ cung cấp một số nguyên scho liên kết toàn cầu được khởi tạo thành địa chỉ bắt đầu của một chuỗi trống (tôi nghĩ). K & R lặng lẽ xử lý tất cả các ép buộc, kể cả cắt ngắn nếu một số nguyên không đủ lớn để giữ địa chỉ.

Chính những cấu trúc như thế này đã tạo ra nhiều lỗi khó tìm và cung cấp nhiều cảm hứng trong các cuộc thi của IOCCC.

Độ dài 6 đoạn

o=042;

Một gotcha của các bộ tính giờ cũ, số 0 đứng đầu trong một số bằng chữ có nghĩa là các chữ số theo sau nằm trong cơ sở bát phân. Đoạn mã trên, khi biên dịch, sẽ cung cấp một số nguyên ocho liên kết toàn cầu được khởi tạo thành số thập phân 34.

Tính năng này của C đã cắn nhiều nhà phát triển phấn đấu để điền số của họ để làm cho chúng xếp thành hàng đẹp và thậm chí!

Độ dài 7 đoạn

f(){f;}

Các mã trên là một chức năng với một cơ thể. Nhưng nó làm gì? Nó lấy địa chỉ của hàm và không làm gì với nó! Thông thường những gì hàm sẽ trả về là không xác định. Mã vô nghĩa như thế này thường có thể biên dịch mà không cần cảnh báo.

Độ dài 8 đoạn

main(){}

Điều này đại diện cho mã có thể biên dịch và liên kết ngắn nhất trong C. Trong khi trong các phiên bản hiện đại của C, các hàm thường không thể được định nghĩa ngầm, vì lý do lịch sử, hạn chế này được nới lỏng main.

Điều kỳ diệu này của một chương trình, không có gì ngoài trả về 0, sẽ biên dịch thành kích thước không đáng kể và liên kết trong các thói quen thời gian chạy C khác nhau. Bạn có thể biên dịch và liên kết với độ dài được đặt thành đầy đủ để xem những gì đang diễn ra dưới mui xe.

Độ dài 9 đoạn

#define Z

Phần chính của các tệp tiêu đề C là #definechỉ thị tiền xử lý. Các chương trình C biên dịch trong các giai đoạn khác nhau và trong một trong các giai đoạn này, các định nghĩa này được thay thế bằng các giá trị thực tế của chúng.

Khi một đối số bị thiếu, C sẽ ngụ ý 1, do đó, ở trên sẽ thay thế 1bất cứ nơi nào Zđược sử dụng trong mã nguồn.

Ở trên thường sẽ được đưa vào một tệp tiêu đề và #included theo yêu cầu.

Độ dài 10 đoạn

enum{P,Q};

Các enumtừ khóa cung cấp một cách đôi khi kiểu an để xác định một loạt các hằng số. Giống như định nghĩa, chúng thường được sử dụng trong các tệp tiêu đề. Đoạn mã trên khi được bao gồm sẽ xác định Plà số nguyên 0 và Q1.

Độ dài 11 đoạn

volatile v;

Các volatiletừ khóa là để cho trình biên dịch biết rằng một biến có thể thay đổi bởi các nhân viên khác và không đưa ra giả định rằng nó sẽ không thay đổi giữa các truy cập.

Độ dài 12 đoạn

#pragma once

#pragma once là một chỉ thị tiền xử lý không chuẩn nhưng được hỗ trợ rộng rãi để chỉ ra rằng tệp nguồn hiện tại chỉ được đưa vào một lần trong một quá trình biên dịch.

Kỹ thuật truyền thống và được hỗ trợ đầy đủ là sử dụng các bộ #includebảo vệ với những nhược điểm của mã được thêm vào và các xung đột tên có thể có.

Độ dài 13 đoạn

w(){for(;;);}

Có rất nhiều quy ước trong C, và một trong số đó là cách biểu diễn các vòng lặp vô hạn. Trong trường hợp này, for(;;)biểu thị không khởi tạo, không có kiểm tra thoát nào mặc định là 1 có nghĩa là đúng - tức là không phá vỡ và không có mã lặp.

Đôi khi có thể làm mọi thứ bên trong ()và bản thân vòng lặp không cần cơ thể. Trong trường hợp này, một dấu chấm phẩy giả được thêm vào cuối.

Trong đoạn mã trên, khi được biên dịch, nó sẽ cung cấp một hàm sẽ đi vào một vòng lặp bận rộn chặt chẽ - một trong những điều không có trong thiết kế phần mềm - và không bao giờ quay trở lại.

Độ dài 14 đoạn

int a[]={1,2};

Mảng trong C không cần độ dài quy định. Dấu ngoặc vuông trống []cho trình biên dịch "tự tìm ra". Tuy nhiên, trong C, không giống như các ngôn ngữ khác, không có cách tích hợp nào để ngăn truy cập vào một mảng bên ngoài các giới hạn này, dẫn đến phép ẩn dụ "tự bắn vào chân mình" mà C được biết đến.

Đoạn mã trên, khi được biên dịch, sẽ cung cấp một mảng có thể thay đổi toàn cầu agồm hai số nguyên được khởi tạo với 1 và 2.

Độ dài 15 đoạn

const long k=7;

Các constspecifer là một bổ sung sau để C mượn từ C ++. Một câu hỏi phỏng vấn phổ biến là "Có ý nghĩa gì khi định nghĩa một biến là volatile const?". constcùng với enuminlineđược dự định để giảm sự phụ thuộc vào #definevấn đề an toàn kiểu.

Độ dài 16 đoạn

extern void **q;

externđược sử dụng để chỉ ra rằng một biến được khai báo ở nơi khác. Các void *type là kiểu generic tiêu chuẩn trong C, có nghĩa là nó không cần phải được rõ ràng đúc hoặc đúc từ trong câu lệnh gán. Trình **tự toán tử có nghĩa là con trỏ tới một con trỏ, thường thổi vào tâm trí của người mới, nhưng hoàn toàn hợp lệ và thường được sử dụng C.

Độ dài 17 đoạn

double d=4/3-1/3;

Nếu bạn đã in ở trên, kết quả sẽ là một, và bạn nghĩ, siêu! Thay đổi thành double d=4/3-2/3;và câu trả lời là gì? Nó vẫn là một! C đang sử dụng số học số nguyên để tính 4/3 → 1 và 2/3 → 0 và 1 - 0 → 1!

Độ dài 18 đoạn

main(){puts("!");}

Cuối cùng, chúng tôi nhận được một số mã thực sự làm một cái gì đó! putslà một yêu thích của người chơi gôn C vì nó không yêu cầu tệp tiêu đề để sử dụng.

putscũng sẽ thêm một nguồn cấp dữ liệu cho đầu ra. Ngược lại, đối tác của nó getssẽ tước nguồn cấp dữ liệu. Không bao giờ nên sử dụng getsngoại trừ trong các trường hợp rất được kiểm soát - nó không có bảo vệ cho lỗi tràn bộ đệm và là nguyên nhân gốc rễ của nhiều khai thác.

Độ dài 19 đoạn

#include <stdlib.h>

Việc bao gồm các tệp tiêu đề thường là chữ ký cá nhân của các nhà phát triển. Nhiều bao gồm libiobất kể nếu họ cần thiết. Một số thứ tự các tệp tiêu đề để độ dài tăng hoặc giảm. Hầu hết đặt <>trước "". Cá nhân tôi đã sử dụng chữ ký này trong những ngày TA của tôi để kiểm tra gian lận giữa các sinh viên: chữ ký tiêu đề giống nhau? xem xét kỹ hơn!

Độ dài 20 đoạn

char*p=(char*)0x300;

C được thiết kế để được sử dụng trên các nền tảng thô sơ ở mức rất thấp. Trong một số trường hợp, bạn có thể cần truy cập trực tiếp các cổng được ánh xạ bộ nhớ đặc biệt.

Trong mã ở trên, địa chỉ của một cổng được xác định là thập lục phân 300. Bạn sẽ truy cập giá trị của cổng bằng cách sử dụng *p, như *p=0xff;để bật tất cả các bit hoặc v=*p;để lấy giá trị hiện tại.

Độ dài 21 đoạn

int w=sizeof(double);

Các sizeofnhà khai thác cung cấp kích thước tính bằng byte của một loại. Với tên biến, dấu ngoặc không bắt buộc, vd double d;int w=sizeof d;.

Độ dài 22 đoạn

asm("xorl %ecx,%ecx");

Làm thế nào asmđể được sử dụng được xác định bởi trình biên dịch. Trên đây là một ví dụ về mã gcc trực tuyến của Linux trên nền tảng Intel.

Unix ban đầu có một phần nhỏ nhưng không đáng kể trong mã của nó trong trình biên dịch chương trình. Ngay cả ngày nay, nếu tốc độ là mối quan tâm chính và tính di động hoàn toàn không có, bạn sẽ thấy nó được sử dụng.

Trên các hệ thống tương thích, mã ở trên sẽ biên dịch và nó sẽ thực sự là một hướng dẫn lắp ráp bị cô lập mà không có phương tiện truy cập thông thường nào! BTW xor R,Rlà một thành ngữ ngôn ngữ lắp ráp phổ biến để xóa một thanh ghi một cách nhanh chóng.

Độ dài 23 đoạn

union u{char c;int i;};

A unionsẽ cung cấp ít nhất đủ không gian cho phần tử lớn nhất. Bạn có thể thấy nó được sử dụng cùng với void *để cung cấp một loại "mờ" phổ biến trong các thư viện nhất định. Trong trường hợp này, liên minh thường sẽ là một phần của cấu trúc lớn hơn, với cấu trúc có một trường để xác định loại kết hợp.

Độ dài 24 đoạn

/*INTS*/int i,j,k;//INTS

Nhận xét C ban đầu được phân định là /* comment */và mượn // comment to end of lineđịnh dạng từ C ++.

Độ dài 25 đoạn

int main(void){return 1;}

Đây là phiên bản phù hợp hơn của đoạn mã dài 8 ở trên. Kiểu trả về và kiểu hàm được chỉ định và nó có giá trị được trả về rõ ràng.

Quy ước trong C là sử dụng giá trị trả về 0cho thành công và 1thất bại, hoặc nếu bạn muốn tuân thủ nghiêm ngặt EXIT_SUCCESSEXIT_FAILUREnhư được định nghĩa trong stdlib.h.

Độ dài 26 đoạn

typedef struct{int x,y;}P;

typedeflà cực kỳ hữu ích, đặc biệt , typedef struct. Theo thuật ngữ hiện đại, bạn có thể gọi nó là "ánh sáng hướng đối tượng".

Sau khi bao gồm ở trên, mã có thể sử dụng Pnhư một loại thông thường trong khai báo và hàm, với kiểm tra kiểu đầy đủ. Tuy nhiên, không giống như C ++, bạn không thể định nghĩa các toán tử như +, * hoặc <<, do đó "ánh sáng hướng đối tượng".

Độ dài 27 đoạn

#define C(x,y)(((x)+1)*(y))

C có #definecú pháp macro thuận tiện .

Một lỗi newbie phổ biến là bỏ qua dấu ngoặc trong và / hoặc bên ngoài, dẫn đến lỗi ưu tiên toán tử khó tìm.

Độ dài 28 đoạn

struct f{int s:1,e:8,m:23;};

C có thể định nghĩa rõ ràng các trường bit có thể được gán và đọc và thao tác như bất kỳ số nguyên nào.

Trên đây là một xấp xỉ của cấu trúc dữ liệu dấu phẩy động đơn chiều rộng của IEEE.

Độ dài 36 đoạn

f(unsigned x){return!!x&!(x&(x-1));}

Trong nhiều ngôn ngữ, bạn không cần quan tâm đến cách các con số được thể hiện. Trong C, bạn cần phải nhận thức sâu sắc về đại diện nội bộ của họ.

Ví dụ tốt nhất về điều này tôi có thể nghĩ đến là xác định xem một số nguyên có phải là lũy thừa của hai {1, 2, 4, 8, ...} hay không. Những người không quen thuộc với C sẽ thực hiện các vòng lặp và dịch chuyển và tất cả các cách thức của thời gian chạy O (log (n)), không tệ, nhưng ở trên là một chức năng sẽ làm tương tự trong thời gian chạy O (1). Tôi sẽ để nó như một bài tập để người đọc xác nhận nó hoạt động, nhưng nó thực sự ...

Quy !!ước thường được sử dụng để ép buộc một số nguyên từ khác không và 0 đến 1 và 0 tương ứng. Nhiều nhà phát triển C thích sử dụng các loại thủ thuật này (thường là tỷ lệ cược của những người coi trọng sự rõ ràng của mã).

Các nhà phát triển siêu nhạy bén C có thể xác nhận rằng phần trên sẽ hoạt động trên phần cứng bổ sung và có chữ ký. Đối với những người thắc mắc, bạn gần như chắc chắn sẽ làm việc trên phần cứng bổ sung twos ngay bây giờ. Chỉ có những người thực sự may mắn (hoặc không may mắn tùy thuộc vào quan điểm của bạn) mới cần phải lo lắng về điều này!

Độ dài 48 đoạn

#include<complex.h>
double complex c=3.0+I*4.0;

C99 bao gồm hỗ trợ cho các số phức. Như bạn có thể thấy từ mã, nó có dạng một công cụ sửa đổi cho một loại thực. Bạn cũng có thể sử dụng int complex c=3+I*4;nhưng bên trong nó cưỡng chế thành một loại điểm nổi. Đoạn mã trên sẽ biên dịch trong gcc bằng cách sử dụng gcc -std=c99 -c length-48.c.

Nếu bạn muốn xem thêm các phần bên trong, hãy thử biên dịch với công tắc -E. Đối với phiên bản gcc của tôi, khai báo ở trên trở thành double _Complex c=3.0+(__extension__ 1.0iF)*4.0;. Lưu ý rằng loại phức tạp là một bổ sung đáng kể cho ngôn ngữ, không chỉ là một vài macro giá rẻ.

Đây chỉ là một lời trêu ghẹo, khi chúng tôi có hơn 125 ký tự, sau đó chúng tôi có thể bắt đầu có một số niềm vui thực sự với các số phức!

Độ dài 51 đoạn

#include <math.h>
main(){double d=sqrt(sin(3.2));}

Vì nhiều lý do, C không tự động liên kết đến các hàm toán học tiêu chuẩn như sin, cos, tan, sqrt, v.v. Vì vậy, nếu chúng được sử dụng nhưng không được liên kết, nhà phát triển sẽ gặp lỗi liên kết không xác định tham chiếu đến 'sqrt' , hoặc một số lỗi khác.

Trong gcc, mã ở trên sẽ biên dịch và liên kết bằng cách sử dụng gcc length-51.c -lm.

Lưu ý sin(3.2)sẽ trả về một số âm, trong đó căn bậc hai không hợp pháp trong miền thực. Trong C, một giá trị đặc biệt NaNđược trả về để chỉ ra lỗi này, mà chương trình được miễn phí bỏ qua!

Trong C99, có rất nhiều chức năng xử lý ngoại lệ mới để cung cấp khả năng kiểm soát rất an toàn và chi tiết cho các loại lỗi toán học này, điều mà hầu như không ai sử dụng!

Độ dài 63 đoạn

static int w;static int X(int x){static int s=0;s^=x;return s;}

Hoặc được định dạng rõ ràng hơn:

static int w;
static int X(int x)
{
    static int s=7;
    s^=x;
    return s;
}

Như bạn có thể đoán, đây là tất cả về từ khóa staticcó nhiều hơn một nghĩa trong C.

Trong hai trường hợp đầu tiên, thông báo staticcho trình biên dịch rằng số nguyên wvà hàm Xkhông hiển thị bên ngoài tệp này hoặc đơn vị biên dịch, tức là chúng là nội bộ.

Các hàm này không có ý định được gọi ra bên ngoài, vì vậy chúng có thể không kiểm tra tính hợp lệ và cắt các góc khác. Vì chúng có phạm vi nội bộ, bạn có thể xác định lại wXtrong các tệp khác, và chúng thường sẽ tách biệt.

Trong trường hợp cuối cùng, staticchỉ ra rằng số nguyên sgiữ nguyên giá trị giữa các lệnh gọi hàm. Lần đầu tiên Xđược gọi, ssẽ là giá trị ban đầu của nó 7, khi nó được độc quyền OR x, với giá trị mới sẽ được giữ lại.

Trong nội bộ, mặc dù phụ thuộc vào việc triển khai, tổ chức bộ nhớ thông thường đang snằm trên heap, bộ nhớ được khởi tạo cụ thể, trong khi đối số xnằm trong ngăn xếp. Ví dụ, nơi các biến cư trú rất quan trọng nếu bạn muốn triển khai các thuật toán đệ quy.

Một gotcha trong C là xung đột với các biến toàn cục. Cho đến khi wXthực sự được định nghĩa là static, nếu chúng được định nghĩa toàn cầu ở đâu đó, thì wXsẽ đề cập đến các thực thể toàn cầu thay thế.

Ở đây qwcó thể không được khởi tạo cho cùng một giá trị, bởi vì toàn cầu wđang được sử dụng để đặt q:

static int q = w;
static int w;

Nếu một thế giới wkhông tồn tại, việc biên dịch sẽ thất bại.

Ở đây qwsẽ được khởi tạo với cùng một giá trị:

static int w;
static int q = w;

Thông thường, các nhà thiết kế sẽ giảm xung đột tên bằng cách thêm tiền tố hoặc hậu tố đặc biệt vào các biến và hàm toàn cầu của họ.

Trong C99, staticđã đạt được một mục đích sử dụng khác, ví dụ int Y(int a[static 10]);, có nghĩa là có một hàm Ylấy một mảng ít nhất 10 số nguyên.

Độ dài 74 đoạn

void f(register int*p,register int*q,register int l){while(l--)*p++=*q++;}

Hoặc đặt ra độc đáo:

void f(register int *p, register int *q, register int l)
{
    while (l--)
        *p++ = *q++;
}

Từ khóa registercung cấp một gợi ý cho trình biên dịch rằng sử dụng các thanh ghi phần cứng sẽ có lợi ở đây. Các chức năng trên sẽ sao chépl số nguyên từ qsangp , sử dụng các thanh ghi phần cứng nếu có thể.

Đôi khi việc tăng tốc có thể là đáng kể. Ví dụ, trong họ vi xử lý 68K, dòng *p++ = *q++có thể được dịch thành một lệnh MOVE.W (Ap)+,(Aq)+so với sáu hoặc tám nếu bạn không sử dụng register. Bộ vi xử lý 68K có các chế độ tăng và giảm trước rõ ràng, do đó, nhà phát triển hiểu biết, nếu anh ta biết nền tảng, sẽ điều chỉnh mã bằng cách sử dụng x++--yvs.++xy--.

Ngày nay trình biên dịch chủ yếu bỏ qua register , ngoài việc không cho phép lấy địa chỉ của chúng (ví dụ như ở trên &lsẽ gây ra lỗi trình biên dịch).

Độ dài 88 đoạn

#include<stdio.h>
int f(int x){return(x>1)?x*f(x-1):1;}int main(){printf("%d\n",f(12));}

Hoặc với cách bố trí saner:

#include <stdio.h>

int f(int x)
{
    return (x > 1)? x * f(x - 1): 1;
}

int main()
{
    printf("%d\n", f(12));
}

A, đệ quy! Đoạn mã là một chương trình hoàn chỉnh để biên dịch, liên kết và chạy. Hàm ftính toán giai thừa của đối số của nó xbằng cách sử dụng công thức đệ quy f (x) = x * f (x - 1). Các yếu tố trở nên lớn thực sự nhanh chóng, vì vậy, ví dụ f(12)là giá trị lớn nhất bạn có thể nhận được trong một số nguyên 32 bit đã ký.

Để biết ví dụ về mã thực sự đệ quy, hãy xem xét các triển khai ngây thơ của hàm Ackermann .

Trình biên dịch thông minh có thể tối ưu hóa chức năng, sử dụng gợi ý inlinevà "hủy đăng ký" chức năng khi các hằng số được cung cấp dưới dạng đối số sao cho:

f(12)

Trở thành:

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

Nếu không có bất kỳ cuộc gọi chức năng cần thiết!

Trình biên dịch khác có thể sắp xếp lại chức năng:

int f(int x)
{
    return (x < 2)? 1: f(x - 1);
}

Và thực hiện một cái gì đó gọi là đệ quy đuôi. Điều này có hiệu lực thay thế lệnh gọi hàm cuối cùng thành một goto đơn giản và cho phép hàm đó xử lý trả về. Lợi ích là ít ngăn xếp stack hơn, mã nhanh hơn và nhỏ hơn.

Trong ngôn ngữ lắp ráp, các loại cơ hội tối ưu hóa này thực sự dễ dàng nhận ra và có thể được thực hiện bằng một thứ gọi là "trình tối ưu hóa lỗ khóa", về cơ bản tìm kiếm các mẫu nhỏ và thay thế chúng bằng một cái gì đó nhanh hơn và / hoặc nhỏ hơn.

Độ dài 117 đoạn

#include<stdio.h>
int main(int c,char**v){int a,b;sscanf(v[1],"%d%*[\t ,]%d",&a,&b);printf("%d\t%d\n",a,b);return 0;}

Hoặc là:

#include <stdio.h>

int main(int c, char **v)
{
    int a, b;

    sscanf(v[1], "%d%*[\t ,]%d", &a, &b);
    printf("%d\t%d\n", a, b);

    return 0;
}

C đã mượn từ các ngôn ngữ đương thời vào thời điểm đó, khái niệm I / O phổ quát có thể được áp dụng nhất quán cho bất kỳ thiết bị nào, dù là bàn điều khiển, thẻ đục lỗ, băng, đĩa hoặc máy in, nhưng ở dạng C thực, nó cho phép nhà phát triển tạo ra tuyên bố rất ngắn gọn nhưng mạnh mẽ.

Trong đoạn trích trên, nó sẽ lấy đầu vào dòng lệnh, phân tích hai số nguyên cách nhau bởi dấu cách, tab hoặc dấu phẩy và xuất chúng. Nó tận dụng một công scanfcụ xác định mới hơn %*[\t ,]sẽ: [\t ,]kéo ra tất cả các tab, dấu cách và dấu phẩy và: *bỏ qua chúng.

Tôi nhớ đã sửa đổi một số mã C ++ trong đó nhà phát triển đã làm mọi thứ theo cách C ++ "thuần túy" <<và một kho phương thức như findsubstr. Đó là ít nhất một chục dòng và nó vẫn không thể xử lý dấu phẩy như dấu phân cách. Tôi đã thay thế tất cả các mã khó hiểu đó bằng một sscanfdòng như trên!

Độ dài 132 đoạn

#include<stdio.h>
int main(int c,char**v){while(--c){++v;printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n",*v,*v,*v,*v,*v);}return 0;}

Hoặc là:

#include <stdio.h>

int main(int c, char **v)
{
    while (--c)
    {
        ++v;
        printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n", *v, *v, *v, *v, *v);
    }

    return 0;
}

Các chức năng printf, sprintf, fprintf, vv định dạng sử dụng specifiers để xác định chiều rộng và đệm đầu ra.

Biên dịch và chạy ở trên bằng cách sử dụng các đối số dòng lệnh để xem các đầu ra khác nhau:

> main xyz 123456
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                              
|xyz  |                                                                                                                                              
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                 
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|12345|                                                                                                                                              
|12345| 

Lưu ý .5giới hạn đầu ra cho bộ xác định tối đa năm ký tự, trong khi hàng đầu 5đảm bảo đầu ra có ít nhất năm ký tự, với -chỉ thị căn lề trái. Kết hợp chúng đặt đầu ra ở chính xác năm ký tự.


4
Tôi không nghĩ rằng có một yêu cầu để thêm một factoid mới cho mỗi upvote :)
Trình tối ưu hóa

28
Một văn hóa phổ biến trong C là bỏ qua các cảnh báo tổng hợp , tôi không nghĩ đây là bất cứ nơi nào gần sự thật!
Shahbaz

4
Nếu bạn có một dự án lớn và xem xét nhiều trình biên dịch, có thể khá vô ích khi cố gắng loại bỏ tất cả các cảnh báo.
frageum

5
Điều này thật tuyệt vời
Kik

4
Tôi là một lập trình viên C và tôi không sợ Haskell.
Shahbaz

138

Mã máy x86

Factoid:

Mã máy x86 là phiên bản lắp ráp của x86 hội mà bộ xử lý thực sự chạy. Nó được phát triển trở lại khi bộ nhớ và dung lượng lưu trữ đắt tiền và được thiết kế để tương thích ngược với Intel 8008. Giữ mã thực thi nhỏ là một trong những mục tiêu và nó sử dụng các hướng dẫn độ dài thay đổi và kiến trúc CISC để trợ giúp đạt được điều này (điều này có nhược điểm là làm cho nó trở nên phức tạp hơn để cải thiện hiệu suất trên các bộ xử lý hiện đại). Điều này, cùng với bản chất cơ bản của lắp ráp và mã máy nói chung, mang đến cho các chương trình x86 khả năng cực kỳ nhỏ gọn.

Độ dài 1:

Bây giờ cho chương trình đầu tiên:

0xC3

Mở trình soạn thảo hex, nhập byte đó và lưu nó dưới dạng test.com.

Bây giờ bạn có chương trình MS-DOS hợp lệ, trả về ngay lập tức mà không cần làm gì, vì 0xC3 là hướng dẫn 'RET'. Tuy nhiên, điều này cho thấy một khía cạnh thú vị khác khi chơi golf với x86: định dạng tệp .com. Định dạng thực thi này hoàn toàn không có tiêu đề - tệp được tải đơn giản vào bộ nhớ bắt đầu từ địa chỉ 0x100, và sau đó thực thi được bắt đầu ở 0x100. Điều này có nghĩa là không có byte lãng phí trên siêu dữ liệu!

Độ dài 2:

Chương trình tiếp theo của chúng tôi:

0x4D 0x5A

hoặc 'MZ' trong ASCII.

Ok, tôi đã lừa dối một chút, đó thực sự không phải là một chương trình hữu ích, vì nó tương ứng với hướng dẫn

DEC     BP
POP     DX

Mà thực sự không hữu ích để bắt đầu một chương trình .com. Trên thực tế, đó là toàn bộ quan điểm của hai giá trị đó - không có tệp .com hợp lý nào nên bắt đầu với chúng! Các tệp .com được giới hạn ở kích thước 65280 byte (64KiB - 0x100), vì vậy khi cần các chương trình lớn hơn, một định dạng mới phải được phát triển. Đây là định dạng tệp .exe, có tiêu đề. Tuy nhiên, MS-DOS cần phải giữ phần mở rộng .com trên một số thành phần nhất định để tương thích ngược, vì vậy nó cần một cách để phát hiện xem một tệp .com có ​​thực sự là một .exe hay không. Họ đã chọn sting 'MZ' làm số ma thuật này và cho đến ngày nay, nếu bạn mở tệp Windows .exe (hoặc đậm) trong trình chỉnh sửa hex, bạn sẽ thấy chúng bắt đầu bằng hai byte đó. Điều thú vị là ngay cả chương trình Windows hiện đại nhất cũng bắt đầu với một ràng buộc tương thích từ những năm 70.

Độ dài 3:

Bây giờ cho một vòng lặp vô hạn:

41 E2 FD

Dịch ra

start:
inc cx
loop start 

Chương trình này tăng giá trị của CX (sẽ bắt đầu bằng 0), sau đó thực hiện lệnh lặp. Vòng lặp là một ví dụ tuyệt vời của hướng dẫn CISC vì nó kết hợp 3 thao tác đơn giản thành một hoạt động có mục đích đặc biệt: nó giảm giá trị của CX, kiểm tra xem nó có bằng 0 hay không và nhảy vào nhãn đích nếu không. Ngoài ra còn có các dạng vòng lặp kiểm tra các cờ khác ngoài việc kết thúc khi CX bằng 0. Chúng ta có thể thực hiện chỉ là 'nhảy bắt đầu' cho một vòng lặp vô hạn 2 byte, nhưng điều này thú vị hơn.

Độ dài 4:

Một chương trình rất hữu ích:

40 CD 10 C3

Dịch sang lắp ráp:

inc ax    ; 1 byte
int 10h   ; 2 bytes
ret       ; 1 byte

Chương trình này đặt bàn điều khiển thành 40x25 ký tự, xóa màn hình, sau đó quay lại dòng lệnh. AX được đặt ở chế độ video mà chúng tôi muốn (1), sau đó BIOS ngắt 10h được gọi để thực sự đặt chế độ video & xóa cửa sổ, trước khi quay lại. Hy vọng sẽ thấy nhiều hơn các ngắt BIOS này trong tương lai.

Độ dài 5:

Bây giờ chúng ta có thể thực hiện một chương trình tạm dừng:

B4 01 CD 21 C3

Dịch sang lắp ráp:

mov ah,1  ; 2 bytes
int 21h   ; 2 bytes
ret       ; 1 byte

Chương trình này yêu cầu BIOS đợi một phím được nhấn và lặp lại màn hình trước khi quay lại. Điều này cũng cho thấy làm thế nào trên x86, một số thanh ghi có thể được đọc hoặc viết một phần. Trong trường hợp này, chúng tôi đặt byte trên cùng của AX (AH) thành 1. Trên bộ xử lý 32 bit, bạn cũng có thể hoạt động ở mức 16 bit thấp mà không ảnh hưởng đến 16 bit trên cùng. Khả năng sửa đổi các thanh ghi một phần này có thể hữu ích cho các lập trình viên lắp ráp, nhưng có nhược điểm đối với các bộ xử lý hiện đại đang cố gắng thực hiện không theo thứ tự , vì chúng có thể đưa ra các phụ thuộc dữ liệu sai.

Độ dài 9:

Bây giờ để thực sự hiển thị đầu ra:

68 00 B7 07 AB 40 79 FC C3

Dịch sang lắp ráp:

; These two instructions set up ES, the 'extra segment'
push 0xb700 ; 3 bytes
pop  es     ; 1 byte
label:
stosw       ; 1 byte, Store Word - Copy AX to [ES:DI] then add 2 to DI
inc  ax     ; 1 byte
jns  label  ; 2 bytes, Jump Not Signed - Jump unless the sign flag is set (when inc AX yields 0x8000
ret         ; 1 byte

Đầu ra là bộ ký tự mặc định được lặp lại trong các màu khác nhau. Byte thấp của AX là mã ký tự và byte cao chỉ định màu sắc sẽ sử dụng. Bộ ký tự mặc định được lặp lại trong các màu khác nhau

Các chương trình 16 bit chỉ có thể giải quyết trực tiếp tối đa 64KiB. Để giải quyết vấn đề này, x86 đã sử dụng 'phân đoạn' - các thanh ghi đặc biệt sẽ được nhân với 16 và được thêm vào tất cả các truy cập bộ nhớ để cung cấp 20 bit bộ nhớ có thể định địa chỉ. Một chương trình có thể thay đổi giá trị của các thanh ghi phân đoạn này để truy cập thêm bộ nhớ - hoặc các vùng bộ nhớ đặc biệt: chương trình này sửa đổi phân đoạn bổ sung để ghi vào bộ nhớ video. Các loại truy cập bộ nhớ khác nhau đã sử dụng các thanh ghi phân đoạn khác nhau, cho phép mã, dữ liệu và ngăn xếp có thể truy cập được trong các khối bộ nhớ khác nhau cùng một lúc. Phân đoạn mặc định cũng có thể được ghi đè cho nhiều hướng dẫn.

Độ dài 20:

Chúng ta hãy làm cho một cái gì đó dễ nhận biết - chúng ta sẽ sử dụng 'Quy tắc 90' để vẽ các hình tam giác Sierpinki.

B0 13 CD 10 68 0F A0 1F AC 31 C2 88 94 3E 01 87 D3 93 EB F4

Trong lắp ráp:

mov al,13h      ; 2b
int 10h         ; 2b - Set the video mode to 13h

push    0xA00F  ; 3b
pop     ds      ; 1b - Set the data segment to video memory

start:          ; This loop runs 'Rule 90' to draw Sierpinski triangles
lodsb           ; 1b - load al with [ds:si] then increment si

xor     dx,ax   ; 2b - xor the left and right values of the previous row of pixels
mov     [si+318],dl ;4b - store result to memory

xchg    dx,bx   ; 2b - swap register values
xchg    ax,bx   ; 1b - swapping with ax is 1 byte shorter

jmp     start   ; 2b - infinite loop

Đầu ra mẫu: Tam giác Sierpinki

Đối với chương trình này, chúng tôi sử dụng 'Chế độ 13' hơi nổi tiếng - chế độ đồ họa có độ phân giải 320x200 với 256 màu. Nó được sử dụng bởi nhiều trò chơi DOS phổ biến , như Doom.

Dài 21

Hãy xem ai sản xuất CPU mà chúng tôi đang chạy.

0F A2 66 60 BB EE FF B9 0C 00 8A 17 43 B4 02 CD 21 E2 F7 FF E1

Dịch sang lắp ráp:

cpuid         ; 2b  CPU ID - retrieve processor information based on the value in AX. For AX=0,
              ;     the 12 bytes in EBX, ECX, and EDX are loaded with a vendor identification string
pushad        ; 2b  Push all registers on the stack (32 bit version)
mov  bx,0xffee; 3b  Start of the vendor identification string on the stack
mov  cx,12    ; 3b  12 characters to print
print:    
mov  dl,[bx]  ; 2b  Character to print
inc  bx       ; 1b  Advance string position
mov  ah,2     ; 2b  Set AH to the 'Print character to STDOUT' value
int  21h      ; 2b  Call the bios interrupt to print
loop print    ; 2b  Decrement CX and jump if it is not zero
jmp  cx       ; 2b  Instead of restoring the stack, just jump right to the exit point

Đầu ra mẫu:

c:\misc>cpuid.com
GenuineIntel

Chương trình này sử dụng hướng dẫn CPUID để lấy thông tin về bộ xử lý mà nó đang chạy, đặc biệt là chuỗi nhận dạng nhà cung cấp. Hầu hết mọi người sẽ thấy 'GenuineIntel' hoặc 'AuthenticAMD', trừ khi họ có nhà sản xuất CPU không phổ biến hoặc đang chạy trong một số máy ảo nhất định.

Chiều dài 26

Bây giờ chúng ta có thể làm hoạt hình thú vị

B0 13 CD 10 C4 07 BB 40 01 59 99 89 F8 F7 F3 31 D0 AA E2 F6 26 FE 05 47 EB FA

Trong hội

mov al,13h     ;2b
int 10h        ;2b Enter Video Mode 13h

les ax,[bx]    ;2b Set ES to (roughtly) video memory
mov     bx,320 ;3b Set up  BX asdivisor
pop     cx     ;1b Zeroize CX

start:
cwd            ;1b Sign extend AX to DX, AX will never have the sign bit set so this zeroizes DX in 1 byte
mov     ax,di  ;2b Copy video memory pointer
div     bx     ;2b Divide by width to get AX = Y pos, DX = X pos
xor     ax,dx  ;2b X pos ^ Y pos
stosb          ;1b Store and increment video pointer
loop    start  ;2b CX starts at 0, so this will loop until it wraps around

cycle:
inc     byte [es:di];3b Increment value in video memory to animate
inc     di     ;1b Increment video memory pointer
jmp     cycle  ;2b Infinite loop 

Và đầu ra sẽ như thế này:

Diễu hành

Hàm X pos ^ Y pos tạo ra một fractal thú vị, đặc biệt là khi hoạt hình

Chiều dài 27

Bạn không chỉ có thể tạo văn bản và đồ họa trong một chương trình x86 .com nhỏ, bạn còn có thể tạo âm thanh và âm nhạc:

BA 31 03 B0 3F EE BA 30 03 B0 93 EE B4 01 CD 21 3C 1B EE 3C 1B B0 7F EE 75 EC C3

Trong lắp ráp:

    mov dx,0x331            ; value for the midi control port
    mov al,0x3F             ; command value to set midi mode to UART
    out dx,al               ; output the command to the midi control port
play_loop:
    mov dx,0x330            ; value for the midi data port
    mov al,0x93             ; midi instrument value (piano)
    out dx,al               ; output to midi data port
    mov ah,1
    int 0x21                ; read character from stdin, with echo
    cmp al,27               ; test if it is escape
    out dx,al               ; output the ascii value as the midi note to play
    mov al,0x7F             ; note duration
    out dx,al               ; output note duration
    jne play_loop           ; loop if escape was not pressed
    ret  

Chương trình này sử dụng thẻ midi để biến bàn phím thành đàn piano. Để thực hiện việc này, thẻ midi được đặt ở chế độ UART, phát các ghi chú midi ngay khi nhận được. Tiếp theo, chương trình chờ một ký tự được nhấn và xuất giá trị ASCII dưới dạng ghi chú cho thẻ midi. Chương trình chạy cho đến khi thoát được nhấn.

Chiều dài 29

Chúng ta hãy sử dụng một hệ thống chức năng lặp để tạo ra một fractal Dragon Curve:

B0 13 CD 10 89 D0 01 CA 29 C1 D1 FA D1 F9 73 03 83 E9 7A B4 01 CD 16 B8 02 0C 74 E6 C3

Dịch sang lắp ráp:

mov  al,13h
start:
int  0x10    ; This does double duty, setting the video mode to 13h at program start,
             ; and calling the 'draw pixel at coordinates' interrupt when looping
mov  ax,dx   ; The next couple instructions are our IFS, the algorithm is aproximately
add  dx,cx   ; f(y) = 0.5x + 0.5y
sub  cx,ax   ; f(x) = 0.5x - 0.5y OR f(x) = 0.5x - 0.5y - 1
sar  dx,1    ;
sar  cx,1    ;
jnc  skip    ; This jump handles pseudo-randomly switching between the two functions for x,
             ; based on if the previous value of x was odd or not.
sub  cx,122  ; Magic number, chosen since it provides sufficent 'randomness' for a filled in
             ; fractal and a good scale to the fractal. 102 and 130 also work.
skip:
mov  ah,1
int  0x16    ; Get keyboard state, zero flag will be set if no key has been pressed
mov  ax,0xC02; Set up AH for the draw pixel function when int 0x10 is executed,
             ; AL = color, CX = column, DX = row
jz   start   ; Loop if a key hasn't been pressed
ret  

Đầu ra:

Đường cong rồng

Nhấn phím không điều khiển sẽ khiến chương trình thoát ra. Điều này được dựa trên Fire Coral của Desire trên Pouet.net.

Chiều dài 52

Chương trình này là một chút của một tính năng kép, nó cho thấy một chút của bộ đồng xử lý dấu phẩy động x87 và mã tự sửa đổi.

B3 07 D9 E8 B1 11 DE 0E 32 01 E2 FA BE 0A 24 56 B1 09 DF 34 AC D4 10 
86 E0 05 30 30 50 E2 F5 44 B4 2E 50 89 E2 B4 09 CD 21 FE 06 03 01 4B
75 D2 CD 20 0A 00

Khi chạy, chương trình sẽ xuất ra một số hằng số toán học:

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

Đó là One, Log2 (10), Log2 (e), Pi, Log10 (2), Log e (2) và Zero.

Trong lắp ráp:

100h

mov     bl,7         ;Counter for the total number of constants to print
start:
fld1                 ;Floating point constant to load on the FP stack,
                     ;start with 1 since it's op-code is the lowest

mov     cl,17        ;Multiply the constant by 10, 17 times to get the
mult:                ;printing part as an integer
fimul   word[ten]
loop    mult

mov     si,10+'$'*256;ASCII new line (10) and the end-of-string ($)
                     ;characters. These are used both as
push    si           ;a constant memory location, and stored to the
                     ;stack to format and printing

mov     cl,9         ;print 18 digits (9 pairs)
fbstp   [si]         ;store the integer part of the floating point
                     ;number on top of the FP stack as a packed
                     ;binary-coded decimal number (1 digit/nibble),
                     ;and then pop the number off the FP stack

convert:
lodsb                ;load a pair of packed digits

db 0xd4,16 ; AAM 16  ;ASCII Adjust For Multiply instruction using
                     ;non-standard base 16. This puts AL/16 in AH,
                     ;and AL%16 in AL, unpacking the digit pair.

xchg    ah,al        ;Swap the digit order
add     ax,'00'      ;Convert the digits to ASCII values
push    ax           ;Store digits on the stack
loop    convert

inc     sp           ;AX now holds the 1st 2 digits to print,
mov     ah,'.'       ;so to insert a decimal point, the 2nd digit
push    ax           ;is replaced with a '.', the stack pointer
                     ;is adjusted to overwrite 1 byte, and then
                     ;AX is pushed on the stack

mov     dx,sp        ;Load DX with the start of the print string
mov     ah,9         ;Load AH with the 'Print String' constant
int     21h          ;Call the 'Print String' interrupt to display
                     ;the constant

inc     byte[start+1];Self-modifying code - increment the load
                     ;floating point constant op-code to iterate
                     ;through all of them

dec     bx
jnz     start        ;Exit when all 7 constants have been printed
int     20h


ten: dw  10

Toán học dấu phẩy động trên các hệ thống x86 ban đầu được xử lý bởi bộ đồng xử lý x87 tùy chọn, phải đến năm 486, nó mới được chuyển lên cùng một con chip. X87 cũng có kiến ​​trúc khá khác biệt, nó dựa trên ngăn xếp, với 8 thanh ghi 80 bit có sẵn. Nó cũng có nhiều chế độ làm tròn, độ chính xác và ngoại lệ có thể đeo được.

Chương trình này in các giá trị cho bảy hằng số được đưa vào bộ xử lý. Có vẻ lạ khi không gian lệnh sẽ bị lãng phí cho các hằng số đơn giản như 0 và 1, nhưng hãy nhớ rằng tập lệnh được tạo khi bộ nhớ nhỏ và các lệnh này thường nhỏ hơn 2 byte so với các thao tác tương đương. Chương trình cũng sử dụng một hướng dẫn tối nghĩa, FBSTP -'Store BCD Integer and Pop '. Quay lại khi x86 được phát triển, các thao tác trên các số BCD phổ biến hơn và x86 / x87 có một số hướng dẫn cụ thể để đơn giản hóa toán học BCD, chẳng hạn như lệnh AAM 'ASCII Điều chỉnh cho nhiều' cũng được sử dụng trong chương trình.

Trong mô hình bộ nhớ không được bảo vệ được sử dụng bởi các chương trình x86 đầu tiên, không có sự phân biệt giữa dữ liệu và mã. Do đó, thật dễ dàng để lặp lại thông qua các hướng dẫn 'Tải không đổi' được mã hóa liên tục bằng cách tăng giá trị phù hợp.

Độ dài 64

Đăng chéo mục nhập của tôi cho Thử thách Mandelbrot , một chương trình có thể được viết để hiển thị một mảnh nhỏ Mandelbrot màu 320x200 chỉ trong 64 byte.

B0 13 CD 10 C4 07 99 89 F8 B9 40 01 F7 F1 83 E8 64 FE CE 31 DB 31 F6 
89 F5 0F AF F3 01 F6 0F AF DB 70 19 0F AF ED 70 14 01 EB 70 10 29 EB
29 EB C1 FB 06 01 D3 C1 FE 06 01 C6 E2 DB 91 AA EB C6

Trong lắp ráp:

mov al,13h ; set up graphics mode 13
int 10h

les ax,[bx]; trick to set video memory

FillLoop:
cwd
mov ax,di  ; di is the current position on screen
mov cx,320 ; convert di int x,y screen coordinates
div cx     ; CX is the iteration counter, exit the loop if it hits
           ; zero before the value escapes.
sub ax,100 ; center the fractal vertically
dec dh     ; center the fractal horizontally

xor bx,bx
xor si,si

MandelLoop: ; Fairly standard Mandelbrot routine,
mov bp,si   ; exits if the values overflow
imul si,bx
add si,si
imul bx,bx
jo MandelBreak
imul bp,bp
jo MandelBreak
add bx,bp
jo MandelBreak
sub bx,bp
sub bx,bp

sar bx,6   ; We use fixed point math with the lowest 6
add bx,dx  ; bits being the fractional portion, so this
sar si,6   ; rescales the values after multiplication
add si,ax

loop MandelLoop

MandelBreak:
xchg ax,cx ; Write the escape itteraction as the color
stosb
jmp FillLoop

Kết quả cuối cùng là hình ảnh này:

Mandelbrot Fractal

Chương trình này sử dụng toán học điểm cố định để tạo ra fractal, vì nó cần ít byte hơn. 6 bit thấp nhất của các thanh ghi 16 bit được coi là phần phân số của số và các giá trị được định cỡ lại sau khi được nhân.


7
Trong tất cả các ngôn ngữ để xem trên PPCG, tôi không mong đợi điều này.
Alex A.

23
Ồ Cộng với các nhân vật khác để làm cho một nhận xét này. Nhưng nghiêm túc. Ồ
krs013

2
@Michael Edenfield Đó là những gì DOSBox dành cho!
Sir_Lagsalot

1
Sierpinki 20 byte rất ấn tượng.
qwr

1
Tôi coi mình là một lập trình viên giỏi, nhưng khi nhìn vào điều này tôi phải thừa nhận thất bại.
Stephan bijzitter

121

Haskell

Bạn có thể muốn đọc từ dưới lên. Đôi khi tôi đề cập lại các đoạn thấp hơn, nhưng không bao giờ để các đoạn cao hơn, vì vậy nó có thể giúp hiểu.

Những độc giả không biết Haskell: tôi có rõ không? Khi nào tôi không rõ ràng? Tôi không thể nói.

Đoạn dài 86

Một ví dụ có thể gập lại cho cấu trúc dữ liệu cây của chúng tôi (đoạn 23). Có thể gập lại là một lớp loại - như trong, một lớp (/ nhóm) các loại. Đây là song song với các giao diện trong Java. Về cơ bản, chúng khái quát hóa qua các loại, thống nhất các loại có đặc điểm chung; ví dụ, chúng có thể được thêm vào cùng nhau ( Monoid), container ( Functor), có thể được in dưới dạng văn bản ( Showmà chúng ta đã gặp, trong showhàm), v.v. Kiểu này thống nhất các kiểu dữ liệu giống như danh sách trong đó chúng có thể được lặp lại hoặc làm phẳng thành một danh sách.

Trong đoạn mã này, chúng tôi xác định thể hiện bằng cách định nghĩa foldr, về cơ bản lặp lại kiểu dữ liệu từ phải sang trái. Bây giờ, chúng ta có thể sử dụng một loạt các mã viết sẵn nói chung. Đầu tiên, chúng tôi xác định một hàm trợ giúp để có được một cây đơn lẻ, để tránh tất cả sự lộn xộn : s a = N E a E. Hiện nay:

sum (N (s 3) 7 (N E 5 (s 8))     === 23
product (N (s 3) 7 (N E 5 (s 8)) === 840
toList (N (s 3) 7 (N E 5 (s 8))  === [3,7,5,8]

vân vân

Đây là hình ảnh của cây của chúng tôi:

7
| \
3  5
    \
     8

Độ dài 70 đoạn

primes=sieve[2..] where
 sieve(p:xs)=p:sieve(filter(\x->x`mod`p/=0)xs)

Đây là một sàng chính!

(lưu ý: /=là những gì !=trong các ngôn ngữ khác)

Điều này hoạt động bằng cách xác định một hàm sievelọc danh sách và chỉ giữ các số không chia hết cho bất kỳ số nguyên tố nào trước đó. Nó được định nghĩa đệ quy - sieveđược định nghĩa là chia danh sách thành phần tử đầu tiên pvà phần đuôi, lọc từ phần đuôi bất kỳ số nào chia hết cho p, sievebit còn lại, đính kèmp vào đầu của phần đó và trả về.

Một lần nữa, chúng tôi đang làm việc với các danh sách vô hạn ở đây - nhưng việc tính toán sẽ dừng lại theo thời gian miễn là bạn không yêu cầu một số lượng vô hạn các số nguyên tố được tính toán.

take 4 primes === [2,3,5,7]

Độ dài 68 đoạn

Cuối cùng, một quine!

main=do putStr s;print s where s="main=do putStr s;print s where s="

Trong lần đầu tiên đọc nó, bạn có thể nghĩ rằng đầu ra của câu hỏi này sẽ thiếu dấu ngoặc kép, và tại sao bạn lại một lần viết putStrvà một lần print? Nghe có vẻ giống nhau.

Trong Haskell, putStrlà một hàm chỉ in nội dung của chuỗi mà nó nhận được trên thiết bị xuất chuẩn; printMặc dù, in những thứ để stdout. Vì vậy, print 4tương đương với putStr "4\n", nhưng putStr 4là vô nghĩa - 4không phải là một chuỗi! Vì vậy, khi printnhận được một giá trị, đầu tiên nó sẽ chuyển đổi nó thành một chuỗi và sau đó in chuỗi đó. Nói chung cách để chuyển đổi mọi thứ thành chuỗi là tìm cách bạn viết nó thành mã. Vì vậy, cách bạn sẽ viết chuỗi abctrong một chuỗi bằng mã Haskell "abc", vì vậy print "abc"thực sự in "abc", không phải abc.

Thật may mắn làm sao bây giờ tôi có đủ phiếu bầu, tôi sẽ không phải đánh gôn những thứ này

Độ dài 33 đoạn:

main=go 0
go n=do print n;go(n+1)

Điều quan trọng cần lưu ý là chúng tôi đã không sử dụng một vòng lặp. Haskell không lặp. Haskell đệ quy. Haskell không có vòng lặp. Nó sâu hơn thế: Haskell thậm chí không có luồng Điều khiển . Làm thế nào, bạn có thể hỏi? Vâng, nó không cần bất kỳ.

Trên với các chi tiết. Chương trình này in một chuỗi số nguyên tăng vô hạn, bắt đầu từ 0. goin chúng bắt đầu bằng đầu vào của nó, sau đó maingọi nó vào 0.

dolà một sức mạnh cú pháp đặc biệt của Haskell. Trong kịch bản này, nó chỉ kết hợp các hành động I / O, giống như>> thực hiện (xem đoạn 22).

Độ dài 26 đoạn:

map f=foldr(\x y->f x:y)[]

Điều này xác định mapchức năng, có thể quen thuộc với mọi người, sử dụng foldr. Lưu ý rằng mặc dù chúng tôi không khai báo maploại của máy tính, nhưng bằng cách nào đó, máy tính biết loại của nó (a -> b) -> [a] -> [b], tức là được cung cấp một hàm từ ađến bvà một danh sách as, trả về một danh sách bs.

Làm sao nó biết ?? ;-)

Độ dài 25 đoạn:

main=putStr"Hello World"

Thế giới Hello tiêu chuẩn. Lưu ý các loại: maincó loại IO ()putStrcó loại String -> IO ()(một hàm từ chuỗi đến hành động I / O không trả về gì).

Độ dài 23 đoạn:

data T a=E|N(T a)a(T a)

Đây là một định nghĩa tiêu chuẩn của Cây. Dễ dàng hơn nhiều so với tất cả các dòng cần thiết để xác định cây trong Java, C hoặc bất cứ thứ gì khác.

(xem đoạn 10)

Hãy phá vỡ nó:

data- tuyên bố này khai báo một loại dữ liệu. T a- một cây chứa các yếu tố của loại a. Đây là loại chúng tôi đang xác định. =- mọi giá trị của T asẽ là bất kỳ giá trị nào sau đây, được phân tách bằng một đường ống |. E- một trong những giá trị có thể của T s- cây trống. N (T a) a (T a)- giá trị có thể khác của cây - một nút. Mỗi nút bao gồm con trái ( (T a)) phần tử ( a) và con phải ( (T a)).

Độ dài 22 đoạn:

main=putStrLn"y">>main

Một yeschức năng Haskell . >>là một toán tử kết hợp và sắp xếp hai hành động I / O. Nó có loại >> :: IO a -> IO b -> IO b.

mainđược định nghĩa đệ quy bởi chính nó, như hành động I / O đầu tiên in "y"và sau đó tự làm bất cứ điều gì main.

Độ dài 18 đoạn:

fix f=r where r=f r

Một định nghĩa tốt hơn cho fix. (Xem đoạn trích 14.) Vấn đề với định nghĩa đầu tiên fix f = f(fix f), là mỗi khi chúng ta gọi các fix f fixthu hồi fix f, trong đó nhớ lại fix f, tạo ra các bản sao vô tận của cùng một tính toán. Phiên bản này sửa nó bằng cách định nghĩa r(kết quả) là kết quả; như vậy , f r = r. Vì vậy, hãy xác định r = f r. Bây giờ chúng tôi trở lại r.

Độ dài 17 đoạn:

f n=product[1..n]

Đây là cách chức năng để xác định giai thừa.

Độ dài 16 đoạn:

f n=(\x->x+x+x)n

(\x -> x + x + x)là một lambda (ai đó nghĩ \giống như bức thư.).

(\x -> x + x + x) nlà lambda được áp dụng cho n(điều này hoàn toàn giống như n + n + n).

flà hàm nhân ba (cũng f = (*3))

Độ dài 15 đoạn:

sum=foldl (+) 0

Điều này xác định sumchức năng bằng cách sử dụng một nếp gấp. Một nếp gấp về cơ bản là một vòng lặp trên các thành phần của danh sách với một bộ tích lũy.
foldllấy làm đối số một số hàm fvà một số giá trị ban đầu xcho bộ tích lũy và danh sách xs. Hàm fsẽ nhận làm đầu vào giá trị bộ tích lũy trước và giá trị hiện tại của danh sách và nó trả về bộ tích lũy tiếp theo.
Sau đó, lần lặp lặp lại trên các giá trị danh sách, áp dụng ftrên bộ tích lũy trước đó và sau đó trả về bộ tích lũy cuối cùng.

Một cách khác để suy nghĩ về các nếp gấp giống như nếp gấp 'chèn' fgiữa các giá trị danh sách và với bộ tích lũy ban đầu ở một trong các cạnh. Ví dụ, foldl (*) 1 [4,2,5]đánh giá để 1 * 4 * 2 * 5.

Độ dài 14 đoạn:

fix f=f(fix f)

Người ytổ hợp. Nó thường được đặt tên fixbởi vì nó tìm thấy điểm cố định của phương trình f x = x. Lưu ý rằng x = infinite loopđôi khi cũng có thể là một giải pháp, vì vậy fix (\x -> x^2 + 5*x + 7)sẽ không giải phương trình x^2 + 4*x + 7 = 0mà thay vào đó trả về một vòng lặp vô hạn.

Bạn cũng có thể lưu ý rằng không phải lúc nào cũng x = infinite looplà một giải pháp, vì sự lười biếng của Haskell.

Phiên bản này là một rò rỉ thời gian và không gian; chúng tôi sẽ xác định lại nó trong một đoạn dài hơn.

Độ dài 13 đoạn:

f=sum.map(^2)

Điều này xác định hàm f đưa ra một danh sách trả về tổng bình phương của nó. Nó là thành phần chức năng của chức năng sumchức năngmap(^2) , lần lượt là chức năng map được áp dụng cho chức năng (^2) ( chức năng hình vuông ), lần lượt là một phần của chức năng ^ (các phần được giới thiệu ở đoạn 2 và thành phần tại đoạn 3 ).

Như bạn có thể thấy, các chức năng khá quan trọng trong một ngôn ngữ chức năng như Haskell. Trong thực tế, người ta đã nói rằng Haskell là ngôn ngữ với thư viện chuẩn nhất các chức năng mà có được chức năng như đầu vào hoặc trả lại chức năng như kết quả đầu ra (điều này thường được gọi là một bậc cao chức năng .

Nhân tiện, về mặt kỹ thuật, mọi hàm đối số hai hoặc nhiều hơn là một hàm trả về các hàm làm đầu ra (điều này được gọi là currying).

Độ dài 10 đoạn:

data B=T|F

Đây là một định nghĩa của booleans Haskell với các tên khác nhau. Loại boolean được đặt tên B.
Định nghĩa này giới thiệu hai hàm tạo: true ( T) và false ( F).
Đoạn mã này về cơ bản cho trình biên dịch biết rằng mọi boolean ( B) là true ( T) hoặc false ( F) hoặc nói cách khác , B=T|F.

Trong thực tế, tất cả các loại dữ liệu từng có thể được định nghĩa trong Haskell, khi trong các ngôn ngữ khác, các kiểu dữ liệu số, tham chiếu và mảng cần sự hỗ trợ đặc biệt từ trình biên dịch. Trong thực tế có sự hỗ trợ đặc biệt trong Haskell vì nó sẽ rất bất tiện, nhưng ví dụ, Boolkiểu dữ liệu được định nghĩa hoàn toàn bằng ngôn ngữ.

Độ dài 9 đoạn:

main=main

Chương trình vô nghĩa này sẽ được xác định mainlà chính. Vì Haskell lười biếng, các giá trị cần một vòng lặp vô hạn để đánh giá có thể được sử dụng tự do nếu chúng ta không sử dụng giá trị thực của chúng. Các giá trị như vậy chứa các vòng lặp vô hạn, như của chúng ta main, được gọi là "đáy".

Một sự thật thú vị là trình biên dịch GHC Haskell có thể phát hiện các loại vòng lặp vô hạn này và đưa ra một ngoại lệ có thể bắt được (!) Khi nó được chạy.

Độ dài 8 đoạn:

f(x:_)=x

Điều này xác định hàm f, được đưa ra một danh sách không trống, sẽ trả về đầu của nó.

Các mẫu trong Haskell giống như giải nén trình tự của Python, nhưng được khái quát cho tất cả các loại. Các mẫu có thể từ chối hoặc khớp với một giá trị và nếu nó khớp, có thể liên kết các biến với các giá trị.

Các mẫu trong đoạn trích này là:

  • _: mẫu phù hợp với bất cứ điều gì và liên kết không có biến.
  • x: mô hình liên kết bất cứ điều gì và liên kết nó với biến x.
  • :: mẫu này có các mẫu con, nghĩa là một cho đầu và một cho đuôi. Nếu danh sách không trống, nó khớp với đầu và đuôi.

Mẫu phù hợp rất khái quát. Trong thực tế, chỉ cần xác định các kiểu dữ liệu mới sẽ tự động đưa ra các mẫu để làm việc với chúng.

Độ dài 5 đoạn:

x=2:x

Whoa, có quá nhiều thứ để giải thích về cái này.

Trước hết, Haskell là lười biếng. Điều này có nghĩa là các biểu hiện phụ sẽ chỉ được đánh giá khi thực sự cần thiết.

Lưu ý: đoạn mã này không hiển thị bài tập, nhưng định nghĩa. Haskell không có nhiệm vụ.

Đoạn mã này được xác định x, một danh sách vô hạn được tạo thành hoàn toàn 2. Thông thường trong các ngôn ngữ khác xphải được đánh giá trước khi 2:xcó thể được đánh giá, nhưng trong Haskell chúng ta có thể làm điều này.

Danh sách vô hạn Haskell là một loại kết hợp của các trình lặp và danh sách được liên kết thông thường: chúng hoạt động như cả hai (ví dụ, một lần lặp trên một phạm vi sẽ sử dụng bộ nhớ không đổi).

Độ dài 4 đoạn:

2:[]

Đoạn mã này chỉ mã hóa danh sách singleton [2]. :là toán tử Cons trong Haskell. Trong thực tế, cú pháp danh sách thông thường chỉ là cú pháp cú pháp cho toán tử khuyết điểm và danh sách trống theo nghĩa đen. Điều này liên kết chặt chẽ trong cách Haskell xử lý các kiểu Dữ liệu và khớp dữ liệu (đặc biệt là khái niệm về hàm tạo).

Độ dài 3 đoạn:

f.g

Trong Haskell, .viết tắt của thành phần chức năng. Haskell có thể được viết theo kiểu "không có điểm", được đặc trưng bởi không đặt tên các đối số hàm và thay vào đó sử dụng. toán tử để thao tác luồng dữ liệu.

Độ dài 2 đoạn:

1-

Khi mã này được gói trong ngoặc đơn (vì lý do cú pháp), nó được gọi là "phần". Sau đó, nó là một hàm đưa ra một số, "lấp đầy" chỗ trống và trả về một số trừ đó. Khái niệm này đôi khi hữu ích trong một ngôn ngữ chức năng như Haskell, nếu không thì sẽ cần một lambda.

Độ dài 1 đoạn:

1

Trong Haskell, 1có thể cả một Int, Float, Double, Wordvà vân vân. Trong thực tế, bạn có thể viết mã để xác định một phiên bản 1thuộc bất kỳ loại nào và sử dụng nó một cách tự do.
điều này cũng được thực hiện bằng JavaScript, Python và vv, nhưng không giống như những thứ đó, nó được thực hiện với loại an toàn đầy đủ.

thực tế:

Ban đầu, ủy ban Haskell dự định gọi ngôn ngữ là "Curry" theo tên của Haskell B. Curry nhưng quyết định đổi tên thành Haskell vì một số cách chơi chữ có thể phát sinh. Chỉ sau đó, họ nhận thấy sự tương đồng của Haskell với "Pascal" và "Hassle"!


Tôi không biết liệu tôi có nên thay thế factoid bằng thực tế rằng Haskell có nhiều hàm / toán tử nhất trong thư viện chuẩn tạo ra các hàm từ các hàm khác không (và về mặt kỹ thuật thì cứ hai hoặc nhiều hàm tham số là như vậy). tôi có nên
tự hào

Hiển thị nó trong một đoạn và thêm nó trong phần giải thích.
Martin Ender

f=0:1:zipWith(+)f(tail f) -- 25 chars, một hàm trả về một danh sách được tính toán lười biếng của các số Fibonacci.
chamini2

ugh tôi đã thêm một loạt các đoạn trích và sau đó máy tính của tôi tắt
tự hào

@proudhaskeller Tiết kiệm op. Tôi chưa bao giờ thực hiện việc này một cách cá nhân, nhưng nếu bạn có một chỉnh sửa lớn để thực hiện cùng một lúc, bạn có thể thực hiện chỉnh sửa trong một tài liệu bên ngoài bằng cách lưu, sau đó dán nó vào khi hoàn thành.
mbomb007

99

C #

C # là sự pha trộn thú vị, điên rồ của các tính năng từ Java, C, Haskell, SQL và hàng tấn ngôn ngữ khác, và nó cung cấp rất nhiều tính năng và API thực sự hay. Nó cũng được biết đến ở đây vì khá dài dòng, nhưng chúng ta sẽ thấy những gì chúng ta có thể làm!

Tôi sẽ bỏ qua các mẫu nồi hơi yêu cầu thông thường:

class Program { public static void Main(string[] args) { ... } }

Độ dài 1:

;

Các lệnh được chấm dứt bằng dấu chấm phẩy trong C #! Một dòng trống là cú pháp hoàn toàn hợp lệ.

Độ dài 5:

x=5f;

Khi bạn chỉ định số bằng chữ trong C #, trình biên dịch sẽ cho rằng chúng là số nguyên hoặc số nhân (dựa trên việc chúng có dấu thập phân hay không). Nếu bạn muốn sử dụng số float theo nghĩa đen, bạn nên chỉ định rằng bằng cách thêm 'f' vào số hoặc nó sẽ được truyền trong thời gian chạy, phát sinh một chi phí nhỏ.

Độ dài 7 (byte):

s=@"
";

Nếu bạn đặt tiền tố một chuỗi ký tự bằng dấu @, nó sẽ trở thành một chuỗi ký tự "nguyên văn". Các chuỗi ký tự bình thường phân tích các chuỗi thoát như '\ n' thành các ký tự đặc biệt, nhưng các nguyên văn nguyên văn thì không, cho phép bạn sử dụng ký tự dấu gạch chéo ngược mà không thoát khỏi nó. Chúng cũng có thể bao gồm trả về dòng, như được hiển thị. Điều đó có thể giúp bạn tiết kiệm một vài byte trong golf hoặc làm cho chuỗi ký tự nhiều dòng của bạn dễ đọc hơn. Chỉ cần coi chừng thụt vào trong chuỗi.

Độ dài 8:

()=>x=y;

Biểu thức này là một hàm ẩn danh. Nó trả về một đối tượng kiểu Actioncó thể được truyền xung quanh và cũng được gọi là một hàm. Các hàm ẩn danh kế thừa phạm vi mà chúng được khai báo và chúng kéo bất kỳ biến cục bộ nào trong phạm vi đó với chúng bất cứ nơi nào chúng đi.

Độ dài 9:

(a)=>a.p;

Đây là một hàm ẩn danh khác sử dụng một tham số và giá trị trả về. Biểu thức trả về một đối tượng kiểu Func(chính Func trả về kiểu a.p. Bạn sẽ sử dụng Funcrất nhiều để giao tiếp với Linq.

Độ dài 10:

enm.Any();

Đây là lần đầu tiên chúng tôi giới thiệu về Linq! Linq là một tập hợp các phương thức mở rộng có thể được gọi trên bất kỳ đối tượng nào có thể đếm được (thực hiện giao diện IEnumerable) - như ArrayList. IEnumerable sử dụng đánh giá lười biếng: nó đi qua bộ sưu tập một mặt hàng tại một thời điểm, mà không biết về toàn bộ bộ sưu tập - nó thậm chí có thể là vô hạn!

Đó là nơi Anyđến - nó sẽ trả về truenếu Enumerable chứa ít nhất 1 vật phẩm. Tốt hơn nhiều so với tính toán ra toàn bộ chiều dài.

Độ dài 11:

var a=1.5f;

Các vartừ khóa chỉ thị các trình biên dịch để tự động xác định loại a. atrong trường hợp này sẽ được gõ như Single. Rất tiện lợi cho môn đánh gôn, vì nó ngắn hơn hầu hết mọi loại tên, mặc dù nhiều người không thích sử dụng nó trong mã sản xuất.

Độ dài 15:

yield return 0;

Đây là một tuyên bố điên rồ mà bạn có thể ít quen thuộc hơn. Bạn biết rằng các đối tượng có thể được đếm bằng cách kế thừa IEnumerable, nhưng bạn có biết rằng các hàm có thể đếm được không? Khai báo một hàm với kiểu trả về IEnumerablevà có yield returnsố lần bạn muốn. Khi bạn nhận được một Trình liệt kê cho hàm, mỗi lệnh gọi GetNextsẽ có chương trình thực thi tất cả mã đến lần tiếp theo yield return, trả về giá trị đó và sau đó tạm dừng cho đến khi bạn chuyển tiếp lại. Bạn sử dụng yield breakđể kết thúc việc lặp lại.

Độ dài 16:

[Obsolete]int a;

Đoạn mã này cho thấy một thuộc tính. Thuộc tính là một loại thẻ bạn có thể dán vào bất kỳ khai báo nào trong mã của mình. Một số hướng dẫn trình biên dịch thực hiện một số điều nhất định, như trình biên dịch này phát ra cảnh báo lỗi thời nếu bạn gọi a. Bạn có thể tạo riêng của mình bằng cách mở rộng Attributevà bạn có thể truy vấn chúng bằng Reflection (có thể nhiều hơn về sau), có lẽ). Bạn có thể truy cập meta và hạn chế loại khai báo mà thuộc tính có thể được sử dụng với AttributeUsagethuộc tính.

Chiều dài 17

c.Count(t=>t==3);

Đây là một phương pháp chơi golf tiện dụng. Cho một Funcmà các bản đồ một phần tử của đếm được ctới bool, nó sẽ trả về số phần tử trong cmà mà Functrả true. Đẹp hơn nhiều so với viết ra một vòng lặp.

Độ dài 18:

foreach(T t in c);

Đây là một vòng lặp cho mỗi. Với tất cả các cuộc nói chuyện về vô số điều này, đây là một cấu trúc rất cần thiết. foreachlà đường cú pháp sẽ thiết lập một Enumerator cho c(phải là vô số) và lặp lại thông qua nó một yếu tố ttại một thời điểm. Bạn có thể thay đổi hoặc kiểm tra từng yếu tố riêng lẻ, nhưng việc thay đổi chính bộ sưu tập sẽ làm mất hiệu lực của điều tra viên.

Chiều dài 19

c.Select(t=>t.a/2);

Đây là chức năng 'bản đồ' của bạn, dành cho người hâm mộ lập trình chức năng. Chọn là một cách ngắn gọn thú vị để thực hiện một số chuyển đổi tùy ý (được xác định bởi một Functhông qua) trên mỗi phần tử của một liệt kê. Nó trả về một IEnumerable sẽ nhổ các phần tử "đã chuyển đổi" khi bạn lặp lại nó.

Dài 21

Console.Write("Hi!");

Dòng này viết một số văn bản cho thiết bị xuất chuẩn và có lẽ là một trong những lý do chính khiến C # không được sử dụng để chơi gôn nhiều!

Chiều dài 23

typeof(T).GetMethods();

C # hỗ trợ một tính năng rất mạnh gọi là Reflection. Reflection cho phép bạn kiểm tra cấu trúc mã của bạn khi chạy. Ví dụ, cuộc gọi này sẽ trả về một mảng của tất cả các phương thức trên loại đã chỉ định. Bạn có thể kiểm tra các phương thức đó, gọi chúng hoặc thậm chí sửa đổi các giá trị của các trường và thuộc tính. Các thuộc tính (xem Độ dài 16) là một cách tốt để gắn thẻ các phần của mã của bạn để sử dụng với Reflection.

Dài 25

from t in c select t.a/2;

Đó có phải là SQL không? Trong mã C #? Khá gần. Biểu thức này thực hiện tương tự như biểu thức ở Độ dài 19.

Chiều dài 27

for(var l;;l=new object());

C # là ngôn ngữ được thu gom rác, có nghĩa là mọi bộ nhớ bạn phân bổ (sử dụng newtừ khóa) có thể được tự động phát hành miễn là không có tài liệu tham khảo nào về nó. Mã này sẽ chạy hạnh phúc mãi mãi mặc dù tôi không bao giờ giải phóng bộ nhớ được tạo một cách rõ ràng. Mặc dù vậy, bộ sưu tập rác có chi phí - tìm kiếm trên web để tìm hiểu thêm.

Chiều dài 29

var e=Enumerable.Range(0,99);

Enumerable.Rangelà một chức năng golf có khả năng tiện dụng. Nó trả về một cấu trúc có thể được liệt kê và sẽ mang lại từng số trong phạm vi được chỉ định, theo thứ tự. Tham số thứ hai là một số đếm, không phải là một chỉ số.

Chiều dài 31

public int pr{get;private set;}

Tại đây, chúng tôi có thể hiển thị một 'tài sản' đơn giản, tính năng OOP và một dấu hiệu khác của C #. Nếu bạn đã từng sử dụng Java, có lẽ bạn đã thực hiện các phương thức 'get' và 'set' cho một trường để tách biệt khả năng truy cập của họ hoặc chạy mã khi nó thay đổi. Chà, C # cho phép bạn khai báo mã đó ngay trên đầu trường và cũng đặt các bộ sửa đổi truy cập riêng để nhận và cài đặt. Đoạn mã đặc biệt này tự động tạo một getter và setter mặc định, nhưng làm cho setter ở chế độ riêng tư.

Chiều dài 32

public static void m(this T o){}

Đoạn mã này cho thấy một tính năng C # rất hay cho thiết kế API. Bằng cách áp dụng công cụ thissửa đổi cho tham số đầu tiên của phương thức tĩnh, phương thức đó trở thành phương thức "mở rộng". Khi điều này được khai báo, T.mbây giờ có thể được gọi trên bất kỳ đối tượng nào thuộc loại T như thể nó thực sự là một phương thức của T. Điều này có thể được sử dụng để thêm chức năng mới cho bất kỳ lớp hiện có nào, mà không cần sửa đổi hoặc thậm chí có quyền truy cập vào mã nguồn của nó.

Chiều dài 38

int f(int a,ref int b,out int c){c=0;}

Phương pháp này hiển thị các loại tham số khác nhau mà bạn có thể có trong C #. Các tham số không thay đổi được truyền theo giá trị . Các tham số có tiền tố refđược truyền bằng tham chiếu: bạn có thể gán một đối tượng hoàn toàn mới cho chúng và chúng sẽ mang nó ra khỏi phương thức. Các tham số có tiền tố outgiống như các giá trị trả về bổ sung: bạn được yêu cầu gán cho chúng một giá trị trong phương thức và chúng được đưa ra ngoài giống như các tham số ref.

Chiều dài 42

Console.Write("It is \{DateTime.Now()}.");

Tiêu chuẩn C # 6 mới có thể giúp bạn tiết kiệm một số ký tự khi bạn phải xuất các chuỗi đã lắp ráp, sử dụng phép nội suy chuỗi. Tính năng này cho phép bạn viết bất kỳ biểu thức nào trong dấu ngoặc nhọn bên trong một chuỗi ký tự và chuỗi sẽ được tự động lắp ráp với các giá trị của các biểu thức đó khi chạy.

Chiều dài 48

IEnumerable f(){for(int a=0;;)yield return a++;}

Chỉ cần đủ nhân vật bây giờ để làm một cái gì đó với một mục đích thực tế! Phương pháp này sử dụng một số ý tưởng mà chúng tôi đã khám phá ở trên để tạo ra một Số vô hạn, đơn giản sẽ trả về các số nguyên, từng cái một, bắt đầu bằng 0. Hãy nhớ rằng C # sử dụng đánh giá lười biếng với Enumerables, vì vậy một chuỗi vô hạn là hoàn toàn hợp lệ - bạn có thể lặp đi lặp lại nhiều như bạn muốn, và thoát ra bất cứ lúc nào.

Chiều dài 56

int p{get{return mP;}set{mP=Math.Max(value,0);}};int mP;

Đây là một ví dụ khác về 'tài sản' (xem đoạn 31). Ở đây, tôi thực sự đã định nghĩa các đoạn mã khác nhau cho getsetthay vì sử dụng các đoạn mã tự động như trước đây. Ví dụ này cho thấy cách bạn có thể sử dụng một thuộc tính để xác thực giá trị được gán cho một biến - ở đây, giá trị không được phép nhỏ hơn 0. Các cách sử dụng tốt khác của các thuộc tính bao gồm thông báo một sự kiện khi thay đổi giá trị hoặc xây dựng lại các giá trị được lưu trong bộ nhớ cache điều đó có thể dựa trên cái này

Chiều dài 65

int v;public static implicit operator int(Program o){return o.v;}

Tính năng này được gọi là một diễn viên ngầm. Nó giống như một phương thức mở rộng ở chỗ nó là mã tĩnh hoạt động trên một lớp cụ thể (xem đoạn 32). Tuy nhiên, dàn diễn viên ngầm không được sử dụng bằng cách gọi nó - nó được sử dụng đơn giản bằng cách coi một Programđối tượng là một số nguyên (ví dụ int i=new Program()). Khi bạn thực hiện việc này, đối tượng sẽ được chuyển đổi âm thầm thành loại bạn đang sử dụng, dựa trên mã trong dàn diễn viên ngầm. Thực tiễn tốt nhất nói rằng chỉ làm điều này khi không có thông tin bị mất do chuyển đổi.


1
Hãy xem những gì bạn sẽ có thể làm với những nhân vật này ... ;-)
tự hào

9
Tôi thực sự muốn nói rằng nó gần với java hơn C, thực sự
tự hào

Lưu ý Tôi nghĩ rằng chúng ta gần như có đủ để làm một số Linq - đến tối nay!
BMac

toán tử ẩn công khai int (MyClass o) {return o.objVal;} // 65. Với mã này, dòng này hợp lệ: MyClass o1 = new MyClass (10); int o2 = o1; // o2 là 10 bây giờ. msdn.microsoft.com/en-us/l
Library / 85w54y0a.aspx

Xin vui lòng thêm đoạn trích
Cyoce

98

Java


Độ dài 44 đoạn

Object a=System.out.append("Hello, World!");

In Hello, World!sang STDOUT.

Độ dài 43 đoạn

float[][][][][]a=new float[5][3][7][2][10];

achứa 10 mảng, mỗi mảng chứa 2 mảng, mỗi mảng chứa 7 mảng, mỗi mảng chứa 3 mảng, mỗi mảng chứa 5 floats.

Độ dài 42 đoạn

interface A{static void main(String[]a){}}

Một chương trình hoàn chỉnh. Vì tất cả mọi thứ trong một interfacelà vốn có public, chúng ta có thể bỏ qua từ publictừ phương thức chính.

Độ dài 36 đoạn

class A{class B extends A{B.B.B b;}}

Acó một lớp bên trong B. Điều này có nghĩa là chúng ta có thể khai báo một biến loại A.B.

Nhưng Blà một lớp con của A, có nghĩa là nó có tất cả các phương thức, các trường và các lớp bên trong của A. Vì vậy, chúng ta có thể tham khảo các loại B.Blà tốt.

Trong mã này, chúng tôi thực hiện bước này thêm một bước nữa và đưa ra Bmột biến thể hiện của kiểu B.B.B.

Đạo đức: làm theo những câu hỏi nóng hổi về SO có thể dạy cho bạn rất nhiều điều thú vị, nếu vô nghĩa, kỹ thuật.

Độ dài 35 đoạn

l.stream().map("a"::equals).count()

Nếu llà một danh sách các Chuỗi, điều này cho chúng ta biết có bao nhiêu trong số chúng bằng nhau "a".

Độ dài 34 đoạn

public static void main(String[]a)

Chữ ký phương thức của phương thức chính của chương trình. Chỉ cần thêm 11 nhân vật và chúng ta có thể tạo nên một chương trình hoàn chỉnh!

Độ dài 33 đoạn

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTH, Và WESTđều là những hằng số kiểu D.

Độ dài 32 đoạn

Files.readAllBytes("hello.txt");

Đọc toàn bộ tập tin, trả về một byte[]trong những nội dung.

Độ dài 31 đoạn

new String(new char[]{'h','i'})

Tương đương với "hi". Hữu ích nếu "chìa khóa bị hỏng.

Độ dài 30 đoạn

new JFrame().setVisible(true);

Tạo một khung nhìn thấy mới, mà bạn có thể đặt các thành phần khác vào.

Độ dài 29 đoạn

throws ClassNotFoundException

Buộc mọi phương thức gọi đây là sử dụng khối try- catchhoặc cách khác để chuyển lỗi lên ngăn xếp. Các ngoại lệ được kiểm tra là một trong những quyết định gây tranh cãi nhất của các nhà thiết kế Java.

Độ dài 28 đoạn

int f(int x){return f(x-1);}

Chức năng này không chạy mãi mãi; trong thực tế, trên một máy tính thông thường chỉ mất chưa đến một giây. Cảm ơn, Stack tràn.

Độ dài 27 đoạn

Object a=new String[]{"a"};

Tạo ra một chuỗi mới của chuỗi.

Độ dài 26 đoạn

Object.class.newInstance()

Tạo ra một cái mới Object.

Độ dài 25 đoạn

((Supplier)()->-~0).get()

Tốt nhất là tránh các hằng số mã hóa cứng. Đây là một cách hướng đối tượng để nhận giá trị 1mà không sử dụng bất kỳ hằng số nào khác ngoài 0.

Độ dài 24 đoạn

(Function<Long,?>)x->x+1

Hàm kế.

Độ dài 23 đoạn

l.removeIf(x->x%10==0);

Nếu llà danh sách các số nguyên, điều này sẽ loại bỏ tất cả các giá trị chia hết cho 10.

Độ dài 22 đoạn

int i=(new int[7])[5];

Tạo một mảng mới gồm bảy số nguyên và lấy phần tử thứ năm.

Độ dài 21 đoạn

Arrays.asList(2L,"a")

Tạo một ArrayList với các phần tử này.

Độ dài 20 đoạn

System.out.print(s);

In s.

Độ dài 19 đoạn

import java.util.*;

Cho phép sử dụng chính xác các lớp học như List, Map, Scanner, Timer, và Random.

Độ dài 18 đoạn

Math.addExact(x,y)

Thêm hai số nguyên xy. Nếu xảy ra tràn, phương thức sẽ ném một ngoại lệ thay vì đưa ra một câu trả lời không chính xác.

Độ dài 17 đoạn

Double.MIN_NORMAL

Giá trị dương nhỏ nhất của loại double, trong đó bit đầu của ý nghĩa là 0.

Độ dài 16 đoạn

System.in.read()

Đọc một ký tự từ bảng điều khiển.

Độ dài 15 đoạn

Long.reverse(x)

Đảo ngược các bit trong biểu diễn nhị phân của x.

Độ dài 14 đoạn

int x=050+120;

xbây giờ là 160, vì mọi thứ bắt đầu bằng 0được coi là bát phân.

Độ dài 13 đoạn

private C(){}

Một constructor riêng ngăn các lớp khác khởi tạo nó. Mẫu này được sử dụng bởi SystemMathcác lớp, trong số những người khác. Một nhà xây dựng tư nhân cũng có thể được sử dụng để thực thi Mẫu Singleton.

Độ dài 12 đoạn

static class

Cho phép tạo ra các lớp bên trong mà không có một lớp bên ngoài kèm theo - một giải pháp cho một vấn đề phải đối mặt bởi nhiều lập trình viên .

Độ dài 11 đoạn

throw null;

Nó thường là cần thiết để ném một NullPointerException, nhưng nó cũng khá dài dòng. Đây là một thay thế đơn giản hơn nhiều.

Độ dài 10 đoạn

int[]a,b[]

Xác định hai biến: ab . alà loại int[]blà loại int[][].

Độ dài 9 đoạn

switch(x)

Đi đến một nơi, tùy thuộc vào giá trị của x.

Độ dài 8 đoạn

break a;

Phá vỡ ra khỏi khối được dán nhãn a .

Độ dài 7 đoạn

goto x;

Các gototừ khóa được dành riêng trong C, C ++, và Java. Nếu xlà nhãn, thì mã này sẽ gửi chương trình đến nhãn thích hợp - trong C và C ++. Nhưng nó là Java, nó gây ra một bí ẩnRuntimeException . Trong thực tế, không có cách nào để sử dụng gototừ khóa trong Java.

Độ dài 6 đoạn

\u003b

Kết thúc một tuyên bố. Java là thật kỳ lạ .

Độ dài 5 đoạn

a-=-a

Đôi a bằng cách trừ đi sự phủ định của nó.

Độ dài 4 đoạn

a&=b

Đặt giá trị của abitwise và củaab.

Độ dài 3 đoạn

...

Bất kỳ số lượng đối số, hợp nhất thành một mảng.

Độ dài 2 đoạn

<>

Cho phép trình biên dịch tìm ra loại chung chung mà bạn có thể có nghĩa. Rất không giống Java.

Độ dài 1 đoạn

@

Biểu thị một chú thích để cho phép thông tin bổ sung được hiển thị về các phương thức và các lớp.

Factoid

Trong Java, các vòng lặp vô hạn đôi khi gây ra lỗi trình biên dịch. Ví dụ, vòng lặp while(true);không thể được chấm dứt mà không thoát khỏi phương thức, do đó, bất kỳ mã nào sau đó sẽ gây ra lỗi "tuyên bố không thể truy cập". Như @Optimizer đã chỉ ra, chỉ một số vòng lặp vô hạn sẽ được bắt theo cách này.


5
Trong java, các vòng lặp vô hạn không gây ra lỗi trình biên dịch. IDE của bạn phát hiện ra chúng và tạo ra lỗi. Java chỉ đơn giản là có một khái niệm về các câu lệnh Unreachable, vì vậy nếu bạn có một cái gì đó giống như while(true);trong mã của bạn, bất cứ điều gì được đặt sau dòng đó sẽ đưa ra một lỗi biên dịch của câu lệnh Unreachable. Logic đằng sau việc phát hiện các tuyên bố như vậy là rất nghiêm ngặt, do đó, nó sẽ không nhận ra tất cả các vòng lặp vô hạn bằng bất kỳ phương tiện nào
Trình tối ưu hóa

4
Bạn vừa được bình chọn, tôi đoán điều này có nghĩa là bạn sẽ phải xóa một đoạn trích! ;) (Downvote dành cho "Java thật kỳ lạ")
Simon Forsberg

1
Có vẻ như đoạn trích số 36 là đệ quy và có thể được mở rộng vô thời hạn: class A{class B extends A{B.B.B.B.B.B.B b;}}vẫn biên dịch.
Natix

3
Được nâng cấp để giúp bạn thực hiện một chương trình hoàn chỉnh;)
durron597

1
But it Java, [goto] triggers a mysterious RuntimeExceptionSai lầm. gotothậm chí không biên dịch.
dorukayhan

93

Con trăn

Bây giờ bắt đầu với mới nhất để thuận tiện cho bạn! Để đọc hết độ dài 30 bắt đầu sớm nhất, hãy đến lịch sử sửa đổi.

Nếu bất cứ ai có đề xuất, hãy bình luận.

Độ dài 52:

i=0
while s[i-n:]:print(' '*n+s)[i:n+i];i+=1;i**7**7

Lấy từ mục nhập của tôi trong thử thách Fake Marquee Text . sncần được đặt thành một chuỗi và một số nguyên trước thời hạn. Nó không thực sự hoạt động tốt trong trình thông dịch Python 2 miễn phí mà tôi đang sử dụng, vì vậy tôi đã thêm dấu ngoặc đơn xung quanh (' '*n+s)[i:n+i]và bạn có thể thấy nó chạy trong trình thông dịch Python 3 tại đây .

Độ dài 43:

#-*-coding:rot13-*-
cevag h"Una fubg svefg"

Trong Python bạn có thể mã hóa nguồn bằng một codec cụ thể. Điều này cho thấy cách nguồn có thể được viết trong Rot13. Cú pháp chung là đây : # -*- coding: <codec-name-goes-here> -*-.

Ở đây nó được dịch:

#-*-coding:rot13-*-
print u"Han shot first"

Việc uxác định rằng chuỗi ký tự sau đây là một chuỗi Unicode. Điều này là cần thiết nếu bạn muốn các chuỗi của mình cũng nằm trong Rot13, nếu không mọi chuỗi trong nguồn đều có thể dễ dàng đọc được mặc dù đã mã hóa. Ngoài ra, bạn cũng có thể sử dụng .encode("Rot13")sau mỗi chuỗi (đừng quên sử dụng Rot13 cho chuỗi này.) Theo bài viết này , một số mã hóa thay thế là cơ sở64, ″, uuencode,, zlib, hoặc, bz2.

Độ dài 33:

import cmath
print cmath.sqrt(-1)

Đây là mô-đun của Python cho các số phức (tưởng tượng) . Bản in này 1j, vì Python tuân thủ các tiêu chuẩn kỹ thuật và sử dụng jnhư là đơn vị tưởng tượng, mặc dù tôi thích i, thường được sử dụng trong toán học, và sử dụng jkngoài icác tứ phân vị , nhưng tôi lạc đề. Đọc thứ tự lỗi / thay đổi ở đây (nó sẽ không được thay đổi).

Độ dài 30:

f=lambda n:n*f(n-1)if n else 1

Bây giờ chúng ta xác định hàm giai thừa của chính mình bằng cách sử dụng đệ quy và ternary if-other! Theo như tôi biết, đây là môn đánh gôn như trong Python. Nó cũng có thể được viết theo cách này : f=lambda n:n and f(n-1)*n or 1, hiển thị một vài toán tử Boolean của Python (và cũng được thực hiện trong 30 ký tự.) Xem đoạn trích dài 15 để biết thông tin về lambdacú pháp.

Độ dài 29:

import math
math.factorial(7)

Tìm giai thừa của 7, trở về 5040.

Độ dài 25:

import math
print math.pi

Mô-đun toán học của Python cung cấp nhiều hàm và hằng hữu ích. Đây là PI. Trả về 3.14159265359. (Trong đoạn mã trên, tôi đã tính dòng mới là một ký tự.)

Độ dài 24:

f=lambda y:lambda x:x**y

Đây là một ví dụ về việc đóng cửa. Gọi cube = f(3)sẽ làm cho một chức năng khối mà sau đó có thể được gọi với print cube(24), in 13824.

Độ dài 19:

print"Hello World!"

Cuối cùng, đủ chỗ để in một số đầu ra cơ bản! Không gian không được yêu cầu ở đây, vì dấu ngoặc kép và dấu ngoặc đơn cũng là dấu phân cách. Điều này sẽ chỉ hoạt động trong Python 2, vì Python 3 đã thay đổi printhàm được gọi như bất kỳ hàm nào khác. Trong Python 3, sử dụng print("Hello World!"). Để biết thêm thông tin về chức năng in và sự khác biệt giữa Python 2 và 3, hãy xem Có gì mới trong Python 3.0 .

Độ dài 16:

[x*3 for x in l]

Một lần nữa, giả sử llà một danh sách hoặc bất kỳ đối tượng lặp lại nào khác, chẳng hạn như chuỗi hoặc trình tạo. Tuyên bố này được gọi là một sự hiểu biết danh sách . Nó ngắn hơn nhiều so với việc sử dụng tiêu chuẩn cho cấu trúc vòng lặp. Ở đây, nó trả về một danh sách với tất cả các số nhân với 3. CSONG, chuỗi có thể được nhân lên! Vì vậy, bất kỳ chuỗi nào trong danh sách sẽ được thêm vào (nối với chính nó) số lần đó.

Độ dài 15:

import this #:)

Đây thực sự là một đoạn dài 11 đoạn, nhưng tôi nhận ra rằng tôi đã quên giới thiệu quả trứng Phục sinh (tuyệt vời) của Python ! Nhập mô-đun này in Zen của Python (Xem Factoid.) Thực tế thú vị: mô-đun this.pyđược mã hóa trong rot13, mà tôi hy vọng sẽ có tính năng sau.

Độ dài 14:

lambda x:x**.5

Điều này xác định hàm căn bậc hai sử dụng lambdacú pháp của Python cho một hàm bằng chữ. Hàm chữ trong Python chỉ có thể chứa biểu thức, không phải câu lệnh. Lambda này có thể được gán cho một biến, được truyền cho một hàm hoặc được thực thi cùng dòng (lambda x:x**.5)(9), trả về 3.0. Sử dụng số mũ cho căn bậc hai là một cách thay thế để nhập sqrthàm trong mathmô-đun.

Độ dài 13:

1 if x else 0

Đây là một ví dụ về ternary if của toán tử. Điều này đã được thêm vào Python 2.5 để không khuyến khích các lập trình viên thực hiện nó bằng các thao tác Boolean. Ở đây, 1là trả lại nếu xđánh giá True, nếu không 0được trả lại.

Độ dài 12:

s=input(">")

Điều này sẽ in >cho văn bản nhắc nhở và cho phép người dùng nhập một giá trị. Python 2 diễn giải bất kỳ giá trị nào được nhập, do đó, bất kỳ chuỗi nào cũng cần dấu ngoặc kép. Python 3 đã thay đổi điều này, để đầu vào được nhập không tự động diễn giải. Để nhập dữ liệu vào mà không diễn giải nó trong Python 2, hãy sử dụng raw_input(). Trong Python 2, input()tương đương với eval(raw_input()).

Độ dài 11:

eval("2e3")

2e3là ký hiệu khoa học cho phao 2 x 10³. Các evalchức năng giải thích và đánh giá bất kỳ chuỗi như là một biểu. Trong trường hợp này, nó có kết quả tương tự như sử dụng bằng chữ 2e3hoặc float("2e3"). Nó trở lại 2000.0.

Độ dài 10:

range(013)

Hàm này trả về một danh sách các số nguyên từ 0giá trị bát phân 013, đó là11 (độc quyền), có nghĩa là danh sách sẽ có [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Hàm này có tối đa ba tham số tương tự như slicehàm chúng tôi đã xem xét trước đó : range(start, stop[, step]). Sự khác biệt là, chỉ với một tham số, tham số thể hiện giá trị dừng.

Lưu ý rằng Python 3.x không có tương đương. Nó rangetương tự, nhưng thực tế giống như Python 2xrange , trả về một đối tượng trình tạo thay vì danh sách.

Độ dài 9:

a,b = b,a

Nhiều bài tập. Đây là một tính năng đơn giản nhưng thanh lịch, cho phép bạn gán nhiều giá trị cùng một lúc. Trong đoạn trích được cung cấp, nó hoán đổiab. Những gì về thứ tự đánh giá, bạn yêu cầu? Tất cả các biểu thức ở bên phải của toán tử gán được đánh giá trước khi thực hiện bất kỳ phép gán nào. Điều này đánh bại nhiều ngôn ngữ yêu cầu gán trung gian cho một biến tạm thời.

Độ dài 8:

#comment

Bạn biết nó là gì ... Đợi đã, bạn không? Bạn biết đấy, những điều đó cho phép bạn gõ văn bản tùy ý để mô tả một dòng mã, làm cho nó dễ hiểu hơn? Không? Ờ được rồi...

Độ dài 7:

l[::-1]

Một lần nữa giả định l là một danh sách, điều này sẽ trả về danh sách theo thứ tự ngược lại. Đối số thứ ba chỉ ra kích thước bước. Vì cả ba đối số có thể là giá trị âm, nên kích thước bước âm có nghĩa là lặp theo thứ tự ngược lại. Các đối số thứ nhất và thứ hai trống cho thấy chúng ta đang lặp lại trên toàn bộ danh sách.

Chúng ta đang đến nơi chúng ta có thể bắt đầu sử dụng một số cấu trúc thú vị hơn!

Độ dài 6:

l[-6:]

Đây được gọi là một hoạt động lát . Nếu llà một danh sách, điều này sẽ trả về một danh sách mới chứa sáu thành phần cuối cùng của ldanh sách. -6đại diện cho chỉ số bắt đầu (6 từ cuối) và dấu hai chấm có nghĩa là tiếp tục cho đến khi chỉ mục kết thúc sau nó (mà chúng ta để trống, cho đến cuối.) Nếu danh sách của chúng tôi chứa các số từ 1 đến 10, điều này sẽ trở lại [5, 6, 7, 8, 9, 10].

Độ dài 5:

1<x<5

Một trong những tính năng tuyệt vời của Python là cho phép bạn xâu chuỗi các toán tử so sánh. Trong nhiều ngôn ngữ khác, điều này sẽ được gõ là 1 < x && x < 5. Nó thậm chí còn tốt hơn khi bạn xem xét nhiều so sánh: 1 < x < y < 5là hoàn toàn hợp lệ!

Độ dài 4:

0256

Một số nguyên có số 0 đứng đầu là giá trị bát phân bằng chữ. Đây là một mẹo hay cho mã obfuscation là tốt. Điều này trả về giá trị thập phân 174. Trong Python 3.x, giá trị bát phân sẽ được viết là 0o256.

Độ dài 3:

`3`

Xung quanh một biểu thức trong backticks cũng giống như sử dụng repr(), nó trả về biểu diễn chuỗi của một đối tượng. Hàm cố gắng trả về chuỗi theo cách mà khi nó được truyền dưới dạng đối số cho evalhàm, nó sẽ trả về đối tượng ban đầu. Nó không giống như sử dụng str(), mặc dù kết quả đôi khi giống nhau. Đối với đầu vào này, '3'được trả lại trong cả hai trường hợp. Đây là một yêu thích của tôi cho mã golf!

Chỉ hoạt động trong Python 2!

Độ dài 2:

[]

Một danh sách trống.

Độ dài 1:

_

Ký tự gạch dưới là một tên biến ném bỏ được sử dụng nhiều. Tuy nhiên, nếu bạn đang sử dụng shell Python (trình thông dịch tương tác), nó sẽ giữ kết quả của câu lệnh được thực thi cuối cùng (và sẽ trả lại nó.) Ngoài ra, theo chủ đề này , nó cũng được sử dụng để tra cứu dịch thuật trong i18n.

Factoid : Python là một ngôn ngữ tương tự Java và C. Nó được xây dựng với triết lý thiết kế cụ thể (lấy từ " PEP 20 - Zen of Python ":

  • Đẹp thì tốt hơn xấu.
  • Rõ ràng là tốt hơn so với ngầm
  • Đơn giản là tốt hơn phức tạp
  • Phức tạp tốt hơn phức tạp
  • Tính dễ đọc

Bởi vì những điều này, mặc dù các dấu chấm phẩy được cho phép như một dấu phân cách câu lệnh, chúng thường được bỏ qua để sử dụng nhiều dòng để dễ đọc. Ngoài ra, thụt dòng là rất quan trọng!


Bất cứ lúc nào! Tôi sẽ không thêm đoạn trích nữa (không thể cưỡng lại Độ dài 9!), Vì bạn đã làm rất tốt với nó. Chúc may mắn!
nasser-sh

1
độ dài 6: nó sẽ trở lại [5, 6, 7, 8, 9, 10](6 số cuối trong danh sách)
Vincent

Độ dài 16: lkhông phải là một danh sách, nó có thể là bất kỳ đối tượng lặp lại nào; tuples, danh sách và máy phát điện, ví dụ như tất cả công việc
nasser-sh

@ Sp3000: Tôi đã sử dụng nó với các thách thức [nguồn bị hạn chế].
Robbie Wxyz 2/2/2015

4
Không có tình yêu cho người tốt import antigravity?
Mật mã

87

JavaScript

Điều này đi mới nhất đến cũ nhất. Liên kết cho chính tôi: [ chỉnh sửa ]

Độ dài 51 đoạn:

console.log(require('fs').readFileSync(__filename))

Một Node.JS được đặt ra lần này, mặc dù nó sẽ không đáp ứng bất kỳ yêu cầu "nghiêm ngặt" nào, do đọc mã nguồn của chính nó.

Độ dài 50 đoạn:

a=new XMLHttpRequest;a.open('GET','file');a.send()

Cuối cùng! Yêu cầu AJAX (sử dụng Vanilla.JS ). Chúng tôi khởi tạo, mở và gửi yêu cầu, nhưng tôi đã hết phòng để thêm người xử lý và thực sự làm bất cứ điều gì với kết quả.

Độ dài 49 đoạn:

msg=new SpeechSynthesisUtterance('Hello World!');

Chuẩn bị một giọng hát "Xin chào thế giới!". Nó sẽ là một công việc nhiều hơn để thực sự nói nó. Chúng tôi cũng có thể điều chỉnh âm lượng, cao độ, tỷ lệ và dấu. Xem API tổng hợp lời nói trên HTML5Rocks . Chưa được Firefox hỗ trợ, chắc chắn không phải IE .

Độ dài 48 đoạn:

function repeat(){setTimeout(repeat,48)}repeat()

Mô phỏng setIntervalbằng cách đệ quy setTimeouting.

Độ dài 47 đoạn:

module.exports=function MyModule(a) {this.a=a};

NodeJS một lần nữa, nhưng nguyên tắc là giống nhau ở mọi nơi trong JS. Đây là một hàm xây dựng rất cơ bản, tạo ra một đối tượng với một thuộc tính ( a). Cài đặt module.exportsxuất hàm để sử dụng bằng cách require()-ing nó.

Độ dài 46 đoạn:

canvas.getContext('2d').fillRect(46,46,46,46);

Điều này đòi hỏi một <canvas id="canvas"></canvas>yếu tố. Nó lợi dụng thực tế là các phần tử có ID được xác định là biến toàn cục, vì vậy phần tử này có thể truy cập được canvastừ JS. Sau đó, chúng tôi điền nó với một hình vuông 46x46 tại x = 46, y = 46.

Độ dài 45 đoạn:

JSON.parse(require('fs').readFileSync('jsn'))

Quay lại nút. Ở đây, chúng tôi phân tích một tệp JSON có tên jsntừ thư mục hiện tại.

Độ dài 44 đoạn:

(a=document.createElement('a')).href="/url";

Xây dựng trên # 39. Bây giờ chúng ta tạo một phần tử và gán một thuộc tính. Nó vẫn không có trong DOM.

Độ dài 43 đoạn:

sq=[1,2,3,4,5].map(function(n){return n*n})

Tạo một mảng của 5 hình vuông đầu tiên, sử dụng map().

Độ dài 42 đoạn:

six="1+5",nine="8+1";eval(six+' * '+nine);

Điều này hoạt động theo nguyên tắc tương tự như thế này , nhưng JS thiếu #definevà do đó kết thúc xấu hơn. Nó trả lại, tất nhiên, câu trả lời cho cuộc sống, vũ trụ và tất cả mọi thứ .

Độ dài 41 đoạn:

c=function(){var i;return function(){}}()

Sự khởi đầu của một đóng cửa. cbây giờ là một hàm (hàm bên trong) có quyền truy cập vào biến nội bộ i, nhưng nó không làm gì cả.

Độ dài 40 đoạn:

$('p').click(function(){$(this).hide()})

Chúng tôi hoàn toàn bỏ những đoạn đó và sử dụng jQuery.

Độ dài 39 đoạn:

script=document.createElement('script')

Đây là sự khởi đầu của việc thêm một tập lệnh bên ngoài mới. Tạo một <script>phần tử trống và giữ một tham chiếu đến nó.

Độ dài 38 đoạn:

document.getElementsByClassName('abc')

Tìm tất cả các .abcyếu tố trong tài liệu. Tất nhiên, với jQuery, nó chỉ $('.abc')...

Độ dài 37 đoạn:

b=JSON.parse(JSON.stringify(a={3:7}))

Tạo hai đối tượng giống hệt nhau, nhưng tách rời a, và b. Nếu bạn sẽ làm

a={a:1};
b=a;
b.a=3;

bạn sẽ kết thúc với a=={a:3}, bởi vì abtrỏ đến cùng một đối tượng. Chúng tôi sử dụng JSON để tách chúng ra.

Độ dài 36 đoạn:

(function f(){return "("+f+")()"})()

Một quine . Nó in mã nguồn riêng của mình.

Độ dài 35 đoạn:

document.body.style.display="none";

Xem # 32. Điều này chỉ ẩn tài liệu, mà không ghi đè lên nội dung.

Độ dài 34 đoạn:

Object.prototype.toString.call(34)

Gọi Object.prototype.toStringlà một cách tốt để nói loại của một đối tượng. Trong khi 34..toString()"34", đoạn là[object Number] .

Đoạn trích dài 33: (tín dụng cho lần này dành cho người dùng ẩn danh )

+0%-0.&(v\u0061r=~void[{}<<!(0)])

Bạn nghĩ rằng đây không phải là JavaScript hợp lệ? Tốt hơn nên dùng thử ... (sử dụng Chrome);)

Độ dài 32 đoạn:

document.body.innerHTML="hacked"

Dừng lại! Hazxxors! Mười một !! 11!

Độ dài 31 đoạn:

a=[];for(i=0;i<31;i++)a.push(i)

Không đùa đâu, tôi đã chờ đợi rất lâu để có thể thực sự sử dụng một forvòng lặp! Điều này tạo ra một mảng từ 0-30.

Độ dài 30 đoạn:

new Date().getDay()==1?"S":"E"

Lần đầu tiên sử dụng toán tử ternary. Tôi không thể phù hợp hơn 30 ký tự này, vì vậy chúng tôi chỉ biết nếu hôm nay là Chủ nhật, hay gì đó khác. : P

Độ dài 29 đoạn:

Object.keys(window).push('i')

Object.keys(window)sẽ nhận được một mảng các biến toàn cục (thuộc tính của window). .push()sẽ nối một mục vào mảng đó. Hãy nghĩ rằng điều này là tương đương với window.i=undefined? Không!

Độ dài 28 đoạn:

setTimeout("a=confirm()",28)

Chờ đợi 28 mili giây không hữu ích lắm, ngoại trừ việc tạo một chủ đề mới.

Độ dài 27 đoạn:

document.querySelector('a')

Thật xấu hổ khi tên DOM quá dài. Tôi chỉ có thể nhận được một liên kết duy nhất ở đây.

Độ dài 26 đoạn:

JSON.stringify({twenty:6})

Xem # 16. Bây giờ chúng ta có JSON thực tế - một chuỗi.

Độ dài 25 đoạn:

new Badge("Good Answer");

Giả sử Badge()là một hàm xây dựng lấy một đối số ... một huy hiệu Câu trả lời tốt đã được tạo!

Độ dài 24 đoạn:

do {alert(24)} while(!1)

Tôi thực sự không sử dụng do..whilenhiều, nhưng một số thì có. Nếu đây là một whilevòng lặp thông thường , nó sẽ không cảnh báo bất cứ điều gì, vì nó luôn luôn sai. do..whilesẽ luôn luôn chạy ít nhất một lần, vì vậy chúng tôi phải xem 24.

Độ dài 23 đoạn:

window.parent==self.top

Tất cả đều đề cập đến cùng một đối tượng, thường được gọi là window. Nếu bạn gọi một chức năng bình thường, cũng có this. Đó là 5 cách truy cập đối tượng toàn cầu!

Độ dài 22 đoạn:

for(i in self)alert(i)

Thông báo tất cả các biến toàn cầu. Nó xảy ra là như vậy self==window. (Xem đoạn trích tiếp theo.)

Độ dài 21 đoạn:

"2"+1==21 && 2+1=="3"

Hãy nhìn xem, đó là quy tắc đúc của JS một lần nữa. Tuyên bố này là đúng, btw.

Độ dài 20 đoạn:

Math.random()<.5?0:1

Chọn một số ngẫu nhiên từ 0-1 và làm tròn bằng toán tử ternary. Mặc dù nó sẽ dễ sử dụng hơn Math.round...

Độ dài 19 đoạn:

[1,2,3].map(i=>i*i)

Cái này là mới Giống như, thực sự mới. Nó sử dụng các hàm mũi tên ES6 để tính các bình phương 1, 2 và 3. Hiện tại, nó dường như chỉ được Firefox hỗ trợ.

Độ dài 18 đoạn:

location.href="/";

Giống như # 15, nhưng lần này, nó đi đến trang chủ PPCG, không phải SE.

Độ dài 17 đoạn:

(function(){})()

Đó là đoạn trích từ 14, nhưng tốt hơn! Bây giờ là IIFE.

Độ dài 16 đoạn:

obj={not:'json'}

Điều này giải thích một trong những thú cưng của tôi. Đây là một đối tượng , không phải JSON ! JSON là một định dạng trao đổi dữ liệu dựa trên các đối tượng JavaScript, nhưng có định dạng nghiêm ngặt hơn.

Độ dài 15 đoạn:

open('//s.tk/')

Tưởng tượng rằng. Mở trang chủ SE, sử dụng chuyển hướng http://s.tk/ .

Độ dài 14 đoạn:

function f(){}

W00t! Chức năng! Quá tệ, không có chỗ để làm bất cứ điều gì.

Độ dài 13 đoạn:

Math.random()

Tạo một số ngẫu nhiên từ 0 đến 1. Bạn muốn xác định giới hạn của riêng mình? May mắn lớn. (Không thực sự, nó dễ dàng.)

Độ dài 12 đoạn:

new Date<=12

Tuyên bố này chưa bao giờ đúng trong JS. JS không được tạo cho đến '95 (xem factoid), rất lâu sau 1/1/1970 00: 00: 00.012.

Độ dài 11 đoạn:

Math.PI*121

Diện tích hình tròn có bán kính 11.

Độ dài 10 đoạn:

if('j')9+1

Trong trường hợp bạn không nhận thấy, tôi thích làm gì đó với số đoạn trong mã. Cái này trả về 10 và sử dụng j, chữ cái thứ mười của bảng chữ cái.

Độ dài 9 đoạn:

[9].pop()

Tạo một mảng với một mục. popđi chồn 9.

Độ dài 8 đoạn:

document

Cơ sở cho tất cả các công việc DOM. Nhưng chúng ta không thể làm gì được, vì nó quá dài. :( Đi jQuery!

Độ dài 7 đoạn:

alert()

Oh Boy! Một cuộc gọi chức năng! Cuối cùng nhận được để có thể làm công cụ!

Độ dài 6 đoạn:

var x=6

Dựa trên # 3. Mặc dù tốt hơn nhiều, bởi vì bây giờ toàn cầu là rõ ràng . : P

Độ dài 5 đoạn:

[][5]

Thậm chí ngắn hơn void 0để có được undefined. BTW: ''.athậm chí còn ngắn hơn; chỉ có 4 ký tự.

Độ dài 4 đoạn:

+"4"

Điều này sẽ tạo ra số 4trong chuỗi"4" . Bạn có thể sử dụng lại chính xác 4 ký tự này theo một thứ tự khác để làm ngược lại!

Độ dài 3 đoạn:

x=3

Oh dang, chúng tôi vừa thực hiện một biến toàn cầu ngầm ...

Độ dài 2 đoạn:

{}

Cái này làm gì Nếu bạn nói tạo ra một đối tượng theo nghĩa đen, bạn đã sai. Nó thực sự là một khối trống rỗng. Mở một giao diện điều khiển và thử nó! Nó trả về undefined, không phải{} .

Năm 2018, {}trong bảng điều khiển của Chrome thực sự trả về một đối tượng trống.

Độ dài 1 đoạn:

1

Đó là nó. Bất kỳ số nào là một biểu thức JS hợp lệ.

Factoid: JavaScript ban đầu được gọi là LiveScript. Nó đã được đổi thành JavaScript để tận dụng sự phổ biến của Java, vào thời điểm đó (1995). Cá nhân, lẽ ra họ nên giữ tên cũ; JavaScript đã là một nguồn gây nhầm lẫn kể từ đó. Thực tế là, Java và JavaScript gần giống như "xe hơi" và "thảm" .


1
Đoạn trích 33 không hoạt động trên Firefox. Nó có thực sự hợp lệ không?
Oriol

Tôi thấy việc xâu chuỗi và sửa chữa một đối tượng để sao chép nó quá bẩn. ECMAScript 6 giới thiệu Object.assign, vì vậy đoạn 37 trở thành b = Object.assign({ }, a = {3 : 7}).
Oriol

@Oriol Vâng, vâng, chỉ có Firefox hỗ trợ nó ngay bây giờ, vì vậy chúng tôi phải bám vào cách bẩn thỉu ngay bây giờ. Ít nhất là nó tốt hơn eval(uneval(a)), phải không? ;)
Scimonster

Khoảng # 38, luôn có document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)"). (Hỗ trợ bất kỳ bộ chọn CSS hợp lệ).
Mateon1

Đoạn trích số 40 tự nó không thú vị lắm, nhưng nhận xét là vô giá.
Scimonster

85

R

Factoid: Ngôn ngữ lập trình R bắt đầu như một triển khai GNU của ngôn ngữ lập trình S. Nó chủ yếu được sử dụng để thống kê và các ứng dụng liên quan.

Lưu ý: Mặc dù không phải là một yêu cầu của cuộc thi, mọi đoạn mã ở đây đều có thể tự chạy trong R.


Độ dài 32:

`[.data.frame`(swiss,3,2,drop=F)

Điều này có vẻ hơi bí ẩn ... và thực sự nó nên! Có một cách tốt hơn để viết này:

swiss[3, 2, drop = FALSE]

Điều đó sẽ trông quen hơn một chút. Đây là những gì xảy ra khi chúng ta chạy một trong hai đoạn mã sau:

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

Các swiss dữ liệu vận chuyển với R giống như một số khác mà chúng ta đã thấy cho đến nay. Nó chứa các chỉ số sinh sản và kinh tế xã hội cho 47 tỉnh nói tiếng Pháp của Thụy Sĩ từ khoảng năm 1888. Hàng thứ ba dành cho tỉnh Franches-Mnt, và cột thứ hai là tỷ lệ nam giới tham gia vào nông nghiệp như một nghề ở mỗi tỉnh. Vì vậy, vào năm 1888, 39,7% nam giới ở tỉnh Franches-Mnt của Thụy Sĩ làm việc trong ngành nông nghiệp.

Khi bạn trích xuất các hàng hoặc cột từ khung dữ liệu bằng cách sử dụng ký hiệu đơn giản hơn, R thực sự đang sử dụng [.data.frametrong nền. Như chúng ta đã thấy trong đoạn 24, hầu như mọi thứ đều có thể được định nghĩa là tên hàm miễn là nó được bao quanh trong dấu tích ngược, vì vậy đoạn mã của chúng ta ở đây là hợp pháp mặc dù tên hàm về mặt kỹ thuật có chứa dấu ngoặc không khớp.

Đối drop=số cho R biết liệu bạn có muốn nó thả kết quả xuống chiều thấp hơn nếu có thể. Thật vậy, nếu chúng ta nói drop=TRUE, chúng ta nhận được điều này:

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

Trường hợp trước đây kết quả là một khung dữ liệu, R bây giờ cho chúng ta gấp đôi.


Độ dài 31:

print(fortune("hadleywickham"))

Các fortune()chức năng là từ fortunesgói tất cả hiểu biết , cung cấp một loạt các trích dẫn khôn ngoan từ nhiều người thông thái. Đoạn trích này sẽ cung cấp cho bạn loại đá quý sau từ Hadley Wickham (23) bằng cách in ra bàn điều khiển:

That's a casual model, not a causal model - you can tell the difference by looking
for the word "excel".
    -- Hadley Wickham (commenting on an Excel chart showing student's SAT score
       increases with family income, without considering future covariates)
       http://twitter.com/#!/hadleywickham (February 2012)

Độ dài 30:

pie(rep(1,12),col=rainbow(12))

Ai không thích một biểu đồ tròn tốt? Các pie()chức năng sẽ phục vụ quý khách lên một biểu đồ pie mới ra lò dựa trên một vector của các con số. rep()tạo một vectơ bằng cách lặp lại phần tử đầu tiên r lần trong đó r là đối số thứ hai. Các col=tham số nói pie()làm thế nào để tô màu những lát. Chức năng ma thuậtrainbow() tạo ra một vectơ có độ dài xác định chứa mã hex cho các màu "cách đều nhau" của cầu vồng.

Những gì bạn có ở đây là biểu đồ "Số lượng mỗi màu trong biểu đồ" cơ bản của bạn:

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


Độ dài 29:

summary(lm(mag~depth,quakes))

Có một vài điều đang diễn ra ở đây, vì vậy hãy thực hiện từng bước một.

quakeslà một tập dữ liệu mà tàu với R. Nó chứa thông tin khoảng 1.000 sự kiện địa chấn cường độ lớn hơn 4,0 độ Richter gần Fiji từ năm 1964. Hai trong số các cột trong tập dữ liệu là mag, đó là cường độ của trận động đất, và depth, đó là độ sâu của tâm chấn tính bằng km.

Các lm()chức năng, như đã đề cập trong đoạn 28, phù hợp với mô hình tuyến tính. Nó trả về một lmđối tượng, hay chính xác hơn là một đối tượng của lớp lm. Có hai cách để chỉ định công cụ dự đoán (hoặc biến độc lập ) và phản hồi (hoặc biến phụ thuộc ) và tôi đã chọn phương thức công thức. Điều này có hình thức response ~ predictor. Nhiều dự đoán được chỉ định là y ~ x1 + x2. Các đối tượng trong công thức được đánh giá trong ngữ cảnh được cung cấp trong đối số tiếp theo.

Vì vậy, những gì lm(mag ~ depth, quakes)đang làm là phù hợp với một mô hình tuyến tính bằng cách sử dụng hồi quy bình phương nhỏ nhất bình thường trong đó cường độ là đáp ứng và độ sâu là yếu tố dự đoán. Nó biết những gì magdepthlà bởi vì chúng tôi nói với họ rằng họ đến từ quakes.

summary()là một hàm chung được sử dụng chủ yếu để tóm tắt kết quả của các mô hình được trang bị. Nó gọi một phương thức đặc biệt cho lớp đối số của nó. Vì chúng ta đã truyền một lmđối tượng, nên nó thực sự gọi một hàm được gọi summary.lm().

Đặt tất cả lại với nhau, chúng ta có được bản tóm tắt của mô hình tuyến tính đang cố gắng giải thích trận động đất từ ​​độ sâu của trận động đất. Cụ thể, đây là những gì R nói ra:

> summary(lm(mag~depth,quakes))

Call:
lm(formula = mag ~ depth, data = quakes)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72012 -0.29642 -0.03694  0.19818  1.70014 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.755e+00  2.179e-02 218.168  < 2e-16 ***
depth       -4.310e-04  5.756e-05  -7.488 1.54e-13 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3921 on 998 degrees of freedom
Multiple R-squared:  0.05319,   Adjusted R-squared:  0.05225 
F-statistic: 56.07 on 1 and 998 DF,  p-value: 1.535e-13

Chú ý điều đầu tiên nó nói với bạn là hàm gọi? Đó là bởi vì lm()hàm này sử dụng match.call(), giống như chúng ta đã làm trong đoạn 28!


Độ dài 28:

f<-function(x,y)match.call()

Các hàm R thường thích theo dõi những gì bạn nói với chúng. Thật vậy, đôi khi lệnh bạn đã gửi được trả lại cho bạn như một thuộc tính của đối tượng được trả về. (Một ví dụ là lm(), tạo ra các mô hình tuyến tính.) Nhớ lại các hướng dẫn chính xác được thực hiện bằng cách sử dụng match.call()trong hàm. Điều này chụp, hoặc khớp , gọi chức năng diễn giải.

Ở đây chúng ta đã định nghĩa một hàm f()có hai đối số và sau đó cho bạn biết những gì nó đã thấy.

> f(1,2)
f(x = 1, y = 2)

Điều này chủ yếu hữu ích khi phát triển các chức năng cho sử dụng chung (thay vì chỉ dành cho bạn), như trong phát triển gói. Nếu bạn muốn xem một ví dụ về match.call()tự nhiên, hãy xem mã nguồn lm()bằng cách gửi stats:::lm. Một trong những điều đầu tiên nó làm là nắm bắt cuộc gọi chức năng bằng cách sử dụng match.call().


Độ dài 27:

install.packages("ggplot2")

Điều này có vẻ tầm thường, nhưng nó cho thấy một trong những lý do tại sao R rất phổ biến: Nó rất dễ dàng mở rộng thông qua các gói. Và bất cứ ai cũng có thể phát triển và tự do chia sẻ các gói của họ!

install.packages()không chính xác những gì tên của nó gợi ý. Việc tìm kiếm các gói sử dụng máy nhân bản CRAN (Mạng lưu trữ toàn diện R) mặc định của bạn sau đó cài đặt chúng trên hệ thống của bạn, nơi R có thể tìm thấy chúng. Bạn cũng có thể yêu cầu nó cài đặt các gói từ mã nguồn cục bộ.

Ghi nhớ đoạn 23 nơi chúng tôi đã sử dụng ggplot2gói? Gói đó không giao hàng với R, nhưng chỉ trong 27 ký tự, bạn có thể biến tất cả ggplot2những giấc mơ của mình thành hiện thực bằng cách cài đặt nó.


Độ dài 26:

filled.contour(t(volcano))

Bộ volcanodữ liệu được gửi cùng với R. Đó là một ma trận chứa thông tin địa hình trên núi lửa Maungawhau (hay Núi Eden) ở Auckland, New Zealand. Các hàng của ma trận tương ứng với các đường lưới chạy từ đông sang tây và các cột là các đường lưới chạy từ nam sang bắc.

Vì lý do mất phương hướng, chúng ta hãy trao đổi các hướng, vì vậy các cột bây giờ là đông-tây và các hàng là nam-bắc. Chúng ta có thể làm điều này bằng cách sử dụng ma trận chuyển vị, hoàn thành thông qua t(). Và tại sao không tạo một bản đồ đường viền trong khi chúng ta đang ở đó? filled.contour()không chỉ thế

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


Độ dài 25:

pmatch("s",c("n","size"))

Các pmatch() chức năng cung cấp sự kỳ diệu đằng sau tất cả các hợp phần chúng tôi đã thấy cho đến nay. Đối số đầu tiên là một chuỗi được so sánh với từng phần tử của đối số thứ hai, một vectơ. Nếu có một kết quả khớp duy nhất, chỉ mục của phần tử phù hợp sẽ được trả về, nếu không bạn sẽ nhận được NA.

Đoạn mã ở đây là một ví dụ "thế giới thực" về việc sử dụng chức năng này. Nghĩ lại đoạn 13 nơi chúng tôi đã sử dụng sample()hàm. Nó chấp nhận lập luận n, size, replace, và prob, nhưng chỉ yêu cầu hai đầu tiên. Trong đoạn 13 chúng tôi đã sử dụng s=làm tốc ký cho size=. Những gì thực sự diễn ra trong nền là một cái gì đó giống như đoạn trích này, nơi những gì chúng tôi cung cấp được so sánh với những gì được mong đợi. Vì "s" khớp với "kích thước" duy nhất, nên việc sử dụng s=làm tốc ký là hoàn toàn hợp pháp .


Độ dài 24:

`(`=function(x)9;2*(3-1)

Một ví dụ hoàn hảo về những điều bạn không nên làm! Không bao giờ!

Bạn có thể gán các ký tự dưới dạng các hàm miễn là bạn bao quanh chúng trong các dấu tick ngược khi xác định hàm. Ở đây chúng tôi đã nói với R rằng đó (là một hàm luôn trả về 9 bất kể đầu vào. Giống như trong nhiều ngôn ngữ khác, ;có thể được sử dụng để bao gồm hai lệnh trên một dòng. Vì vậy, những gì chúng ta đã nói với R là xác định hàm (, sau đó in 2*(3-1).

Bây giờ, bất cứ ai cũng sẽ nói với bạn rằng 2 * (3-1) nên là 4 vì bạn làm 3-1 = 2, sau đó 2 * 2 = 4. Nhưng chúng tôi đã nói với R rằng bất cứ điều gì trong ngoặc đơn là 9. Vì vậy, trong khi 3-1 = 2, bây giờ chúng tôi có (3-1) = 9. Khi đó ta được 2 * (3-1) = 2 * 9 = 18.

Vì những điều khủng khiếp như thế này là có thể, mỗi khi bạn gửi mã có chứa dấu ngoặc đơn trong một biểu thức (nghĩa là không phải là một hàm gọi), trình thông dịch R thực sự sẽ tìm kiếm bất kỳ hàm nào được gọi (bất kể bạn đã xác định (là hàm. Nói chung, bạn viết càng nhiều, trình thông dịch R càng làm việc nhiều.


Độ dài 23:

qplot(Na,y=RI,data=fgl)

Cuối cùng, đủ số phiếu cho một ggplot2ví dụ (rất) đơn giản . Các ggplot2gói là một thực hiện R của Grammar của đồ họa, tạo ra bởi các vị thần huyền thoại R Hadley Wickham . Nói chung, cú pháp rất khác với đồ họa cơ sở R và mất một số làm quen. Tuy nhiên, qplot()là một giao diện đơn giản hơn với một số tính năng cốt lõi của gói và có cú pháp gần giống với plot()cơ sở R. Nhưng không giống như nhiều ví dụ tôi đã chỉ cho bạn, qplot()không hỗ trợ khớp một phần tên tham số chức năng.

Bộ fgldữ liệu đến từ MASSgói. Nó chứa các phép đo tính chất của các mảnh thủy tinh pháp y. Ở đây chúng tôi đang sử dụng các biến số Na, đó là phần trăm natri (Na) tính theo trọng lượng, và RI, là chỉ số khúc xạ của thủy tinh.

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


Độ dài 22:

unique(presidential$n)

Các unique()hàm trả về một vector chứa các giá trị độc đáo từ vector đầu vào của nó theo thứ tự mà chúng xuất hiện trong đầu vào. Các presidentialtập dữ liệu tàu với ggplot2gói (27). (Cảm ơn Jemus42 đã sửa lỗi đó!) Mô tả của nó:

Tên của mỗi tổng thống, ngày bắt đầu và ngày kết thúc nhiệm kỳ của họ, và đảng của họ gồm 10 tổng thống Mỹ từ Eisenhower đến Bush W.

presidentiallà khung dữ liệu và khung dữ liệu chứa các cột giống như danh sách chứa các mục. Các cột được tham chiếu theo tên bằng cách sử dụng $. Bộ dữ liệu đặc biệt này có một cột được gọi name, chứa tên của tổng thống. Nhưng chờ đã, chúng tôi chỉ định n! Trên thực tế, đây là một ví dụ khác về kết hợp một phần (13, 16), vì vậyn là hoàn toàn hợp pháp.

Đệ trình này có một kết quả thú vị:

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Lưu ý cách tên của Lyndon B. Johnson được đánh vần ... Rất tiếc.

(Lưu ý: Tôi đã chú ý, hơn một năm sau khi đăng bài này, lỗi đánh máy Johnson đã được sửa. RIP hài hước.)


Độ dài 21:

integrate(dexp,0,Inf)

R có một hàm tích hợp cho phương trình bậc hai thích ứng của các hàm của một biến trong một khoảng hữu hạn hoặc vô hạn. Trong R, vô cực được chỉ định là Inffor + infinite và -Inffor -infinite. Các dexp()chức năng là hàm phân bố xác suất cho việc phân phối mũ. Vì sự hỗ trợ của phân phối theo cấp số nhân là [0, + vô cùng) và phân phối xác suất tích hợp thành 1, chúng tôi sẽ mong đợi kết quả là 1. Kìa, một kết quả mong đợi!

1 with absolute error < 5.7e-05

Độ dài 20:

deriv(~cos(x^3),"x")

R có thể làm dẫn xuất tượng trưng! Điều này trả về:

expression({
    .expr1 <- x^3
    .value <- cos(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(sin(.expr1) * (3 * x^2))
    attr(.value, "gradient") <- .grad
    .value
})

Nhìn qua đó bạn có thể thấy cách nó phân tích hàm và sử dụng quy tắc chuỗi. Tất cả mọi thứ một chức năng đã tính toán năm đầu tiên sẽ có thể làm được! Đối số đầu tiên cho deriv()hàm là biểu thức R (là loại R thực tế) theo một số biến, trong trường hợp này x. Đối số thứ hai là tên của biến liên quan đến đạo hàm được lấy ở đây "x".

Bạn muốn xem một cái gì đó thực sự gọn gàng? Chỉ định ở trên cho một biến, nói dx. Xác định một biến xlà một vectơ số. Sau đó nộp eval(dx). R đánh giá đạo hàm tại x!


Độ dài 19:

c(matrix(1,3,3),"a")

Trong R, c()viết tắt của "kết hợp" hoặc "concatenate", tạo ra một vectơ từ các đối số của nó. Các phần tử của vectơ phải cùng loại và tất cả đều có độ dài 1. Nhưng thay vì nổi giận với bạn về nó, R sẽ làm phẳng một phần tử có cấu trúc, trong trường hợp này là ma trận và đúc mọi thứ thành cùng loại.

Nếu các đối số c()chỉ chứa một loại duy nhất, không có kiểu truyền nào xảy ra, ví dụ: nếu tất cả các đối số là logic ( TRUEFALSE), thì vectơ sẽ là tất cả các logic. Nếu nó chứa logic và số, nó sẽ là tất cả các số. Nếu nó chứa nhân vật và bất cứ điều gì, nó sẽ là tất cả các nhân vật. Vì vậy, đoạn trích của chúng tôi cung cấp cho chúng tôi điều này:

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

Lưu ý rằng ma trận 3 trong 3 đã được làm phẳng và việc thêm "a" biến mọi thứ thành các ký tự.


Độ dài 18:

(1-1/3-1/3-1/3)==0

Một bài học về độ chính xác của máy. Điều này trở lại FALSE.


Độ dài 17:

example(readline)

Các example()chức năng sẽ cung cấp cho bạn một ví dụ về cách sử dụng bất kỳ chức năng built-in. Nếu bạn cần tìm hiểu cách sử dụng readline(), R có một câu trả lời tự mãn cho bạn.

> example(readline)

readln> fun <- function() {
readln+   ANSWER <- readline("Are you a satisfied R user? ")
readln+   ## a better version would check the answer less cursorily, and
readln+   ## perhaps re-prompt
readln+   if (substr(ANSWER, 1, 1) == "n")
readln+     cat("This is impossible.  YOU LIED!\n")
readln+   else
readln+     cat("I knew it.\n")
readln+ }

readln> if(interactive()) fun()
Are you a satisfied R user?

Cách để khiêm tốn, R.


Độ dài 16:

acf(lh,t="part")

Các acf()chức năng trả về chức năng tự tương quan cho một chuỗi thời gian. lhlà một bộ dữ liệu gửi cùng với R. Mô tả của nó:

Một chuỗi thời gian thường xuyên cung cấp hoocmon luteinzing trong các mẫu máu trong khoảng thời gian 10 phút từ một người phụ nữ, 48 mẫu.

Trong ví dụ này, khớp một phần đang được sử dụng hai lần : một lần với tham số hàm và một lần với giá trị chuỗi được truyền cho tham số. Tên thông số đầy đủ là typevà các giá trị được công nhận là "correlation", "covariance", và "partial". Chỉ đủ của chuỗi phải được cung cấp để xác định nó độc đáo, vì vậy chúng tôi có thể sử dụng "part"cho "partial", mang đến cho chúng ta những chức năng tự tương quan từng phần (PACF).

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


Độ dài 15:

p3d(bunny,p=99)

Một lần nữa chúng ta lại thấy chú thỏ khét tiếng (11). Các oniongói cho chúng ta một cách thậm chí đẹp hơn để xem các dữ liệu hữu ích nhất bao giờ hết, sử dụng chức năng vẽ 3D p3d(). Điều này gọi hàm đồ họa cơ sở persp()trong nền, trong đó có một đối số quay phi. Sử dụng kết hợp một phần tên tham số (13), chúng ta có thể chỉ định p=thay cho phi=.

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


Độ dài 14:

stats:::rgamma

R là mã nguồn mở nhưng bạn không phải là một trình hướng dẫn để xem mã nguồn; bạn chỉ có thể nhập tên gói và hàm có mã bạn muốn xem cách nhau bởi ba dấu hai chấm ( :::). Điều này cung cấp cho bạn mã xác định rgamma()hàm, tạo ra các sai lệch ngẫu nhiên khỏi phân phối gamma. Đệ trình này mang lại:

function (n, shape, rate = 1, scale = 1/rate)
{
    if (!missing(rate) && !missing(scale)) {
        if (abs(rate * scale - 1) < 1e-15)
            warning("specify 'rate' or 'scale' but not both")
        else stop("specify 'rate' or 'scale' but not both")
    }
    .External(C_rgamma, n, shape, scale)
}
<bytecode: 0x00000000098cd168>
<environment: namespace:stats>

Lưu ý rằng nó sử dụng một chức năng .External(). Điều này đòi hỏi chức năng viết bằng các ngôn ngữ khác, thường là C và Fortran, các ngôn ngữ trong đó bao gồm nhiều nền tảng của R. Định vị rằng mã nguồn không mất một chút ma thuật. Chỉnh sửa: @Vlo chỉ ra rằng những người bình thường thực sự có thể xem mã C bên dưới được gọi .Internal().Primitive()sử dụng pryrgói. Cảm ơn, @Vlo!


Độ dài 13:

sample(9,s=4)

Điều này trông không giống lắm, nhưng nó minh họa một khái niệm mạnh mẽ trong R: khớp một phần các tham số chức năng . Các tham số được đặt tên trong sample()hàm là size, replaceprob, nhưng bạn chỉ cần cung cấp đủ các chữ cái của tham số đã đặt tên để xác định duy nhất nó. Do đó sample(), bạn có thể sử dụng s=thay size=vì không có tên tham số nào khác bắt đầu bằng chữ "s". Mã ở đây chọn một mẫu ngẫu nhiên có kích thước 4 từ các số nguyên 1 đến 9.


Độ dài 12:

LETTERS[-pi]

Có một vectơ tích hợp được gọi là LETTERSchứa tất cả các chữ cái tiếng Anh viết hoa theo thứ tự bảng chữ cái. Không giống như nhiều ngôn ngữ khác, bạn có thể lập chỉ mục một vectơ bằng cách sử dụng số dấu phẩy động. Không có gì quá thú vị xảy ra; R chỉ lấy phần nguyên. Sử dụng -trước chỉ mục của một vectơ sẽ loại bỏ phần tử với chỉ mục đó khỏi vectơ. pilà một hằng số tích hợp có chứa - bạn đoán nó - số vô tỷ π. Vì vậy, điều này loại bỏ phần tử 3 khỏi vectơ và trả về "A" đến "Z" bỏ qua "C".


Độ dài 11:

plot(bunny)

Trong oniongói, có một bộ dữ liệu được gọi bunny. Vẽ đồ thị cho bạn những gì có thể là đồ họa hữu ích nhất mọi thời đại:

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


Độ dài 10:

????sample

Nói rằng bạn thực sự bối rối về sample()chức năng và bạn rất cần sự giúp đỡ. Thay vì thông thường ?sampleđể kéo lên trang hướng dẫn R, bạn viết ra bốn dấu hỏi. R nghe thấy cảnh ngộ của bạn và cố gắng giúp ...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

Than ôi.


Độ dài 9:

isTRUE(1)

Lúc đầu, điều này có vẻ thách thức quy ước trong phần còn lại của gói cơ sở R để phân tách isvà từ sau trong tên hàm với a .. Tuy nhiên, điều đó chỉ áp dụng cho một bài kiểm tra logic về việc liệu đối số có thuộc loại nhất định hay không, như dưới đây (8). Trong trường hợp này, chúng tôi đang kiểm tra xem nó TRUEcó phải là loại không. Điều này sử dụng một định nghĩa nghiêm ngặt TRUE, tức là 1 không "đúng" theo nghĩa thông thường. isTRUE(1)trả lại FALSE.


Độ dài 8:

is.na(8)

Không giống như hầu hết các ngôn ngữ lập trình khác, .là một ký tự hợp lệ trong hàm và tên biến. Nó không biểu thị bất kỳ loại phương pháp hoặc gia truyền; nó chỉ là một phần của cái tên Các is.na()chức năng kiểm tra xem đối số của nó để đánh giá NA(thiếu) và trả về TRUEhoặc FALSE.


Độ dài 7:

stop(7)

Điều này gây ra lỗi với đầu vào là thông báo lỗi. Nếu được gọi bên trong hàm, việc thực thi chức năng sẽ dừng lại. Nhưng gọi nó bên ngoài chức năng sẽ không dừng tập lệnh. Trong trường hợp này, đầu ra là Error: 7.


Độ dài 6:

x < -1

Mặc dù điều này có vẻ tầm thường, nhưng nó hiển thị một sự chỉ trích lớn của toán tử gán <-: cụ thể là, ý nghĩa thay đổi tùy thuộc vào vị trí của các khoảng trắng. Như đã đề cập, x <- 1gán 1 cho x. Việc tách <-với một khoảng trắng như trên sẽ thay đổi nó thành một phép thử logic xem xcó nhỏ hơn -1 không. Vì lý do đó, nhiều người thích =chuyển nhượng.


Độ dài 5:

x<<-1

Tương tự như <-ngoại trừ <<-luôn gán biến cho phạm vi toàn cầu bất kể phạm vi hiện tại.


Độ dài 4:

x<-1

R sử dụng <-để gán các biến trong phạm vi hiện tại. Đoạn mã này gán giá trị 1 cho x.


Độ dài 3:

!0i

Các !nhà điều hành là R cho "không", và 0ilà số phức tạp 0+0i, AKA 0 trong mặt phẳng phức tạp. Đệ trình tuyên bố này trả về TRUEvì 0 là sai.


Độ dài 2:

NA

Điều này trả về giá trị R đặc biệt NA, viết tắt của "không khả dụng", biểu thị một giá trị còn thiếu.


Độ dài 1:

T

Điều này trở lại TRUE. Trong R, TFlà từ đồng nghĩa cho các giá trị boolean TRUEFALSE, tương ứng.


Yay R "!"(T)!
Vlo

@Vlo: "!"(T)đánh giá để FALSE. Tuy nhiên, tuyên bố "Yay R" không bao giờ sai. ;)
Alex A.

Làm thế nào để tôi upvote nhiều hơn cho nhiều mục hơn ???? "Xác định vị trí mã nguồn cần một chút thuật sĩ" là chuyện nhỏ .Internal.Primitive->pryr::show_c_source(.Primitive("sum"))
Vlo

@Vlo: Tôi chưa nghe nói về pryrgói. Rất tuyệt! Cảm ơn đã chỉ ra rằng. Tôi rất vui vì bạn thích các mục cho đến nay, cảm ơn vì sự hỗ trợ. :)
Alex A.

2
@ Jemus42 Ah, có vẻ như bạn cần phải làm data(bunny)trước.
Alex A.

75

Brainfuck

Factoid: Brainfuck (Còn được gọi là brainf * ck) là một ngôn ngữ bí truyền thử nghiệm để tạo ra trình thông dịch ngôn ngữ hoàn chỉnh nhỏ nhất từng có, được tạo bởi Urban Müller, và hiện là ngôn ngữ nổi tiếng nhất của loại hình này. Nó chỉ có tám lệnh, dễ học, nhưng khó sử dụng.

Brainf * ck có bộ nhớ cơ sở băng với 30000 ô và con trỏ di chuyển và có thể được hiển thị như thế này:

0 0 0 0 0 0
    ^

Với ^ký tự đại diện cho con trỏ và 0 là đại diện cho các giá trị cho mỗi ô.

Brainfuck có tám hướng dẫn:

Instruction  C Equivalent              Description
+            mem[ptr]++;               Add one to the value under the cell
-            mem[ptr]--;               Subtract one from the value under the cell
>            ptr++;                    Go on cell to the right
<            ptr--;                    Go on cell to the left
,            mem[ptr] = getchar();     Read a ASCII character from input and put the result in the value under the cell
.            putchar(mem[ptr]);        Write a ASCII character to the output using the value under the cell
[            while (mem[ptr]) {        Start a while loop: Continue to matching ']' when value under the cell is 0
]            }                         End a while loop: Go back to matching '[' when value under the cell is NOT 0

Brainfuck đến C:

#include <stdlib.h>

int main(void) {
    unsigned char* mem = calloc(30000, sizeof(unsigned char));
    unsigned int ptr = 0;

    // Put your brainfuck code here, converted to the matching expressions under "C equivalent"

    return 0;
}

Độ dài 1 đoạn

Đọc một ký tự và đặt nó vào ô hiện tại.

,

Bộ nhớ (có đầu vào abc:)

0 0 97 0 0 0
    ^

Độ dài 2 đoạn

Thêm một vào ô hiện tại và dịch chuyển con trỏ sang phải.

+>

Ký ức

0 0 1 0 0 0
      ^

Độ dài 3 đoạn

Loại bỏ một từ ô hiện tại cho đến khi nó bằng không; Đặt ô hiện tại về 0

[-]

Bộ nhớ có thể:

Bộ nhớ: (Trước)

0 0 100 0 0 0
    ^

Bộ nhớ: (Sau)

0 0 0 0 0 0
    ^

Độ dài 4 đoạn

Nhận xét: Trong brainfuck, mọi thứ không phải là một hướng dẫn đều bị bỏ qua. Vì lý do đó, chương trình sau đây là chương trình cân não hoàn toàn hợp lệ (nhưng trống rỗng):

Hey!

Độ dài 5 đoạn

Một chương trình mèo đơn giản (Ghi đầu vào vào đầu ra)

,[.,]

Cảm ơn tomsmede cho nhận xét của mình

Độ dài 6 đoạn

Di chuyển giá trị của ô hiện tại sang ô bên phải (Giả sử ô bên phải là 0, nếu không, nó sẽ thêm giá trị của ô hiện tại vào giá trị của ô bên phải):

[>+<-]

Nói chung, mọi người sử dụng mã này để di chuyển một biến mặc dù.

Bộ nhớ: (Trước)

10 0 100 0 0 0
     ^

Bộ nhớ: (Sau)

10 0 0 100 0 0
     ^

Độ dài 25 đoạn

Đảo ngược một đầu vào sáu ký tự và in nó, theo sau là mỗi ký tự ASCII (N-1) .. 1 (trong đó N là giá trị của ký tự đầu vào đầu tiên).

,>,>,>,>,>,.<.<.<.<.<[.-]

Độ dài 53 Đoạn

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

Chương trình C rút gọn này cũng là một chương trình Brainfuck được ngụy trang, và ngược lại! Trong thực tế, họ (gần như) làm điều tương tự. Đây là mã Brainfuck không có "ý kiến" (mã C).

><+-

Hãy để tôi giải thích mã Brainfuck (và mã C). Như bạn có thể thấy, nó sử dụng hai ô ( ij). Nó tăng ô đầu tiên (tăng i1). Sau đó, nó giảm cùng một ô (giảm i1).

Đây chỉ là một ví dụ ngớ ngẩn về một số mã nguồn có thể được biên dịch thành hai ngôn ngữ khác nhau và chạy (thực tế) như nhau.


2
,[.,]- 5 nhân vật, chương trình mèo
tomsmeding

13
Đây có thể là "Brainfuck 101" tốt nhất mà tôi từng thấy.
hoosierEE

chiều dài 6: sẽ đặt tổng vào ô bên phải và bằng 0 bên trái. Không di chuyển, phải không?
Filip Haglund

Đã thêm một biến giả cho chiều dài 6 để giải thích rõ hơn về khái niệm này. Trên thực tế, chương trình sẽ thêm ô số 3 vào ô số 4 và tạo ô số 3 0.
YoYoYonnY

58 phiếu bầu - bạn có thể cập nhật? :)
Conor O'Brien

65

C ++

Với bộ tiền xử lý, các mẫu, lambdas, các đặc điểm loại và vô số các tính năng phức tạp khác mà không ai có thể hy vọng hiểu được toàn bộ, C ++ được phát hiện lại theo từng thế hệ mới của tiêu chuẩn. Bằng cách khai thác nhiều cách để thực hiện mọi thứ trong thời gian biên dịch, người ta có thể viết các tóm tắt không chi phí như thư viện cho phép các đơn vị vật lý được gắn vào các kiểu dữ liệu số để kiểm tra độ chắc chắn của chúng tại thời gian biên dịch (ví dụ: bạn không thể gán kết quả của kg* mcho N)

Độ dài 1

#

Thông thường giới thiệu một câu lệnh tiền xử lý, #có thể tự đứng trên một dòng. Về cơ bản, nó không có nghĩa gì và dường như không được biết đến mức hầu hết các công cụ tô sáng cú pháp tôi thấy đều không biết.

Độ dài 2

%:

Tất nhiên không phải ai cũng có #khóa, vì vậy C ++ là (tốt, nó thực sự được thừa hưởng từ C) cổ đại để cho phép bạn viết nó bằng mã thông báo thay thế này (còn gọi là digraph )

Chiều dài 3

??=

Đây là một khóa học lịch sử trên C ++. Những ngày này không nhất thiết hợp lệ nữa, mặc dù việc triển khai có thể hỗ trợ họ, là những chiến tích. Trình tự này được dịch sang #các hệ thống hỗ trợ nó, nhưng để không can thiệp vào chuỗi ký tự thô, nó không được phép trong các hệ thống đó. Việc triển khai có thể chọn bỏ hoàn toàn hỗ trợ.

Độ dài 4

auto

Là một trong những phát minh mới hơn (kể từ C ++ 11) để làm việc với mã chung dễ dàng. Nó là để suy ra kiểu của một biểu thức và vì C ++ 14, nó thậm chí có thể được sử dụng để suy ra các tham số lambda và kiểu trả về của các hàm.

Độ dài 5

 catch

Là một từ khóa cũng được biết đến từ nhiều ngôn ngữ khác, có trong C ++, nhưng lập trình viên C ++ thành ngữ tốt hầu như không bao giờ sử dụng nó. Với các hàm tạo và hàm hủy của nó, C ++ sử dụng một nguyên tắc được gọi rộng rãi là RAII (Thu nhận tài nguyên là khởi tạo) hoặc đôi khi tôi muốn gọi nó một cách thích hợp hơn: SBRM (Quản lý tài nguyên giới hạn phạm vi). Do các lớp như con trỏ thông minh, người ta có thể kết nối trọn đời tài nguyên được phân bổ động (đó không chỉ là bộ nhớ!) Cho các đối tượng khác. Khi những thứ đó vượt ra khỏi phạm vi (ví dụ: bởi một ngoại lệ bị ném), các đối tượng này sẽ tự động dọn sạch tài nguyên. Điều này cho phép mã ngoại lệ an toàn và dễ sử dụng mà không cần sử dụng catch.

Độ dài 6

[](){}

[]{}()

Như stefan đã đề cập trong các bình luận, bạn có thể sử dụng []{}làm đối tượng lambda ngắn nhất, do đó đây là hình thức ngắn nhất để gọi lambda. Văn bản sau đây dành cho phiên bản cũ:

có lẽ là hình thức ngắn nhất của lambda. Lambdas trong C ++ là các đối tượng (thuộc loại xác định thực hiện) có thể nắm bắt một phần phạm vi mà chúng được tạo trong (cú pháp [] điều khiển điều này) và có thể gọi được (cú pháp () điều khiển điều này). Mã của họ (Phần {}) có quyền truy cập vào các biến này như thể chúng nằm trong phạm vi của chúng. Với tùy chọn kiểu trả về khấu trừ và thông số tự động khấu trừ của họ giới thiệu trong C ++ 14, họ là những công cụ để sử dụng cho tất cả các thuật toán thư viện tiêu chuẩn mong đợi một callable (ví dụ như các tham số std :: sort thứ ba).

Độ dài 7

virtual

Là từ khóa để bắt đầu sử dụng đa hình thời gian chạy trong C ++, một trong những khối cơ bản của lập trình hướng đối tượng. Điều này tuân theo nguyên tắc "không trả tiền cho những gì bạn không sử dụng", trong các ngôn ngữ khác, tất cả các chức năng đều là ảo theo mặc định. Là một ngôn ngữ đa mô hình, có thể gây ngạc nhiên cho mọi người khi nghĩ rằng "C ++ là hướng đối tượng" để xem các chương trình hoặc thư viện gần như không sử dụng từ khóa này, ví dụ như vì chúng tuân theo nguyên tắc lập trình chung.

Dài 8

override

Làm việc cùng với từ khóa ảo, overridelà một trong những bổ sung sau này cho C ++ để làm cho trình biên dịch thực hiện nhiều công việc hơn cho bạn. Bằng cách sử dụng nó, bạn thể hiện ý định ghi đè một hàm ảo trong lớp cơ sở và trình biên dịch sẽ báo lỗi nếu bạn mắc lỗi và lớp đó không có chức năng được chỉ định. Nói chung, nó được coi là phong cách tốt nếu mã của bạn thể hiện ý định, thay vì sử dụng bit.

Độ dài 9

constexpr

Cũng là một bổ sung sau này cho C ++, constexprcho phép lập trình viên thể hiện các hàm hoặc biến, mà chúng được biết đến tại thời gian biên dịch và nên được tính toán tại thời gian biên dịch. Điều này cho phép các hàm này được sử dụng trong các ngữ cảnh cần biên dịch biểu thức thời gian (ví dụ như tham số mẫu hoặc kích thước mảng). Nhiều hàm thư viện chuẩn (nếu có thể) đã là constexpr để chúng có thể được sử dụng ở đây.

Độ dài 10

for(i:c){}

Là một vòng lặp hoàn chỉnh trên một thùng chứa, hoặc thùng chứa như cấu trúc hỗ trợ std::beginstd::endđể có được các vòng lặp (bao gồm các mảng kiểu C). Nó là cơ bản tương đương với for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. Điều này cho phép lặp dễ dàng trong mã chung.

Dài 11

void f()&&;

Là một cách mới để khai báo các hàm thành viên và các thuộc tính trên đối tượng mà chúng có thể được gọi. Trong các phiên bản trước của C ++, chúng tôi chỉ có khả năng chọn void f() const;trình biên dịch để có thể gọi hàm trên các đối tượng const (do đó không có const bạn không thể gọi chúng trên các đối tượng không phải là const). Giống như cách bây giờ chúng ta có &&cú pháp cho các tham chiếu giá trị r đang được sử dụng để có thể gọi các hàm đó theo giá trị.

Dài 12

int main(){}

Đây có lẽ là chương trình hoàn chỉnh ngắn nhất mà bạn có thể biên dịch liên kết và chạy. Nó sẽ không làm gì và trả về 0. Sự trở lại này là một trong nhiều trường hợp đặc biệt bạn có thể gặp trong C ++. Thông thường trả về không có gì là hành vi không xác định, nhưng đối với hàm điểm nhập chính, trả về không có nghĩa là trả về 0.

Độ dài 13

auto f()->int

là một cách khá mới để khai báo kiểu trả về của hàm. Thông thường bạn sẽ không làm điều này nếu bạn đã biết loại, nhưng có rất nhiều tình huống trong lập trình chung trong đó loại phụ thuộc vào tham số mẫu và các biến bạn sử dụng. Làm theo cách này cho phép truy cập dễ dàng hơn vào các tham số này như trong template<class T> auto f( const T& t ) -> decltype(t.foo())thay vìtemplate<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
Tôi sẽ đề nghị sử dụng ;như một đoạn mã 1 ký tự thay thế, bởi vì đó không phải là macro tiền xử lý và thực tế là bạn có thể có một câu lệnh 1 ký tự trong C ++ có vẻ khó hiểu.
Joe Z.

1
[](){}không phải là hình thức ngắn nhất của lambda: Vì danh sách các tham số trống, nên nó có thể bị bỏ qua. Do đó []{}là lambda ngắn nhất. Đáng kể, []{}()là việc thực hiện ngắn nhất của lambda ;-) ideone.com/k8fAvs
stefan

@stefan: thực sự, tôi luôn quên nó vì nó không hoạt động như sau đó;) Tôi đã thêm nó vào câu trả lời.
PlasmaHH

@PlasmaHH Tôi hoàn toàn ghét nó vì thực sự nó không giống chức năng .. ;-)
stefan

59

Regex

Độ dài 2 đoạn

[]

JavaScript : Một lớp ký tự trống không khớp với bất cứ thứ gì.

PCRE , Java , Pythonre , Ruby (đã thử nghiệm trên phiên bản 2.0): Lỗi cú pháp.

Độ dài 1 đoạn

.

., được gọi là dot-all, có sẵn trong tất cả các hương vị tôi có cơ hội nhìn vào.

Nó phù hợp với cái gì?

Trong g̨͜e҉̡͞n̵͢e͜͝r̷͝a͘l̢҉, ̡͟ ̕̕ ̴.̸̴̢̛́ phù hợp với nhân vật ͘a҉n̛͜͠ỳ̸ ̴̕͢ex͝͞͞c҉ept̛ ̕f̴҉o͟͜r̴͢ mới ͡l͝i̸̧n͢͡e̶.͟

JavaPattern : Ở chế độ mặc định, dot-all khớp với bất kỳ điểm mã nào, ngoại trừ 5 điểm mã này \r\n\u0085\u2028\u2029. Với UNIX_LINESchế độ bật (nhưng không có DOTALL), dot-all khớp với bất kỳ điểm mã nào, ngoại trừ \n. Với DOTALLchế độ bật, dot-all khớp với bất kỳ điểm mã nào. Từ Java 5, Patternhoạt động trên điểm mã, do đó, các ký tự Astral được khớp bởi dấu chấm-all.

Pythonre (được thử nghiệm trên 2.7.8 và 3.2.5, có thể khác nhau trên 3.3+): Ở chế độ mặc định, dot-all khớp với bất kỳ đơn vị mã UTF-16 nào (bao gồm 0000 đến FFFF), ngoại trừ \n. re.DOTALLnâng ngoại lệ và làm cho .khớp với bất kỳ đơn vị mã UTF-16 nào. Trong các phiên bản này,re hoạt động trên các đơn vị mã UTF-16, do đó .chỉ quản lý để khớp với một đơn vị mã của các ký tự trong mặt phẳng.

.NET : Giống như Python. Chế độ dot-all trong .NET được gọi làSingleline .

JavaScript (C ++ 11 <regex>) : Ở chế độ mặc định, dot-all khớp với bất kỳ đơn vị mã UTF-16 nào, ngoại trừ 4 điểm mã này \n\r\u2028\u2029. Với scờ bật, dot-all khớp với bất kỳ đơn vị mã UTF-16 nào. JavaScript cũng hoạt động trên các đơn vị mã UTF-16.

PCRE : Tùy thuộc vào build tùy chọn, dot-tất cả các thể loại trừ \r, \nhoặc \r\n, hoặc tất cả 3 trình tự CR LF, hoặc bất kỳ newline chuỗi Unicode trong chế độ mặc định. Ở chế độ mặc định, công cụ hoạt động trên đơn vị mã (có thể là đơn vị mã 8, 16 hoặc 32 bit), do đó, tất cả khớp với bất kỳ đơn vị mã nào, ngoại trừ các chuỗi dòng mới. Trong chế độ UTF, công cụ hoạt động trên điểm mã, do đó, tất cả khớp với bất kỳ điểm mã nào ngoại trừ các chuỗi dòng mới. Chế độ dot-all được gọi PCRE_DOTALL.

PHP (đã thử nghiệm trên ideone): PCRE, được biên dịch dưới dạng thư viện UTF-8 và \nlà chuỗi dòng mới duy nhất theo mặc định. Chế độ dot-all có thể truy cập thông qua scờ.

Postgres : Trong chế độ mặc định, dot-all khớp với bất kỳ điểm mã nào mà không có ngoại lệ.

Ruby (đã thử nghiệm trên phiên bản 2.0.0): Ở chế độ mặc định, .khớp với bất kỳ điểm mã nào ngoại trừ \n. Chế độ dot-all có thể truy cập thông qua mcờ (!).

s cờ được sử dụng để biểu thị mã hóa Windows-31J trong Ruby.


Factoid

E̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ c҉̷̨a̸̛͞n҉̛͠ p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ H̨̧͜͜T̷͞M̷̛͜L͢.̴̡́ Lặp lại sau tôi. R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ phân tích ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
Tôi cảm thấy tồi tệ cho bất cứ ai không có được tài liệu tham khảo trên thực tế.
Robobenklein

6
@robobenklein Tôi biết một loại thuốc bí mật cho nỗi đau của bạn: Chỉ cần soi sáng cho chúng tôi!
flawr

24
@flawr Đối với những người không biết câu hỏi nổi tiếng: câu trả lời đầu tiên tại stackoverflow.com/questions/1732348/ Đây là những gì bạn đang tìm kiếm.
Robobenklein

1
Bạn có thể đọc văn bản của Zalgo, nhưng đừng quá coi trọng chúng theo cả hai hướng. Thật sai lầm khi làm theo cách của Zalgo một cách mù quáng, nhưng văn bản Zalgo không phải lúc nào cũng sai.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, bạn sẽ không sử dụng tất cả những phiếu bầu đó để chỉ cho chúng tôi cách phân tích HTML chứ?
mbomb007

57

J

PS: Đoạn mã hiện được liên kết với tryJ.tk cho phép bạn chơi xung quanh với chúng chạy bằng JavaScript trong trình duyệt của bạn mà không cần cài đặt J.

PPS: Tôi đã trao đổi thứ tự; điều này có ý nghĩa hơn đối với những người tham gia và để tham khảo trong tương lai.

PPS: Tôi nghĩ, do hạn chế về thời gian, tôi sẽ thêm một đoạn một ngày

thực tế:

J là hậu duệ của APL (xem ở đây để biết lịch sử gia đình) trừ đi bộ ký tự ngộ nghĩnh.

Độ dài 1 đoạn

_

J sử dụng _cả dưới dạng vô cực và chỉ thị phủ định , khi được gắn với chữ số (trái ngược với động từ -).

Độ dài 2 đoạn

a.

a.được gọi là Bảng chữ cái , chứa tất cả các ký tự 1 byte. Vì J không chứa các hàm như thế atoi, vì chúng là các tra cứu đơn giản trong bảng chữ cái:a. i. 'z' =122

Độ dài 3 đoạn

i.9

i.dành cho Số nguyên, khi được sử dụng một cách đơn điệu (nghĩa là chỉ có một đối số, đối số đúng, thường được gọi là y). Khi được sử dụng một cách tự nhiên, nó phục vụ như là chỉ mục của , như trong ví dụ trên.

Độ dài 4 đoạn

!!6x

J hỗ trợ số nguyên chính xác và số hữu tỷ . Điều này tính toán giai thừa của giai thừa 6 (số 1747 chữ số).

Độ dài 5 đoạn

^.^:_ 

Một mật độ dày đặc ... Đầu tiên, các động từ (như các hàm gọi J) được sắp xếp theo chủ đề. Tất cả ^ động từ được gắn với lũy thừa. ^đối với lũy thừa (và expkhi được sử dụng một cách đơn điệu, ^.đối với logarit . ^:là một đặc biệt, tổ hợp Power (hàm bậc cao hơn), áp dụng một hàm số lần. Khi đối số bên phải là vô cực ( _) ví dụ ^.) trên đầu ra của chính nó cho đến khi nó hội tụ. Thực tế, ^.^:_là một động từ giảix = ln(x) khi áp dụng cho bất kỳ đối số nào ngoại trừ 1, mang lại 0.318132j1.33724.

Độ dài 6 đoạn

^0j1p1

hoặc tương đương

^o.0j1

Bản sắc của Euler trong J. Như được trích dẫn ở trên, ^exp(). Ngoài các số nguyên và số hữu tỷ chính xác tùy ý, nó còn hỗ trợ các số pi và số phức, và các kết hợp ở đây dưới dạng chữ. 0j1p1có nghĩa là (0 + j) * pi ^ 1.

Độ dài 7 đoạn

+/&.:*:

Một động từ lấy định mức 2 của bất kỳ vectơ nào. Điều này thể hiện 2 điều:

  • các Chèn trạng từ biến động từ Add +vào Sum bằng cách chèn nó giữa mỗi phần tử của đối số của nó. Do đó (0+1+2+3) = +/ i.4.

  • Kết hợp Under khi được sử dụng v &.: u ytương đương với vi u v y, ở đâu vimặt phải (nói chung là nghịch đảo).

Vâng, J biết về nghịch đảo chức năng. Kết hợp những điều này làm cho động từ trong đoạn trích tương đương %: @: (+/) @: *:hoặc sqrt(sum(y.^2))trong Matlab chẳng hạn.

Độ dài 8 đoạn

$#:I.@:,

Một ngã ba bao gồm 3 động từ mà không có bất kỳ tham chiếu đến các đối số. Điều này cho phép những gì trong J được gọi là lập trình ngầm (không có điểm). Một ngã ba f g h, trong trường hợp đơn âm (như trong ví dụ này) tương đương với (f y) g (h y). Như các nhánh, mảng đa chiều là một phần nội tại của J. "Chỉ số" trả về các chỉ số của một trong các vectơ, nhưng không mở rộng ra các chiều cao hơn như vậy. Ví dụ này sử dụng Shape , AntibaseI.@:,như 3 hộp của ngã ba thực hiện I. cho các mảng chiều cao hơn, ví dụ:

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

Độ dài 9 đoạn

<"1 i.4 6 

Mảng đóng hộp là một kiểu dữ liệu trong J, cho phép kết hợp nội dung không đồng nhất (cả loại và kích thước) thành một giá trị. Monadic < hộp đó là cuộc tranh cãi. Xếp hạng là một khái niệm trung tâm trong J và cho phép tự động mở rộng các động từ đối với các mảng có kích thước cao hơn. Cả danh từ và động từ đều có thứ hạng.

Thứ hạng danh từ là số thứ nguyên của bất kỳ danh từ nào, mà động từ $@$có thể cho bạn biết. Ví dụ i. 2 3 4là một mảng của hạng 3.

Thứ hạng động từ là thứ hạng mà động từ sẽ tự áp dụng. Mỗi động từ có một thứ hạng nội tại có thể được truy vấn với sự kết hợp Cơ bản . v b. 0trả về 3 số cho thứ hạng đơn, trái phải và dyadic của động từ v.

Một động từ hoạt động trên các ô danh từ có thứ hạng bằng thứ hạng động từ và thay thế kết quả trong rank-verb rankkhung danh từ . Thứ hạng của một động từ có thể được giới hạn bằng cách sử dụng kết hợp Xếp hạng , như được thực hiện ở đây, quyền anh xếp hạng 1 ô (hàng) thay vì làm việc trên thứ hạng _, tức là. đấm bốc toàn bộ mảng. Thông tin thêm về thứ hạng có thể được tìm thấy ở đây .

Độ dài 10 đoạn

<./ .+~^:_

Đoạn trích này là một động từ tính toán con đường ngắn nhất trên sơ đồ có trọng số. Nó giới thiệu tối thiểu ( <./) và kết hợp Dot . Kết hợp dấu chấm là một khái quát của sản phẩm ma trận, có thể được viết là +/ . *. Nói chung là,u . v tương đương với u@(v"(1+lv,_))nơi lv là thứ hạng bên trái của động từ v. Hoặc trong các từ "u được áp dụng cho kết quả của v trên danh sách các ô đối số bên trái, một đối số bên trái" và đối số bên phải trong toto ". (Xem ở trên để xếp hạng)

Như vậy động từ bên trong <./ .+~thay thế mục y(i,j)với mức tối thiểu lày(i,k)+y(k,j) cho tất cả k.

^:_ Lặp lại bước này cho đến khi hội tụ.

Ví dụ, hiển thị khoảng cách đường dẫn gốc và ngắn nhất:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

Độ dài 11 đoạn

<.@o.10x^99

Đoạn mã này giới thiệu mã đặc biệt : Một số mã J được hỗ trợ bởi mã được viết riêng cho một trường hợp sử dụng nhất định, được nhận dạng tại thời điểm phân tích và được tối ưu hóa; hoặc cho độ chính xác cao hơn (như trường hợp ở đây) hoặc hiệu suất cao hơn (xem Kết hợp đặc biệt )

Cụm từ này cho 99 chữ số của pi (mặc dù đã thay đổi 99 chữ số thập phân). Mã đặc biệt phụ thuộc vào cụm từ chính xác, những gì thường tương đương sẽ không chính xác như mã đoạn mã: <.o.10x^99 mất độ chính xác mở rộng.

Độ dài 12 đoạn

($-.1:)($,)]

Thỉnh thoảng, bạn kết thúc trong tình huống do các lựa chọn được thực hiện trong dữ liệu, có các kích thước đơn lẻ đang chạy trên đường. Tiện ích tiện dụng này, được gọi là bóp trong Matlab, vắt kiệt tất cả các kích thước đơn. Tine bên trái của ngã ba ($-.1:)mang lại tất cả các kích thước mà không có kích thước, trong khi cái ở giữa ($,) định hình lại mảng có riềm cho các kích thước được giữ lại. Tine đúng ]phục vụ chỉ để làm cho điều này một ngã ba, và tham chiếu các đối số đúng.

Độ dài 13 đoạn

1 :'-u%u d.1'

Phương pháp của Newton tìm thấy một xấp xỉ gốc của một hàm khác biệt. Đây trạng từ rõ ràng là để được áp dụng cho các chức năng trong đó gốc được tìm kiếm, và đại diện cho một bước của quy trình lặp đi lặp lại. ulà đối số tham chiếu hàm, được thay thế thời điểm trạng từ được áp dụng. d. là một hàm dẫn xuất kết hợp một cách tượng trưng và ở đây có thể được thay thế bằng chức năng D.số tương tự (nhưng khác khi áp dụng cho các hàm thứ hạng cao hơn). Kết quả là một cái móc trừ đi ngã ba ( uchia cho đạo hàm của nó) khỏi đối số.

Ví dụ:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

Độ dài 14 đoạn

(%-.-*:)t.i.10

10 số đầu tiên của chuỗi Fibonacci do Taylor mở rộng x / (1 - x - x^2). Phân tích cái móc %-.-*:cho (y % (-.-*:) y) = (y % ( (1 - y) - *: y).

Độ dài 15 đoạn

(#{.+//.)!/~i.9

Một cách khác về chuỗi Fibonacci. Lần này từ một góc độ khác; bắt đầu từ tam giác Pascale '! /~i.9'.

/khi được sử dụng có nghĩa là Bảng , áp dụng động từ mà nó bị ràng buộc giữa mỗi ô của các đối số của nó, mang lại một bảng hoạt động giữa các đối số x và y. Trong trường hợp này !được sử dụng một cách ngẫu nhiên, như Kết hợp (hoặc Hết) . ~làm cho động từ Reflexive , tức là. sử dụng đối số bên phải của nó như là một bên trái quá.

Trạng từ /.là một số lẻ, nó áp dụng động từ dọc theo các đường chéo của một mảng (ví dụ: thử </.!/~i.5ở đây )

Vì vậy, đoạn trích này lấy tổng của 9 đường chéo đầu tiên trên tam giác của Pascal, đây là một chuỗi Fibonacci xuất hiện khác.

Độ dài 16 đoạn

;/@~.,. <"0@#/.~:

Ok, tôi đã thêm một khoảng trắng chỉ để đến 16 :). Đoạn mã này biểu thị một ngã ba sử dụng Khóa : liệt kê tất cả các mục trong đối số và tần số của chúng.

x u/. yáp dụng u để y trong khối trong đó x là duy nhất, hoặc trong J: (=x) u@# y, nơi =tự Phân loại , mà tạo ra một mảng boolean chứa 1 trong những vị trí mà chúng xuất hiện trong nub ~. Ở đây, nó được áp dụng theo phản xạ, do đó thực hiện Tally trên từng mục duy nhất trong y, đếm số lần xuất hiện.

Vì hầu hết các động từ trong J đều giữ trật tự nub (thứ tự xuất hiện của các vật phẩm độc đáo mới, trái ngược với uniqueMatlab, sắp xếp đối số của nó), điều này có thể được sử dụng để Stiching các mục theo tần số của chúng như được thực hiện ở đây. ;/@~.được sử dụng để tạo một danh sách đóng hộp của tất cả các mục.

Lưu ý rằng vì khái niệm tiền xử lý của Xếp hạng , mã này hoạt động cho mọi chiều .

Độ dài 17 đoạn

*./ @:(#&>)@C.@A.

J hỗ trợ một vài nguyên thủy cụ thể về hoán vị:

  • Anagram A. Về mặt đơn giản, nó tìm thấy chỉ mục Anagram, theo cách ngẫu nhiên, nó áp dụng hoán vị được chỉ định bởi chỉ số đảo chữ trong đối số bên trái cho đối số bên phải.
  • Chu kỳ - Hoán vị C. chuyển đổi giữa biểu diễn trực tiếp và chu kỳ của hoán vị.

Đoạn mã này là một động từ lấy chỉ mục đảo chữ ở bên trái (giữa 0 và !#y) và đối số bên phải y một mảng để hoán vị. Sau đó, nó tính LCM *./ của độ dài chu kỳ #&>, nghĩa là. khoảng thời gian sau đó bạn lấy lại mảng ban đầu:

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

Dài 21

<:@(#/.~)@(i.@#@[,I.)

Động từ nhỏ này xuất phát từ bổ trợ "thống kê / cơ sở" và được gọi là biểu đồ . Nó thực hiện chính xác điều đó, với một danh sách các bin bắt đầu, tính tổng tất cả các lần xuất hiện của dữ liệu trong khoảng ]bn-1,bn]trong đó bn là bắt đầu của số bin n.

Nó khai thác Interval IndexI. để tìm khoảng:

Nếu y có hình dạng của một mục của x, thì x I. y là j không âm ít nhất sao cho j {x theo y theo thứ tự hoặc #x nếu y theo {: x theo thứ tự hoặc nếu x có Không có sản phẩm.

Việc tạo tổng của mỗi khoảng được thực hiện bằng cách sử dụng phím như được tô sáng trong đoạn 16.

Đoạn mã được liên kết đến trên tryj.tk thể hiện định lý giới hạn trung tâm bằng biểu đồ này:

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

Chiều dài 22

=,&(+/)(~:#[)e.&~.~:#]

Thú vị trong J. Điều này thực hiện một công cụ chủ mưu, lấy một mảng bí mật làm đối số bên trái và đoán là bên phải. Các giá trị được trả về là số lượng chốt trắng và đen. Tháo rời:

NB.   ExactMatch: checks where digits correspond:
ExactMatch =: =

NB.   GoodDigitWrongPlace: Copies non-matched numbers from both arguments (left and right
NB.   pairs of parentheses, and checks them for same elements(e.), after eliminating
NB.   doubles in both (&~.)
GoodDigitWrongPlace =: (~: # [) (e.&~.) (~: # ])

NB.   Piecing the conditions together, after summing the booleans:
mm =: ExactMatch ,&(+/) GoodDigitWrongPlace

Được sử dụng như

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

Ở đâu secretguesslà bất kỳ mảng. Nó hoạt động với bất kỳ loại dữ liệu thực sự.


17
Chà, hoặc bạn nhận được một đống biểu tượng kỳ lạ không thể đọc được, hoặc bạn nhận được một đống biểu tượng ASCII không thể đọc được. Chọn thuốc độc của bạn.
John Dvorak

16
@JanDvorak Tất cả các ngôn ngữ là không thể đọc được cho đến khi bạn học chúng. ;-)
Gareth

5
Tôi đã từng nghĩ dài, mô tả tên trợ giúp hiểu mã. Rồi tôi được giác ngộ .
hoosierEE

@Gareth Nhưng không phải tất cả đều không thể đọc được ngay cả sau khi bạn học chúng. Không đặt tên bất kỳ.
flawr

45

RPL (Ngôn ngữ lập trình Redstone) [và Minecraft]

Đây là một bước tiến lớn về việc chúng ta có thể coi đây là ngôn ngữ lập trình thực sự hay không, nhưng dù sao chúng ta sẽ thử. Và, vì hai "ngôn ngữ" này thực tế giống nhau, tôi sẽ kết hợp chúng, đôi khi đăng đoạn trích trong ngôn ngữ "Minecraft" (đá đỏ, v.v.) và đôi khi bằng RPL. Ngoài ra, vì nhiều đoạn trích sẽ có trong Minecraft, tôi sẽ đăng các liên kết đến các hình ảnh thay vì chính các hình ảnh để tiết kiệm không gian. Ngoài ra, tất cả các đoạn sẽ là các khái niệm lập trình trong Minecraft, không phải là đá đỏ nói chung (tức là không có cửa đá đỏ nào xuất hiện). Các ký tự sẽ được tính bằng byte (tính theo RPL) hoặc theo điều này (trong Minecraft).

Factoid:

RPL là ngôn ngữ lập trình của Tossha Nhà phát minh chuyển đổi mã thành khối đỏ và khối lệnh Minecraft. Nó có thể thực hiện đầu vào và đầu ra, các vòng lặp, thao tác số nguyên, hàm trig, gốc và nhiều hơn nữa.

Độ dài 1:

Nút (1 byte) là hình thức nhập đơn giản nhất trong Minecraft. Nó cũng có thể bắt đầu hoặc dừng một "chương trình". Tương tự, một đòn bẩy (cũng là 1 byte) là một dạng đầu vào khác và cũng có thể được sử dụng để khởi động và dừng chương trình vì nó có trạng thái "bật" và "tắt". Một điều cần nhớ là Minecraft thực sự là một ngôn ngữ lập trình 3D, do đó, vị trí nút / đòn bẩy trong chương trình có thể tạo ra sự khác biệt rất lớn.

Độ dài 2:

Một nút được gắn vào đèn đá đỏ là khá nhiều chương trình mèo rất cơ bản của bạn . Nó lấy đầu vào (bằng một nút hoặc đòn bẩy, 0hoặc 1( offhoặc on)) và xuất nó dưới dạng ánh sáng từ đèn dưới dạng 0hoặc 1( offhoặc on).

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

Độ dài 3:

Như được thấy dưới đây, đây là một trong những chương trình sửa đổi mã nguồn ngắn nhất (vì bạn có thể sửa đổi nguồn khi chạy với Minecraft!). Bây giờ, cái cụ thể này thực sự không có tác dụng, nhưng khái niệm này có thể được kết hợp với những cái khác để tạo ra một số chương trình tuyệt vời (như đi kèm với nhiều upvote hơn). Khi chạy, chương trình này sẽ loại bỏ nguồn đầu vào của nó và khiến nó không thể chạy lại được. nhập mô tả hình ảnh ở đây

Độ dài 4

"Đoạn trích" này thực sự cho thấy hai khái niệm: độ trễ và cổng KHÔNG. Độ trễ được thực hiện bằng cách sử dụng các yếu tố đá đỏ nhất định có độ trễ đánh dấu đá đỏ . Một đánh dấu đá đỏ bằng một phần mười giây. Các thành phần đá đỏ khác nhau có độ trễ khác nhau: đèn pin có độ trễ 1rt (1 redstone-tick), bộ so sánh có độ trễ 1rt, bộ lặp có thể có độ trễ 1, 2, 3 hoặc 4rt, tùy thuộc vào cách thiết lập. Trong ví dụ này, bộ lặp redstone được đặt thành độ trễ 4rt.

Tiếp theo là cổng KHÔNG. Cổng NOT có một đầu vào đảo ngược nó. Vì vậy, trong thiết lập này, đầu ra sẽ được bật nếu đầu vào tắt và đầu ra sẽ tắt nếu đầu vào được bật.

Độ dài 5

Cổng OR rất dễ thực hiện trong Minecraft. Hai đầu vào được kết nối với cùng một đầu ra. Thế là xong. Không có mánh khóe hài hước hay bất cứ điều gì, nó khá đơn giản.

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

Độ dài 6

Đây là một mẹo để nén "mã" của bạn. Nếu bạn biết cường độ tín hiệu của hai đầu vào đủ nhỏ để không can thiệp vào các đầu ra tương ứng, bạn có thể nối dây đá phải với nhau. Trong ví dụ dưới đây, có một bộ đếm thời gian phễu đơn giản, chuyển các mục qua lại trong khoảng 0,5 giây trong mỗi phễu, được kết nối với các bộ so sánh tạo ra cường độ tín hiệu là 1. Điều này có nghĩa là hai thông số sẽ không giao thoa với nhau. Trong ví dụ này, đèn chỉ dành cho mục đích trình diễn và không được tính vào tổng số khối.

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


7
Bạn haz 13 upvote, tôi có thể haz 10 chương trình moar?
Rɪᴋᴇʀ

4
Không có chương trình nào của bạn thực sự được viết bằng RPL, vì vậy đừng bỏ qua nó như vậy. Đây hoàn toàn là "mã" Minecraft.
mbomb007

2
Bạn có thâm hụt 14 chương trình m8. Tôi muốn xem những gì bạn có trong đầu;)
Conor O'Brien

4
Bạn haz 21 upvote, tôi có thể haz 15 chương trình moar?
wizzwizz4

1
Bạn haz 29 upvote, tôi có thể haz 23 chương trình moar?
bb010g

42

TI-CƠ BẢN

[Ngôn ngữ thay đổi dựa trên máy tính được sử dụng trên máy tính nào, nhưng những ngôn ngữ này sẽ sử dụng TI-84 trừ khi có ghi chú khác.]

Độ dài 31 đoạn

Menu("","1",A,"2",B
Lbl A
Lbl B

Điều này cho thấy việc sử dụng các menu. Cái ở trên khá vô dụng, vì nó không làm gì cả, nhưng chúng có thể được sử dụng để điều hướng phần khác nhau của một chương trình. Đối số đầu tiên là tiêu đề menu, theo sau là các cặp tùy chọn (chuỗi được hiển thị theo sau là nhãn 1- hoặc 2 chữ cái). Dưới đây là một ví dụ trực quan hơn:

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lblcũng có thể được sử dụng để phân nhánh với Goto. Menu có một số hạn chế khiến chúng khó chịu khi sử dụng, tuy nhiên: Chỉ có thể có bảy mục menu và mỗi tiêu đề có thể có tối đa mười bốn ký tự, vì vậy toàn bộ điều này phù hợp trên một màn hình.

Độ dài 29 đoạn

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(theo mặc định) đặt máy tính ở chế độ số thực, vì vậy các phép tính liên quan đến số phức sẽ NONREAL ANSgây ra lỗi. Khi được đặt ở a+bichế độ, máy tính sẽ hiển thị các câu trả lời dưới dạng số phức nếu có, vì vậy ví dụ thứ hai sẽ trả về 4i. re^θichế độ sử dụng cực thay vì tọa độ hình chữ nhật, do đó, nó xuất ra4e^(1.570796327i) .

Độ dài 23 đoạn

If A≥9
Then
1→X
7→Y
End

Đây chỉ là một điều kiện đơn giản, mặc dù có thể có một Else tuyên bố. ThenEndkhông bắt buộc nếu nó chỉ là một tuyên bố.

Độ dài 21 đoạn

(-B+√(B²-4AC))/(2A)→X

Yêu thích của mọi người, công thức bậc hai. Lưu trữ giải pháp đầu tiên cho phương trình bậc hai như X, giả sử a, b và c được lưu trữ trong các biến tương ứng của chúng, như trong ax 2 + bx + c .

Độ dài 20 đoạn

Shade(|X/2|-3,5-X²,0

Điều này che phủ giao điểm của hai hàm, với một số tham số tùy chọn: giá trị tối thiểu và tối đa của x và hướng và khoảng cách giữa các đường bóng.

Độ dài 18 đoạn

LinReg(ax+b) L1,L2

Ở đây chúng tôi tính toán phương trình hồi quy tuyến tính hoặc phương trình tuyến tính phù hợp nhất với một nhóm điểm, với các giá trị x được lưu dưới dạng danh sách trong L1và giá trị y trong L2. Có nhiều tùy chọn hồi quy khác có sẵn, bao gồm bậc hai, bậc ba và hàm mũ.

Độ dài 17 đoạn

dbd(1.2711,1.2115

Điều này tính toán số ngày giữa hai ngày, trong trường hợp này là ngày 27 tháng 1 năm 2011, ngày trang web này bắt đầu và ngày 21 tháng 1 năm 2015, ngày này được viết. (Đó là 1455 ngày cho người lười biếng.) Cách mã hóa ngày tháng hơi lạ: hoặc DDMM.YY hoặc MM.DDYY, dẫn đầu các số 0 tùy chọn.

Độ dài 16 đoạn

For(A,0,5
Disp A

Điều này cho thấy hai phần của phía lập trình của ngôn ngữ. Đầu tiên là forvòng lặp điển hình của bạn , tương tự như for(var A=0;a<5;a++)trong các ngôn ngữ khác. (Bạn cũng nên sử dụng Endlệnh để thoát ra khỏi vòng lặp.) Thứ hai là tự giải thích: nó hiển thịA , trong trường hợp này là 5 lần vì vòng lặp.

Độ dài 15 đoạn

Y1=|X³-4|
Y2=3X

Dưới đây là hai ví dụ về một tính năng nổi tiếng của máy tính vẽ đồ thị: phương trình đồ thị. Bạn có thể có 10 phương trình khác nhau được vẽ trên cùng một mặt phẳng và có nhiều lệnh hữu ích để tìm giao điểm, cực đại, giá trị của x , v.v ... Những phương trình đó trông như thế này khi được vẽ trên một cửa sổ tiêu chuẩn:

Đồ thị

Độ dài 14 đoạn

[[1,2][34,5]]T

Dấu ngoặc được sử dụng để tạo ma trận và Tma trận chuyển vị:

[[1 34]
 [2 5]]

Độ dài 13 đoạn

dayOfWk(9,1,6

Điều này tìm thấy ngày trong tuần của ngày 6 tháng 1 năm 9 sau Công nguyên. Đầu ra là một số trong đó 1 là Chủ nhật, 2 là Thứ Hai, v.v. Ngày đặc biệt này là thứ ba, vì vậy đầu ra là3 .

Độ dài 12 đoạn

Circle(1,3,5

Đầu tiên trong số các công cụ vẽ cơ bản, công cụ này vẽ một vòng tròn trên biểu đồ với tâm ở (1,3) và bán kính là 5.

Độ dài 11 đoạn

randInt(0,8

Điều này tạo ra một số nguyên ngẫu nhiên (giả) trong khoảng từ 0 đến 8. Có một đối số thứ ba tùy chọn cho biết có bao nhiêu số nguyên để tạo. Có một số hàm ngẫu nhiên khác, bao gồm các hàm cho phân phối bình thường và nhị thức, một cho ma trận ngẫu nhiên và một cho danh sách được sắp xếp ngẫu nhiên không có sự lặp lại. randIntcó thể được gieo bằng cách lưu trữ một số như rand: 2→rand.

Độ dài 10 đoạn

4>5 or 2≠7

Ở đây chúng ta có các toán tử logic và bằng (TI) của TI-BASIC. Các báo cáo bất bình đẳng đánh giá đầu tiên 0 or 1ortrả về true nếu một trong hai bên là đúng, vì vậy điều này sẽ hiển thị 1.

Độ dài 9 đoạn

.656▶F◀▶D

Điều này có thể chuyển đổi từ thập phân sang phân số và ngược lại, rất hữu ích. Cũng có những chức năng chuyên dụng ▶Frac▶Decchỉ đi một chiều. In 82/125trong trường hợp này.

Độ dài 8 đoạn

lcm(14,6

Điều này in bội số chung nhỏ nhất của 14 và 6, là 42.

Độ dài 7 đoạn

getDate

Khá tự giải thích, chỉ cần in ngày hệ thống hiện tại dưới dạng một danh sách, trong trường hợp này {2015 1 19}.

Độ dài 6 đoạn

√({4,9

Mảng (hoặc danh sách) được bao quanh bởi dấu ngoặc nhọn và phân tách bằng dấu phẩy. Điều này tương tự như mapchức năng của nhiều ngôn ngữ, trong đó nó lặp qua từng phần tử của danh sách và áp dụng thao tác bên ngoài dấu ngoặc cho nó, trong trường hợp này là căn bậc hai, vì vậy kết quả là{2 3} . Lưu ý rằng đóng ngoặc là tùy chọn, vì vậy chúng sẽ bị bỏ qua kể từ bây giờ.

Độ dài 5 đoạn

4iii6

Chúng tôi đã có một vài điều thú vị đang diễn ra ở đây. Đầu tiên, các phần thực, 4 và 6 được nhân lên, và sau đó các phần ảo được nhân lên : i^3, hoặc -i. Những nhân cho -24i. Chương trình này giới thiệu phép nhân juxtap vị trí trông thú vị và cách xử lý các số ảo của TI-BASIC.

Độ dài 4 đoạn

8°5′

Đây là 8 độ, 5 phút cung, được chuyển đổi thành độ là 8.0333...

Độ dài 3 đoạn

8→T

Điều này cho thấy cách các số có thể được lưu trữ dưới dạng các biến, điều này hơi bất thường vì số này đi trước, theo sau là mũi tên lưu trữ, sau đó là tên biến. Như đã đề cập trong factoid,θ (theta) cũng có thể được sử dụng như một biến và các biến chỉ có thể là một chữ cái viết hoa.

Độ dài 2 đoạn

4M

Tương tự như Mathicala, bạn có thể nhân với juxtap vị trí, không *cần thiết. Tất cả các biến được khởi tạo thành 0 theo mặc định, do đó, điều này sẽ xuất 0 trừ khi bạn đã lưu trữ một cái gì đó khác cho biến đó (xem đoạn 3).

Độ dài 1 đoạn

e

Đây là hằng số cho số Euler , hiển thị dưới dạng 2.718281828.

Factoid

Các biến chỉ có thể lưu trữ các kiểu dữ liệu nhất định. Ví dụ: A- Z(và θ) lưu trữ các giá trị số, str0- str9lưu trữ chuỗi và [A]- [J]lưu trữ ma trận (mảng 2 chiều).


Nhân tiện, chữ thường n(không n) cũng có thể được sử dụng như một biến.
Ypnypn

Hấp dẫn. Tôi chưa bao giờ sử dụng biến đó.
NinjaBearMonkey

3
Người ta có thể tranh luận về việc str0là 1 ký tự hoặc là 4. Tất cả các hướng dẫn trong TI-BASIC đều dài 1 ký tự.
Ismael Miguel

@IsmaelMiguel Tôi đã nghĩ về điều đó, nhưng chúng là 1 hoặc 2 byte và tôi quyết định đếm các ký tự bình thường.
NinjaBearMonkey 23/1/2015

1
Tôi tôn trọng quyết định của bạn. Nó giúp rất nhiều trong trường hợp này. Tôi thực sự rất thích lập trình trên chiếc TI-83 cũ của tôi. (Tôi thậm chí đã thiết kế một chương trình sơn trong đó!)
Ismael Miguel

41

GNU Sed

Tôi tự áp đặt một yêu cầu hạn chế hơn - tất cả các đoạn sẽ là sedchương trình hoàn chỉnh .

Factoid

sed một ngôn ngữ hoàn chỉnh. Đây là một bằng chứng.

Độ dài 0 Đoạn

Tôi không nghĩ đoạn trích 0 có độ dài là bắt buộc, nhưng vì nó thực sự làm gì đó trong sed, nên đây là:

Sed là "Stream EDitor", tức là nó đọc luồng (từng dòng) từ STDIN, chỉnh sửa, sau đó xuất ra STDOUT. Chương trình sed có độ dài bằng không chỉ đơn giản là sao chép STDIN sang STDOUT. Do đó, các cattiện ích có thể được mô phỏng bởi sed. Sau đây là tương đương:

cat a.txt b.txt > c.txt

sed '' a.txt b.txt > c.txt

Độ dài 1 đoạn

=

Chương trình sed này in số dòng của mỗi dòng thành STDOUT. Điều này gần tương đương với:

nl

hoặc là

cat -n

mặc dù phiên bản sed đặt số dòng trên dòng riêng của nó.

Độ dài 2 đoạn

5q

Sao chép STDIN thành STERE và quits sau dòng 5. Điều này tương đương với:

head -n5

Bạn có thể bắt đầu thấy một chút mô hình ở đây - sed có thể được sử dụng để mô phỏng nhiều công cụ sử dụng lõi tiêu chuẩn.

Độ dài 3 đoạn

iHi

inserts "Hi \ n" trước mỗi dòng. Meh.

Độ dài 4 đoạn

/a/d

Rất nhiều sức mạnh của sed là trong khả năng regex của nó. Chương trình này làm cho tất cả các dòng khớp với biểu thức chính ađược dxóa khỏi luồng. Tất cả các dòng khác sẽ vẫn được xuất ra STDOUT. Điều này tương đương với:

grep -v "a"

Độ dài 5 đoạn

:l;bl

Đây là một vòng lặp vô hạn. Tất cả chúng ta đều yêu thích các vòng lặp vô hạn của CPU. Xác định một nhãn l, sau đó btrang trại (nhảy) cho nó. Quảng cáo vô hạn.

Độ dài 7 đoạn

s/a/A/g

Theo mặc định, sed áp dụng scác lệnh sao cho nó chỉ khớp với lần xuất hiện đầu tiên trên mỗi dòng. Nếu bạn cần nó khớp (và thay thế) mỗi lần xuất hiện trên một dòng, thìg cờ ở cuối dòngs lệnh sẽ thực hiện việc này.

Độ dài 8 đoạn

y/01/10/

Lệnh ít được sử dụng ytương tự như trtiện ích shell (mặc dù không hoàn toàn linh hoạt). Chương trình này sẽ chuyển đổi tất cả 0s với1 s và ngược lại.

Độ dài 9 đoạn

1!G;$p;h

Đoạn mã này thực sự là 8 byte, nhưng yêu cầu tham số -n để sed để chặn đầu ra mặc định, vì vậy theo quy tắc golf-code tiêu chuẩn, tôi đang tính đây là 9. Chương trình này đảo ngược các dòng trong luồng. Vì thế:

sed -n '1!G;$p;h'

hoàn toàn tương đương với:

tac

Độ dài 10 đoạn

s/[ <TAB>]+$//

Đây là bản xem lại đoạn trích 6 (không chính xác). Dải này kéo theo khoảng trắng (khoảng trắng và TAB) từ các dòng.


2
Xem thêm HƯỚNG DẪN SỬ DỤNG MỘT LẦN SỬ DỤNG CHO SED , về cơ bản là cách tôi học đượcsed
Adam Katz

Bạn có nhiều phiếu bầu hơn. Chúng ta có thể có thêm một số?
kẻ lừa đảo người lái xe

2
Thực tế của bạn 404'ed.
Wauzl

1
Đẹp, nhưng xin lưu ý rằng nhiều trong số này sử dụng các phần mở rộng GNU và không phải là tiêu chuẩn đặc biệt là chiều dài 3 (tiêu chuẩn sẽ là i\<newline>Hi<newline>), chiều dài 5 (tiêu chuẩn sẽ sed -e :l -e blhoặc :l<newline>bl<newline) và chiều dài 10 (cần +chuyển sang *hoạt động hoàn toàn). Lưu ý rằng đoạn mã dài 9 -n '1!G;$p;h' tiêu chuẩn, trong khi đó tacthì không . :)
tự đại diện

1
@Wildcard Có - Tôi đã giới hạn điều này với GNU sed.
Chấn thương kỹ thuật số

39

Con trăn

( bài đăng của mbomb007 đã có rất nhiều đoạn trích Python, nhưng tôi nghĩ rằng tôi sẽ tham gia với một số sự thật khó hiểu)

Factoid

Python là một ngôn ngữ được gõ động với sự nhấn mạnh vào khả năng đọc.

Độ dài 1 đoạn

1

Trong Python 3, ở trên tương đương với Truenghĩa 1 == True(và cả 0 == False). Lưu ý rằng điều này không cần thiết đúng trong Python 2, nơi bạn có thể xác định lại giá trị củaTrue .

Độ dài 2 đoạn

<>

<>là một toán tử so sánh lỗi thời tương đương với !=. Nó vẫn hoạt động trong Python 2 (mặc dù việc sử dụng nó không được khuyến khích) và đã bị xóa hoàn toàn khỏi Python 3.

Độ dài 3 đoạn

...

Python có một số tính năng không được tích hợp sử dụng, nhưng chỉ dành cho các thư viện của bên thứ ba. Đây Ellipsisđối tượng là một trong số họ, và nó thường được sử dụng để cắt. Ví dụ: nếu chúng ta có 3D sau mảng numpy :

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

sau đó a[..., 0] (tương đương a[:,:,0]) đưa ra tất cả các yếu tố đầu tiên:

array([[1, 4], [7, 10]])

Trong Python 3, ...nghĩa đen có thể được sử dụng bên ngoài cú pháp cắt, điều này cho phép bạn sử dụng nó như một điểm đánh dấu "việc cần làm" thay chopass hoặc NotImplemented:

def f(x):
    ... # TODO

Độ dài 4 đoạn

(1,)

Một tuple một phần tử trong Python.

Python có các danh sách (ví dụ [1, 2, 3, 4]) có thể thay đổi và bộ dữ liệu (ví dụ (1, 2, 3, 4)) im có thể thay đổi. Một cách sử dụng phổ biến cho các bộ dữ liệu là các khóa từ điển, vì các danh sách không thể băm được.

Một lỗi phổ biến cho người mới bắt đầu là bỏ qua dấu phẩy ở trên, nghĩa (1)là số 1 được bao quanh bởi dấu ngoặc đơn. Bộ dữ liệu một yếu tố là lần duy nhất bạn cần một dấu phẩy trước khi kết thúc khóa - nó sẽ tăng SyntaxErrornếu bạn cố gắng đặt một trong bộ dữ liệu trống() và là tùy chọn cho các bộ có độ dài ít nhất là 2.

Độ dài 5 đoạn

0or x

Có một vài điều đang diễn ra trong đoạn trích này, vì vậy hãy xem!

orgiống như ||trong nhiều ngôn ngữ. Trong Python, A or Bngắn mạch, trả về A(mà không đánh giá B) nếu Alà sự thật, nếu không nó sẽ trả về B. Ví dụ, 1 or xluôn luôn trả về 1, như 1luôn luôn trung thực và thậm chí hoạt động nếu xkhông được xác định. Mặt khác, 0 or xtrả về xnếu xđược xác định hoặc ném NameErrornếu không.

Khi chơi golf, chúng ta thường có thể thả khoảng trắng giữa một số và một or, chẳng hạn như 1 or xtrở thành 1or x. Điều này là có thể bởi vì1or bắt đầu bằng một chữ số, làm cho nó trở thành một định danh Python bất hợp pháp.

Tuy nhiên, có một ngoại lệ - 0or, mà ném một cách bí ẩn a SyntaxError. Tại sao? Bởi vì các chữ bát phân trong Python bắt đầu bằng 0o(ví dụ 0o20 == 16) và trình phân tích cú pháp sẽ bóp nghẹt khi nó đạt đếnr !

Lưu ý: Trong Python 2, các chữ bát phân cũng có thể bắt đầu bằng số 0 đứng đầu, vd 020.

Độ dài 6 đoạn

*x,y=L

Đoạn mã này thể hiện một loại bài tập đặc biệt trong Python, trong đó L là một danh sách, bộ dữ liệu hoặc bất kỳ loại lặp nào khác.

Trong Python, bạn có thể "giải nén" các bộ dữ liệu và danh sách như vậy:

a,b = [1,2]

Điều này gán 1 đến avà 2 cho b. Cú pháp này cũng được sử dụng cho nhiều nhiệm vụ, chẳng hạn như

a,b = b,a+b

rất hữu ích khi viết một chương trình tính toán chuỗi Fibonacci.

Nếu độ dài của cả hai bên không khớp nhau, thì a ValueErrorsẽ bị ném. Tuy nhiên, Python 3 đã giới thiệu một cú pháp mới, giải nén lặp lại mở rộng (hoặc thông thường hơn là "gán sao") cho phép bạn thực hiện những việc như thế này:

*x,y = [1, 2, 3, 4, 5]

Đây gán ycho yếu tố cuối cùng, 5, và xđể phần còn lại của danh sách , ví dụ [1, 2, 3, 4]. Bạn thậm chí có thể làm một cái gì đó như thế này:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

mà gán 1 tới a, từ 2 đến b, [3, 4, 5]để c, từ 6 đến dvà từ 7 đếne .

Độ dài 7 đoạn

zip(*x)

zip là một hàm chứa một loạt các danh sách và, tốt, kéo chúng lên:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

Lưu ý: Trong Python 3, một zipđối tượng được trả về thay vào đó, vì vậy nếu bạn muốn có một danh sách như trên, bạn sẽ cần phải thực hiện cuộc gọilist()

Đây là một chức năng khá thuận tiện nếu bạn có hai hoặc nhiều danh sách liên quan và bạn muốn liên kết các mục tương ứng của chúng.

Bây giờ nói rằng bạn muốn giải nén danh sách - làm thế nào bạn sẽ làm như vậy? Chúng tôi có thể thử sử dụng ziplại, nhưng thật không may, điều này mang lại:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

Vấn đề là mọi thứ đều nằm trong một danh sách, nhưng ziplấy các danh sách riêng lẻ làm đối số chức năng riêng biệt. Để khắc phục điều này, chúng tôi giới thiệu *toán tử splat, trong đó có một danh sách / tuple / etc. và giải nén chúng dưới dạng đối số hàm:

f(*[1,2]) ==> f(1, 2)

Và kết quả là:

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

Độ dài 8 đoạn

x='a''b'

Lần đầu tiên tôi nhìn thấy điều này, tôi đã bị lấy lại một chút - có hai chuỗi bên cạnh nhau nghĩa là gì? Câu trả lời rất đơn giản:

>>> x
'ab'

Python chỉ nối hai chuỗi! Điều này cực kỳ hữu ích cho khả năng đọc, vì nó cho phép bạn chia nhỏ các chuỗi dài như vậy (lưu ý các dấu ngoặc đơn xung quanh):

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

Độ dài 9 đoạn

0!=2 is 2

Bạn có thể đã biết rằng Python cho phép xâu chuỗi các toán tử so sánh, vì vậy 5 < x <= 7chỉ đúng khi 5 < xx <= 7. Nếu bạn không biết rằng ... thì thật bất ngờ!

Dù sao, ít được biết đến là thực tế là, vì is/ is not/ in/ not incũng là các toán tử so sánh, chúng cũng có thể bị xiềng xích. Nói cách khác, đoạn mã trên tương đương với (0 != 2) and (2 is 2), đó là True.

Lưu ý: Có một vài điểm tinh tế với 2 is 2một nửa, vì iskiểm tra xem hai thứ có phải là cùng một đối tượng hay không, liệu hai thứ có cùng giá trị hay không . Python lưu trữ các số nguyên nhỏ nên 1+1 is 2True, nhưng 999+1 is 1000False!

Độ dài 10 đoạn

x=[];x+=x,

Điều gì xảy ra khi bạn thêm một danh sách vào chính nó? Nếu chúng tôi thử in x, chúng tôi nhận được:

[[...]]

May mắn thay, Python printđủ thông minh để không phát nổ khi cố gắng in các danh sách đệ quy. Sau đó chúng ta có thể làm một loạt những điều thú vị, như:

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

Tính năng này cũng hoạt động với từ điển và là một cách tạo cấu trúc dữ liệu theo chu kỳ, ví dụ như biểu đồ.

Độ dài 11 đoạn

help(slice)

Các helpchức năng rất hữu ích để gỡ lỗi bằng Python. Khi được gọi mà không có đối số trong REPL, hãy help()bắt đầu một phiên trợ giúp, trong đó bạn có thể tra cứu tài liệu cho các hàm / kiểu dữ liệu / v.v. Khi được gọi với một đối số cụ thể,help sẽ cung cấp thông tin về các mục liên quan.

Ví dụ: help(slice)cung cấp thông tin sau (cắt ngắn vì nó khá dài):

Help on class slice in module __builtin__:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
 |  
 |  Methods defined here:
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 | ...

Như slicechúng ta có thể thấy, chúng ta có thể tạo slicecác đối tượng để lập chỉ mục. Ví dụ:

>>> L = list(range(10))
>>> L[slice(2, 5)]         # L[2:5]
[2, 3, 4]
>>> L[slice(2, None)]      # L[2:]
[2, 3, 4, 5, 6, 7, 8, 9]

Một chức năng hữu ích khác để gỡ lỗi là dir() , trả về tất cả các tên trong phạm vi hiện tại khi được gọi mà không có đối số và trả về tất cả các thuộc tính của một đối tượng đã cho khi được gọi với một đối số.

Độ dài 12 đoạn

round(5.0/2)

Điều này đánh giá điều gì? Câu trả lời phụ thuộc vào phiên bản Python của bạn!

Trong Python 2, phép chia giữa hai số nguyên dẫn đến phép chia số nguyên (nghĩa là 5/2 == 2) trong khi ở Python 3, chúng ta có phép chia float (nghĩa là5/2 == 2.5 ). Tuy nhiên, đây là sự phân chia giữa một số float và một số nguyên, điều này sẽ luôn dẫn đến một số float. Tại sao chúng ta sẽ nhận được kết quả khác nhau sau đó?

Nếu chúng ta xem tài liệu roundcho cả hai phiên bản Python, chúng ta sẽ tìm thấy câu trả lời:

  • Trong Python 2 , roundtiebreaks bằng cách làm tròn từ 0.
  • Trong Python 3 , roundtiebreak bằng cách làm tròn tới số nguyên chẵn gần nhất .

Nói cách khác, làm 5.0/2 = 2.5tròn thành 3Python 2, nhưng làm tròn thành 2Python 3. Làm tròn theo số nguyên gần nhất có vẻ lạ, nhưng thực ra nó được gọi là làm tròn ngân hàng và cố gắng xử lý các giá trị dương và âm tương tự để giảm sai lệch.

Độ dài 13 đoạn

class C:__x=1

Được định hướng đối tượng, Python có các lớp. Trên đây là một lớp Ccó một thuộc tính duy nhất được __xđặt thành 1.

Chúng ta có thể truy cập các thuộc tính lớp bằng cách sử dụng ký hiệu chấm. Ví dụ, nếu chúng ta có lớp

class MyClass(): my_attr = 42

sau đó in MyClass.my_attrsẽ dẫn đến 42, như mong đợi.

Tuy nhiên, nếu chúng tôi làm tương tự và cố gắng truy cập C.__xnhư được xác định ở trên, chúng tôi nhận được:

AttributeError: type object 'C' has no attribute '__x'

Chuyện gì đang xảy ra vậy? Crõ ràng có một __xthuộc tính!

Lý do là các thuộc tính bắt đầu bằng __mô phỏng các biến "riêng tư", thứ mà Python không có . Python đọc tên của bất kỳ thuộc tính nào bắt đầu bằng __, nối thêm tên lớp để tránh xung đột sử dụng lại tên. Trong ví dụ trên, nếu chúng ta thực sự quyết tâm truy cập vào đó 1, thay vào đó chúng ta sẽ phải làm

>>> C._C__x
1

Độ dài 14 đoạn

NotImplemented

Python không chỉ có các lớp, nó còn có quá tải toán tử. Ví dụ, bạn có thể có một lớp

class Tiny():
    def __lt__(self, other):
        return True

đâu __lt__là toán tử nhỏ hơn. Bây giờ nếu chúng ta tạo một ví dụ Tiny, chúng ta có thể làm điều này

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

vì chúng tôi đã xác định __lt__luôn luôn quay trở lại True. Lưu ý rằng chúng ta cũng có thể làm

>>> 42 > t
True

nhưng những lần nghỉ sau:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

Đợi đã, làm thế nào mà làm việc? Chúng tôi đã không chỉ định một hành vi lớn hơn so với Tiny, vì vậy không có gì đáng ngạc nhiên khi vụ án cuối cùng bị phá vỡ. Nhưng làm thế nào để một int(42) biết rằng nó lớn hơn chúng taTiny đối tượng ?

Python có hằng số dựng sẵn NotImplemented, có thể được trả về bằng phương thức so sánh đặc biệt. Hãy thử xem:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

Bây giờ nếu chúng ta tạo một thể hiện của lớp mới:

>>> u = Unknown()

Chung ta co thể lam được việc nay:

>>> t < u
True
>>> u > t
Called me first!
True

Như chúng ta có thể thấy, điều xảy ra u > tlà Python đã cố gắng gọi phương thức lớn hơn Unknownlần đầu tiên, thấy rằng nó không được thực hiện và thay vào đó đã thử phương thức ít hơn cho lớp khác ( Tiny)!

Độ dài 15 đoạn

x=[],;x[0]+=[1]

Đây là một chút của một niềm vui. Đầu tiên chúng ta gán xcho [],nó là một danh sách trống bên trong một tuple, tức là ([],). Sau đó, chúng tôi làm điều x[0]+=[1]đó cố gắng mở rộng danh sách trống bên trong danh sách thứ hai[1] .

Bây giờ, hãy nhớ rằng danh sách là có thể thay đổi và các bộ là im có thể thay đổi - những gì xảy ra khi bạn cố gắng thay đổi một đối tượng có thể thay đổi bên trong một đối tượng bất biến?

>>> x=[],;x[0]+=[1]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x=[],;x[0]+=[1]
TypeError: 'tuple' object does not support item assignment

Ồ, vậy là nó có lỗi, tôi đoán đó là điều được mong đợi. Nhưng nếu chúng ta cố gắng in xthì sao?

>>> x
([1],)

Huh? Danh sách đã thay đổi!

Nếu bạn tò mò về những gì đang xảy ra ở đây, hãy chắc chắn kiểm tra bài đăng trên blog này .

Độ dài 16 đoạn

@lru_cache(None)

Chỉ cần thêm bộ đệm! Đây là một ví dụ đơn giản về một trình trang trí có sẵn trong Python 3.

Giả sử chúng ta có cách triển khai Fibonacci ngây thơ sau đây:

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Như hầu hết các giới thiệu về các khóa học lập trình có thể cho bạn biết, đây là một cách rất tệ khi triển khai Fibonacci, dẫn đến thời gian chạy theo cấp số nhân vì chúng tôi thực sự chỉ cần thêm rất nhiều 1 trong trường hợp cơ sở.f(10)? Chạy trong tích tắc. f(32)? Mất một lúc, nhưng nó đến đó.f(100)? Không.

Nhưng nếu chúng ta lưu trữ kết quả, mọi thứ sẽ nhanh hơn rất nhiều. Chúng tôi luôn có thể sử dụng từ điển cho bộ đệm, nhưng thay vào đó, hãy thử một cái gì đó khác:

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Như chúng ta có thể thấy, tất cả những gì tôi đã làm là nhập lru_cachetừ functoolsmô-đun và thêm vào @lru_cache(None)trước chức năng của tôi. @biểu thị một trình trang trí bao quanh một chức năng, trong trường hợp này để phân biệt. lru_cacheĐối số đầu tiên là maxsize, kích thước tối đa của bộ đệm - ở đây chúng tôi đã đặt nó Noneđể chỉ ra không có kích thước tối đa.

Bây giờ nếu chúng ta cố gắng sử dụng nó:

>>> f(100)
573147844013817084101

Và nó thậm chí không mất một giây!

Lưu ý: f(1000)dẫn đến lỗi độ sâu đệ quy, nhưng đó là một câu chuyện cho một lần khác


Python "bắt" phạm vi nào cho istoán tử?
mbomb007

@ mbomb007 Từ câu hỏi này , nó xuất hiện từ -5 đến 256. Bạn có thể thử -5-1 is -6255+2 is 257kiểm tra.
Sp3000

37

Jot

Factoid: Tôi có thể định nghĩa Jot với 2 upvote và chứng minh rằng Turing hoàn thành với 8 (không sử dụng độ dài 4, 6 hoặc 7).

Độ dài 1

1

Đây là một ví dụ về hai chức năng trong Jot. Đầu tiên là chuỗi rỗng, đánh giá chức năng nhận dạng. Thứ hai là 1, đó là toán tử nhóm của Jot. 1ước tính cho λxy.[F](xy)( ký hiệu lambda tính toán ), [F]chương trình nằm ở đâu trước 1(ở đây, chuỗi rỗng). Vì vậy, chương trình này là chức năng λxy.(λz.z)(xy)đơn giản hóa λxy.xy.

Độ dài 2

10

Bây giờ chúng tôi đang giới thiệu biểu tượng khác trong Jot : 0. Một lần nữa nếu [F]đại diện cho giá trị của chương trình cho đến nay, hãy 0đánh giá [F]SK, ở đâu SKtừ logic kết hợp . Tôi đã xác định toàn bộ ngôn ngữ bây giờ.

Độ dài 5

11100

Bây giờ tôi sẽ chứng minh rằng Jot đã hoàn thành bằng cách xác định ánh xạ từ logic kết hợp sang Jot. Chương trình Jot Đây là combinator K .

Dài 8

11111000

Đây là tổ hợp S.

Chiều dài 3

1AB

Đây, AB không phải là một phần của Jot, mà là giữ chỗ cho một biểu thức tùy ý. Biểu thức ABtrong ánh xạ logic kết hợp thành 1ABtrong Jot, với Avà được Bchuyển đổi đệ quy theo ba quy tắc này. QED

Độ dài N

1
10
11
100
101
110
[...]

Mỗi số tự nhiên, được biểu thị dưới dạng nhị phân, là một chương trình Jot hợp lệ. Do đó, tôi có thể tạo ra nhiều đoạn mã có độ dài tùy ý. Cho đủ upvote, tôi có thể giải quyết vấn đề tạm dừng .


2
Hai upvote đưa ra. Bây giờ xác định ngôn ngữ.
John Dvorak

@JanDvorak làm việc với nó ... đã quá lâu kể từ khi tôi nghiên cứu về điều này đến nỗi tôi đã quên tất cả :)
Phil Frost

1
Tôi không thấy lý do tại sao điều này sẽ tiếp tục nhận được nhiều sự ủng hộ hơn. Bạn chỉ đơn giản là sẽ tạo ra số nhị phân ngẫu nhiên có độ dài tăng dần: |
Tối ưu hóa

1
Bạn đã nói như vậy đối với upvote số 4. Nhưng ở đây chúng tôi đang xem xét "số ngẫu nhiên bạn vừa tạo"
Trình tối ưu hóa

1
Làm thế nào bạn có thể giải quyết vấn đề tạm dừng? Tôi đoán nó có liên quan gì đến việc sử dụng chương trình vô hạn (số lượng vô hạn)?
Filip Haglund

37

Bash

Factoid:

Lỗi ShellShock cực kỳ nghiêm trọng đã có mặt ở Bash từ năm 1989 và vẫn chưa được phát hiện trong một phần tư thế kỷ. Phần lớn niềm vui của việc viết Bash đang trở nên hấp dẫn với nhiều sự bình dị và không nhất quán của nó.

Độ dài 1 đoạn:

[

Một bí danh cho testnội dung, cho phép mã định dạng if [ a == b ]; then- trong thực tế [là một lệnh độc lập, không phải là một yếu tố cú pháp và ]hoàn toàn là trang trí (mặc dù yêu cầu của [, yêu cầu của nó là tùy ý và bạn có thể loại bỏ nó bằng cách sử dụng alias [=test).

Độ dài 2 đoạn:

||

Giống như logic ortrong hầu hết các ngôn ngữ, nhưng cho các quy trình. Sẽ thực thi lệnh sau ||chỉ khi lệnh trước nó trả về khác không.

Độ dài 3 đoạn:

x=y

Phân công. Đẹp và dễ đoán ... nhưng không giống như hầu hết các ngôn ngữ khác, không gian thêm không được phép. Điều này thật buồn cười bởi vì bạn có thể gắn thêm không gian ở mọi nơi khác giữa các thứ trong bash, không phải xung quanh =.

Độ dài 4 đoạn:

$IFS

Dấu tách trường nội bộ - biến này ảnh hưởng đến cách Bash phân chia dữ liệu cho nhiều hành động tích hợp, chẳng hạn như lặp lại cho các vòng lặp và điền vào các mảng từ các chuỗi. Được sử dụng chính xác, nó có thể rất mạnh mẽ; nhưng thường xuyên hơn nó là nguyên nhân của các lỗi tinh vi và không thể đoán trước.

Độ dài 5 đoạn:

${x^}

Thay thế chuỗi trong x, nhưng với ký tự đầu tiên được viết hoa! Một tính năng được sử dụng thường xuyên như vậy mà nó có đoạn cú pháp ngôn ngữ riêng.

Độ dài 6 đoạn:

x=($y)

Điền vào một mảng, x, từ một chuỗi hoặc danh sách các phần tử y, phân tách trên bất cứ thứ gì IFS hiện được đặt thành - theo mặc định, khoảng trắng. Một tính năng rất hữu ích cho lập trình bash nâng cao.

Độ dài 7 đoạn:

${x[y]}

Mảng! Nhưng chờ đã, cái gì ... y là một chuỗi, không phải là một chỉ số? Vâng thực sự, Bash hỗ trợ mảng kết hợp! Nhiều người không biết điều này. Bạn chỉ cần declare -A xđầu tiên.

Độ dài 8 đoạn:

${x##*,}

Thay thế x, mọi thứ cho đến ,ký tự cuối cùng (hoặc bất cứ điều gì bạn chỉ định). Hữu ích để có được trường cuối cùng của một csv - đây là điều bạn không thể dễ dàng thực hiện được cut, chỉ tính các trường từ bên trái. % và %% cho phép cùng cắt từ bên phải; % và # đã được chọn cho vị trí của họ trên bàn phím Hoa Kỳ nên sẽ rõ ràng nghĩa là trái và nghĩa là phải, nhưng điều đó không có nhiều giá trị cho mọi người không sử dụng bàn phím Hoa Kỳ :)

Độ dài 9 đoạn:

[ a = b ]

Trong hầu hết các ngôn ngữ khác, một bằng bằng trong một hoạt động so sánh sẽ tạo ra hành vi ngoài ý muốn dưới dạng một bài tập. Không phải ở Bash, mặc dù. Chỉ cần không bỏ sót bất kỳ khoảng trống nào, bất cứ điều gì bạn làm!

Độ dài 10 đoạn:

if [ a=b ]

Đây là những gì xảy ra nếu bạn quên đi các không gian bắt buộc. Sẽ không ném lỗi. Sẽ luôn trả về true - ngay cả khi ablà các biến không được đặt hoặc bất cứ thứ gì chúng được đặt thành, không thành vấn đề - nó sẽ luôn trả về true. Hãy suy nghĩ về mã nhưif [ "$password"="$correctpass" ] để thấy tiềm năng thú vị của "tính năng" này.

Độ dài 11 đoạn:

x=${y//a/b}

Thay thế chuỗi con kiểu Regex! Đặt x thành giá trị của y nhưng với mọi phiên bản của a được thay thế bằng b.

Độ dài 12 đoạn:

[[:upper:]]*

Mô hình kết hợp - bạn không giới hạn chỉ sử dụng các ký tự đại diện * trong vỏ, bạn có thể sử dụng bất kỳ trận đấu chuẩn POSIX như alnum, alpha, digit, vv

Độ dài 13 đoạn:

function x(){

Một chút cú pháp C đã bí ẩn len lỏi vào! Một trong nhiều cách sử dụng hoàn toàn khác nhau cho dấu ngoặc nhọn và một ví dụ khác về các yếu tố trang trí tùy chọn để làm cho Bash trông giống với các ngôn ngữ khác - ()hoặc functioncó thể được bỏ qua ở đây (nhưng không phải cả hai). Cũng vui hơn với các không gian không nhất quán - một không gian sau {là bắt buộc, nhưng không phải trước khi đóng cửa }, như trongfunction x { y;}

Độ dài 14 đoạn:

echo {Z..A..3}

Một cách sử dụng hoàn toàn không liên quan khác của niềng răng xoăn. Mở rộng một phạm vi với một bước được chỉ định. Trong trường hợp này, sẽ tạo ra mỗi chữ cái thứ 3 từ Z đến A. Hữu ích cho việc tạo chuỗi mà không sử dụng seq, nhưng không thể được sử dụng với các biến, do đó chức năng bị hạn chế.

Độ dài 15 đoạn:

echo {a,b,c,d}x

Một cách sử dụng tương tự nhưng không giống nhau cho các dấu ngoặc nhọn trong thế hệ chuỗi; in ax bx cx dxvà rất hữu ích để tạo danh sách các chuỗi từ một chuỗi hoặc danh sách trong một lệnh. Tuy nhiên, một lần nữa, hạn chế về tính hữu dụng vì nó không thể được sử dụng với các biến trong niềng răng.


Trên thực tế, ]không hoàn toàn là trang trí. [sẽ từ chối hoạt động nếu đối số cuối cùng của nó không ].
FUZxxl

Có, nhưng nó không phục vụ mục đích nào khác ngoài mỹ phẩm; và nếu bạn thay thế [bằng hình thức khác của nó test, thì ]có thể bỏ qua mà không thay đổi bất cứ điều gì khác trong cuộc gọi - Tôi chỉ đơn giản đưa ra quan điểm rằng đó không phải là cú pháp bash thực tế, chỉ là đường trực quan.
Bạo loạn

Bạn đúng ở chỗ nó không phải là cú pháp bash, nhưng dấu vết ][cú pháp và bạn phải cung cấp nó giống như cách bạn phải chấm dứt một câu lệnh trong C bằng dấu chấm phẩy.
FUZxxl

Đúng là nó bắt buộc, nhưng hoàn toàn không giống với dấu chấm phẩy C. Yêu cầu đối với nó là hoàn toàn tùy ý, như đã thấy nếu bạn chỉ đơn giản alias [=testvà sau đó viết, if [ 1 = 1; thenv.v. Nhưng tôi sẽ làm rõ từ ngữ của tôi để đưa quan điểm của bạn vào tài khoản :)
Riot

1
Về function x(){cú pháp: Bạn có thể thả parens, như bạn nói, nhưng bạn cũng có thể bỏ functionphần. Trên thực tế, đó là cách vỏ POSIX xác định các chức năng, vì vậy nó dễ mang theo hơn. Bạn có thể xác định một chức năng đầy đủ trong 13 ký tự. Ví dụ:x(){ startx;}
kojiro

37

APL

Factoid

APL ( A P rogramming L anguage) khởi nghiệp như một thông dịch viên cho một ký hiệu công thức do Ken Iverson nghĩ ra . Khi ngôn ngữ được thiết kế, mọi người đã sử dụng máy điện báo để giao tiếp với máy tính. Bộ ký tự trong số này bị giới hạn, nhưng do cấu trúc của chúng, người ta có thể đặt nhiều ký tự vào cùng một vị trí để soạn các ký tự phức tạp. Tính năng này được APL sử dụng rất nhiều, góp phần tạo nên danh tiếng khét tiếng như một ngôn ngữ chỉ đọc.

Bạn có thể thử hầu hết các ví dụ trên http://www.tryapl.org .

Độ dài 1

Nhân vật , được gọi là chụp đèn, cả về hình dạng và sự giác ngộ mà bạn có được từ sự hiện diện của nó, giới thiệu một nhận xét. Trong lịch sử, nó được tạo ra bằng cách vượt qua một (jot) và một (giày lên).

Độ dài 2

⍳3

Hàm monadic (một đối số) (iota) tạo ra một vectơ của một vài số tự nhiên đầu tiên. Ví dụ, đã nói ở trên ⍳3sẽ mang lại 1 2 3, vectơ của ba số tự nhiên đầu tiên. Trên một số triển khai của APL, nó sẽ mang lại0 1 2 thay vào đó, điều này phụ thuộc vào giá trị của ⎕IO, i ota o rigin.

Chiều dài 3

5\3

Trái ngược với các đơn nguyên , hàm dyadic \(mở rộng) sao chép đối số bên phải thường xuyên như đối số bên trái; do đó, 5\3sản lượng 3 3 3 3 3. Bạn có thể muốn chơi xung quanh với các đối số vectơ (như 1 2 3\4 5 6) để xem những gì nó làm sau đó.

Độ dài 4

A←⍳3

Điều này gán cho A giá trị của ⍳3. (mũi tên trái) là toán tử gán. Một nhiệm vụ không phải là điều xa nhất trong một tuyên bố; các bài tập được phân tích cú pháp như các lệnh gọi hàm và mang lại giá trị được gán để sử dụng tiếp.

Độ dài 5

∘.×⍨A

Một bảng nhân ba nhân ba, nghĩa là

1 2 3
2 4 6
3 6 9

Điều này hơi phức tạp một chút, vì vậy hãy để tôi giải thích. ⍺∘.f⍵(đọc: alpha jot dot f omega) là sản phẩm bên ngoài của qua f. Sản phẩm bên ngoài là một bảng kết quả của việc áp dụng fcho từng cặp yếu tố có thể từ . Trong ví dụ này, f×(nhân), thu được một bảng nhân. Các nhà điều hành (dấu ngã dấu tách đôi) tiện di chuyển đối số của nó, có nghĩa là, ⍺f⍨⍵bằng ⍺f⍵f⍨⍵không có toán hạng trái bằng ⍵f⍵. Nếu không có toán tử đi lại, đoạn mã này sẽ là a∘.×a. Người vận hành sản phẩm bên ngoài rất đa năng; kiểm tra những gì sẽ xảy ra nếu bạn thay thế =cho ×!

Độ dài 6

{×/⍳⍵}

Một chức năng giai thừa. Một cặp dấu ngoặc nhọn bao quanh một dfn (hàm động), nghĩa là một hàm ẩn danh (xem biểu thức lambda). Các đối số cho một dfn được liên kết với các biến hoặc chỉ khi dfn được gọi là một đơn thức (đối số duy nhất, trái ngược với hàm dyadic, hai đối số). Chúng tôi áp dụng cho các đối số đúng, mang lại số nguyên từ 1đến . Các /(slash) khai thác giảm, đó là f/⍵chèn fgiữa các hạng mục . Ví dụ, +/⍳5chỉ là 1+2+3+4+5. Trong trường hợp này, chúng tôi giảm với ×, mang lại sản phẩm của các mặt hàng ⍳⍵, mà chỉ là yếu tố của .

Độ dài 7

2×3*4+5

Sản lượng 39366. ⍺*⍵(alpha star omega) được nâng lên thành sức mạnh của . APL có một quy tắc ưu tiên rất đơn giản: Mọi thứ được đánh giá từ phải sang trái, tất cả các chức năng đều liên kết phải. Các toán tử liên kết mạnh hơn các hàm và được đánh giá từ trái sang phải. Do đó, biểu thức trên với dấu ngoặc đơn rõ ràng sẽ được viết 2×(3*(4+5))trái ngược với thông thường (2×(3*4))+5.

Dài 8

¯1+3 3⍴A

Đoạn trích này mang lại

0 1 2
3 4 5
6 7 8

và thể hiện hai khái niệm quan trọng: Khái niệm đầu tiên là hàm (rho), định hình lại đối số bên phải của nó thành hình dạng được chỉ định trong đối số bên trái của nó. Hình dạng của một mảng là một vectơ có độ dài của mỗi trục trong mảng. Hình dạng của vô hướng là vectơ trống. Do đó, 3 3⍴Ađịnh hình lại Athành một ma trận ba bởi ba. Khái niệm thứ hai là cách bổ sung được sử dụng ở đây: Chúng tôi thêm ¯1(overbar one), nghĩa là phủ định ( ¯là tiền tố để chỉ định số âm, trong khi -là toán tử) vào một mảng. Hai toán hạng có hình dạng khác nhau, do đó toán hạng có hình dạng nhỏ hơn được phân phối trên toán hạng khác, trừ đi một từ mọi mục trong ma trận được tạo.

Độ dài 9

+.×⍨3 3⍴A

A, được định hình lại thành ma trận 3 nhân 3, nhân với chính nó. Các .(dot) điều hành có hai chức năng và xây dựng một sản phẩm bên trong , nơi mà các chức năng đầu tiên đại diện cho Ngoài và chức năng thứ hai nhân. Một phép nhân đơn giản, cũ, ma trận là +.×, một biến thể phổ biến là ≠.∧(trong đó không bằng và (up caret) là logic và) cho ma trận boolean; nhiều điều thú vị có thể được mô hình hóa như một sản phẩm bên trong với các nhà khai thác nhất định thay thế +×.

Độ dài 10

(.5×⊢+÷)⍣≡

(đọc: dấu ngoặc đơn bên trái chấm năm phép nhân phải cộng với chia dấu ngoặc đơn bên phải sao-diæresis giống nhau) Tính căn bậc hai của một số thực bằng phương pháp Babylon . Đối số bên trái là số bạn muốn tính căn bậc hai của, đối số bên phải là dự đoán ban đầu cho căn bậc hai. Ban đầu tôi muốn cung cấp một dự đoán ban đầu có ý nghĩa, nhưng tôi đã hết các ký tự (nối thêm để sử dụng chính số đó làm dự đoán ban đầu).

Vậy làm thế nào để làm việc này? Trước tiên, hãy bắt đầu với phần bên trái (.5×⊢+÷). Biểu thức này sử dụng ký hiệu ngầm có nguồn gốc từ J mà sau đó được chuyển lại cho Dyalog APL. Ký hiệu ngầm là một chút khó khăn cho người mới bắt đầu, vì vậy xin vui lòng đọc phần này một cách cẩn thận. Một chuỗi bị cô lập, chẳng hạn như +/÷≢, các quy tắc phân tích cú pháp thông thường của Wap không giải quyết được một phần của lời nói được gọi là một chuyến tàu. Một đoàn tàu gồm hai hoặc ba hàm tạo ra một hàm và (bằng độ phân giải lặp lại), một hàm hàm có độ dài bất kỳ cũng tạo ra một hàm. Một nhóm gồm ba hàm fghhoạt động như thế {(⍺f⍵)g⍺h⍵}, nghĩa là, fhđược áp dụng cho các đối số của hàm kết quả và kết quả của các hàm này được áp dụng cho các hành vi như , đây là,g . Một đoàn tàu của một mảng và hai chức năng nhưAfg{Af⍺g⍵}gđược áp dụng cho các đối số của hàm kết quả Avà kết quả đó được áp dụng chof. Một đoàn tàu gồm hai hàm cũng có một ngữ nghĩa, được giải thích trong tài liệu nhưng không được sử dụng trong ví dụ này.

Trong chuyến tàu đặc biệt này, một chức năng mới, (tack phải) được sử dụng. Nó hành xử như thế {⍵}, mang lại lý lẽ đúng đắn của nó. Do đó, toàn bộ biểu thức bằng{.5×⍵+⍺÷⍵} , đó chỉ là bước lặp của công thức Babylon. Thật dễ dàng để thấy cách ký hiệu ngầm mang lại lợi ích cho người chơi golf; nó cho phép bạn cạo khá nhiều ký tự quý giá khi áp dụng.

Phần cuối cùng của câu đố là (ngôi sao diresis), người vận hành năng lượng . Nếu đối số đúng là một mảng, f⍣A⍵áp dụng fcho tổng số Alần. Ví dụ, f⍣3⍵bằng fff⍵. Số lượng có thể âm, trong trường hợp đó APL cố gắng suy ra hàm nghịch đảo fvà áp dụng hàm đó. Nếu đối số quyền là một chức năng, quá, f⍣g⍵áp dụng fcho đến khi (fY)gYnơi Ylà kết quả của việc áp dụng lặp đi lặp lại của fđể . Đáng chú ý, nếu g=(bằng) hoặc (giống nhau), hãy f⍣≡tính điểm sửaf . Đây chính xác là những gì chúng ta cần cho phương pháp Babylon! Chúng tôi muốn lặp đi lặp lại cho đến khi kết quả hội tụ. Cuối cùng, nếu được áp dụng cho một cặp thứ được gọi là hàm dyadic, đối số bên trái bị ràng buộc vớif ở bên trái, tức ⍺f⍣g⍵là bằng với (⍺∘f)⍣g⍵nơi A∘fhành xử như thế nào {Af⍵}.


Bạn đã có nhiều phiếu bầu hơn! Chúng ta có thể có thêm một số?
kẻ lừa đảo người lái xe

@luserdroog Chắc chắn, hãy để tôi nghĩ thêm.
FUZxxl

Tôi có thể chỉnh sửa và mở rộng điều này?
Adám

@ Adám Vâng, làm ơn.
FUZxxl

∘.×⍨a cho tôi một lỗi giá trị . Tôi có đang sử dụng đúng không?
Cyoce

37

Matlab

Đoạn 26 - lặp lại trên ma trận

Đây là một cái gì đó tôi vừa mới phát hiện ra. Thông thường bạn lặp đi lặp lại trên một vectơ nhất định trong các vòng lặp. Nhưng thay vì vectơ, bạn cũng có thể sử dụng ma trận ( rand(10)tạo ra ma trận 10x10 với các số phân bố đồng đều trong khoảng từ 0 đến 1).

for k=rand(10);disp(k);end

Điều này sau đó hiển thị một vectơ cột của ma trận ngẫu nhiên trên mỗi lần lặp.

Đoạn 25 - âm mưu dễ dàng

Chúng ta biết âm mưu là dễ dàng trong MATLAB, nhưng có một chức năng siêu dễ dàng ezplot( E-Zhiểu không? Phải mất khá nhiều thời gian cho đến khi cuối cùng tôi cũng hiểu được, vì tôi Zluôn đánh vần sedthay vì c, bất cứ điều gì ...) Mọi người đều thích các đường cong elip:

ezplot('y^2-x^3+9*x-10.3')

đường cong elip

Đoạn 24 - tích hợp

Từ lỗi thời (nhưng vẫn được sử dụng trong tính toán số) để tích hợp là 'bậc hai', bạn có thể đoán kết quả của từ sau là gì không?

quad(@(x)4./(1+x.^2),0,1)

Đoạn 23 - hình ảnh

Tất nhiên Matlab cũng rất phổ biến trong số các nhà khoa học phải làm việc với hình ảnh (ví dụ phân tích hình ảnh y tế), vì vậy đây là một chức năng rất tiện dụng. Đối số đầu tiên là hình ảnh, góc thứ hai và đối số tùy chọn thứ ba ở đây cho biết hàm cắt nó thành kích thước ban đầu.

imrotate(rand(99),9,'c')

đây

Đoạn 22 - âm nhạc

load handel;sound(y,Fs)

Nó sẽ phát ra âm thanh như thế này (liên kết youtube)

Đoạn 21 - phân biệt và tích hợp

polyint(polyder(p),c)

Bạn có thể dễ dàng phân biệt và tích hợp đa thức bằng cách sử dụng hai hàm đó. Khi tích hợp, bạn có thể truyền một đối số thứ hai sẽ là hằng số.

Đoạn 20 - quay lại đa thức

p=poly(r);cp=poly(A)

Muốn đa thức có gốc trong r? Dễ dàng : p=poly(r). Bạn muốn đa thức đặc trưng của một ma trận A? Dễ dàng : cp=poly(A). Vậy roots(p)là chính xác r(hoặc hoán vị r).

Đoạn 19 - một trò ảo thuật khác

fminsearch(fun,x0);

Có những người hoàn toàn yêu thích chức năng này. Điều này về cơ bản chỉ tìm kiếm tối thiểu funvới một giá trị ban đầu x0(có thể là một vectơ) mà không có bất kỳ điều kiện nào fun. Điều này rất phù hợp để phù hợp với các mô hình nhỏ mà bạn không thể (hoặc bạn quá lười biếng) để phân biệt chức năng lỗi / phạt / mục tiêu. Nó sử dụng thuật toán đơn giản Nelder-Mead , khá nhanh cho các hàm mà bạn không thể đưa ra bất kỳ giả định nào.

Đoạn 18 - giới thiệu về đa thức

p=polyfit(x,y,deg)

Matlab có một giải pháp tốt để đối phó với đa thức. Với polyfitbạn có được một đa thức bình phương tối thiểu của mức độ deggần đúng với các điểm trong x,y. Bạn nhận được một vectơ plưu trữ các hệ số của đa thức, bởi vì đó là điều duy nhất bạn cần để biểu diễn một đa thức. Nếu bạn quay lại đoạn 15, bạn có thể làm điều tương tự bằng cách viết c = polyfit(x,y,2). Vì vậy, ví dụ [1,-2,3]đại diện cho đa thức x^2 - 2*x+3. Tất nhiên cũng có các chức năng để phù hợp với các chức năng cơ bản hoặc tùy ý khác.

Đoạn 17 - góc và sự không liên tục

unwrap(angle(c))

Nếu bạn muốn nhận được đối số của một vectơ 'liên tục' của các số phức, bạn thường nhận lại các giá trị dường như có sự gián đoạn. Eg angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])sẽ giúp bạn [-2.94,-3.04,3.14,3.04,2.94]anglechỉ trả về các góc giữa -pipi. Các chức năng unwrapsẽ chăm sóc này! Nếu bạn nhận được một gián đoạn như thế này, nó sẽ chỉ thêm một bội số 2*piđể loại bỏ những thứ đó: '[-2.94, -3.04, -3,14, -3,24, -3,34]' Điều này thậm chí hoạt động cho ma trận 2d! Nếu bạn chỉ vẽ đối số của các số phức với phần thực âm, bạn sẽ có được đồ họa đầu tiên, bạn sẽ có được hình ảnh đầu tiên, với phần mở rộng, bạn sẽ có được phần thứ hai:

không có với Unrap

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

Đoạn 16 - sản phẩm vô hướng

[1;2;3]'*[4;5;6]

Tất nhiên có các phương thức được xây dựng (như dot), nhưng với toán tử biến đổi ma trận, 'nó đơn giản như vậy. Nếu bạn không biết liệu bạn có vectơ hàng hay cột, bạn chỉ có thể sử dụng a(:)'*b(:)nơi a(:)luôn trả về vectơ cột.

Đoạn 15 - bình phương tối thiểu tuyến tính, phương pháp xấu xí với cây đũa thần

[x.^2,x,x.^0]\y

xlà vectơ (cột) với các giá trị trên trục x, ygiá trị y nhiễu. Nhập c=[x.^2,x,x.^0]\yvà bạn nhận được các hệ số của đa thức bậc 2. Tất nhiên bạn có thể sử dụng một trong số hàng tỷ chức năng phù hợp của matlab (thật nhàm chán) tại sao không sử dụng cây đũa thần? =)

x = (-1:0.1:2)';
y = 3*x.^2-2*x+1+randn(size(x)); %add some gaussian (normal) noise
A = [x.^2,x,x.^0];
c = A\y              %output: c = ]3.0049; -2.3484; 1.1852]
plot(x,y,'x',x,A*c,'-')

linreg

Đoạn 14 - biểu đồ

gplot(graph,x)

Đó là cách vẽ đồ thị. graphnên chứa một ma trận kề kề vuông và xphải là một ma trận nx2 chứa tọa độ của mỗi nút. Hãy tạo một biểu đồ ngẫu nhiên:graph = triu( rand(8)>.7) (tạo một Ma trận chứa 0 và 1, chỉ lấy tam giác trên cho một biểu đồ thú vị). x = rand(8,2)sau đó cốt truyện với một số phong cách ưa thíchgplot(graph,x,'k-.d')

đồ thị (Tôi tuyên bố đây là nghệ thuật hiện đại.)

Đoạn 13 - lưới

meshgrid(a,b)

Đây là một trong những chức năng tuyệt vời nhất, đơn giản nhưng hữu ích. Nếu bạn muốn vẽ một hàm có giá trị thực phụ thuộc vào hai biến, bạn chỉ có thể xác định một vectơ giá trị cho trục x và một cho trục y (a và b). Sau đó với lướigrid, bạn có thể tạo hai ma trận có kích thước len (a) x len (b) trong đó một cái chỉ có vectơ alà cột và cột kia chỉ có cột chỉ có vectơ blà hàng. Ví dụ sử dụng: a = -3:0.2:3;[x,y]=meshgrid(a)(nếu cả hai vectơ đều giống nhau, chỉ cần vượt qua một vectơ là đủ.) Sau đó, bạn có thể chỉ cần gõ z=x.^2+-y.^2và vdmesh(x,y,z). Điều này làm việc cho một số lượng kích thước tùy ý! Vì vậy, điều này không chỉ tuyệt vời cho âm mưu, mà còn để có được tất cả các kết hợp có thể có của các vectơ khác nhau, v.v ... (Vì vậy, nếu bạn muốn tạo một ngôn ngữ golf mã mới, điều này nên có trong đó, chỉ cần đảm bảo bạn sử dụng ngắn hơn Tên chức năng...)

lưới thép

Đoạn 12 - âm mưu

plot(x,x.^2)

Lấy một vector x=-3:0.5:3và để plotlàm phần còn lại. Có nhiều chức năng hơn nữa cho âm mưu này chỉ là một chức năng rất cơ bản mà bạn có thể sử dụng mọi lúc. Nó đã đủ để viết plot(v)và dữ liệu trong vsẽ được vẽ dựa trên các chỉ số mảng. Làm thế nào đơn giản? Nếu bạn muốn tạo kiểu cho cốt truyện của mình, chỉ cần thêm một chuỗi làm đối số thứ ba: ví dụ: 'r:o'sẽ tạo một đường chấm màu đỏ với các vòng tròn xung quanh các điểm dữ liệu. Nếu bạn muốn nhiều ô, chỉ cần thêm nhiều đối số hoặc sử dụng ma trận thay vì vectơ. Hoàn hảo.âm mưu

Đoạn 11 - xử lý chức năng

f=@(x,y)x+y

Đây là một ví dụ về một hàm xử lý được lưu trữ trong f. Bây giờ bạn có thể gọi f(1,2)và nhận được 3. Các hàm xử lý trong MATLAB rất hữu ích cho các hàm toán học (ví dụ như vẽ đồ thị) và bạn có thể định nghĩa chúng trong một dòng. Nhưng một nhược điểm là bạn không thể có điều kiện hoặc từng phần (và do đó không có đệ quy). Nếu bạn muốn điều này, bạn phải sử dụng functioncâu lệnh và khai báo một hàm mới và mỗi hàm phải được lưu trữ trong một tệp riêng biệt ... (WHYYYYYY ????)

Tái bút: Bạn sẽ nhận được một quả trứng Phục sinh vui nhộn khác nếu bạn gõ whyvào bảng điều khiển: Họ đã tạo ra một chức năng khổng lồ tạo ra các thông báo ngẫu nhiên như:

The tall system manager obeyed some engineer.
The programmer suggested it.
It's your karma.
A tall and good and not excessively rich and bald and very smart and good tall and tall and terrified and rich and not very terrified and smart and tall and young hamster insisted on it.

... thật thoải mái nếu bạn đủ tuyệt vọng để hỏi giao diện điều khiển why...

Đoạn 10 - Ma trận của tôi trông như thế nào?

spy(eye(9))

Như bạn đã biết bây giờ eye(9)tạo ra một ma trận danh tính 9x9. spychỉ tạo một mục hiển thị các mục nhập không / khác không của ma trận. Nhưng bạn cũng có thể sử dụng nó để hiển thị bất kỳ dữ liệu nhị phân 2d nào. Nếu bạn gọi spymà không tranh luận, bạn sẽ nhận được một quả trứng Phục sinh nhỏ xinh =)

gián điệp về danh tính gián điệp Easteregg

Đoạn 9

kron(a,b)

Các kronchức năng đánh giá các sản phẩm Kronecker của hai ma trận. Điều này rất hữu ích cho các toán tử tuyến tính đa chiều rời rạc. Tôi cũng đã sử dụng nó mỗi giờ và sau đó để chơi golf mã. Bạn muốn tất cả các sản phẩm có thể của các mục ab? kron(a,b), bạn đi đây

Đoạn 8

5*a\b.*b

Ok ở đây tôi trộn 3 toán tử khác nhau. Bạn có thể nhân bất kỳ ma trận nào với vô hướng chỉ bằng cách sử dụng *. (Sau đó, mọi mục nhập của ma trận được nhân với vô hướng đó). Nhưng *cũng thực hiện phép nhân ma trận. Nếu bạn đặt trước một dấu chấm bạn nhận được .*toán tử, cái này sẽ nhân hai ma trận có cùng kích thước nhưng nhập thông minh . (Điều này cũng có thể được thực hiện với các toán tử phân chia như /\.)

Tiếp theo, toán tử dấu gạch chéo ngược có thể được sử dụng làm phép chia trái (ngược lại /thực hiện phép chia phải như bạn đã quen) nhưng nó cũng là toán tử đặc trưng và mạnh nhất của matlab: Nó thực hiện một 'phép chia ma trận'. Hãy nói rằng bạn có hệ thống các phương trình tuyến tính A*x=bvà bạn muốn giải nó x, sau đó bạn chỉ cần gõ x=A\b. Và \(bạn cũng có thể sử dụng /nhưng ít phổ biến hơn cho ma trận) trước tiên nhanh chóng phân tích ma trận và sử dụng kết quả để tìm thuật toán nhanh nhất để thực hiện phép nhân nghịch đảo này! (Xem ví dụ tại đây )

Nhưng bạn cũng có thể sử dụng nó cho các hệ thống được xác định dưới hoặc quá mức (trong đó không tồn tại nghịch đảo hoặc ma trận không vuông, ví dụ như phương pháp bình phương tối thiểu). Đây thực sự là cây đũa thần của matlab.

Đoạn 7

[a,b;c]

Ok trông không giống lắm, nhưng nó là một công cụ rất tiện lợi: Ghép ma trận. Dấu phẩy giữa hai biểu thức có nghĩa là chúng được nối theo chiều ngang (có nghĩa là chúng phải có cùng chiều cao) và dấu chấm phẩy có nghĩa là 'dòng' trước sẽ nằm trên 'dòng' tiếp theo (theo dòng tôi có nghĩa là mọi thứ giữa hai dấu chấm phẩy. Chỉ là một ví dụ đơn giản: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];sẽ cho kết quả giống dnhư d=[1,2,5; 3,5,6; 7,8,9]. (Có được không?)

Bắn tỉa 6

eye(7)

Hàm này tạo ra ma trận nhận dạng 7x7 đầy đủ. Nó là dễ dàng. Có những chức năng khác giống như nan,inf,ones,zeros,rand,randi,randnvậy hoạt động theo cùng một cách. . và dễ dàng nếu bạn phải giải các phương trình vi phân từng phần. (Khi bạn giải quyết các PDE, cách tiếp cận chung là không hài lòng với các toán tử đạo hàm, về cơ bản, bạn sẽ chỉ nhận được một hệ phương trình tuyến tính khổng lồ cần được giải. đối xứng. Đó là lý do tại sao bạn có thể dễ dàng 'soạn thảo' ma trận bạn cần.

Đoạn 5

a(a>0.5)

Tôi hy vọng bạn không cảm thấy mệt mỏi bởi tất cả các cách truy cập mảng. Điều này cho thấy một cách dễ dàng để có được tất cả các yếu tố của một mảng đáp ứng một số điều kiện. Trong trường hợp này, bạn nhận được một vectơ của tất cả các phần tử alớn hơn 0,5. Biểu thức a>0.5chỉ trả về một ma trận có cùng kích thước avới các ma trận cho từng phần tử thỏa mãn điều kiện và 0cho một phần tử không.

Đoạn 4

a(:)

Điều này một lần nữa chỉ trả về nội dung của amột vectơ cột (ma trận nx1). Điều này thật tuyệt nếu bạn không biết liệu bạn đã lưu trữ dữ liệu của mình dưới dạng vectơ cột hay hàng hay nếu dữ liệu của bạn là hai chiều (ví dụ: đối với các phương pháp sai phân 2d hữu hạn).

Đoạn 3

1:9

Bạn có thể dễ dàng tạo các vectơ (trong trường hợp này là ma trận 1xn) với toán tử dấu chấm phẩy. Trong trường hợp này bạn có được vector [1,2,3,4,5,6,7,8,9]. Điều này cũng đặc biệt tốt khi truy cập các lát của các vectơ khác, ví dụ như a(2:4)truy cập phần tử thứ hai, thứ ba và thứ tư của vectơ a. Bạn cũng có thể sử dụng nó với kích thước bước, như0:0.5:10 hoặc như vậy.

Đoạn 2

i;

Một dấu chấm phẩy ngăn chặn đầu ra cho bàn điều khiển. Bạn có thể xem nó là một điều tốt hay xấu, nhưng tôi thích nó để gỡ lỗi. Bất kỳ dòng tính toán, vv sẽ tự động in kết quả của nó lên bàn điều khiển, miễn là bạn không triệt tiêu đầu ra bằng dấu chấm phẩy.

Đoạn 1

i

Số phức là một loại số cơ bản. (Quá tệ, nhiều người sử dụng inhư một biến đếm trong các vòng lặp trong trường hợp nó bị ghi đè.)

Giới thiệu

Đối với những người không biết, MatLab là ngôn ngữ lập trình (với IDE đẹp còn được gọi là MatLab?), Trước hết là dành cho tính toán số * và thao tác dữ liệu. (Có một bản sao mã nguồn mở có tên là "Octave") Vì nó chỉ được ** diễn giải nên nó không nhanh lắm, nhưng điểm mạnh là bạn có thể dễ dàng thao tác ma trận và nhiều thuật toán được triển khai theo cách tối ưu hóa để chúng chạy khá nhanh khi áp dụng trên ma trận. Nó cũng là một ngôn ngữ rất dễ học, nhưng tôi không khuyến khích nó là ngôn ngữ khởi đầu vì bạn sẽ cho rằng thói quen 'lập trình' khá tệ.

* Vì đây là ngôn ngữ được dịch, nó có thể rất chậm đối với các dự án đắt tiền, nhưng bạn có các phương thức song song tích hợp và bạn cũng có thể sử dụng nhiều máy tính với nhau để chạy chương trình. Nhưng nếu bạn thực sự muốn nhanh chóng, tôi nghĩ bạn vẫn phụ thuộc vào C hoặc Fortran hoặc những thứ điên rồ như thế. Nhưng vẫn còn nhiều thuật toán được thực hiện (nhân ma trận, giải hệ phương trình tuyến tính, v.v.) được tối ưu hóa mạnh mẽ và thực hiện khá tốt. Nhưng nếu bạn lập trình các thuật toán tương tự trong chính Matlab, bạn sẽ phải chờ =) (Một điều thực sự không trực quan khi bạn đến từ các ngôn ngữ khác là nếu bạn vector hóa các hoạt động của mình thay vì sử dụng các vòng lặp, bạn có thể tiết kiệm nhiều thời gian trong Matlab .)

** Bạn có thể sắp xếp các chương trình của mình, nhưng điều đó chủ yếu chuyển đổi mã nguồn thành một tệp không thể đọc được (đối với con người), điều đó không nhanh hơn nhiều khi được thực thi.


1
Tôi gặp vấn đề này rất thường xuyên ... thiết lập imột cái gì đó và sau đó gặp phải hành vi không mong muốn khi nó không phải là đơn vị phức tạp.
frageum

3
Trứng Phục sinh đẹp! Nếu bạn gõ 'chỉnh sửa gián điệp', bạn sẽ tìm thấy một ví dụ về mã obfuscation :-)
Abulafia

1
Tôi đã đi đến upvote này và sau đó nhận ra tôi đã có. Than ôi, nếu tôi có thể nâng cấp nó một lần nữa. Hãy tiếp tục, @flawr!
Alex A.

2
Nếu bạn đang cạn kiệt cảm hứng về những thứ cần thể hiện, tôi có thể giới thiệu blog Mathworks: On the Art of MATLAB của Loren Vershure Thường thì họ mô tả các thực tiễn tốt nhất có thể được hiển thị trong giới hạn ký tự. Đối với sự tò mò, hãy xem xét Abandon Matlab , và đối với các chức năng và tính năng không có giấy tờ, bạn có thể truy cập Matlab không có giấy tờ của Yair Altman
Dennis Jaheruddin

1
@flawr - Đối với factoid, cũng có thể rất tuyệt khi đề cập đến thực tế là trong lịch sử, MATLAB ban đầu được tạo ra cho các sinh viên Khoa học Máy tính tại Đại học New Mexico (lúc đó, Cleve Moler là chủ tịch dễ dàng) LINPACKEISPACK (... hiện đang được thay thế bởi LAPACK ) mà không cần phải học FORTRAN .... và vì dễ sử dụng, nó đã lan sang các tổ chức học thuật khác rất nhanh :)
rayryeng

35

Camam

Hãy thử các đoạn dưới đây tại đây

Độ dài 20 đoạn:

q~{]__~z\z<=\~*0>*}*

Một máy tính min-mod . Một đoạn trích từ câu hỏi:

Hàm minmod là một biến thể của min quen thuộc , xuất hiện trong các sơ đồ độ phân giải cao giới hạn độ dốc cho các phương trình vi phân từng phần. Cho một số độ dốc, nó chọn ra độ dốc bằng phẳng nhất, trong khi chăm sóc các dấu hiệu tương đối giữa các sườn.

Hàm lấy một số lượng tham số tùy ý. Sau đó minmod (x 1 , x 2 , ..., x n ) được định nghĩa là:

  • min (x 1 , x 2 , ..., x n ) , nếu tất cả x i đều dương
  • max (x 1 , x 2 , ..., x n ) , nếu tất cả x i đều âm
  • 0 , nếu không.

Độ dài 18 đoạn:

l'[,65>Dm>_el+_$er

Một bộ mã hóa ROT13. Chỉ chuyển các a-zA-Zký tự từ chuỗi đầu vào qua STDIN

Độ dài 15 đoạn:

T1{_2$+}ri2-*]p

Một chương trình đầy đủ để in các Nsố đầu tiên từ chuỗi Fibonacci, nơi Nđược cung cấp dưới dạng đầu vào thông qua STDIN.

Độ dài 12 đoạn:

{{_@\%}h;}:G

Một hàm GCD đơn giản. Điều này có thể được sử dụng như 2706 410 Gđể có được GCD trên ngăn xếp.

Độ dài 11 đoạn:

123456 789#

#là nhà điều hành điện. Đoạn mã này cho thấy một tính năng thú vị của CJam là nó hỗ trợ BigInt cho hầu hết các hoạt động toán học. Vì vậy, đầu ra của mã trên là

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

Độ dài 10 đoạn:

"`%W_"_W%`

Chúng tôi đã thực hiện xong, hãy đảo ngược nó!. Đây là một trong những câu hỏi ngược ngắn nhất trong CJam. Reverse quine là một quine in mã nguồn của nó theo thứ tự ngược lại.

Độ dài 9 đoạn:

5,K,+_&S*

Đoạn trích này giới thiệu rất nhiều tính năng của CJam,

5, "create an array of numbers 0 to 4"
K, "create an array of numbers 0 to 19"
+  "List concatination"
_  "Duplicate top stack element"
&  "Set distinct operator in this case"
S* "Join array elements with space character"

Độ dài 8 đoạn:

"`_~"`_~

Một trong những nhiệm vụ nhỏ nhất có thể có ở CJam. Đây là một câu hỏi thực sự theo nghĩa là nó không thực sự đọc mã nguồn theo bất kỳ cách nào. (Đọc mã nguồn thậm chí không thể có trong CJam)

Độ dài 7 đoạn:

"AB"_m*

m*tạo ra tất cả các sản phẩm của Cartesian của hai yếu tố ngăn xếp hàng đầu. Ví dụ, đoạn mã trên sẽ được đặt ["AA" "AB" "BA" "BB"]vào stack, là sản phẩm của cartesian "AB""AB".

Độ dài 6 đoạn:

"_~"_~

Một mã đẹp mắt lặp đi lặp lại. KHÔNG chạy cái này :). Sự thể hiện mã này là cơ sở cho quine đơn giản nhất trong CJam. Bạn đặt chuỗi "_~"lên ngăn xếp, tạo một bản sao ( _) và đánh giá nó. Lần lượt thực hiện lại điều tương tự (và một lần nữa ..) cho đến khi bạn đạt được ngoại lệ đệ quy tối đa.

Độ dài 5 đoạn:

{A}:F

Đây là cách một hàm cơ bản hoạt động trong CJam, Biểu thức trên gán khối mã {A}cho biến F. Bây giờ trong mã của bạn, bạn có thể đặt Fbất cứ nơi nào để chạy khối mã (và nhận10 trong trường hợp này)

Độ dài 4 đoạn:

"A"~

Bạn có thể đánh giá bất kỳ khối mã hoặc chuỗi hoặc thậm chí một ký tự bằng cách sử dụng ~. Biểu thức trên cho kết quả10

Độ dài 3 đoạn:

Kmr

Một trình tạo số ngẫu nhiên điển hình từ phạm vi 0 đến Ktức là 20.

Độ dài 2 đoạn:

es

Điều này đưa ra dấu thời gian hiện tại (mili giây từ kỷ nguyên). CJam cũng có etgiờ địa phương theo định dạng có thể sử dụng hơn, trả về một mảng bao gồm các phần khác nhau của thời gian hiện tại (ngày, giờ, v.v.).

Độ dài 1 đoạn:

A

CJam có hầu hết tất cả các bảng chữ cái viết hoa dưới dạng các biến được xác định trước. Alà 10, Blà 11 và đến K20. Ppi (3.141592653589793), Nlà dòng mới và nhiều dòng khác . Chúng có thể rất tiện lợi khi bạn cần các giá trị ban đầu trong các biến hoặc thậm chí khi bạn cần số có hai chữ số trong 1 byte.

Factoid

CJam được truyền cảm hứng bởi GolfScript nhưng xây dựng rất nhiều tính năng trên đầu trang, bao gồm hỗ trợ cho một cuộc gọi NHẬN: D

Tái bút: Tôi sẽ cố gắng cập nhật câu trả lời cứ sau 5 lần upvote hoặc cứ sau 2 giờ (mà trước đó là sớm hơn)


Có một số vấn đề với ví dụ ROT13 của bạn: p Nhưng tôi rất ấn tượng với câu hỏi này, tôi nghĩ tôi sẽ mượn nó :)
aditsu

@aditsu vấn đề là gì?
Tối ưu hóa

Nó thay đổi trường hợp của các chữ cái nz. Ngoài ra, nó có @ mà không có lý do, bạn có thể đặt D ở đó.
aditsu

@aditsu Khá chắc chắn rằng ROT 13 của nó trên phạm vi a-zA-Z và đó là lý do để thay đổi trường hợp. Bạn không thể đọc nó? Tôi đoán ngôn ngữ của riêng bạn: P @ có 18 ký tự tôi đoán: D
Trình tối ưu hóa

Đó không phải là những gì ROT13 thường làm. Tôi không hiểu tại sao bạn hỏi tôi có thể đọc ngôn ngữ của mình không, vấn đề không nằm ở việc hiểu chương trình làm gì, mà là thực tế là nó không làm được những gì mong đợi.
aditsu

34

Lisp thường gặp

Lisp (từ LISt Treatment) là một trong những ngôn ngữ lâu đời nhất vẫn được sử dụng cho đến ngày nay (chỉ FORTRAN cũ hơn). Điều đáng chú ý là ngôn ngữ đầu tiên có mã là dữ liệu và dữ liệu là mã; gọi là đồng âm. Đó cũng là ngôn ngữ đầu tiên có bộ sưu tập rác. Được thiết kế ban đầu bởi John McCarthy trong một bài báo năm 1958 như một ngôn ngữ hoàn toàn lý thuyết, nó đã trở thành một ngôn ngữ thực sự khi Steve Russel nhận ra rằng chức năng eval có thể được thực hiện trên máy tính. Nó phổ biến nhất trong Trí tuệ nhân tạo và có thể nhận ra ngay lập tức từ tính ưu việt của dấu ngoặc đơn. Lisp chung được thiết kế để hợp nhất nhiều phương ngữ Lisp cũ thành một dạng chuẩn hơn.

Tôi sẽ cố gắng để mọi đoạn mã có thể tự chạy được, mặc dù không nhất thiết phải làm bất cứ điều gì có giá trị. Ngoài ra, vì tôi đang sử dụng Common Lisp, các khái niệm cơ bản và rất nhiều cú pháp được áp dụng trong các phương ngữ khác, nhưng một số chức năng nhất định sẽ không hoạt động, giả sử, Scheme.

Độ dài 1

*

Do sự nhấn mạnh vào việc sử dụng Biểu thức S và danh sách để mã hóa, có rất ít biểu thức hợp lệ trong Lisp không chứa dấu ngoặc đơn, được gọi là nguyên tử. Bất cứ điều gì gõ trực tiếp vào REPL (vòng lặp đọc-in) được coi là một biến và được đánh giá như vậy. *giữ giá trị trước đó được in bởi REPL.

Độ dài 2

()

Đây là danh sách trống, một trong những biểu tượng quan trọng nhất trong Lisp. Mỗi danh sách thích hợp trong Lisp được kết thúc bằng một danh sách trống, tương tự như cách mọi chuỗi thích hợp trong C kết thúc bằng \0.

Chiều dài 3

(*)

Đây là một lời gọi hàm cơ bản, bao gồm một biểu tượng được gói trong ngoặc đơn. Lisp không chứa toán tử, chúng chỉ là các chức năng. Tôi đã chọn phép nhân đặc biệt bởi vì nó không thực sự là một hàm nhị phân; toán tử nhân trong Lisp có số lượng đối số không xác định. Nếu nó được đưa ra không có đối số mà nó trả về 1, toán tử nhận dạng để nhân.

Độ dài 4

`(1)

Đây là một tế bào khuyết điểm, chỉ là một cách khác để nói nó là một cặp yếu tố. Trong Lisp, mỗi danh sách bao gồm các ô cons được kết nối với các ô cons, trong đó phần tử đầu tiên (the car) là giá trị và phần tử thứ hai (the cdr) trỏ đến ô cons tiếp theo. Điều này tạo thành cơ sở của Lisp dựa trên các danh sách được liên kết. Tế bào khuyết điểm đặc biệt này có 1như chiếc xe và danh sách trống như cdr của nó.

Độ dài 7

(not t)

Tôi muốn chạm vào các giá trị thật trong Lisp. Điều này sẽ trở lại nil. Trong Common Lisp, tlà biểu tượng cho true trong khi nil()đại diện cho false và bằng nhau, nhưng lưu ý rằng định nghĩa này không phải là tiêu chuẩn cho tất cả các phương ngữ Lisp; Lược đồ, ví dụ, phân biệt giữa #fcho sai và '()cho danh sách trống.

Độ dài 9

(cdr ())

Như tôi đã nói trước đây, cdr là phần tử đuôi của danh sách, mà bạn có thể nhận được với hàm cdr. Tương tự như vậy, bạn có thể có được các yếu tố đầu, chiếc xe, với chức năng car. Khá đơn giản phải không? Xe và cdr của danh sách trống là cả hai nil.

Độ dài 10

(cons 1 2)

Cuối cùng, đủ độ dài để bắt đầu làm việc với danh sách. constạo một ô khuyết với tham số đầu tiên là ô tô và ô thứ hai là cdr. Nhưng thay vì in ra (1 2), nó cho (1 . 2). Quay trở lại đoạn trích dài 2, một danh sách thích hợp được cho là kết thúc với danh sách trống, do đó, cdr của ô khuyết điểm cuối cùng sẽ trỏ đến danh sách trống. Trong trường hợp này, ô khuyết điểm cuối cùng trỏ đến 2, vì vậy Lisp thông báo cho chúng tôi rằng chúng tôi có một danh sách không phù hợp, nhưng vẫn cho phép chúng tôi làm điều đó, như cách bạn có thể tạo chuỗi C mà không cần a \0.

Dài 11

(cons 1 ())

Bây giờ chúng tôi đã tạo danh sách đầu tiên hình thành đúng của chúng tôi. Đó là một tế bào khuyết điểm duy nhất với một chiếc xe hơi 1và một cdr (). Bạn sẽ nhận thấy rằng đối với mọi danh sách khác, tôi dẫn nó với một backquote / tick; bất kỳ danh sách phù hợp nào khác sẽ cố gắng đánh giá đối số đầu tiên của nó là một hàm với các phần tử còn lại làm tham số. Nói đúng ra, ()đây không phải là một danh sách; đó là một biểu tượng bao gồm a (và a )đại diện cho danh sách trống. Lisp cho phép bạn sử dụng hầu hết mọi ký tự có thể in trong tên biểu tượng và sẽ cho phép bạn xác định lại bất kỳ ký hiệu nào bạn muốn.

Dài 12

(cdr `(1 2))

Điều này sẽ đầu ra (2), không 2như một số người đoán. Hãy nhớ rằng, mỗi cdr được cho là trỏ đến một ô khuyết điểm khác hoặc danh sách trống; rõ ràng 2không phải là danh sách trống, vì vậy nó phải là một khuyết điểm khác của một chiếc xe 2và một cdr ().

Độ dài 13

'#1=(1 . #1#)

Điều này sẽ tạo ra một danh sách vòng tròn chỉ với một giá trị duy nhất 1. Nếu được in, nó sẽ in ra (1 1 1 1 ... Nhẫn mãi mãi, để trong thực tế, nó có thể được coi là một danh sách vô hạn (trên đó bạn có thể thực hiện cdrvô số lần để luôn luôn có cùng một kết quả!). Trừ khi người ta gán Tcho biến toàn cục *print-circle*, trong trường hợp đó, nó sẽ được in dưới dạng #1=(1 . #1#).


Đó là chỉnh sửa cuối cùng! Rất nhanh, ai đó tạo ra một esolang theo chủ đề Beatles: D
fede s.

1
@fedes. John McCarthy, Paul McCartney ... ngôn ngữ sẽ được gọi là CarthyCartney.
con mèo

33

GNU Make

Tôi sẽ đi ra ngoài trên chi này. Tôi nghĩ rằng đây có thể là lần đầu tiên makeđược đưa vào PPCG.

Factoid

Make có thể được coi là một ngôn ngữ chức năng.

Độ dài 0 đoạn

Tôi không nghĩ độ dài 0 đoạn là bắt buộc, nhưng dù sao đây cũng là một đoạn. Tôi nghĩ rằng đây có thể là hữu ích nhất trong tất cả các chương trình độ dài 0. Với một Makefile trống (hoặc thậm chí không có Makefile nào cả), make vẫn có một loạt các quy tắc tích hợp. Ví dụ: có các quy tắc dựng sẵn mặc định để biên dịch tệp .c thành .o hoặc nhị phân, với tệp .c tồn tại trong thư mục hiện tại. Vì vậy, nếu chúng ta làm:

make hello.o

thực hiện sẽ tìm quy tắc .c thành .o và biên dịch hello.c để cung cấp hello.o

Tương tự như vậy nếu chúng ta làm:

make goodbye

Nếu có một tệp goodbye.c trong thư mục hiện tại, nó sẽ được biên dịch thành tệp nhị phân tạm biệt.

Độ dài 1 đoạn

TAB

Vâng, nhân vật TAB. Mặc dù điều này không tự làm được gì nhiều, nhưng nó có ý nghĩa rất lớn trong Make. Cụ thể tất cả các dòng công thức theo định nghĩa đích trong quy tắc PHẢI bắt đầu bằng TAB. Điều này gây ra tất cả các loại thất vọng khi gỡ lỗi makefiles khi TAB và dấu cách bị trộn lẫn.

Độ dài 2 đoạn

$@

Đây là một biến tự động để sử dụng trong công thức nấu ăn. Nó sẽ mở rộng thành tên tệp của mục tiêu của quy tắc. Có các biến tự động hữu ích khác .

Độ dài 3 đoạn

a:=

Ngắn nhất chỉ đơn giản là mở rộng biến gán. Biến a được đặt thành "" ngay lập tức khi Makefile được phân tích cú pháp đầu tiên. Nếu thay vào đó chúng ta làm a=, thì phép gán được mở rộng đệ quy, tức là mở rộng được hoãn lại cho đến khi biến thực sự được tham chiếu.

Độ dài 4 đoạn

W:;w

Đặc điểm kỹ thuật quy tắc hoàn chỉnh ngắn nhất hữu ích. Điều này xác định một mục tiêu Wvới một quy tắc chỉ đơn giản là chạy wlệnh shell. Do vậy

make W

tương đương với:

w

Đây là một cú pháp quy tắc thay thế trong đó công thức theo sau mục tiêu trên cùng một dòng được phân tách bằng một dòng mới. Thông thường hơn các dòng công thức ngay lập tức theo một dòng đích riêng biệt, vớiTAB ký tự bắt đầu mỗi dòng công thức.

Độ dài 5 đoạn

$(@D)

Một biến tự động khác. Tương tự $@, nhưng điều này mở rộng đến phần thư mục của đường dẫn, với tên tệp và dấu / loại bỏ.


Có thể một số hàm chuỗi như $(basename )hay $(patsubst )? ( ví dụ. )
luser droog

32

Tuyệt vời

Độ dài 14 đoạn

}0}1
Mulx
HxHx

Đoạn trích này cho thấy thêm một số thư viện của Marbelous và giới thiệu một khái niệm mới, cụ thể là các bảng đa ô. Bảng Mulxlấy hai viên bi làm đầu vào và đầu ra 2 viên bi. Các viên bi vào ô ngoài cùng bên trái Mulxsẽ tương ứng với các }0thiết bị trong bảng đó và ô ngoài cùng bên phải }1. Tương tự, đầu ra cũng sẽ ra khỏi các ô khác nhau. Chiều rộng của một bảng có thể được tính làMAX(1, highest output device + 1, highest input device + 1) các ô không tương ứng với thiết bị đầu vào sẽ bỏ đi bất kỳ viên bi nào rơi vào chúng.

Độ dài 13 đoạn

7E
??
>Y!!
{0

Đây là một bảng sẽ nhổ một ký tự ascii có thể in ngẫu nhiên trên mỗi đánh dấu. Marbelous có hai cách tạo ra các giá trị ngẫu nhiên. Có ??giá trị trả về ngẫu nhiên giữa 0 và đá cẩm thạch đầu vào mà nó nhận được, bao gồm và ?n:?0 lên đến ?Ztương ứng. Mà hành động rất giống với ??. Chúng tôi cũng có thể !!chấm dứt hội đồng ngay cả khi không phải tất cả các đầu ra đều được lấp đầy. Bạn có thể tìm ra làm thế nào các ?nthiết bị có thể được thực hiện như các bảng trong Marbelous bằng cách sử dụng ???

Độ dài 12 đoạn

}0}1
Fb//
Dp

Ở đây chúng ta thấy một vài chức năng thư viện của Marbelous đang hoạt động. Fbxuất ra số thứ n Wikipedia trong đó n là đá cẩm thạch đầu vào. Dpin đá cẩm thạch đầu vào thành STDOUT dưới dạng số thập phân. Cả hai đều được triển khai trong Marbelous và có thể được gọi khi bạn kiểm tra bao gồm các thư viện trong trình thông dịch trực tuyến , đối với trình thông dịch python, bạn phải bao gồm rõ ràng từng tệp. Việc thực hiện các bảng này có thể được tìm thấy trên github . Lưu ý rằng chương trình cụ thể này có 2 đầu vào và sẽ gọi bảng Fibonacci hai lần. Các bảng được gọi là trả lại trong vòng một tích tắc của bảng đã gọi chúng.

Độ dài 11 đoạn

}0}0
{<{0{>

Điều này cần một số lời giải thích. Các }0thiết bị là số liệu, vì chúng có cùng số (0), chúng sẽ chứa cùng một giá trị khi bảng này được gọi. Ba thiết bị ở hàng dưới là đầu ra. {<kết quả đầu ra bên trái của hội đồng quản trị, {0kết quả đầu ra bên dưới ô đầu tiên của hội đồng quản trị và {>kết quả đầu ra bên phải. Đầu ra chỉ được đẩy khi tất cả các thiết bị đầu ra riêng biệt được lấp đầy. Tuy nhiên, trong trường hợp này, thiết bị đầu ra bên phải không bao giờ đạt được. Bảng sẽ thoát vì thiếu hoạt động và xuất ra hai giá trị mà nó có. Bạn có thể tưởng tượng làm thế nào một người có thể thực hiện /\như một bảng tin?

Độ dài 10 đoạn

..40
FF
\\

Có một vài điều đóng vai trò quan trọng trong Marbelous ở đây. Đầu tiên, có sự bổ sung. Nếu bạn theo dõi đường đi của hai viên bi trên bảng, bạn sẽ nhận thấy rằng chúng sẽ kết thúc trên cùng một ô cùng một lúc. Khi điều này xảy ra, chúng sẽ được thêm vào với nhau. (thực tế thú vị: tại một số điểm nó được coi là thay vì được bổ sung với nhau, các viên bi nên hình thành một chồng) Tuy nhiên, Marbelous là một ngôn ngữ 8 bit, Vì vậy, thêm một bằng đá cẩm thạch để FFtương đương với trừ 1 từ nó.

Độ dài 9 đoạn

00
\\/\]]

Đây là cách ngắn nhất để thực hiện một phiên bản mèo thô sơ trong Marbelous. 00 \ / \ Là một vòng lặp đặt một viên 00bi giá trị lên]] thiết bị mỗi giây. Đây là một thiết bị STDIN. Khi một viên bi rơi xuống thiết bị này, nó sẽ cố đọc ký tự đầu tiên từ STDIN, nếu có một ký tự, nó sẽ bị đẩy xuống (và trong trường hợp này được in lại). Nếu không có, Amrble ban đầu sẽ bị đẩy sang phải. (và trong trường hợp này là thùng rác)

Độ dài 8 đoạn

}0
~~
{0

Đoạn trích này cho thấy một vài tính năng. Đầu tiên, nó nhận đầu vào thông qua} 0. Trong trường hợp này, đây là Bảng chính và nó sẽ được thay thế bằng đầu vào dòng lệnh. Bạn cũng có thể gọi hàm này, trong trường hợp đó, đối số sẽ được lấy thay vì đầu vào dòng lệnh. Sau đó ~~, có một toán tử bitwise không. Sau đó, chúng tôi nhận được }0, Nếu tất cả các }nthiết bị được lấp đầy, các giá trị này được trả về dưới dạng các giá trị trả về của hàm. (Marbelous hỗ trợ nhiều hơn một giá trị trả về cho mỗi hàm)

Độ dài 7 đoạn

00
\\/\

Đây là vòng lặp vô hạn nhỏ gọn nhất mà bạn có thể tạo trong Marbelous. Thiết \\bị đẩy bất kỳ viên bi nào sang phải, /\sao chép một viên bi và đẩy một bản sao sang trái và một bản khác sang phải. Vì bảng chỉ rộng hai ô, đá cẩm thạch bên phải bị vứt đi.

Độ dài 6 đoạn

46MB75

Đây là một ví dụ về đệ quy, MB(bảng chính được đặt tên ngầm được gọi trên mỗi đánh dấu, nhưng không phải trước khi In Futhành STDOUT trên mỗi cuộc gọi. (Kết quả như sau: FuFuFuFuFuFu...Điều này rõ ràng tràn qua cuộc gọi.

Độ dài 5 đoạn

2A
++

Một số số học, Đá cẩm thạch với giá trị 2Arơi xuống trên dấu đầu tiên và tìm thấy chính nó trên ++tế bào. Đây là một nhà điều hành. Toán tử đặc biệt này làm tăng bất kỳ viên bi nào rơi xuống nó và để nó rơi xuống. Đá cẩm thạch bây giờ có giá trị 2Bvà rơi ra khỏi bảng. Điều này in +ra STDOUT.

Độ dài 4 đoạn

:
24

Hai thông dịch viên không đồng ý ở đây, tôi đã đặt cho bảng đầu tiên của tệp một ví dụ trong ví dụ này (Tên là một chuỗi trống). Trình thông dịch python giả định đây là Bảng chính và gọi bảng này khi chạy chương trình (in ra $). Trình thông dịch javascript không tìm thấy Bảng chính và do đó không có điểm vào. Điều này có thể hữu ích khi viết một tệp thư viện cho Marbelous.

Độ dài 3 đoạn

:Bo

Đây là một bảng có tên, không có thân, chúng ta có thể gọi bảng này bằng cách Viết Botrong một ô của bất kỳ bảng nào (bao gồm cả Bochính nó)

Độ dài 2 đoạn

3A

Mã này là phần thân của một ô 1x1 (mỗi ô rộng hai ký tự), được đặt tên ngầm định MB(cho Bảng chính). Nó in giá trị ascii của giá trị thập lục phân 3Akhi đá cẩm thạch rơi ra khỏi bảng. Đầu ra của chương trình này chỉ là mã nguồn của:

Độ dài 1 đoạn

:

Cùng với #, đây là một trong hai chương trình 1 nhân vật hợp lệ duy nhất trong sự kỳ diệu. #là một chỉ số của một nhận xét mà không thú vị lắm. :nói với niềm tin rằng bạn sắp tuyên bố một bảng. Cả hai trình biên dịch đều quan tâm rằng bạn không thực sự đặt tên hoặc định nghĩa bảng. Chương trình không làm gì cả.

thực tế:

Marbelous được phát triển bởi những người trên trang web này, một số tên đang chạy theo ngôn ngữ này là Rube và chỉ đơn giản là viên bi .


2
đánh tôi với nó đoạn trích hay!
Sparr

đoạn trích dài 12 của bạn dường như có hai đầu vào và in ra hai số khác nhau của Wikipedia. đó là cố ý?
Sparr

@Sparr, vâng, đó là để giới thiệu cách các chức năng hoạt động trong Marbelous một chút.
overactor

có thể thêm vào đó để giải thích? từ những gì bạn đã viết, tôi hy vọng đoạn trích sẽ lấy một đầu vào và đầu ra một số sợi.
Sparr

Tôi thực sự hy vọng bạn đạt được 40 điểm để chức năng MySpace của tôi sẽ phù hợp ...
Sparr

31

Forth

Forth chỉ có hai loại, ints và float (và float là tùy chọn!) Nhưng nó vẫn quản lý để có ký tự, chuỗi, ints dài, con trỏ, con trỏ hàm, structs, v.v. đó là tất cả trong cách bạn sử dụng nó!

Độ dài 1

.

Các .lệnh (hoặc "từ" như chúng tôi gọi nó) in ra giá trị số nguyên trên đầu trang của các dữ liệu ngăn xếp; nếu ngăn xếp trống, bạn sẽ gặp lỗi thời gian chạy. Nó cũng loại bỏ giá trị khỏi ngăn xếp - upvote để xem làm thế nào chúng ta có thể giữ nó!

Độ dài 2

.s

Các .schữ sẽ hiển thị các giá trị hiện trên stack, mà không loại bỏ bất kỳ trong số họ. Nó cũng hiển thị tổng số giá trị. Trong Gforth,.s theo mặc định bị giới hạn chỉ hiển thị 9 giá trị hàng đầu; có lẽ chúng ta sẽ tìm hiểu làm thế nào để hiển thị nhiều hơn?

Chiều dài 3

see

Nhập seetheo sau bởi bất kỳ từ Forth nào để xem mã nguồn của từ đó. Hầu hết các từ Forth được định nghĩa trong chính Forth và chỉ một vài từ nguyên thủy được định nghĩa trong lắp ráp.

Độ dài 4

1 0=

Tôi đã đề cập rằng Forth là một ngôn ngữ dựa trên ngăn xếp với các toán tử postfix? Gõ 1 0=đẩy 1vào ngăn xếp và sau đó thực thi 0=từ, bật giá trị hàng đầu ra khỏi ngăn xếp và đẩy truenếu nó bằng 0, falsenếu không. 0=là một từ thuận tiện cho 0 =; có một số từ viết tắt giống như nó cho giá trị chung + kết hợp từ, thích 1+0<>. Hơn nữa, trong khi falsetrong Forth là 0 và bất kỳ giá trị khác nào là đúng, các từ kiểm tra tích hợp sẽ trả về truekết quả đúng và trueđi theo mọi cách - đó là giá trị với tất cả các bit được đặt, tức là -1!

Độ dài 5

-1 u.

Nhấn -1vào ngăn xếp, sau đó bật nó ra và in dưới dạng một số nguyên không dấu. Điều này có thể được sử dụng để nhanh chóng thấy giá trị tối đa cho một số nguyên không dấu trên phiên bản Forth của bạn (nhưng không phải là giá trị tích phân tối đa mà nó vốn hỗ trợ!). Bạn có thể hỏi, "Làm thế nào để chúng ta biết khi nào nên in int .và khi u.nào?" Trả lời: .khi nó được ký, u.khi không dấu. "Đó không phải là ý tôi," bạn nói. "Làm thế nào để chúng ta biết khi nào giá trị trên cùng của ngăn xếp được ký và khi nào nó không được ký?" Trả lời: Bạn là lập trình viên - đó là công việc của bạn! Bạn phải biết liệu mỗi số nguyên trên ngăn xếp có đại diện cho một int, một số nguyên không dấu, một int*, mộtchar*, một con trỏ hàm, hoặc khác, hoặc người nào khác bạn nhận được quỷ trong mũi của bạn. Forth sẽ không theo dõi điều đó cho bạn; đây là gì

Độ dài 6

." Hi"

In Hi. ."là một từ Forth (giống như tất cả các từ Forth, phải được theo sau bởi khoảng trắng hoặc EOF) đọc luồng đầu vào lên qua tiếp theo "và in ra bất kỳ byte nào ở giữa. Nếu bạn đặt nhiều hơn một khoảng trắng sau." , tất cả trừ khoảng trắng ngay sau dấu ."sẽ được in. Trình tự thoát không được hỗ trợ (vì vậy bạn không thể in một chuỗi có "trong đó ."), nhưng Gforth thêm .\"vào ngôn ngữ hỗ trợ chúng.

Độ dài 7

: + - ;

Bạn xác định các từ của riêng bạn trong Forth bằng cách viết dấu hai chấm, tên của từ, các từ mà bạn muốn từ của bạn thực thi và dấu chấm phẩy. Một từ có thể là bất kỳ chuỗi ký tự không phải khoảng trắng nào (khoảng trắng là cách Forth cho biết nơi một từ kết thúc và một từ khác bắt đầu, sau tất cả), thậm chí cả dấu câu và thậm chí là các toán tử (rốt cuộc chỉ là các từ). Đoạn trích trên xác định lại+ để có nghĩa là -, vì vậy bây giờ bất cứ khi nào bạn cố gắng thêm, bạn trừ đi để thay thế. Bất kỳ từ nào tồn tại trước đó +đều không bị ảnh hưởng, vì chúng lưu trữ một tham chiếu đến định nghĩa ban đầu của +.

Lưu ý: Một số từ thực hiện những điều khác nhau bên trong định nghĩa của các từ khác so với bên ngoài, nhưng ngoài các cấu trúc điều khiển, tất cả chúng đều khá bí truyền. Hầu hết các từ đều làm điều tương tự bên trong một định nghĩa như bên ngoài, nhưng đôi khi điều đó không rõ ràng - : show-see see see ;sẽ không làm những gì bạn nghĩ!

Dài 8

: 42 - ;

Khi tôi nói một từ có thể là bất kỳ chuỗi ký tự khoảng trắng nào, tôi có nghĩa là bất kỳ chuỗi nào . Không, Forth không có một từ cho mỗi số riêng lẻ; số chỉ là một chút đặc biệt. Khi Forth gặp một chuỗi không phải khoảng trắng, đầu tiên nó sẽ thấy nếu đó là một từ đã biết; nếu không, nó cố phân tích nó thành một số; Nếu thất bại, chỉ sau đó bạn nhận được một lỗi. Xác định một từ được đánh vần giống như một số có nghĩa là bạn sẽ không thể nhập chính tả của số đó nữa mà không nhận được từ đó, nhưng Gforth và nhiều Forth khác cung cấp cho bạn nhiều cách để đánh vần các số .

Độ dài 9

IF 1 THEN

Cuối cùng , một cái gì đó quen thuộc! Rõ ràng, mã này kiểm tra xem đối số của nó 1có đúng không và nếu có, thực thi bất cứ điều gì sau đó THEN, phải không? Sai lầm. Khi thực thi đạt đến IFgiá trị, giá trị trên cùng của ngăn xếp được bật ra và nếu giá trị đó là đúng (nghĩa là khác không), thì việc thực thi tiếp tục với bất cứ điều gì bên trong IF ... THENvà sau đó là bất cứ điều gì sau THEN; nếu giá trị bằng 0, chúng ta chỉ cần bỏ qua thẳng đến sau THEN. Lưu ý rằng, do cách các từ này được triển khai trong nội bộ (nghĩa là các từ Forth khác!) IFTHENchỉ có thể được sử dụng trong một định nghĩa từ, không phải trong "trạng thái diễn giải".

Dài 12

( x y -- y )

Đây là một bình luận. Nó đi từ (cái tiếp theo )ngay sau nó. (Trong trình thông dịch, một dòng mới cũng có thể kết thúc nó.) Đây không phải là "tích hợp" theo cú pháp của Forth (Có gì không?); (chỉ là một từ khác, một từ loại bỏ tất cả mọi thứ trong luồng đầu vào thông qua tiếp theo ). (Đúng vậy - Forth có thể điều khiển cách đọc mã nguồn của nó. Perl không phải là ngôn ngữ duy nhất không thể được phân tích cú pháp mà không thực hiện nó!) Vì đó là một từ, bạn phải theo dõi nó bằng một khoảng trắng, nếu không Forth sẽ phàn nàn rằng (xkhông định nghĩa được. Chúng tôi cũng có thể xác định lại (như là một phần của chiến dịch bắn vào chân mình.

Nội dung bình luận là thú vị hơn, tuy nhiên. Nhận xét này chỉ định hiệu ứng ngăn xếp cho một số từ; phần bên trái của --danh sách những gì nên ở trên cùng của ngăn xếp trước khi bạn chạy từ (phần trên cùng bên phải) và bên phải của --mô tả phần trên cùng của ngăn xếp sẽ như thế nào (một lần nữa , trên cùng là bên phải). Quy ước chung là thêm một nhận xét như vậy vào nguồn của bất kỳ từ nào bạn xác định, ngay sau : namebit, và cũng có một quy ước rất mạnh về việc đặt tên các thành phần ngăn xếp để chỉ ra loại của chúng thậm chí theo tiêu chuẩn .

Ngẫu nhiên, hiệu ứng ngăn xếp hiển thị là cho niptừ. Bạn sẽ có thể nói những gì nó làm chỉ từ nhận xét.

Độ dài 13

1 2 3 4 d+ d.

Như đã chỉ ra trước đây, loại giá trị Forth hoàn toàn nằm ở cách bạn sử dụng nó - nếu bạn coi một giá trị là một con trỏ, thì đó là một con trỏ và nếu giá trị đó không phải là một con trỏ tốt , thì đó là lỗi của bạn khi coi nó là một con trỏ. Tuy nhiên, bất kể bạn đang xử lý loại giá trị nào, nó sẽ luôn chiếm một ô trên ngăn xếp dữ liệu; các trường hợp ngoại lệ là tế bào kép hoặc số nguyên có độ chính xác gấp đôi . Đây là các số nguyên được biểu thị bằng hai giá trị trên ngăn xếp, cho phép bạn thực hiện số học với số bit gấp đôi bình thường. Ô có ý nghĩa cao hơn hoặc bit cao hơn được đặt lên trên cùng của ô ít quan trọng hơn hoặc bit thấp hơn, do đó, đó 1 0là biểu diễn của ô kép 10 1là 2 ^ 32 hoặc 2 ^ 64, tùy thuộc vào mức độ lớn của các ô thông thường của Forth của bạn. Đương nhiên, để xử lý một giá trị hai ô như vậy, chúng ta cần sử dụng các từ hoạt động rõ ràng trên các giá trị hai ô; chúng thường chỉ là d(hoặc udkhông dấu) theo sau là tên của từ đơn ô tương ứng: d+để thêm, d<để so sánh, d.để in, v.v.


+1 cho Forth. Tôi đã bắt đầu tìm kiếm những ngôn ngữ chưa được thực hiện. Rất vui khi thấy nó ở đây.
mbomb007

2
Ngoài ra, nếu bạn từng đạt +1675, tôi đã có một hình ảnh ASCII đẹp để xuất ra. : D
mbomb007

31

Bình

Đối với các đoạn tiếp theo, tôi sẽ đăng các giải pháp cho các thử thách golf và liên kết đến vấn đề.

Độ dài 17:

<ussC,cG\_GUQ*zQQ

Tìm các nký tự đầu tiên của chuỗi vô hạn được hình thành bằng cách lặp lại chuỗi đầu vào mãi mãi, sau đó điền vào dấu gạch dưới của nó với chính chuỗi đó, sau đó lặp lại mãi mãi.

Điền vào chỗ trống

Độ dài 14:

#QX=Qhf>FT.:Q2

Đưa ra một danh sách các yếu tố duy nhất, sắp xếp danh sách bằng cách hoán đổi các cặp yếu tố lân cận, in ra tất cả các kết quả trung gian.

Sắp xếp lại một bộ số theo thứ tự

Độ dài 13:

?hu]+HG_UQYQY

Tạo cấu trúc sau : [0, [1, [2, [3]]]].

Trang chủ trên phạm vi danh sách

Độ dài 12:

uxyG*HQjvz2Z

Phép nhân XOR.

Phép nhân XOR

Độ dài 11:

lfqSzST.:wz

Đếm xem có bao nhiêu chuỗi con của từ đầu tiên là đảo chữ của từ thứ hai.

Phát hiện đảo chữ trong Chuỗi gốc

Độ dài 9:

fqJjQT_J2

Tìm cơ sở thấp nhất trong đó đầu vào là một bảng màu.

Palindrom cơ sở thấp nhất

Độ dài 5:

!%lQ1

Kiểm tra xem đầu vào có phải là công suất của 2. Lấy cơ sở nhật ký 2, lấy mod 1 kết quả và lấy logic không.

Kiểm tra xem một số nguyên có phải là lũy thừa 2 không mà không sử dụng các phép toán +, -

Độ dài 4:

sjQ2

Tính trọng lượng hãm của đầu vào bằng cách thêm đại diện cơ sở 2 của đầu vào.

Đếm số lượng trong số nguyên 16 bit không dấu

Độ dài 3:

^G2

^ trên chuỗi, int, đưa ra sản phẩm cartesian của đối số thứ nhất với chính nó n lần, trong đó n là đối số thứ hai.

Trong trường hợp này, vì Glà bảng chữ cái ( abcdefghijklmnopqrstuvwxyz), ^G2cho tất cả 2 chuỗi ký tự, aathông qua zz.

Độ dài 2:

lT

l, trong khi Normaly phục vụ như len(), cũng có thể được sử dụng làm cơ sở nhật ký 2. Vì Tlà biến được khởi tạo 10, nên bản in này3.3219280948873626 , cơ sở nhật ký 2 của 10.

Độ dài 1:

H

Hlà từ điển trống (bảng băm) trong Pyth và là cách duy nhất để có được một từ điển trong Pyth, không sử dụng v(eval) hoặc $(Python bằng chữ).

Factoid:

Pyth không có cấu trúc đa nhân vật ngoài chữ. Ngoài ra, Pyth biên dịch về cơ bản một-một thành Python.


Là factoid của bạn được thêm vào trước khi bạn có lệnh bắt đầu .?
Nữ tu bị rò rỉ

@LeakyNun Có ..
isaacg
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.