Ngôn ngữ tiếng Anh và hầu hết các ngôn ngữ lập trình được viết và đọc từ trái sang phải, từ trên xuống dưới, nhưng đó không phải là trường hợp .
Trong thực tế cho khối văn bản
ABC
DEF
Tôi có thể nghĩ về tám cách liên quan có thể được đọc:
- Từ trái sang phải, từ trên xuống dưới (LTR-TTB):
ABCDEF
- Từ trên xuống dưới, từ trái sang phải (TTB-LTR):
ADBECF
- Từ trái sang phải, từ dưới lên trên (LTR-BTT):
DEFABC
- Từ dưới lên trên, từ trái sang phải (BTT-LTR):
DAEBFC
- Từ phải sang trái, từ trên xuống dưới (RTL-TTB):
CBAFED
- Từ trên xuống dưới, từ phải sang trái (TTB-RTL):
CFBEAD
- Từ phải sang trái, từ dưới lên trên (RTL-BTT):
FEDCBA
- Từ dưới lên trên, từ phải sang trái (BTT-RTL):
FCEBDA
Thử thách
Viết một khối văn bản hình chữ nhật có thể được đọc theo từng cách trong tám cách trên dưới dạng tám chương trình dòng đơn trong ngôn ngữ bạn chọn. Mỗi chương trình này sẽ xuất ra một số nguyên khác nhau từ một đến tám.
Không quan trọng hướng đọc nào xuất ra số nào, chúng không phải khớp với các số trên. Ví dụ: nếu khối văn bản của bạn vẫn còn
ABC
DEF
sau đó chương trình ABCDEF
đầu ra sức 5
và FEDCBA
đầu ra sức 2
, và sáu chương trình khác sẽ ra 1
, 3
, 4
, 6
, 7
, và 8
theo một trật tự.
Khối văn bản có thể chứa bất kỳ ký tự nào ngoại trừ dấu kết thúc dòng .
Đầu ra phải đi đến thiết bị xuất chuẩn hoặc một giải pháp thay thế tương tự nếu ngôn ngữ của bạn không có thiết bị xuất chuẩn phù hợp. Không có đầu vào. Bạn có thể cho rằng các chương trình được chạy trong môi trường REPL.
Pietu1998 đã viết một cách khéo léo một JSFiddle cung cấp cho 8 chương trình dòng đơn khác nhau khi được cung cấp một khối văn bản. Tôi đã biến nó thành một đoạn trích:
<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+" "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/> <label for="b">Show directions</label><br/><pre id="a"></pre>
Bạn vẫn có thể tìm thấy phiên bản CJam của Martin tại đây .
Chấm điểm
Điểm của bạn là khu vực của khối văn bản của bạn (chiều rộng nhân với chiều cao). Bài nộp với số điểm thấp nhất sẽ thắng. (Về cơ bản, mã nhỏ nhất sẽ thắng, do đó thẻ golf-code .) Tiebreaker đi đến bài đăng được đăng trước đó.
Ví dụ là 2 nhân 3 nên điểm của nó là 6. Một số điểm nhỏ hơn 4 (2 bằng 2) là không thể vì sau đó một số trong 8 chương trình sẽ giống hệt nhau và không thể đưa ra hai giá trị khác nhau.
String.prototype.repeat()
vẫn còn mới. Cũng xác nhận để làm việc trong IE bây giờ.