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


15

Than là ngôn ngữ được tạo bởi chỉ ASCII và DLosc, chuyên về các thách thức nghệ thuật ASCII.

Bạn có lời khuyên nào cho việc chơi golf trong Than? Rõ ràng tôi đang tìm kiếm các mẹo liên quan cụ thể đến Than, không phải những lời có thể áp dụng cho hầu hết - nếu không phải là tất cả - ngôn ngữ.


Thôi nào, tôi sẽ thử làm một câu trả lời than trên một cái gì đó, brb. Có lẽ tôi có thể đưa ra gợi ý nhỏ về chủ đề này.
Bạch tuộc ma thuật Urn

Câu trả lời:


5

Tận dụng lợi thế của deverbosifier

Sử dụng deverbosifier có nghĩa là bạn có thể viết bằng ASCII ( --dvhoặc --deverbosifydeverbosify -vhoặc --verboseđể thực thi dưới dạng mã dài dòng). Hơn nữa, nó nén các chuỗi cho bạn, có thể hữu ích trong một số thách thức nghệ thuật ASCII khi chuỗi cần nén quá dài.

@Neil khuyên bạn nên sử dụng -vlhoặc -v --sl. Đây là viết tắt của từ này --verbose --showlength, có nghĩa là nó sẽ được hiểu là Charbose dài, và độ dài của mã Char than thông thường sẽ được hiển thị. Ngoài ra, khi deverbosifying, hãy kiểm tra đầu ra để đảm bảo rằng đầu vào thực sự đã được phân tích cú pháp chính xác, vì Char than thường bỏ qua các lỗi phân tích cú pháp. Nếu có một lỗi cú pháp, sử dụng -a( --astify) hoặc --oa( --onlyastify) để giúp đỡ con số ra vấn đề.


Hơn nữa, tôi khuyên bạn nên sử dụng -v -sl. Ngoài ra, khi deverbosifying, hãy kiểm tra đầu ra để đảm bảo rằng đầu vào thực sự được phân tích cú pháp chính xác, vì bạn không luôn gặp lỗi phân tích cú pháp.
Neil

3

Sử dụng quá tải

Ví dụ: nhiều lệnh chỉ cần một đối số:

  • Rectangle, OblongBoxlàm cho một hình vuông nếu chỉ có một lập luận được đưa ra
  • Reflect lệnh mặc định để phản ánh đúng
  • Rotate lệnh mặc định đến 90 độ ngược chiều kim đồng hồ
  • PolygonPolygonHollowcó thể chấp nhận một chiều đa chiều và chiều dài bên. Điều này có thể được sử dụng nếu tất cả các cạnh có cùng chiều dài.

Tôi phát hiện ra sự thật đó về một PolygonHollowcách tình cờ. Bạn thậm chí có thể có một số đa hướng, nhưng chúng phải đến trước mũi tên bình thường (tôi không biết liệu giới hạn này có phải là cố ý hay không). Tôi đã sử dụng nó trong câu trả lời của tôi cho thử thách "Vẽ một khối lập phương".
Neil

Hmm, giới hạn này là có chủ ý, nhưng tôi đoán tôi nên thay đổi nó vì dù sao nó cũng không gây hại
ASCII - chỉ

Tôi thấy bạn đã cố định Đa giác để chấp nhận mũi tên và đa hướng theo bất kỳ thứ tự nào, cảm ơn! Khi tôi ở đây, tôi đã mong đợi được ReflectButterfly dlsgọi ReflectButterflycho mỗi hướng, nhưng (như wiki là tài liệu chính xác) nó thực sự gọi ReflectOverlap.
Neil

@Neil lol oops, tôi sẽ cố gắng khắc phục điều đó càng sớm càng tốt (Tôi nghĩ đó cũng là một sự trùng hợp quá haha)
ASCII chỉ có

3

Tránh các hằng số cùng loại

Ví dụ, Plus(Times(i, 2), 1)dịch là ⁺×鲦¹, nhưng bạn có thể tiết kiệm một byte bằng cách chuyển các thông số: Plus(1, Times(i, 2))dịch là ⁺¹×ι²Plus(Times(2, i), 1)như ⁺ײι¹cả hai đều tiết kiệm một byte. Plus(1, Times(2, i))(dịch là ⁺¹×²ι) sẽ còn tốt hơn nếu có một hằng số khác theo sau nó.


3

Sử dụng các biến được xác định trước

Dưới đây là danh sách tất cả các biến có thể được sử dụng, đưa ra chữ cái Hy Lạp cô đọng và chữ cái dài thể hiện nó.

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

