Mê cung Inscriptio


22

Tại nơi chôn cất của Vua Silo của Asturias, có một dòng chữ ghi chữ SILO PRINCEPS FECIT ( Vua Silo đã làm điều này ).

QUẦN ÁO SILO

Chữ cái đầu tiên được tìm thấy ở giữa, và từ đó người ta đọc bằng cách đi theo bất kỳ hướng không chéo nào tỏa ra bên ngoài. Bức thư cuối cùng được tìm thấy trên tất cả bốn góc. Trong thử thách này, bạn sẽ khái quát quy trình để thực hiện chúng.

Đầu vào

Một chuỗi ( hoặc tương đương ) và một số nguyên. Bạn có thể đưa ra các giả định sau về đầu vào:

  • Chuỗi sẽ có độ dài lẻ.
  • Số nguyên sẽ là một số lẻ trong khoảng từ 1 đến một nhỏ hơn hai lần chiều dài của chuỗi.

Đầu ra

Một mê cung inscriptio cho chuỗi, sử dụng số nguyên cho chiều cao hoặc chiều rộng (xem mô hình cho các ví dụ về chiều cao). Đầu ra phải là mỗi chữ cái không có dấu cách, ngắt dòng làm mặc định cho hệ thống / ngôn ngữ của bạn.

Các trường hợp thử nghiệm

Lưu ý rằng đầu vào 1 hoặc (chiều dài * 2 - 1) sẽ dẫn đến một bảng màu ngang hoặc dọc.

 Input: FOO, 3    Input: BAR, 1    Input: BAR, 3    Input: BAR, 5

Output: OOO      Output: RABAR    Output: RAR       Output: R
        OFO                               ABA               A
        OOO                               RAR               B
                                                            A
                                                            R

 Input: ABCDE, 5   Input: ABCDE, 3   Input: *<>v^, 5

Output: EDCDE     Output: EDCBCDE           ^v>v^
        DCBCD             DCBABCD           v><>v
        CBABC             EDCBCDE           ><*<>
        DCBCD                               v><>v
        EDCDE                               ^v>v^

Chấm điểm

Đây là để câu trả lời ngắn nhất trong byte thắng. Sơ hở tiêu chuẩn bị cấm.



Đầu vào có thể chứa không gian? Nếu vậy, họ nên được xử lý như thế nào?
Nitrodon

1
Chúng tôi có thể lấy đầu vào như một danh sách các nhân vật?
Robin Ryder

1
@Charlie rõ ràng bạn đã bỏ lỡ tất cả các câu trả lời Perl6 của tôi :-) Tôi cũng mong chờ câu trả lời từ bạn vì nó được truyền cảm hứng bởi vị vua thứ năm của Tây Ban Nha (tốt, của Astories, nhưng Astories ye España, y tolo demás ye tierra conquistao haha)
user0721090601

1
Chúng ta có thể lấy chiều rộng thay vì chiều cao?
attinat

Câu trả lời:


6

J , 27 byte

