Lời khuyên cho việc chơi golf trong INTERCAL


10

Bạn có lời khuyên chung nào cho việc chơi golf trong INTERCAL ? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các thử thách chơi gôn và ít nhất là phần nào cụ thể cho INTERCAL (tức là "xóa bình luận" không phải là một câu trả lời hữu ích).

Tôi biết các ngôn ngữ kỳ lạ có thể thực sự hữu ích để chiến thắng các cuộc thi golf, nhưng tôi không thấy nhiều mã INTERCAL quanh đây. Bạn có lời khuyên nào có thể giúp mọi người có được kích thước mã cạnh tranh với INTERCAL không? Ngôn ngữ này bao giờ có thể cạnh tranh?

INTERCAL không được sử dụng đúng mức đến mức nó thậm chí không có thẻ. Buồn quá...


Hầu hết các ngôn ngữ không có hoặc cần thẻ riêng của họ ở đây, vì những thách thức về ngôn ngữ nói chung thường không được khuyến khích.
Alex A.

9
Một gợi ý rằng đây có thể không phải là ngôn ngữ chơi golf tốt nhất, từ trang wikipedia của nó:Despite the language's intentionally obtuse and wordy syntax,
isaacg

Câu trả lời:


2

Loại bỏ khoảng trắng / "tiếng ồn" có thể đi xa hơn bạn mong đợi

INTERCAL là một ngôn ngữ không nhạy cảm khoảng trắng. Tuy nhiên, không giống như hầu hết các ngôn ngữ không nhạy cảm với khoảng trắng, sự vô cảm đi xa hơn nhiều so với bạn mong đợi.

Ví dụ: DO NOTlà hai mã thông báo, nhưng có thể được viết DONOTmà không có trình phân tích cú pháp phàn nàn (gần như bất kỳ triển khai được sử dụng rộng rãi nào). (Tất nhiên, bạn cũng có thể viết DON'T, nhưng nó không phải là bất kỳ vấn đề nào. Tuy nhiên, nó có thể dễ đọc hơn. PLEASEN'TCó lẽ khó đọc hơn PLEASE NOT, mặc dù vậy.) Trên thực tế, có một số tranh luận về việc liệu khoảng trắng có làm gì không; ít nhất một trình phân tích cú pháp INTERCAL cho phép nó ngay cả bên trong các hằng số (không phải là rất hữu ích khi chơi gôn). Một điều cần lưu ý là việc loại bỏ khoảng trắng khỏi các DO READ OUTcung cấp có thể gây nhầm lẫn cho một số trình phân tích cú pháp INTERCAL cũ hơn do được nhúngDOREADOUTDO(mặc dù các tác giả của họ thường coi đây là một lỗi và do đó ngày nay nó thường hoạt động trong một chương trình hợp lệ, không nên đặt mã như thế này trong vùng lân cận của lỗi cú pháp, vì khi đó có thể khó phân biệt hơn).

Cũng nên nhớ rằng bạn có thể overpunch các ký tự để tiết kiệm không gian. Trong ASCII, bạn chỉ có thể thực sự thực hiện điều này với '.!, nhưng đó là một mẹo rất hữu ích theo đúng nghĩa của nó. (Khi bạn không sử dụng mảng, không có khả năng gây ra sự mơ hồ ngay cả khi tất cả các ký tự nhóm của bạn đều giống nhau, vì vậy, đối với các mục chơi gôn, bạn chỉ nên sử dụng 'trừ khi một đăng ký mảng thực sự yêu cầu a ". được biểu thị bằng một byte bằng cách sử dụng ?chữ viết tắt (C-INTERCAL) hoặc Latin-1 cho ¥(CLC-INTERCAL), thay vì ba ký tự mà INTERCAL-72 cần.


2

Tập trung vào làm càng nhiều công việc càng tốt trong một tuyên bố

