Chọn ngôn ngữ để chơi gôn [đóng]


28

Một số lời khuyên cho việc lựa chọn ngôn ngữ phù hợp để chơi golf là gì? Những yếu tố ảnh hưởng đến ngôn ngữ được lựa chọn?

Dưới đây là một số loại vấn đề ví dụ:

  • Các sự cố yêu cầu giải pháp I / O , bàn điều khiển hoặc tệp
  • Các vấn đề yêu cầu phân tích cú pháp
  • Các vấn đề yêu cầu bạn viết giải pháp của bạn dưới dạng định nghĩa hàm
  • Bài toán
  • Vấn đề xử lý số nguyên tố
  • Giải câu đố số
  • Thực hiện các phương pháp số
  • Xử lý chuỗi
  • Xử lý mảng
  • Vấn đề mảng 2D rắc rối
  • Hình học tính toán
  • Đệ quy
  • Đồ họa 2D
  • Đồ họa 3D
  • Âm thanh
  • Mạng / web
  • Tiến trình song song

Đừng chỉ đơn giản nói những điều như "Sử dụng GolfScript | J" vì bạn thích chúng.


Đối với một số vấn đề, đó là hệ thống loại. Ví dụ: nếu bạn cần xử lý các số nguyên lớn hơn 64 bit, bạn muốn các ngôn ngữ được tích hợp (ví dụ: Golfscript, Haskell) thay vì các ngôn ngữ khiến chúng trở nên đắt đỏ (ví dụ Java).
Peter Taylor

Tôi đã biến đây thành một wiki phù hợp với chính sách của chúng tôi về các câu hỏi loại "Mẹo".
dmckee

99 chai là hữu ích nếu bạn cần một ngôn ngữ bắt đầu bằng một chữ cái cụ thể ...
Jesse Millikan

Kudos để ace, trimsty, Thuật toán và hosch250 để giúp làm cho chủ đề này trở thành một tài nguyên tốt hơn. Hãy tiếp tục gửi bài! Đó là một cuộc gọi tiền thưởng khó khăn giữa thuật toán và hosch250, cả hai đã nỗ lực rất nhiều chi tiết, nhưng cuối cùng Herr Shark đã nhận được cái gật đầu dẫn đầu.
Jonathan Van Matre

Chọn bất kỳ ngôn ngữ nào bạn muốn. Đó cũng là một cuộc cạnh tranh trong các ngôn ngữ. Giải pháp độc đáo hơn, thú vị hơn trong nhiều ngôn ngữ là tốt.
Mego

Câu trả lời:


-1

Phụ thuộc vào những gì một người cần, C / C ++ rất nhanh, nhưng bạn phải tự viết mã nhiều công việc hơn. Python và Ruby chậm hơn nhưng mã hóa dễ dàng hơn rất nhiều với các phương thức tích hợp giúp rút ngắn rất nhiều công việc và chúng tự động xử lý các giá trị lớn vô hạn (nếu có RAM). Sử dụng một ngôn ngữ chức năng như Haskell là tuyệt vời cho việc sử dụng chức năng toán học thuần túy nếu người ta có thể đóng khung vấn đề theo cách đó.


2
Là người dùng python chủ yếu, trong Py bạn trả tiền cho sự dễ sử dụng của bạn trong việc đếm số ký tự mặc dù có một số thủ thuật thực sự hack có thể cứu nhân vật. Haskel và Lisp, trong khi vui, có xu hướng chạy lâu hơn Python.
arrdem

Đây có lẽ không nên là câu trả lời được chấp nhận. Mô tả về ngôn ngữ cấp cao và cấp thấp thực sự không liên quan gì đến số lượng ký tự.
Samy Bencherif

Vâng, thật công bằng khi tổ chức một câu trả lời năm 2011 cho một câu hỏi được chỉnh sửa vào ngày 23 tháng 2 năm 2017. Có lẽ chúng ta nên ngừng thay đổi các câu hỏi sau khi nó đã được trả lời?
ewanm89

10

Đặt hai xu của tôi vào các ngôn ngữ lập trình mảng , đặc biệt là JAPL .

K / Kona, Q và Nial cũng thuộc loại này, nhưng nhìn chung chúng có cùng lợi ích và chỉ trích. Sử dụng thận trọng. Tôi sẽ sử dụng các ví dụ J bên dưới, chủ yếu là vì đây là ASCII và do đó dễ gõ - nhớ hơn các ký tự APL được tính là các byte đơn, vì vậy đừng coi đó là vấn đề của bạn với ngôn ngữ là sự lựa chọn cho việc chơi golf.

  • Bài toán
  • Giải câu đố số
  • Thực hiện các phương pháp số
  • Vấn đề mảng 2D rắc rối

