Mở ra theo mọi hướng


14

Đầu vào:

Một chuỗi

Đầu ra:

1) Trước tiên chúng ta hãy nhân vật remove ở phần cuối của đầu vào dây cho đến khi chúng tôi là trái với chiều dài đó là một hình vuông (tức là 1, 4, 9, 16, 25, 36, vv)
Vì vậy,abcdefghijklmnopqrstuvwxyz (chiều dài 26) trở thành abcdefghijklmnopqrstuvwxy( dài 25).

2) Sau đó, chúng tôi đặt cái này vào một hình vuông, mỗi dòng một dòng, từ trái sang phải:

abcde
fghij
klmno
pqrst
uvwxy

3) Chúng tôi gấp nó theo cả bốn hướng, như thế này (chúng tôi tiếp tục mở cho đến khi 'khối' được gấp bên ngoài không còn các ký tự bên trong để mở ra nữa):

      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Một số điều cần lưu ý, khi chúng ta gập ra bên ngoài, về cơ bản chúng ta phản ánh như thế này (các số được thêm vào như là sự làm rõ, đại diện cho 'chỉ mục' trong các ví dụ này):

Khi chúng ta gấp bên trái:

 123    to:   321 123
fghij         ihgf   j

Khi chúng ta gấp bên phải:

 123    to:    123 321
fghij         f   jihg

Khi chúng ta gấp lên:

            3q
            2l
            1g
  b   to:    b
 1g         1
 2l         2
 3q         3
  v          v

Khi chúng ta gập xuống:

 b          b
1g         1
2l         2
3q         3
 v   to:    v
           3q
           2l
           1g

Quy tắc thử thách:

  • Bạn có thể giả sử đầu vào sẽ luôn có ít nhất 1 ký tự (cũng sẽ là đầu ra).
  • Định dạng đầu ra là linh hoạt, vì vậy bạn có thể in sang STDOUT hoặc STDERR; trả về dưới dạng chuỗi-mảng / danh sách hoặc mảng 2D ký tự; chuỗi đơn với dòng mới; Vân vân.
  • Đầu vào sẽ chỉ chứa các ký tự chữ và số ( a-zA-Z0-9)
  • Bạn cũng có thể sử dụng ký tự không phải là chữ và số để lấp đầy khoảng trắng trong và / hoặc xung quanh đầu ra nghệ thuật ASCII, như dấu chấm . .
  • Không gian lưu trữ và một dòng mới duy nhất là tùy chọn.
  • Chúng tôi tiếp tục mở ra cho đến khi 'khối' gấp bên ngoài không còn trung tâm nào để mở ra.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

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

Input: abcdefghijklmnopqrstuvwxy
Output:
      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Input: A
Ouput:
A

Input: ThisIsATest
Output:
  I
 Thi
Is sI
 ATe
  I

Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:

               An
               ch
              xamp
              i  I
              o  E
              quar
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
            HowAbout
      oLyreVA      noLyreV
  xampl    Eg      el    Examp
hci  Is    hW      As    hi  Ihc
nAo  Ev    sl      ev    so  EnA
  quare    Sn      Ie    Squar
      Odaetsn      fOdaets
            OddOneAn
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
              xamp
              i  I
              o  E
              quar
               An
               ch

Input: Lenght7
Output:
Le
ng

Input: abc
Output:
a

có một lỗi trong bài kiểm tra "How AboutAVeryLongExampleWhichIsAlsoAnEvenSapesInsteadOfOddOneAndExceeds64Chars": 'h' -> 'i' gần cuối sản lượng
ngn

Câu trả lời:


5

SOGL V0.12 , 75 byte

l√u²m√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚

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

Điều này mong đợi đầu vào trên ngăn xếp, vì vậy để dễ sử dụng tôi đã thêm vào ,lúc bắt đầu. Điều đó có thể gây ra vấn đề nếu đầu vào chỉ chứa các số vì vậy đây là một bộ kiểm tra cho điều đó.