Các định danh tuyên bố của INTERCAL khá dài dòng; DOlà hai ký tự nhiễu trên mỗi câu lệnh, bản thân tên của câu lệnh cũng có xu hướng khá dài và bạn phải ném vào PLEASEmỗi câu lệnh để giữ cho trình phân tích cú pháp vui vẻ. (Điều tốt nhất bạn có thể làm là tỷ lệ bốn DOtrên một PLEASE, nghĩa là bạn đang sử dụng 14 ký tự trong số nhận dạng cho mỗi 5 lệnh.) Mặt khác, cú pháp biểu thức khá ngắn gọn (lố bịch, nhưng ngắn gọn). Điều này có nghĩa là nó thường có giá trị phù hợp một phần chương trình của bạn thành một biểu thức ngay cả khi sử dụng nhiều câu lệnh sẽ là cách "tự nhiên" hơn để làm mọi việc.

Ví dụ: nếu bạn muốn gán #1cho .1#2đến .2, thay vì thực hiện theo cách rõ ràng INTERCAL-72:

DO.1<-#1DO.2<-#2

thật đáng để cân nhắc quá tải một biến ngẫu nhiên để cho phép bạn gán cả hai cùng một lúc:

DO:1<-#1$#2

(được :1/!1$.2'ném vào đâu đó sớm hơn trong chương trình; lưu ý rằng ký hiệu này hoãn INTERCAL-72 theo một cách khá, vì vậy bạn sẽ cần sử dụng INTERCAL hiện đại để làm việc này). Việc này chỉ lâu hơn một chút ngay cả khi bạn tính đến thiết lập và trở nên ngắn hơn nếu bạn cần, hoặc có thể sắp xếp, đồng thời gán cho .1.2nhiều lần.

Nó không chỉ tính toán các lệnh mà thủ thuật này hoạt động. Nếu bạn cần bỏ một biến hai lần, đừng làm như thế này:

DOSTASH.1DOSTASH.1

nhưng như thế này:

DOSTASH.1+.1

( +Ký hiệu hoạt động cho hầu hết các lệnh trong đó về mặt khái niệm có thể có ý nghĩa.)


2

Sử dụng một RESUME duy nhất cho tất cả các kiểu INTERCAL-72 nếu phối hợp

Nếu bạn cần viết tương đương với câu lệnh "if", phương thức bình thường sử dụng mã INTERCAL-72 là NEXThai lần và sau đó thực hiện tính toán RESUME. (Trong mã hiện đại, thường thì một phép tính COME FROMsẽ tốt hơn, nhưng mẹo này giả sử mã của bạn thích NEXT.) Bạn gần như chắc chắn phải trả các byte cho lần đầu tiên NEXT, vì nó nhảy từ một nhánh của "nếu" sang nhánh khác. Chia sẻ thứ hai NEXTcũng không cần thiết, trừ khi bạn có rất nhiều câu "nếu" đi đến cùng một vị trí khi nhìn thấy a #1. Tuy nhiên, RESUMEcó thể là bất cứ nơi nào trong chương trình (vì điều khiển sẽ rời khỏi nó ngay lập tức ở bất cứ đâu).

Có hai cách để xử lý việc này. Nếu bạn có nhiều câu lệnh "nếu", thì RESUMEcó lẽ sẽ đảm bảo một số dòng một chữ số, để NEXTcâu lệnh thứ hai của bạn có thể càng ngắn càng tốt. Nếu có thể, hãy cố gắng biến nó thành một phép tính RESUMEtự nhiên xảy ra trong mã của bạn (phải thừa nhận rằng điều này rất khó, vì hiếm khi chúng xuất hiện trong "dòng chảy bình thường" của mã thay vì được chỉnh NEXTsửa); sau đó, chi phí duy nhất là số dòng. Bạn sẽ phải sử dụng một biến boolean duy nhất cho tất cả các NEXTs này ; sự đồng thuận phổ quát ở đây là sử dụng .5, chủ yếu là vì đó là biến mà thư viện chuẩn sử dụng cho các giá trị trả về boolean.

Ngoài ra, có thể sử dụng một tài liệu không có giấy tờ (về mặt kỹ thuật, vì tôi đã đưa một gợi ý vào tài liệu INTERCAL khi tôi nhận thấy) của thư viện chuẩn. Bởi vì một vị trí trung tâm cho một RESUMErất hữu ích, thư viện tiêu chuẩn sử dụng một trong nội bộ. Số dòng trong INTERCAL là toàn cầu (với các quy ước đặt tên, nhưng có thể bị phá vỡ nếu bạn biết bạn đang làm gì), vì vậy bạn có thể truy cập NEXTvào các thư viện tiêu chuẩn nếu bạn muốn, và đặc biệt, có thể NEXTđến vị trí RESUME trung tâm của nó . Điều này đủ phổ biến trong mã INTERCAL hiện tại mà việc thay thế thư viện tiêu chuẩn có xu hướng phải thực hiện nó để tránh phá vỡ các chương trình hiện có.

Dòng trong câu hỏi là (theo nghĩa đen hoặc hiệu quả, tùy thuộc vào việc thực hiện):

(1001) DO RESUME .5

Lý do chính không sử dụng điều này là số dòng dài của nó; nếu bạn cần thực hiện nhiều kiểu INTERCAL-72 nếu xây dựng, sẽ tốt hơn nếu sử dụng của riêng bạn để cung cấp cho nó một số ngắn hơn.

Tất nhiên, bạn có thể kết hợp các kỹ thuật, viết một cái gì đó như

(9)DO(1001)NEXT

chỉ dài hơn một chút

(9)DORESUME.5

và có lợi ích mà các booleans trở thành #2#3(khó đọc hơn, nhưng thông thường dễ tạo ra hơn). Trên thực tế, nó có thể đáng để đặt thêm mã để xử lý #0#1nếu bạn sẽ gặp nhiều khó khăn (nhưng tính toán COME FROMcó thể sẽ hoạt động tốt hơn trong trường hợp này trừ khi yêu cầu của bạn rất kỳ lạ).


2

INTERCAL không chỉ định quyền ưu tiên, nhưng cũng không có lỗi về quyền ưu tiên mơ hồ

Một biểu hiện như

#1$#2~#3

là mơ hồ, và có thể có nghĩa là

'#1$#2'~#3

hoặc là

#1$'#2~#3'

Thông số INTERCAL khiến nó cố ý không rõ nghĩa là gì và nói chung không có tiêu chuẩn nào (mặc dù C-INTERCAL và CLC-INTERCAL nỗ lực để khớp với nhau trong các trường hợp đơn giản hơn). Điều đó nói rằng, bản gốc không chính xác ; điều này không rõ ràng và tôi không khuyên bạn nên sử dụng nó trong mã sản xuất (nhưng sau đó, tôi sẽ không khuyên sử dụng chính INTERCAL trong mã sản xuất), nhưng nó sẽ có ý nghĩa trong phần lớn các trình biên dịch.

Nói cách khác, có thể đáng để loại bỏ các nhóm ký tự và hy vọng chương trình của bạn vẫn hoạt động. Hầu hết các thông dịch viên sẽ phân tích bất kỳ biểu thức mơ hồ nhất định nào, do đó, đối với mỗi cặp nhân vật nhóm, có một cơ hội 1 trong 2 là không cần thiết; có thể thêm vào một số tiền tiết kiệm. (Thật không may, các trình phân tích cú pháp INTERCAL có xu hướng đủ gây nhầm lẫn rằng không ai hoàn toàn chắc chắn các quy tắc thực sự là gì , nhưng nó thường có thể được xác định bằng thử nghiệm. Trong các trường hợp đơn giản nhất, các toán tử có xu hướng đều có quyền ưu tiên như nhau và có tính kết hợp nhất quán.)


2

Trong C-INTERCAL, hãy xem xét viết tắt mã bằng cách sử dụng CREATE

Câu CREATElệnh cho phép bạn tạo cú pháp mới. Điều này đặc biệt hữu ích trong việc chơi golf vì nó cho phép bạn đưa ra những câu ngắn hơn. Bạn cũng có thể sử dụng nó để "xác định hàm" một cách hiệu quả thông qua việc tạo một toán tử mới (có lợi thế rất lớn là nó cho phép bạn gọi hàm ở giữa một biểu thức).

Chi phí thiết lập ở đây khá cao, nhưng nếu có một cấu trúc mà bạn sử dụng nhiều, phát minh ra cú pháp ngắn hơn cho nó có lẽ sẽ là một ý tưởng tốt.

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.