Mẹo chơi gôn trong> <> (Cá)


14

Vì tôi đã nhìn thấy nhiều hơn > <> các bài nộp nổi gần đây, tôi nghĩ rằng có thể có một trang mẹo.

Vui lòng giữ một mẹo trên mỗi bài đăng, trừ khi chúng có liên quan chặt chẽ.

Trình thông dịch Python chính thức

Thông dịch viên trực tuyến (một số lỗi hiện tại, nhưng tốt cho hầu hết các trường hợp)


9
Tôi vừa nhận ra trong khi nhìn vào trang esolang: người tạo ra> <> có một cái tên nghe có vẻ giống như "harpoon".
mbomb007 24/2/2015

Làm thế nào tôi có thể in một dòng mới trong cá?
Thuyền trưởng Man

@CaptainMan Bạn có thể xuất điểm mã với ovà vì dòng mới \nlà ASCII 10 bạn có thể làm ao.
Sp3000

@Sp cảm ơn, tôi đã cố gắng CRthay vì LFvà đang đẩy dthay vì a.
Thuyền trưởng Man

Câu trả lời:


5

Kiểm tra so với 0

Sử dụng ?!thay vì 0=?thường tiết kiệm một byte.

Tuy nhiên, chỉ cần một tiêu chuẩn ?đôi khi có thể tốt hơn nếu bạn có đủ khả năng tái cấu trúc một chút

?!vA
  B

đấu với

?vB
 A

4

Kiểm tra EOF

Khi đạt EOF,> <> đẩy -1 lên ngăn xếp, có thể được kiểm tra theo một trong hai cách:

:0(?
:1+?

Đối với mục đích kiểm tra EOF, hai điều này là phủ định, vì vậy cái nào có lợi hơn phụ thuộc vào cấu trúc chương trình của bạn.


3

Chuyển đến phá vỡ bắt đầu dòng mới

Bắt đầu một dòng mới đôi khi có nghĩa là lãng phí rất nhiều khoảng trắng hàng đầu trên dòng tiếp theo. Trong tình huống như vậy, nhảy có thể hữu ích.

Ví dụ,

[lots of code here]>[loop body]v
                   ^ ......... <

có thể được thực hiện để phù hợp với một dòng như vậy:

[lots of code here][loop body][jump]

Để có một ví dụ thực tế, đây là chương trình Hello World trên một dòng:

"!dlroW ,olleH"l?!;oe0.

3

Sử dụng mô-đun để đơn giản hóa đầu vào

Đây có thể là một mẹo quá đơn giản, vì vậy nếu đó là tôi sẽ chỉ thay thế hoặc xóa nó.

Giả sử bạn muốn nhập hai ký tự "a" và "b" và trả lại 1 và 2 cho mỗi ký tự tương ứng. Bạn có thể sử dụng các điều kiện cho việc này, vì nó có ý nghĩa nhất và tôi sẽ sử dụng một hình thức cô đọng hơn cho ví dụ cụ thể này.

i:"a")+1+n

Điều này kiểm tra xem liệu đầu vào có lớn hơn "a" không và thêm 1. Vì "a" sẽ trả về 0 và "b" 1, điều này sẽ cho 1 và 2. Điều này thực hiện công việc khá tốt, nhưng trong trường hợp của chúng tôi đầu vào, chúng ta có thể đi xa hơn.

i:3%n

Trong mod 3, 97, tương đương với số "a", trở thành 1 và 98, là "b" s, trở thành 2. Đối với hai số khác nhau, có một mod đảm bảo cho kết quả duy nhất cho cả hai. Đối với nhiều hơn hai, có một mod cho kết quả duy nhất, nhưng tôi không có khả năng toán học để tìm ra cái nhỏ nhất một cách đơn giản (ví dụ: nếu bạn có bộ {100,101,102,103}, mod 104 sẽ cho kết quả duy nhất cho mỗi giá trị trong đó nhưng không phải là một cách rất hữu ích). Tuy nhiên, trong hầu hết các trường hợp, với đầu vào bị giới hạn ở một vài ký tự chữ cái, bạn thường có thể tìm thấy một mod hoạt động.