Các biến đại diện cho đầu vào sẽ trống nếu không có đủ đầu vào tồn tại, nhưng tất cả các biến khác không được hiển thị ở đây phải được chỉ định trước khi sử dụng.


Chúng nên được sửa trên TIO ngay bây giờ, thật tuyệt nếu bạn có thể xác minh rằng nó hoạt động
ASCII - chỉ

Chỉ có ASCII Bạn có thể xác nhận điều đó yfcó cách nào khác với những gì tôi đã dán không? (Tôi có thể đã đọc sai các chữ cái Hy Lạp khi ban đầu tôi viết nó.)
Neil

Vâng, họ là cách khác
ASCII - chỉ

3

Tìm hiểu phản xạ và xoay của bạn

Có rất nhiều biến thể của sự phản xạ và xoay cơ bản, vì vậy nó trả tiền để biết sự khác biệt tinh tế là gì. Chìa khóa để bàn:

  • Lệnh: Tên của lệnh trong chế độ Verbose.
  • Biến đổi: Liệu Than có nên cố gắng lật hoặc xoay các ký tự khi nó phản chiếu hoặc xoay chúng. Ví dụ, một /có thể trở thành \sau khi xoay hoặc lật.
  • Giữ nguyên bản: Liệu Than có nên hợp nhất kết quả với khung gốc không.
  • Chồng chéo: (Chỉ áp dụng khi Giữ nguyên bản là Có.) Xác định vị trí của trục phản chiếu / xoay, trong một nửa ký tự từ đường viền. Trong trường hợp phản xạ, tương đương với số lượng hàng / cột không bị ảnh hưởng và kết thúc ở giữa kết quả. Trong trường hợp xoay, bản sao được xoay được phép ghi đè lên các vùng rõ ràng (nhưng không phải khoảng trắng) trong bản gốc.

Những phản ánh

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

Hướng phản xạ là tùy chọn. Mặc định là để phản ánh một lần sang phải. Đối với những phản xạ giữ nguyên bản, nhiều hướng được cho phép, chỉ đơn giản lặp lại lệnh cho mỗi hướng. (Điều này có nghĩa là ví dụ ReflectMirror(:¬)sẽ thực sự tạo ra bốn bản sao tổng cộng.)

Con trỏ được di chuyển cùng với sự phản chiếu (ngay cả khi bản gốc được giữ).

Xoay

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

Đối với những vòng quay giữ nguyên bản, có một nguồn gốc xoay tùy chọn. Mặc định là phía dưới bên phải của khung vẽ. Giá trị cho phép là bất kỳ hướng chéo.

Số lượng vòng quay (tăng 45 °) là tùy chọn. Mặc định là 2, tức là 90 ° ngược chiều kim đồng hồ (ngược chiều kim đồng hồ). Đối với các phép quay giữ nguyên bản, có hai tùy chọn thay thế: số nguyên nhiều chữ số chỉ định xoay khung vẽ một lần cho mỗi chữ số và sau đó hợp nhất các kết quả, trong khi danh sách số nguyên chỉ lặp lại lệnh cho mỗi phép quay, với kết quả thay đổi tùy thuộc vào cách vải thay đổi ở giữa.


Câu hỏi: Có Transformnghĩa là gì?
Máy

@CalculatorFeline Câu hỏi hay. Các trường hợp trong đó Transform không chỉ đơn giản là một bản sao theo từng ký tự. Chẳng hạn, một phản xạ chuẩn của "4> 2" chỉ là các ký tự theo thứ tự ngược lại, tức là "2> 4". Điều này không phải lúc nào cũng mong muốn, do đó, Transform cố gắng chuyển đổi các ký tự theo cách phù hợp nhất, do đó, sự phản chiếu của "4> 2" sẽ trở thành "2 <4". Transform có thể không phải là mô tả tốt nhất về điều này, vì vậy hãy thoải mái đề xuất một cái gì đó tốt hơn.
Neil

Không thể nghĩ ra bất cứ điều gì tốt hơn, vì vậy bạn chỉ nên giải thích cách làm Transformviệc trong câu trả lời ở đâu đó.
Máy

@CalculatorFeline Tôi đã thêm một khóa vào bảng, chỉ trong trường hợp các cột khác không rõ ràng.
Neil

Các lỗi nên được sửa chữa ngay bây giờ. Cũng cảm ơn bạn rất nhiều vì đã dành thời gian để viết lời giải thích này!
ASCII - chỉ

2

Sử dụng các lệnh không có ký tự lệnh