([{~]+/&(|@i:)#@[-1+])-:@<:

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

Một ví dụ sẽ làm rõ cách tiếp cận cấp cao.

Xem xét 'ABCDE' f 3

Chúng tôi nhận thấy rằng những gì chúng tôi tìm kiếm chỉ đơn giản là bảng "bổ sung chéo" 1 0 13 2 1 0 1 2 3, trông giống như thế này:

4 3 2 1 2 3 4
3 2 1 0 1 2 3
4 3 2 1 2 3 4

Sau đó chúng tôi kéo các chỉ mục đó từ chuỗi ban đầu : [{~.

Tất cả phần còn lại của mã chỉ là số học nhàm chán và việc sử dụng i:để xây dựng các đối số 1 0 13 2 1 0 1 2 3.


6

Thạch , 12 byte

Uṡṛ‘HɗŒBŒḄZY

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

Một liên kết dyadic lấy chuỗi làm bên trái và chiều cao của nó làm đối số bên phải của nó. Trả về một chuỗi có ngắt dòng. Nếu danh sách các chuỗi được chấp nhận cho đầu ra, tôi có thể xóa cuối cùngY lưu một byte . Điều thú vị là PRINCEPS ban đầu của SILO nhìn thấy tôi giống như nghệ thuật ASCII của một viên kim cương 3D khi tôi nhìn vào nó trên TIO.

Giải trình

U            | Reverse input
 ṡ   ɗ       | All overlapping substrings of the length given by:
  ṛ          | - The right argument
   ‘         | - Incremented by 1
    H        | - Halved
      ŒB     | Concatenate to the reverse, keeping a single copy of the last character (so creating a palindrome)
        ŒḄ   | Do the same, but this time using the lists of characters generated by the last atom
          Z  | Transpose
           Y | Join with newlines

2
Tôi nhấp vào thử nó chỉ để xem và vâng, thực sự, nó làm 3D. Lạ nhưng ngầu.
user0721090601

6

R , 93 91 87 byte

-2 byte nhờ Giuseppe. -4 byte bằng cách nhập chiều rộng thay vì chiều cao, như được OP cho phép.

function(s,W,w=W%/%2,h=length(s)-w-1)write(s[1+outer(abs(-w:w),abs(-h:h),`+`)],1,W,,"")

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

Đưa đầu vào như một vector của các ký tự. Phần quan trọng là s[1+outer(abs(-w:w),abs(-h:h),'+')].

wh(2w+1)×(2h+1)

(tôi,j)1+|tôi-h|+|j-w|abs(-w:w)abs(-h:h)abs(-h:h)[h,h-1,h-2,Giáo dục,2,1,0,1,2,Giáo dục,h-1,h]outer(abs(-2:2), abs(-1:1), '+')

32123
21012
32123

(sau đó chúng ta cần thêm 1 vì R là 1 chỉ mục.) 0 ở giữa là nơi mà chữ cái đầu tiên của đầu vào sẽ đi.

Phần còn lại là định dạng.


5

Than , 25 19 byte

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η‖O←↑

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η

Vẽ một phần tư của dòng chữ.

‖O←↑

Phản ánh để hoàn thành các dòng chữ.


1
Ấn tượng! Tôi mới vào trang web, tôi xin lỗi trước nếu những câu hỏi sau đây là một vài câu hỏi ngớ ngẩn.1. Đó chắc chắn là 19 ký tự, nhưng chúng cũng là 19 byte? 2. Trong mã hóa văn bản nào sẽ mất 19 byte?
damix911

Vâng, được mã hóa trong UTF-8, điều này sẽ mất 19 ký tự , nhưng thực sự là 51 byte. Với UTF-16, điều này vẫn mất 39 byte để mã hóa.
ruohola

1
@ damix911 Than có mã hóa riêng, có thể tìm thấy trên wiki của nó. Tôi nghĩ rằng các ký tự bên ngoài trang mã có giá 3 byte. Deverbosifier cố gắng tính toán độ dài chính xác nhưng nó không bận tâm đến việc mã hóa thành mã hóa thực sự, điều này gây khó chịu.
Neil

1
@Neil Okey, có vẻ hợp pháp!
ruohola

3

Japt -R , 19 16 byte

z
ò@VÔtXUaVÊ)êÃê

Thử nó

z\nò@VÔtXUaVÊ)êÃê     :Implicit input of integer U & string V
z                     :Floor divide U by 2
 \n                   :Reassign result to U
   ò                  :Range [0,U]
    @                 :Map each X
     VÔ               :  Reverse V
       tX             :  Substring from index X to index ...
         Ua           :    Absolute difference between U and ...
           VÊ         :    Length of V
             )        :  End substring
              ê       :  Palindromise
               Ã      :End map
                ê     :Palindromise
                      :Implicit output, joined by newlines

2

Ngôn ngữ Wolfram (Mathicala) , 57 54 byte

(g=Reverse@Rest@#~Join~#&)@BlockMap[g,#,⌈#2/2⌉,1]&

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

Lấy chiều rộng làm đầu vào.


1
@lirtosiast thì lần đầu tiên gkhông được đánh giá lần đầu tiên hàm được gọi. Hãy thử trực tuyến!
attinat

Thật thú vị, bất kỳ ý tưởng tại sao nó xuất hiện để làm việc khi bạn sử dụng @@ hoặc @@@?
lirtosiast

@lirtosiast Nó nghĩ Print/@f[...]-> Print/@Transpose[g[...]]-> Transpose[Print@g[...]], theo thời gian gđược xác định.
attinat

2

Japt -R , 10 byte

Ôã°Vz)mê ê

Lấy chiều rộng thay vì chiều cao.

Thử nó

Mã giả (U là chuỗi, V là số nguyên):

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize

Tốt đẹp! Không bao giờ xảy ra với tôi để cố gắng xây dựng nó đi ngang.
Xù xì


2

Python 3, 104 byte

Tôi đã không chơi golf quá lâu ... Tôi chắc chắn điều này có thể ngắn hơn.

Chi tiết

Mã này xác định một hàm lấy hai đối số (chuỗi và chiều cao) và đưa ra kết quả trên đầu ra tiêu chuẩn.

Chỉ số vào chuỗi là khoảng cách Manhattan từ trung tâm của lưới. Đối với một lưới có chiều rộng wvà chiều cao h, khoảng cách cho ô (x, y)abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2).