Hai ngôn ngữ này rất tốt về ngôn ngữ toán học và thao tác dữ liệu, bởi vì chúng tung các mảng xung quanh mức cao và rất nhiều vòng lặp được thực hiện ngầm , bằng cách nói, ví dụ, thêm mười vào mỗi 3, 4 và 5 ( 10 + 3 4 5) hoặc tổng hợp từng hàng của một mảng ( +/"1 arr- vòng lặp nằm trong "1).

  • Vấn đề xử lý số nguyên tố

Với các vấn đề về số nguyên tố nói riêng, J có các nguyên hàm dựng sẵn nhanh và ngắn, cũng như một số phương ngữ của APL. (Chỉnh sửa: Tôi đang nghĩ về Nars2000, là một phương ngữ và một phần thực hiện hoàn toàn khác nhau. APL không có nội dung nào cho các số nguyên tố.) N-th Prime ( p:), no. các số nguyên tố lên đến ( _1&p:), bao thanh toán ( q:), GCD và LCM ( +.*.), v.v., có rất nhiều ở đó. Tuy nhiên, trong thực tế, câu hỏi thường sẽ chỉ định rằng bạn phải nấu các triển khai chính của mình, vì vậy những điều này không được sử dụng quá nhiều. Vẫn có những cách gọn gàng và lạ mắt để có được những thứ cơ bản bạn cần, nó chỉ trở nên ít hơn một chút cắt và dán.

  • Xử lý chuỗi
  • Xử lý mảng

Xử lý mảng và chuỗi là một chút của một túi hỗn hợp: nếu đó là thứ mà APL / J giỏi hoặc có một thành ngữ nguyên thủy hoặc phổ biến, thì nó gần như tầm thường; nếu đó là một thứ gì đó rất tuần tự và không song song, bạn sẽ có một khoảng thời gian tồi tệ. Bất cứ điều gì ở giữa là trong không khí, mặc dù thông thường họ sẽ phản ứng thuận lợi.

  • Các sự cố yêu cầu giải pháp I / O, bàn điều khiển hoặc tệp
  • Các vấn đề yêu cầu bạn viết giải pháp của bạn dưới dạng định nghĩa hàm

IO thật kỳ lạ. APL có biểu thức nhập một ký tự, nhưng với J, bạn phải dành ít nhất 8 ký tự để đọc số : ".1!:1]1. Đầu ra ít dài dòng hơn một chút, nhưng thực tế bạn vẫn đang nhìn vào 6 hoặc 7 ký tự bị lãng phí. J đặc biệt thực sự thích nó rất nhiều nếu bạn có thể lấy đầu vào làm đối số cho một hàm, thay vì phải tự loay hoay với IO.

Trong thực tế, với J và APL, thông thường giải pháp được viết dưới dạng hàm mà bạn gọi ở bàn điều khiển. Với APL, về cơ bản, bạn có thể chỉ cần đặt tên biến cho các đối số của mình và gói biểu thức bạn đang làm việc trong dấu ngoặc nhọn và gọi nó là một ngày.

Nhưng với J, có một chút chi phí để xác định rõ ràng các chức năng-- 3 :'...'và bạn phải thoát khỏi bất kỳ chuỗi nào bên trong - vì vậy, điều thường được thực hiện là một thứ gọi là lập trình ngầm: bạn lập trình ở cấp độ chức năng, kết hợp nguyên thủy theo cách thức không giống như của Haskell. Điều này có thể vừa là một phước lành vừa là một lời nguyền, bởi vì bạn không cần phải dành quá nhiều nhân vật để nói về lập luận của mình, nhưng thật dễ dàng để chìm đắm trong dấu ngoặc đơn và cuối cùng mất hàng chục nhân vật cố gắng hack giải pháp thông minh và ngắn gọn khác của bạn vào một cái gì đó hoạt động.

  • Các vấn đề cần phân tích cú pháp
  • Hình học tính toán

Tôi không có kinh nghiệm với việc chơi golf những vấn đề đặc biệt này, nhưng tôi sẽ nói điều này: cuối cùng, các ngôn ngữ lập trình mảng rất giỏi trong việc chuyển đổi và biến đổi nhiều dữ liệu theo cùng một cách. Nếu bạn có thể biến vấn đề thành một bài tập về xáo trộn số, bạn có thể biến nó thành vấn đề APL / J, không có mồ hôi.

