Tải trọng, 196 byte
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
Tôi nghĩ rằng nó có thể thú vị để thử thách này trong một esolang năng lượng thấp; Underload thực hiện khá tốt đối với một ngôn ngữ có số lượng lệnh thấp như vậy.
Đầu ra là một tệp SVG với các thẻ được lồng rất nhiều và một số phím tắt chơi gôn. Cho đến nay, tôi vẫn chưa tìm thấy một trình duyệt có thể hiển thị nó (Firefox bị treo trong vài phút khi cố tải nó và cả Firefox và Chromium đều cho một màn hình trống). Hầu hết các chương trình xử lý ảnh cũng không thể tải nó (khiến việc chuyển đổi sang định dạng khác trở nên khó khăn), nhưng tôi đã quản lý để tải nó trong trình xem ảnh Eye of Gnome (là một phần của cài đặt mặc định trên Ubuntu). Vì vậy, tôi đã chụp ảnh màn hình của hình ảnh để bạn có thể nhìn thấy nó (hình ảnh thực tế có nền trong suốt, nhưng bạn không thể thực sự chụp màn hình trong suốt):
Chúng ta cần xác định rõ kích thước hình ảnh. Chọn một hướng thích hợp cho hình ảnh, vẽ mọi thứ ở kích thước hợp pháp tối thiểu và thực hiện số lần lặp tối thiểu được chỉ định bởi thử thách, sẽ cho chúng ta một hình ảnh vừa với chiều rộng 99 pixel, tiết kiệm một byte. Thật tuyệt khi mọi thứ diễn ra như vậy.
Thuật toán chung được sử dụng để vẽ hình ảnh là duy trì hai biến (Underload không đặt tên biến, nhưng tôi nghĩ chúng là x và y ), cả hai ban đầu đều trống. Sau đó, chúng tôi liên tục thay thế ( x , y ) bằng ( x , rẽ trái và di chuyển về phía trước, y ) và ( x , rẽ phải và di chuyển về phía trước, y ). Sau mười lần lặp, cả x và y giữ một đường cong rồng chín lần.
Cũng có một vài tối ưu hóa vi mô và các thủ thuật dành riêng cho Tải trọng. Để tránh quá nhiều lộn xộn với đỉnh của ngăn xếp, mỗi lần lặp lại, chúng tôi bắt đầu bằng cách kết hợp x và y vào hàm "trả về chuỗi được tạo bằng cách nối: x , một lệnh rẽ, đối số hàm, di chuyển- chỉ dẫn về phía trước và y . " Hàm này chỉ chiếm một khoảng trống trên ngăn xếp, vì vậy chúng ta có thể nhân đôi nó, gọi nó bằng -90
một đối số, hoán đổi giá trị trả về dưới dạng trùng lặp và gọi nó với 90
tư cách là một đối số, để giữ các giá trị mới cho x và ymà không bao giờ cần phải chạm nhiều hơn hai yếu tố hàng đầu của ngăn xếp (mà cho đến nay là phổ biến nhất có thể truy cập). Hàm này được tạo mã khi chạy. Bản thân trình tạo cũng được tạo mã khi chạy, để cho phép nó sử dụng lại chuỗi <g transform="translate
cũng được sử dụng để đặt gốc của hình ảnh. Chúng tôi tạo ra tất cả các thẻ mở trước, và sau đó vì tất cả các thẻ đóng chỉ là </g>
, chúng tôi có thể xuất 1024 thẻ đóng thông qua việc lặp lại chuỗi, mà không phải lo lắng về việc khớp chúng với các thẻ mở. (Viết số hiệu quả trong Underload là một vấn đề thú vị theo cách riêng của nó; (:*)::*:**:*
có lẽ là cách hiệu quả nhất để viết 1024, tuy nhiên, dịch thành "2 thành sức mạnh của (1 + 2 × 2) × 2".
Underload không có bất kỳ thư viện đồ họa nào, vì vậy tôi tạo ra SVG bằng cách sử dụng kết hợp các đường vẽ ở một vị trí cố định và xoay hình ảnh xung quanh một điểm nhất định; thay vì xoay bút, chúng ta lật giấy. Ý tưởng là bằng cách vẽ một dòng, xoay toàn bộ hình ảnh, vẽ một dòng khác, xoay hình ảnh một lần nữa, v.v., chúng ta có thể mô phỏng hiệu quả đồ họa rùa mà không phải thực hiện bất kỳ số học hoặc sử dụng bất kỳ thư viện đồ họa nào, vì tất cả các dòng được vẽ ở cùng một vị trí Tất nhiên, điều đó có nghĩa là chúng ta có một số thẻ xoay hình ảnh được lồng rất nhiều, khiến nhiều người xem SVG bối rối.
Tạo kiểu cho hình ảnh sẽ được tính theo số byte, vì vậy tôi cần đưa ra kiểu dáng tối thiểu cần thiết để hiển thị hình ảnh. Điều này hóa ra là stroke="#"
, mà ít nhiều dịch là "dòng cần phải có một số màu"; điều này dường như được mở rộng để vẽ nó bằng màu đen. (Thông thường bạn sẽ chỉ định màu như, nói, "# 000".) Nền mặc định trong suốt. Chúng tôi không chỉ định chiều rộng nét, nhưng lựa chọn được chọn bởi Eye of Gnome khiến mọi thứ hiển thị.
Nhiều trình thông dịch Underload đấu tranh với chương trình này, ví dụ như phiên bản trên Try It Online gặp sự cố, vì nó tạo ra một số chuỗi rất lớn trong nội bộ. Trình thông dịch Underload trực tuyến ban đầu hoạt động, mặc dù. (Thật thú vị, trình thông dịch đầu tiên là trực tuyến, vì vậy ngôn ngữ có thể sử dụng trực tuyến trước khi có thể sử dụng ngoại tuyến.)
Một điều tôi hơi khó chịu là dường như chỉ có 1023 phân đoạn dòng ở đây và chúng tôi mong đợi 1024. Có thể là một trong những phân đoạn ở cuối không được vẽ bằng thuật toán này (nó sẽ là được vẽ trên lần lặp tiếp theo thay thế). Nếu điều đó không đủ tiêu chuẩn, có thể điều chỉnh chương trình, nhưng nó có thể sẽ kết thúc lâu hơn đáng kể. (Không giống như thử thách này sẽ giành chiến thắng trong cuộc thi nào; đã có một vài mục ngắn hơn.)