Đọc mã theo 8 cách để xuất 8 số


21

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:

  1. Từ trái sang phải, từ trên xuống dưới (LTR-TTB): ABCDEF
  2. Từ trên xuống dưới, từ trái sang phải (TTB-LTR): ADBECF
  3. Từ trái sang phải, từ dưới lên trên (LTR-BTT): DEFABC
  4. Từ dưới lên trên, từ trái sang phải (BTT-LTR): DAEBFC
  5. Từ phải sang trái, từ trên xuống dưới (RTL-TTB): CBAFED
  6. Từ trên xuống dưới, từ phải sang trái (TTB-RTL): CFBEAD
  7. Từ phải sang trái, từ dưới lên trên (RTL-BTT): FEDCBA
  8. 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 5FEDCBAđầu ra sức 2, và sáu chương trình khác sẽ ra 1, 3, 4, 6, 7, và 8theo 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/>&nbsp;<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ẻ .) 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.


6
Tại sao quy tắc "chỉ có thể in ascii"? Điều đó có nghĩa là APL không thể cạnh tranh trong thử thách này. :(
Moris Zucca

3
Tôi đã thực hiện một fiddle chuyển đổi một khối mã thành 8 chương trình. Có thể được bao gồm như một đoạn trích, muốn ý kiến ​​của OP về điều này mặc dù.
PurkkaKoodari

3
@ MartinBüttner Được rồi, tôi đã sửa nó. Có vẻ như String.prototype.repeat()vẫn còn mới. Cũng xác nhận để làm việc trong IE bây giờ.
Fiddle

@MorisZucca Tất cả các ký tự bên cạnh các đầu cuối dòng đều được phép.
Sở thích của Calvin

@ Pietu1998 Cảm ơn Fiddle, tôi đã thêm nó dưới dạng đoạn trích.
Sở thích của Calvin

Câu trả lời:


21

J, 3 * 3 = 9

1[2
+2+
2+2

Thực hiện tất cả các hướng:

       ". '1[2+2+2+2','2+2+2+1[2','1+2[2+2+2','2+2[2+1+2','2+2+2+2[1','2[1+2+2+2','2+2+2[2+1',:'2+1+2[2+2'
1 7 3 4 8 2 6 5

Giải trình:

  • Trong thực thi J đi từ phải sang trái và không có quyền ưu tiên toán tử.
  • Các [( left) mất phía bên trái của hai toán hạng của nó nên nó về cơ bản hủy bỏ toàn bộ phía bên phải của biểu ví dụ của chúng tôi 1+2[2+2+2trở nên 1+2[6và sau đó1+2 .
  • Các biểu thức bên trái là các bổ sung với tổng số toán hạng 1, 2, 3 và 4. Có hai trong số các nbiểu thức -operand một với số 1và một chỉ có 2s. Các bổ sung với việc 1tạo ra các số lẻ và những cái khác tạo ra các số chẵn.

5
Điều này thực sự tốt đẹp. Thay thế [bằng ;và nó sẽ hoạt động trong môi trường REPL của hầu hết các ngôn ngữ.
Tối ưu hóa

18

Befunge-98 ,5x5 = 25 5x3 = 15

1+4+2
$.@.$
3+4+4

Tôi đã viết một kịch bản nhỏ tìm thấy những con số chính xác cho tôi. Phải mất một lúc, nhưng này, tôi mới đánh bại GolfScript! : D

Các tập lệnh tôi đã sử dụng ở đâyđây , nhưng tôi không khuyên bạn nên xem chúng vì kiểu mã này cực kỳ gây ung thư.

Chương trình con

1+4+2$.@.$3+4+4   LTR-TTB   5
3+4+4$.@.$1+4+2   LTR-BTT   7
1$3+.+4@4+.+2$4   TTB-LTR   3
2$4+.+4@4+.+1$3   TTB-RTL   4
4+4+3$.@.$2+4+1   RTL-BTT   8
2+4+1$.@.$4+4+3   RTL-TTB   6
4$2+.+4@4+.+3$1   BTT-RTL   2
3$1+.+4@4+.+4$2   BTT-LTR   1

Phiên bản cũ

 1.6
3 @ 4
.@ @.
8 @ 7
 2.5

Chương trình con

Xuất ra các số 1-8 tương ứng.

 1.6 3 @ 4.@ @.8 @ 7 2.5    LTR-TTB
 2.5 8 @ 7.@ @.3 @ 4 1.6    LTR-BTT
 3.8 1 @ 2.@ @.6 @ 5 4.7    TTB-LTR
 4.7 6 @ 5.@ @.1 @ 2 3.8    TTB-RTL
 5.2 7 @ 8.@ @.4 @ 3 6.1    RTL-BTT
 6.1 4 @ 3.@ @.7 @ 8 5.2    RTL-TTB
 7.4 5 @ 6.@ @.2 @ 1 8.3    BTT-RTL
 8.3 2 @ 1.@ @.5 @ 6 7.4    BTT-LTR

14

Brainfuck $ , 4x3 = 12

Brainfuck $ rất giống với Brainfuck , nhưng có thêm một số lệnh, bao gồm lệnh xuất giá trị ô hiện tại dưới dạng đầu ra số, rất hữu ích cho thử thách này.

++:+
  ++
++++

Lệnh một dòng:

++:+  ++++++   LTR-TTB, outputs 2
++++  ++++:+   LTR-BTT, outputs 8
+ ++ +:+++++   TTB-LTR, outputs 4
+++:+++ ++ +   TTB-RTL, outputs 3
++++++  +:++   RTL-BTT, outputs 7
+:++++  ++++   RTL-TTB, outputs 1
+++++:+ ++ +   BTT-RTL, outputs 5
+ ++ +++:+++   BTT-LTR, outputs 6

Tôi cho rằng bạn không cần Brainfuck $ 's; chỉ huy. Tôi sẽ xem xét sử dụng đơn giản. và xuất 0x01-0x08 hoàn toàn hợp lệ. Đó là Brainfuck, vì (não) chết tiệt. +1.
chiến lược

Tôi sẽ ổn với đầu ra nhị phân.
captncraig 23/2/2015

7

TECO, 3 * 5 = 15

 +4 5
+2=4 
 +1 \

=in giá trị của biểu thức số cuối cùng. \được sử dụng để đọc hoặc ghi số từ các chuỗi, nhưng tôi chỉ sử dụng nó như là một loại bỏ ở đây.

  • +4 5+2=4 +1 \ 7
  • + +2+4=1 4 5 \ 6
  • + +2+1=4 4 \ 5 3
  • +1 \+2=4 +4 5 2
  • \ 1+ 4=2+5 4+ 5
  • \ 5 4 1=4+2+ + 1
  • 5 \ 4 4=1+2+ + 4
  • 5 4+ 4=2+\ 1+ số 8

7

piet - 12x12 = 144

nhập mô tả hình ảnh ở đây

Vì một chương trình một dòng không bao giờ có thể kết thúc, giả sử nó kết thúc sau đầu ra đầu tiên.

8 chương trình con trong một hình ảnh duy nhất:

nhập mô tả hình ảnh ở đây


6

GolfScript, 4 x 4 = 16

1})7
)  }
}  )
3)}5

