Viết chương trình hình vuông cho ra số lần nó đã được kiểm soát


22

Xét một khối văn bản vuông, N ký tự rộng bằng N cao, đối với một số nguyên N lẻ lớn hơn 1.

Để làm ví dụ, hãy để N = 5 và văn bản là:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Lưu ý rằng đây là bảng chữ cái (ngoài Z) xoắn ốc xung quanh ngược chiều kim đồng hồ từ góc dưới bên trái. Nó giống như một tấm thảm cuộn lên.

Bảng chữ cái xoắn ốc

"Bỏ kiểm soát" văn bản theo một phần tư lần lượt theo chiều kim đồng hồ để FGHIcó cùng cấp độ với ABCDEkết quả trong:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

Việc hủy đăng ký này có thể được thực hiện thêm 7 lần nữa cho đến khi văn bản là một dòng duy nhất:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Thử thách

Thách thức là viết một chương trình là một khối văn bản N × N xuất ra số lần nó đã "không được kiểm soát" trong một phần tư lượt khi nó được sắp xếp lại thành các mẫu không kiểm soát và chạy.

Thực sự có hai cuộc thi ở đây: (hy vọng nó sẽ không quá lộn xộn)

  1. Làm điều này với N. nhỏ nhất (xuống đến giới hạn N = 3)
  2. Làm điều này với N. lớn nhất (không giới hạn)

Sẽ không có câu trả lời được chấp nhận nhưng người chiến thắng trong mỗi loại này sẽ nhận được ít nhất 50 đại diện tiền thưởng từ tôi. Trong trường hợp quan hệ các câu trả lời lâu đời nhất giành chiến thắng.

Thí dụ

Nếu khối mã của bạn là

MyP
rog
ram

chạy nó như là đầu ra 0.

Đang chạy

   rM
   oy
ramgP

nên đầu ra 1.

Đang chạy

     or
ramgPyM

nên đầu ra 2.

Đang chạy

       o
ramgPyMr

nên đầu ra 3.

Cuối cùng, chạy ramgPyMronên xuất 4.

Chi tiết

  • Đầu ra phải được in ra thiết bị xuất chuẩn (hoặc thay thế gần nhất). Không có đầu vào.
  • Bạn chỉ có thể sử dụng ASCII có thể in (mã hex 20 đến 7E, bao gồm khoảng trắng) trong mã của bạn.
  • Không gian lấp đầy khoảng trống trong sắp xếp không kiểm soát. (Trừ khi bạn không điều khiển sang trái.)
  • Chỉ các sắp xếp từ hoàn toàn vuông đến phẳng hoàn toàn cần phải có đầu ra hợp lệ. Không có sự sắp xếp khác sẽ được chạy.
  • Bạn có thể không đọc nguồn của riêng bạn.
  • Bạn có thể sử dụng ý kiến.
  • N = 1 được loại trừ vì trong nhiều ngôn ngữ, chương trình 0sẽ hoạt động.
  • Nếu muốn bạn có thể bỏ qua bên trái chứ không phải bên phải. Vì vậy, ví dụ

    MyP
    rog
    ram
    

    trở thành

    Pg
    yo
    Mrram
    

    vân vân Không có không gian thêm được thêm vào khi lăn theo cách này. Các dòng chỉ kết thúc

(Liên quan: Viết chương trình hình chữ nhật cho ra số lần nó được quay )


Trước khi tôi đọc đoạn "thử thách", tôi đã mong đợi một thử thách để viết một chương trình mà bản thân nó không được kiểm soát
John Dvorak

1
Tại sao N phải lẻ?
John Dvorak

1
@JanDvorak Tôi cho rằng N không phải là số lẻ, nhưng nó làm cho các hình xoắn ốc được chuẩn hóa hơn. Vẫn như vậy nhưng cứ thoải mái đăng N = 2 dưới dạng bình luận nếu bạn tìm thấy.
Sở thích của Calvin

8
Chỉ là một ý tưởng: Việc bỏ "tấm thảm" sang phải sẽ tạo ra nhiều dòng bắt đầu bằng khoảng trắng, loại bỏ các ngôn ngữ như Python. Nếu bạn cho phép hủy đăng ký ở bên trái, sẽ không cần thêm khoảng trắng và Python (về mặt lý thuyết) là có thể.
Falko

5
Bạn có một cuốn sách ma thuật với những ý tưởng thách thức vô hạn? Làm thế nào khác để bạn tiếp tục đến với những thách thức thú vị như vậy?
Justin

Câu trả lời:


27

Golf, N <- [5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

Hoàn toàn không được kiểm soát:

],9\-#  .   .  .  . . ...