Điều đó nói rằng, không phải tất cả mọi thứ là một vấn đề APL / J. Không giống như Golfscript, APL và J tình cờ chơi golf, bên cạnh những lợi ích khác của họ;)


Đóng góp xuất sắc! Cảm ơn bạn đã là người đầu tiên vào hồ bơi.
Jonathan Van Matre

4

Tại sao Perl chưa được ca ngợi? Đó là một ngôn ngữ chơi golf tuyệt vời, cho hầu hết mọi thứ, đặc biệt là những thứ liên quan đến chuỗi (regex).

Burlesque tốt cho các chương trình liên quan đến số, trong khi Ruby là tuyệt vời cho thao tác văn bản đơn giản hơn.

Thực sự có một danh sách các ngôn ngữ và điểm đánh gôn ở đây .


Tôi không biết ngồi xổm về Perl, nhưng tôi đồng ý.
ckjbgames

2

Tôi thích sử dụng các ngôn ngữ lập trình tối nghĩa để (cố gắng) hoàn thành công việc.

Dưới đây là mục yêu thích của tôi để biết chi tiết bạn liệt kê:

Các sự cố yêu cầu giải pháp I / O, bàn điều khiển hoặc tệp

Các ngôn ngữ như TI-Basic hoạt động tốt, nhưng tôi thích Ruby hơnputs

Các vấn đề cần phân tích cú pháp

GolfScript chắc chắn sẽ hỗ trợ bạn ở đây

Các vấn đề yêu cầu bạn viết giải pháp của bạn dưới dạng định nghĩa hàm

TI-84 Bảng - cho phép chức năng như Y=ví dụ Y=|X|trả về giá trị tuyệt đối của X

Bài toán

TI-Basic - được tạo cho một máy tính, vì vậy nó bao gồm toán học;)

Vấn đề xử lý số nguyên tố

Không có gì đặc biệt; Mathematica có lẽ là công cụ phù hợp cho công việc

Giải câu đố số

TI-Basic khi nó tự động lặp qua các mảng

Thực hiện các phương pháp số

TI-Basic hoặc Mathicala

Xử lý chuỗi

Python - có một số hàm chuỗi tuyệt vời.

Cho dù bạn nghĩ TI-Basic tốt đến đâu , đừng sử dụng nó cho chuỗi ...

Xử lý mảng

TI-Basic - tự động lặp qua các mảng ; ví dụ: tăng tất cả các giá trị trong mảng -L1+1→L1

Ruby - cũng có các tính năng mảng rất mạnh, và tất nhiên điều !này cũng sẽ giúp nén mã

Vấn đề mảng 2D rắc rối

Ruby hoặc Python hoạt động tốt nhất ở đây, vì TI-Basic không hỗ trợ mảng 2D

Hình học tính toán

TI-Basic có các tính năng hình học và có thể được sử dụng cho hầu hết các phép toán cho đến Giải tích và Đại số tuyến tính


THƯỞNG

Vòng lặp

Hoặc Arduino hoặc Quomplex . Arduino có tích hợp sẵn void loop(){}Quomplex có các vòng lặp vô hạn được chứa trong ngoặc ( [])

Vẽ / GUI

Game Maker Language cócác tính năng vẽ rất mạnh mẽ và TI-Basic cũng là một công cụ thường hữu ích vì hỗ trợ vẽ trên biểu đồ.

Quines

Hoặc HQ9 + hoặc QuomplexHQ9 +Qđầu ra mã nguồn của chương trình và Quomplex sẽ tự động in ra mã nguồn của nó trừ khi *(đầu ra) được quy định hoặc nó tạo ra không có đầu ra, được xác định với#


2

Nếu bạn đang giải một bài toán và bạn không có Mathicala, hãy thử Sage . Nó dựa trên Python, vì vậy nếu bạn đã biết Python, bạn không cần nhiều thời gian để học cú pháp của nó.

Ví dụ:

Nó cũng hữu ích cho việc vẽ đồ thị và giải phương trình (ví dụ: bạn có thể sử dụng solve()hàm trong Sage hoặc nếu bị cấm bởi các quy tắc, nó cho phép thực hiện dễ dàng quy trình Newton Raphson vì nó có diff()chức năng có thể thực hiện phân biệt biểu tượng) .