70 byte √lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚cũng hoạt động, nhưng bây giờ tôi chỉ thực hiện trên các chuỗi và tài liệu không đề cập rằng nó sẽ vượt quá độ dài mà tôi sẽ không đếm được.

Giải trình:

creating a square from the input

l       get the length of the input
 √      get its square root
  u     floor that
   ²    square it
    m   mold the input to that length
     √  convert it to a square

creating the unfoldings of the square - the idea is to cut out the inner squares to a new array

lH»{                              } (length-1)//2 times do
    ā;                                push an empty array below ToS
      l⁾                              push ToS.length - 2 (ToS here is the square or the previous unfolding)
        :A                            save a copy of that in the variable A
          ∫B                    }     repeat that amount of times, saving iteration on B - cutting the inner square to the empty array
            a{                 }        variable A times do
              bIw                         get the b+1th row of the previous unfolding
                 FIW                      get the (current loops iteration + 1)th character of that
                    h                     swap the 2 items below ToS - so the stack now is [..., prevUnfolding, newArray, character]
                     Fbž                  at [current loops iteration; b] insert that character in the array
                        ;                 swap the top 2 items - the stack now is [..., newArray, prevUnfolding]
                         FIbI@ž           at [current loops iteration+1; b+1] insert a space
                                 ;    get the now not empty array ontop of the stack

add the horizontal unfoldings

¹                    wrap the stack in an array
 K                   push the 1st item of that, which will function as the canvas
  ⁴{              }  iterate over a copy of the remaining items
    ē2\⌡               repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        ±                reverse the array horizontally
         e{  }         repeat e times
           @Κ            add a space before ToS
              ;⁴┼┼     add that horizontally before and after the canvas

add the veertical unfoldings

;                get the copy of the foldings above the canvas
 0E              reset the variable E to 0
   {         }   iterate the copy of the foldings
    ē2\⌡           repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        №            reverse the array vertically
         :h++      add that vertically before and after the canvas
              ╚  center the canvas vertically

Phiên bản 70 byte của bạn là hợp lệ vì không cạnh tranh không còn là một điều nữa .
Xù xì

@Shaggy Phiên bản 75 byte chỉ hợp lệ vì trước đó thử thách này chỉ hoạt động trên các con số. Lý do tại sao tôi không tính phiên bản 75 byte là vì tôi cảm thấy như nó rơi vào kẽ hở của việc thêm một tích hợp chỉ cho một thách thức
dzaima

4

Than , 120 109 byte

AI§⪪IXLθ⁰·⁵.⁰ηFη⊞υ✂θ×ιηF⁴«AυεJ⁰¦⁰F÷⁺¹η²«F⁴«F⁻η⁺κκ§§εκ⁺μκ↷A⮌EεEε§ξνε¶»A⎇﹪ι²Eε⮌λ⮌εεA⎇‹ι²⁻⁺²⁺κκη⁻η⁺κκκ¿﹪ι²Mκ¹M¹κ

Hãy thử trực tuyến! Lưu ý rằng đã được thay đổi thành và liên kết phản ánh điều này. Giải trình:

       θ          Input string
      L           Length
     X  ⁰·⁵       Raise to the power 0.5
    I             Cast to string
   ⪪       .      Split on the decimal point
  §         ⁰     Take the first element (integer part)
 I                Cast to integer
A            η    Assign to h

Tính toán h = int(sqrt(len(q))). ( Floorvẫn chưa được thực hiện ...)

Fη⊞υ✂θ×ιη

Trích xuất các hlát có độ dài htừ đầu vào. (Trên thực tế tôi không bận tâm đến việc cắt các lát theo chiều dài h.) Tôi sử dụng mộtfor vòng lặp chứ không phải là Mapvì tôi cần phải Assignkết quả của Mapmột nơi nào và đây là tầm thường khi giao dịch với một Slice.

F⁴«

Việc mở ra xảy ra 4 lần, một lần cho mỗi hướng (xuống, phải, lên, trái như được mã hóa). Biến vòng lặp cho vòng lặp này là i.

   Aυε