Một biểu thức không phải là một phần của lệnh được in.
Nếu nó đi trước một hướng, biểu thức được in theo hướng được chỉ định.
Các số được in dưới dạng một dòng có độ dài được chỉ định bằng cách sử dụng một ký tự được chọn từ đó \/-|.

Nếu một hướng không được theo sau bởi một biểu thức, thì nó được tính là di chuyển một khoảng trắng theo hướng đã chỉ định.

Lưu ý: Điều này đôi khi có thể được tính là một phần của lệnh trước để ký tự lệnh thực sự có thể được yêu cầu. (cảm ơn Neil đã nhắc nhở tôi)


1
Bạn phải coi chừng sự mơ hồ bởi vì lệnh trước đó có thể chấp nhận một tham số tùy chọn.
Neil

2

Sử dụng đa chiều

Một số lệnh có thể chấp nhận đa chiều : +X*|-\/<>^KLTVY7¬⌊⌈. Những gì họ mở rộng đến đây . Nói chung, danh sách hướng bắt đầu từ lên và tiếp tục theo chiều kim đồng hồ.


Bất kỳ lý do cụ thể tại sao một số lệnh chấp nhận đa chiều nhưng những lệnh khác yêu cầu một danh sách hướng? (Có thể có một lý do chính đáng cho việc này mà tôi đang xem, nhưng tôi đã cố gắng thực hiện ReflectButtterflyOverlap(:¬, Modulo(g, 2));.)
Neil

@Neil Tôi không nghĩ vậy, sẽ thay đổi càng sớm càng tốt
ASCII chỉ

0

Tận dụng triệt để Sum

Sum có quá nhiều tiện ích:

  • Trên một danh sách các chuỗi, nối chúng lại với nhau. Tuy nhiên, nếu có thể danh sách đó có thể trống, thì điều này sẽ không có gì, vì vậy trong trường hợp này, hãy sử dụng Join(..., "")thay thế.
  • Trên một danh sách các số không trống, chỉ cần lấy tổng của chúng.
  • Trên một danh sách không trống các danh sách, nối chúng lại với nhau (làm phẳng đến độ sâu 1).
  • Trên một số nguyên, lấy tổng các chữ số của nó. (Các giá trị dấu phẩy động được cắt ngắn thành số nguyên. Nếu bạn muốn tổng các vị trí thập phân, trước tiên hãy chuyển thành chuỗi.)
  • Trên một chuỗi chỉ chứa các chữ số và tùy ý một .ký tự, lấy tổng các chữ số.
  • Trên một chuỗi chứa các số và dấu phân cách, lấy tổng của các số được đúc thành int hoặc float (nhưng lưu ý rằng nó -được tính là một dấu phân cách).

Một tác dụng phụ thuận tiện của hai quy tắc cuối cùng là nếu bạn sử dụng Sumtrên một ký tự thì các chữ số 1-9sẽ được chuyển thành giá trị của chúng và mọi thứ khác trả về 0, không giống như Castcác giá trị không có chữ số.


0

Sử dụng split cho một mảng chuỗi, split và cast cho một mảng số

Chia cho một mảng chuỗi chỉ có ba ký tự trên không, và phân chia và truyền chỉ là bốn ký tự trên đầu. So sánh điều này với việc viết mảng theo nghĩa đen, sẽ yêu cầu bắt đầu và kết thúc mảng một dấu phân cách giữa mọi phần tử mảng.

Nếu mảng số của bạn chỉ có số nhỏ hơn 95, hãy sử dụng một chuỗi (nếu tất cả các số nhỏ hơn 10) hoặc chỉ mục vào một trong các biến được xác định trước.


0

Sử dụng Bộ lọc để cắt ký tự đầu tiên từ một mảng hoặc chuỗi

Ngay cả khi bạn may mắn, sử dụng Sliceđể cắt ký tự đầu tiên từ một chuỗi mất 2 byte : Slice(..., 1). Sẽ mất nhiều thời gian hơn nếu biểu thức được cắt kết thúc bằng một số, yêu cầu một dấu phân cách hoặc nếu đoạn mã sau có thể được hiểu là một biểu thức, vì trong trường hợp đó Slicesẽ muốn sử dụng nó như một tham số bổ sung.

Thay vào đó, chỉ cần sử dụng Filter(..., k), làm giảm yếu tố đầu tiên, do đó đạt được kết quả mong muốn. (Rõ ràng sử dụng biến chỉ số vòng lặp thích hợp nếu biểu thức của bạn được lồng bên trong một vòng lặp khác.) Đây luôn là 2 byte và không thể bị ảnh hưởng bởi mã xung quanh.

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.