Ngoài ra, nếu bạn là một lập trình viên Python2, sử dụng Sage có thể cho phép bạn gian lận bằng cách bỏ qua các importcâu lệnh dài . Ví dụ, mathsysđã được nhập theo mặc định. (Lưu ý rằng điều này có thể không hoạt động nếu chương trình Python2 của bạn phụ thuộc vào phép chia số nguyên.)


Thông tin tốt! Cảm ơn đã đóng góp.
Jonathan Van Matre

1

Tôi biết ba ngôn ngữ - Java, C ++ và Python 3. Tôi không biết ngôn ngữ nào ở cấp độ cao, nhưng đây là kinh nghiệm của tôi với chúng.

Java:

Tôi sẽ không bao giờ sử dụng Java để chơi gôn nữa. Phải mất hơn 80 ký tự chỉ để viết Hello World!. Tuy nhiên, nó có điểm mạnh:

Đầu vào yêu cầu tạo ra một Scannerđối tượng. Rất khó để nhập một ký tự đơn. Nó đòi hỏi đặc điểm kỹ thuật của loại bạn đang nhập.
Phân tích cú pháp là đủ đơn giản vì forvòng lặp. forVòng lặp nâng cao là tuyệt vời cho việc này.
Java hỗ trợ các phương thức, nhưng khai báo phương thức khá dài.
Java rất giỏi toán, cũng như tất cả các ngôn ngữ cấp cao khác.
Java rất khó sử dụng khi vấn đề liên quan đến sửa đổi chuỗi. Bạn không thể thực hiện sửa đổi cho một chuỗi hiện có.
Các mảng của Java rất đơn giản để sử dụng.
Java là tốt về đệ quy.
Java bao gồm đồ họa tích hợp. Chúng rất dễ sử dụng.

C ++

C ++ là một ngôn ngữ rất mạnh, nhưng nó hơi dài khi cố gắng chơi golf ở 56 ký tự Hello world!.

Đầu vào và đầu ra rất dễ dàng. Bạn không cần chỉ định loại bạn đang nhập - được thực hiện tự động. Tuy nhiên, bạn phải bao gồm thư viện iostream.
Phân tích cú pháp rất dễ dàng.
Chức năng khai báo là đơn giản, nhưng ăn rất nhiều nhân vật quan trọng. C ++ vượt trội về toán học, nhưng nó không bao gồm PI hoặc E, như Java.
Chuỗi của C ++ rất dễ sử dụng và thay đổi khi cần.
Tôi sử dụng vectors nếu có thể thay vì arrays, nhưng cả hai đều dễ sử dụng.
C ++ rất tốt trong đệ quy.
C ++ không bao gồm đồ họa tích hợp.

Con trăn 3

Python 3 tương tự như C ++ và Java. Nó ngắn hơn nhiều vì nó không được gõ mạnh - nói cách khác, nó chỉ đoán được các biến là gì.

Đầu vào là dễ dàng, nhưng tất cả mọi thứ là đầu vào dưới dạng chuỗi. Bạn phải tự chuyển đổi tất cả đầu vào thành bất kỳ giá trị nào bạn muốn.
Phân tích cú pháp và lặp rất đơn giản.
Khai báo hàm Python khá đơn giản và ngắn gọn.
Python giỏi toán.
Chuỗi của Python rất đơn giản để sử dụng.
Mảng rất đơn giản để sử dụng.
Python giỏi đệ quy.
Python không bao gồm đồ họa tích hợp.


Tôi đoán bằng vòng lặp for nâng cao, bạn đang nói về vòng lặp phạm vi. C ++ hỗ trợ điều này kể từ C ++ 11 ( en.cppreference.com/w/cpp/lingu/range-for ). Nó có cấu trúc tương tự như vòng lặp phạm vi Java và yêu cầu lớp của đối tượng lặp để thực hiện bắt đầu () và kết thúc () hoặc bắt đầu (T) và kết thúc (T) cho quá tải đối tượng đã cho. Nó cũng được triển khai cho các chuỗi kiểu C và các mảng tích hợp và hoạt động cho tất cả các bộ chứa thư viện tiêu chuẩn.
foobar

@foobar Vâng, tôi đã nói về điều đó. Cảm ơn thông tin, tôi đã ước điều đó kể từ khi tôi dùng Java.
Hosch250

Java hiện có một giải pháp 61 byte, nhưng quan điểm của bạn vẫn đứng vững.
MilkyWay90
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.