Để tìm mô-đun nhỏ nhất mang lại kết quả duy nhất cho hai số, a và b, bạn làm như sau. Lấy giá trị tuyệt đối của hiệu của a và b ( |a - b|) và tìm số nhỏ nhất, n, không chia nó. ví dụ: đối với 97 và 98, |98 - 97| = 1và vì vậy 2 sẽ là mod nhỏ nhất (nhưng đối với chương trình thử nghiệm của chúng tôi, điều này mang lại 1 cho 97 và 0 cho 98, vì vậy mod 3 tốt hơn).


3

Sử dụng nhảy như một điều kiện

Đôi khi bạn sẽ kết thúc việc viết chương trình trong> <> yêu cầu bạn phải làm những việc khác nhau khi nhận được các đầu vào khác nhau. Thông thường, bạn sẽ sử dụng các điều kiện ( ?) và bộ thay đổi hướng để phân tích cú pháp này. Trong một số trường hợp, điều đó hoạt động tốt (đặc biệt là khi có ít loại đầu vào để xử lý), nhưng đôi khi bạn kết thúc với một cái gì đó trông như thế này. (Bỏ qua thực tế là mã này có thể được giảm bằng cách sử dụng một số thủ thuật khác, nó chỉ để trình diễn)

i:"a"=?v:"b"=?v"c"=?v>
  .00n1< .00n2<.00n3<

Trong khi điều này là tốt, nó có một số khoảng trắng (mà cá nhân tôi không bao giờ muốn thấy) và nó có rất nhiều sự lặp lại ( =?v.00n). Thay vào đó, bạn có thể sử dụng một bước nhảy và các dòng khác nhau làm điều kiện của bạn. Đây là một ví dụ:

i:"a")$"b")+1+0$.>
v1
v2
v3
<.00n

Điều này sẽ loại bỏ 10 byte. Đây là những gì đang xảy ra:

i: Chúng tôi nhân đôi đầu vào một lần để có thể đánh giá nó hai lần

"a")$"b")+Đây có thể là loại mẹo riêng của nó, nhưng những gì tôi đang làm ở đây là kiểm tra xem liệu đầu vào có lớn hơn ký tự "a" hay không và nếu nó lớn hơn ký tự "b" và thêm kết quả. Đối với "a", điều này sẽ mang lại 0, cho "b," 1 và cho "c," 2.

1+0$.Đây là nơi phép màu xảy ra; chúng tôi lấy kết quả của sự đơn giản hóa trước đó và thêm 1 (cho 1 cho "a", 2 cho "b", 3 cho "c"), sau đó đẩy 0 và hoán đổi các giá trị. Khi chúng tôi đạt được bước nhảy, điều này sẽ di chuyển đến dòng tương ứng với giá trị chúng tôi đã gán cho các ký tự đó (ví dụ: dòng 1 cho "a"). NB Line 0 là đầu chương trình.


1

Viết mã có thể chạy hai cách

Trampolines ( !) rất tiện dụng khi bạn muốn mã của mình được chạy tiến và lùi (hoặc lên xuống). Những kịch bản này có phần khó xảy ra, nhưng đối với các thử thách palindrom hoặc tương tự, mẹo này có thể hữu ích.

Đây là một ví dụ: Tôi muốn chạy một số mã một lần, sau đó lặp qua các giá trị loại bỏ ngăn xếp cho đến khi tôi đạt 0, rồi đi xuống. Con trỏ đi vào vòng lặp này từ >. Bạn có thể sử dụng một bước nhảy để thực hiện điều này, ví dụ

?!v80.>ao (giả sử tôi muốn in một dòng mới trước)

nhưng nếu mã chúng ta muốn chạy một lần (mã qua >) làm cho dòng dài hơn 16 ký tự, chúng ta không còn có thể sử dụng bước nhảy trong ba ký tự. Tuy nhiên, đây là một ví dụ mà việc chạy tiến và lùi ...

?!v!?<>ao>

Đi về phía trước, chúng tôi in một dòng mới và sau đó nhấn vào ?!vđó loại bỏ giá trị nếu nó không phải là 0, sau đó vì tấm bạt lò xo, chúng tôi bỏ qua tiếp theo ?và đi ngược lại. Điều tương tự cũng xảy ra và vòng lặp tiếp tục cho đến khi chúng ta đạt 0.

Đây là một ví dụ cụ thể kỳ lạ, nhưng có một số ứng dụng (có lẽ không nhiều).

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.