Lấy một bản sao của chuỗi cắt lát.

   J⁰¦⁰

Quay trở lại nguồn gốc của khung vẽ để mỗi lần mở ra bắt đầu bằng h -by- hvuông trong cùng một vị trí.

   F÷⁺¹η²«

Nói lại (h+1)/2 nhiều lần; một lần cho mỗi lần mở ra, cộng với một lần cho hình vuông ban đầu. Biến vòng lặp cho vòng lặp này là k.

          F⁴«

Lặp lại 4 lần, một lần cho mỗi bên của hình vuông chưa được mở. (Tôi không sử dụng biến vòng lặp l.)

             F⁻η⁺κκ         Loop h-2k times, loop variable `m`
                    §εκ     Take the `k`th row
                   §   ⁺μκ  Take the `k+m`th column
                            Implicitly print the character

In một mặt của hình vuông mở ra. Vì đây là phần kmở ra, cạnh của hình vuông h-2kvà đưa các ký tự kra khỏi cạnh của hình vuông ban đầu.

Xoay sẵn sàng để in mặt tiếp theo của hình vuông.

               Eε       Map over the array (element `m`, index `n`)
                 Eε     Map over the array (element `x`, index `p`)
                   §ξν  Take the `n`th element of `x`
              ⮌         Reverse
             A        ε Replace the array with the result

Xoay chuỗi thái lát. (Vâng, đó là một ξ. Tôi không được sử dụng nó thường xuyên!) EηCũng sẽ hoạt động cho bên ngoài Map. Xoay cũng có tác dụng phụ thuận tiện là cắt bớt chiều rộng của mảng thành h.

             ¶»

Sau khi in mặt, con trỏ di chuyển khỏi cạnh của hình vuông. In ít hơn một ký tự cho các ô vuông bên 1 và dù sao cũng ít chơi gôn hơn. Đã xoay vòng trước đó, in một dòng mới thuận tiện di chuyển con trỏ trở lại góc.

            ﹪ι²         Take `i` modulo 2
           ⎇            Choose either
                   ⮌ε   Reverse the array
               Eε       Map over the array (element `l`, index `m`)
                 ⮌λ     Reverse each element
          A          ε  Replace the array with the result

Lật hình vuông theo chiều dọc hoặc chiều ngang cho phù hợp.

           ⎇‹ι²                 If `i` < 2
                  ⁺κκ           Double `k`
                ⁺²              Add 2
               ⁻     η          Subtract `h`
                        ⁺κκ     Else double `k`
                      ⁻η        Subtract from `h`
          ≔                κ    Assign back to `k`.

Tính toán độ dịch chuyển để mở ra tiếp theo.

           ﹪ι²          Take `i` modulo 2
          ¿             If not zero
              Mκ¹       `k` across and 1 down
                 M¹κ    Else 1 across and `k` down

Di chuyển theo chiều ngang hoặc chiều dọc để mở ra tiếp theo khi thích hợp.

Đây là một liên kết đến phiên bản 97 byte có được bằng cách sử dụng tất cả các tính năng mới nhất của Char than bao gồm Floor: Dùng thử trực tuyến! Liên kết là phiên bản dài dòng của mã.


Bạn có chắc chắn điều này hoạt động? TIO dường như chỉ đưa ra một lỗi.
LyricLy

@LyricLy Bah, tôi nghĩ rằng tôi đã thông minh, nhưng không thực sự kiểm tra xem nó có hoạt động không. Tôi sẽ hoàn nguyên thay đổi.
Neil

1
Crap đã quên làm cho phao hoạt động trong các lát cắt
ASCII - chỉ

@ ASCII-only Không giúp tôi, tôi cần cắt ngắn thành số nguyên trước khi nhân.
Neil

Đúng. Chà, tôi sẽ thêm sàn sớm nên sẽ không có vấn đề gì nhiều: P
ASCII - chỉ
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.