Chiều rộng của lưới phải sao cho khoảng cách Manhattan của các góc (giả sử (0, 0)) nhỏ hơn một chiều dài của chuỗi. Thay thế(0, 0) vào đó và đơn giản hóa, chúng tôi thấy rằng chiều rộng chỉ đơn giản là2 * len(s) - h .

def b(s,h):
 w=2*len(s)-h
 for y in range(h):print(''.join(s[abs(x-w//2)+abs(y-h//2)]for x in range(w)))

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



1

Bình thường , 19 byte

L+_btbjyyM.:Q-lQ/E2

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

L+_btbjyyM.:Q-lQ/E2   Implicit: Q=string, E=height
L                     Define a function, y(b):
  _b                    Reverse b
 +  tb                  Append all be first element of b
                      y is now a palindromisation function
              lQ      Length of Q
             -  /E2   Subtract floored division of E by 2
          .:Q         All substrings of Q with the above length
        yM            Palindromise each substring
       y              Palindromise the set
      j               Join on newlines, implicit print



1

C # (.NET Core) , 146 byte

s=>n=>{int w=s.Length*2-n,i=0,j;var r=new char[n,w];for(;i<n;i++)for(j=0;j<w;)r[i,j]=s[System.Math.Abs(n/2-i)+System.Math.Abs(w/2-j++)];return r;}

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

Câu trả lời dài nhất rất lâu. :-) Nó sử dụng khoảng cách Manhattan đến trung tâm của quảng trường. Phải có một cách ngắn hơn, mặc dù.


1

Tcl , 188 170 162 byte

{{w s} {join [lmap C [lrepeat $w string] {join [$C reverse [set y [$C range $s [set x [expr abs($w/2+1-[incr i])]] end-[expr $w/2-$x]]]][$C range $y 1 end]}] \n}} bytes

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

Dường như có một triệu cách tồi tệ để giải quyết vấn đề này trong TCL. Đây không phải là tồi tệ nhất của họ.

Đã lưu tối thiểu 18 byte bằng cách chuyển đổi sang lambda (có thể tiết kiệm thêm tới 13 byte nếu giá trị trả về của danh sách các dòng được chấp nhận)

Đã lưu thêm 8 vì trình lặp lmap được dùng như một hằng số bổ sung


1

Tranh sơn dầu , 18 byte

±X↕┌L╵┌-Y{x;1y1@]┼

Hãy thử nó ở đây!

Canvas không làm lớp nền, vì vậy tôi cần coi nó như một đối tượng nghệ thuật và có được phần phụ theo cách đó. Tôi cảm thấy như thế này tốn của tôi 2 byte, nhưng này, bạn có thể làm gì.

Có vẻ như điều này thực sự không hoạt động như tôi nghĩ: Các chức năng palindromize của Canvas phản chiếu một số ký tự nhất định (ví dụ V được nhân đôi theo chiều dọc trở thành ^), và tôi không thể vô hiệu hóa chính xác điều đó ... ồ, tôi đoán vậy


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.