Đặt hai xu của tôi vào các ngôn ngữ lập trình mảng , đặc biệt là J và APL .
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.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ý 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ọ;)