Làm cho việc sử dụng "siêu bình luận" cũ tốt: một vô song }bỏ qua phần còn lại của mã (trong thực tế, trong trường hợp này, một nhận xét bình thường #cũng sẽ hoạt động tốt, vì tất cả các mã được chạy dưới dạng một dòng). Vì vậy, từ mỗi góc chỉ có một số duy nhất hoặc (theo hướng khác) số đó tăng thêm 1, vì việc thực thi chấm dứt và nội dung ngăn xếp được in. 8 chương trình là

1})7)  }}  )3)}5  # LTR-TTB
1)}3}  ))  }7})5  # TTB-LTR
3})1)  }}  )5)}7  # BTT-LTR
3)}5}  ))  }1})7  # LTR-BTT
5})3)  }}  )7)}1  # RTL-BTT
5)}7}  ))  }3})1  # BTT-RTL
7})5)  }}  )1)}3  # TTB-RTL
7)}1}  ))  }5})3  # RTL-BTT

5

Haskell, 26x26 = 676

Sử dụng các bình luận ( --) để ẩn các bit ngược và ngang. Điều này làm cho nó dài khủng khiếp

main=print 1--2 tnirp=niam
a                        a
i                        i
n                        n
=                        =
p                        p
r                        r
i                        i
n                        n
t                        t

3                        4
-                        -
-                        -
5                        6

t                        t
n                        n
i                        i
r                        r
p                        p
=                        =
n                        n
i                        i
a                        a
main=print 7--8 tnirp=niam

2
Dường như với tôi rằng điều này có thể được mở rộng sang hầu hết các ngôn ngữ với các bình luận nội tuyến
Sp3000

4

Mở đầu , 5x3 = 15

12 34
  !  
56 78

Điều này giả sử trình thông dịch Python , in các giá trị dưới dạng số thay vì mã ký tự.

Điều này không đánh bại Befunge $, nhưng nó đánh bại trình nộp GolfScript của tôi và tôi thích sự đơn giản của nó. Cũng lưu ý rằng nó chỉ sử dụng 9 ký tự không phải khoảng trắng, ít hơn bất kỳ ký tự nào khác cho đến nay (J lại tấn công :)). Trong Prelude, mỗi chữ số được đẩy lên ngăn xếp riêng lẻ và tùy theo đường dẫn, có một chữ số khác ngay trước chữ số !, chỉ in phần tử ngăn xếp trên cùng. 8 chương trình là:

12 34  !  56 78   LTR-TTB   4
56 78  !  12 34   LTR-BTT   8
1 52 6 ! 3 74 8   TTB-LTR   6
4 83 7 ! 2 61 5   TTB-RTL   7
87 65  !  43 21   RTL-BTT   5
43 21  !  87 65   RTL-TTB   1
8 47 3 ! 6 25 1   BTT-RTL   3
5 16 2 ! 7 38 4   BTT-LTR   2

Ngoài ra, cũng có

 1 3 
1+!+1
 5 7 

Việc đẩy các số lẻ trên các đường dẫn dọc và tăng chúng 1lên trên các đường dẫn ngang:

 1 3 1+!+1 5 7    LTR-TTB   4
 5 7 1+!+1 1 3    LTR-BTT   8
 1 1+5 ! 3+7 1    TTB-LTR   5
 1 3+7 ! 1+5 1    TTB-RTL   7
 7 5 1+!+1 3 1    RTL-BTT   6
 3 1 1+!+1 7 5    RTL-TTB   2
 1 7+3 ! 5+1 1    BTT-RTL   3
 1 5+1 ! 7+3 1    BTT-LTR   1

2

CJam - 7 × 7

Không ấn tượng, nhưng không có câu trả lời của CJam và tôi thích vẻ ngoài của nó :)

 8;];1 
7     2
;  0  ;
] 0 0 ]
;  0  ;
6     3
 5;];4 

Nó chủ yếu sử dụng thực tế là ]; xóa ngăn xếp.

Dùng thử trực tuyến


1

Hồng ngọc - 7x7

Không ấn tượng, chiến thuật tương tự như câu trả lời của Haskell.

p 1#2 p

3     7
#     #
4     8

p 5#6 p

1

R, 9x9

Không có khoảng trắng, không có bình luận.

75%%99299
99%%99699
%%299%%41
%%699%%06
995999997
11%%999%%
99%%799%%
39719%%99
59519%%16

Tôi đoán điều này có thể được mở rộng đến bất kỳ kích thước nào bạn muốn. Tôi nghĩ toán tử modulo là toán tử linh hoạt nhất trong số các toán tử khả dụng, vì nó ngăn các giá trị quá lớn bất kể kích thước dữ liệu và không có hiệu ứng nào có số lượng rất lớn ở giữa.

75%%9929999%%99699%%299%%41%%699%%0699599999711%%999%%99%%799%%39719%%9959519%%16   LTR-TTB  2
59519%%1639719%%9999%%799%%11%%999%%995999997%%699%%06%%299%%4199%%9969975%%99299   LTR-BTT  3
79%%9193559%%91999%%265%%75%%999%%1199999979999%%999%%26%%999%%99409%%9199167%%96   TTB-LTR  4
99167%%9699409%%9126%%999%%99%%999%%999999799%%999%%11%%265%%7559%%9199979%%91935   TTB-RTL  1
61%%9159599%%91793%%997%%99%%999%%1179999959960%%996%%14%%992%%99699%%9999299%%57   RTL-BTT  5
99299%%5799699%%9914%%992%%60%%996%%799999599%%999%%11%%997%%9999%%9179361%%91595   RTL-TTB  6
69%%7619919%%90499%%999%%62%%999%%9999799999911%%999%%57%%562%%99919%%9553919%%97   BTT-RTL  7
53919%%9799919%%9557%%562%%11%%999%%997999999%%999%%99%%999%%6219%%9049969%%76199   BTT-LTR  8

1

Ngôn ngữ lập trình này , 5 * 9 = 45

1i;i2
2   2
+   +
i   i
;   ;
i   i
+   +
2   2
5i;i6

Điều này chuyển thành điều này:

1i;i22   2+   +i   i;   ;i   i+   +2   25i;i6
5i;i62   2+   +i   i;   ;i   i+   +2   21i;i2
12+i;i+25i       i;       ;i       i22+i;i+26
22+i;i+26i       i;       ;i       i12+i;i+25
6i;i52   2+   +i   i;   ;i   i+   +2   22i;i1
2i;i12   2+   +i   i;   ;i   i+   +2   26i;i5
62+i;i+22i       i;       ;i       i52+i;i+21
52+i;i+21i       i;       ;i       i62+i;i+22

Kể từ khi ;chấm dứt chương trình, phần trên chuyển thành:

1i;   - outputs 1
5i;   - outputs 5
12+i; - outputs 3
22+i; - outputs 4
6i;   - outputs 6
2i;   - outputs 2
62+i; - outputs 8
52+i; - outputs 7

Giải thích: bất kỳ số nào từ 0để 9đẩy chữ số tương ứng lên ngăn xếp. +bật hai giá trị trên cùng xytắt ngăn xếp và đẩy x + ylên ngăn xếp. ixuất ra ngăn xếp dưới dạng một số nguyên.

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.