Diamondize Một số văn bản


20

Đưa ra một chuỗi đầu vào có độ dài 2hoặc dài hơn chỉ bao gồm các ký tự chữ cái [A-Z]hoặc [a-z](lựa chọn của bạn nếu chúng đều là chữ hoa hoặc chữ thường), xuất ra một chuỗi ký tự liên tục tạo thành một mẫu kim cương kép.

Chuỗi đầu vào bắt đầu trên đường trung tâm và kéo dài xuống bên phải theo đường chéo cho đến khi kết thúc chuỗi đầu vào. Sau đó, mẫu tiếp tục hướng lên và sang phải theo đường chéo cho đến khi bạn ở xa đường trung tâm bằng độ dài của chuỗi đầu vào trừ đi 1. Tiếp tục đi xuống và quay lại phải vào đường giữa, rồi xuống và trái, sau đó lên và xuống (đi "phía sau" nhân vật trung tâm), và cuối cùng trở xuống và quay lại trái với nhân vật bắt đầu.

Điều đó hơi dài dòng và được thể hiện tốt hơn bằng một số ví dụ:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

Xem cách YOUbắt đầu tại đường trung tâm và theo dõi từ dưới sang phải, sau đó lên và phải, v.v., cho đến khi vòng lặp trở lại từ đầu. Đặc biệt lưu ý cách phần Ytrên và bên trái "phía sau" Ovà do đó không được hiển thị.

Một số ví dụ khác:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

  • Đầu vào và đầu ra có thể được đưa ra bởi bất kỳ phương pháp thuận tiện .
  • Đầu vào được đảm bảo dài ít nhất hai chữ cái (nghĩa là bạn sẽ không bao giờ nhận được ""dưới dạng đầu vào).
  • Bạn có thể in nó sang STDOUT hoặc trả lại dưới dạng kết quả chức năng.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Bất kỳ số lượng khoảng trắng bên ngoài nào cũng được chấp nhận, miễn là các ký tự xếp hàng một cách thích hợp (ví dụ: hãy thoải mái đệm như một hình chữ nhật).
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Không chắc chắn rằng nó quan trọng, thực sự, nhưng tại sao đường chuyền thứ hai (lên trái) lại đi sau đường chuyền thứ nhất (lên phải)? Làm cho cảm giác ít trực quan hơn và cũng hơi khó chịu khi bỏ qua hoặc vẽ lại bức thư đó.
BradC

2
@BradC Tôi đang chơi với dải Mobius ở bàn làm việc khi tôi gặp thử thách, và dải này đi "phía sau", vậy đó là lý do. Không có lý do khác.
admBorkBork

Có thể là một ý tưởng để bao gồm một "bản vẽ" của đường dẫn bằng cách sử dụng các ký tự mũi tên, để giúp chúng ta hình dung nó.
Xù xì

@Shaggy Thêm một bản vẽ.
admBorkBork

Đẹp một, Cái này thách thức hơn cái nhìn đầu tiên ..
booshlinux

Câu trả lời:


10

Than , 17 byte

GH<↗↘>↖↙LθθGH<Lθθ

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:

GH

Vẽ dọc theo một con đường.

<↗↘>↖↙

Vẽ theo hướng ( <>là tốc ký cho hai cặp đó, nhưng các cặp khác không có tốc ký.)

Lθ

Mỗi đoạn đường dẫn có cùng độ dài, bao gồm các đầu, chiều dài của đầu vào.

θ

Sử dụng đầu vào là văn bản được viết dọc theo đường dẫn.

GH<Lθθ

In hai phần đầu của đường dẫn một lần nữa để ký tự ở giữa là chính xác.


3
Thử thách này có vẻ được thiết kế riêng cho Char than
Jonah

@Jonah Đáng buồn thay, lệnh đường dẫn văn bản không vẽ ký tự cuối cùng nếu đường dẫn bị đóng, vì vậy bạn không thể sử dụng thủ thuật vẽ ngược ở đây. (Mặc dù nếu có, dù sao nó cũng sẽ có cùng số byte, vì xoay chuỗi có giá 6 byte.)
Neil

9

05AB1E , 12 byte

gIR7._•Íη•Λ

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

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 

Ý bạn là 1, 3, 3, 1, 7, 5, 5, 7sao
Neil

Oh bạn nói đúng. Tôi đã trộn lẫn các con số một chút
Dorian

6

JavaScript (ES6),  157 155  154 byte

Trả về một ma trận các ký tự.

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

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

Làm sao?

nw×h

  • w= =4n-3
  • h= =2n-1

(0,n-1) và hướng về Đông Nam, cho đến khi nó trở lại vị trí ban đầu.

Chỉ số dựa trên 0 của ký tự trung tâm phải được bỏ qua trong hình dạng kim cương là:

p= =6n-6

n= =4

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

Đã bình luận

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)

Tôi có một giải pháp 136 byte lấy cảm hứng từ giải pháp của bạn, mặc dù tôi nghĩ bây giờ nó có thể đủ khác để đủ điều kiện là một câu trả lời riêng biệt.
Neil

@Neil Có lẽ bạn nên đăng nó như một câu trả lời mới.
Arnauld

3

JavaScript (ES6), 136 byte

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

Trả về một mảng hai chiều. Hoạt động bằng cách vẽ chuỗi vào mảng tính toán trực tiếp tọa độ đích làm việc ngược từ cuối để ô trung tâm được ghi đè tự động. Giải trình:

(s

Chuỗi đầu vào.

,l=s.length-1

Khoảng cách giữa "nảy", cũng bằng một nửa chỉ số hàng cuối cùng và một ít hơn chiều dài.

,z=l*4

Chỉ mục cột cuối cùng, cũng bằng một nửa chiều dài của văn bản để vẽ.

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

Mảng không gian.

,g=x=>x--

Đếm ngược từ ô cuối cùng đến ô đầu tiên.

  ?g(x

Cuộc gọi đệ quy để xử lý các ô còn lại.

    ,a[a[y=(x+l)%z]?y:z-y]

Tính hàng của ô này.

      [x>z?z+z-x:x]=s[x%-~l])

Tính cột của ô này và ký tự thuộc về đó.

  :a

Kết thúc bằng cách trả về mảng.

)=>g(z+z)

Bắt đầu ở cuối văn bản.


Đó là một điều tốt đẹp, +1
Ver Nick nói Phục hồi



0

Python 2 , 137 byte

s=input();n=len(s);m=2*n-2
for r in range(m+1):print''.join([s[[x,-8-x][(x<=m)==(m>2*r)]%n],' '][r!=(x+1-n)%m!=m-r]for x in range(4*n-3))

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

Một chương trình đầy đủ lấy một chuỗi làm đầu vào như in ra phiên bản kim cương.

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.