Giải trình:

  • . (nhiều lần) - nhân đôi đầu vào
  • ] - thu thập ngăn xếp thành một mảng duy nhất
  • , - lấy chiều dài của nó
  • 9\- - trừ nó từ 9
  • # - dòng bình luận

Khoảng trắng là một NOP, nhưng bất kỳ NOP nào khác cũng sẽ hoạt động tốt.

Cuộn hoàn toàn, nó sử dụng chín bản sao của đầu vào (nội dung bị bỏ qua) làm ngăn xếp; 9 - 9 = 0; nó đã không được kiểm soát.

Mỗi unroll ẩn thêm một dấu chấm (trùng lặp) phía sau bình luận, thu nhỏ ngăn xếp một lần, tăng sản lượng.

Không được kiểm soát hoàn toàn, nó chỉ sử dụng đầu vào (nội dung bị bỏ qua) làm ngăn xếp; 9 - 1 = 8; nó đã được kiểm soát 8 lần.

Cách tiếp cận tương tự hoạt động với mọi N> 4: Thay đổi 9giá trị thích hợp là 2 * N + 1, sau đó mở rộng mẫu chấm (trùng lặp) bằng cách sử dụng cùng một mẫu xoắn ốc để đảm bảo chính xác một dấu chấm được kiểm soát trong mỗi lần bỏ kiểm soát.


Chà, trừ khi ai đó tìm thấy N = 3, đây sẽ là câu trả lời chiến thắng ở cả hai loại.
Sở thích của Calvin

3
@ Calvin'sHob sở thích tôi có nên là một tinh ranh hoàn toàn và cũng đăng một giải pháp không kiểm soát? :-)
John Dvorak

Tại sao không. Một câu trả lời khác dường như không thể xảy ra: P
Sở thích của Calvin

1
Tại sao không đi cho một trong đó có thể bỏ theo cả hai hướng? :)
Beta Decay

@BetaDecay hmm ... :-)
John Dvorak

13

GolfScript, N = 4

Điều này một cuộn phải như spec ban đầu.

.. . 
...# 
.#.~
],8-

Dưới đây là các unrolls:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

Hãy thử nó ở đây


Làm thế nào bạn nghĩ về sự sắp xếp này?
tự hào

3
@proudhaskeller Sẽ tốt hơn nếu bạn không biết ...
Trình tối ưu hóa

8
Bạn đã vũ phu tìm kiếm một giải pháp?
tự hào

Thách thức đặc biệt: bạn có thể làm cho một trong số .s và #s?
John Dvorak

Tôi thích dấu vết ~. Có lẽ tôi có thể đánh cắp nó cho N = 3?
John Dvorak

9

APL, N = 3

201
340
5|0

Chưa được kiểm soát:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Hãy thử trực tuyến.

Nó tính toán phần còn lại của số đó chia cho 5. Chỉ kết quả của dòng cuối cùng được in.

APL, N = 2

⍬∞
≡0

Chưa được kiểm soát:

  ⍬
≡0∞

≡0∞⍬

Hãy thử trực tuyến.

trả về độ sâu (không bị nhầm lẫn với kích thước hoặc chiều dài) của một mảng:

  • 0không phải là một mảng. Vậy độ sâu là 0.
  • 0∞là một mảng có hai mục 0(vô cùng). Nó có độ sâu 1.
  • 0∞⍬có một mục khác , đó là một mảng trống có độ sâu 1. Vì vậy, 0∞⍬có độ sâu 2.

Hai chương trình này cũng hoạt động trong trình thông dịch trực tuyến. Tôi không chắc liệu cái sau này có đúng về mặt cú pháp không.

⍬0
≡∞


⍬¯
≡0

APL, với mọi N> = 4

Với N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Hoàn toàn không được kiểm soát:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Với N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

Hoàn toàn không được kiểm soát:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓loại bỏ một mục trong mảng. Nó cũng trả về mảng trống nếu đối số là vô hướng. được chiều dài mảng.


Có lời giải thích nào không?
tự hào

@proudhaskeller Đã chỉnh sửa.
jimmy23013

Bạn có thể lý tưởng sử dụng logic độ sâu tương tự cho bất kỳ N. Nhờ APL
Trình tối ưu hóa

@Optimizer Thật không dễ dàng gì. Những điều trước dòng cuối cùng vẫn phải được tổng hợp chính xác. Vì vậy, tôi không thể sử dụng hầu hết các chức năng hoặc các ký tự dấu chấm câu khác ()[]như chúng sẽ xuất hiện ở một số vị trí không mong muốn.
jimmy23013

Ý tôi là như: `\ n⍬⍬0 \ n≡ ∞` (Không chính xác như vậy, nhưng bạn hiểu ý)
Trình tối ưu hóa
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.