Square-unspirus chuỗi!


12

Cho một chuỗi, đầu tiên vuông nó như sau:

Đầu tiên, viết chuỗi.

abcde

Tiếp theo, viết chuỗi xoay một bên trái.

abcde
bcdea

Tiếp tục làm điều này cho đến khi bạn đã viết các dòng len (chuỗi) .

abcde
bcdea
cdeab
deabc
eabcd

Bây giờ, đọc từ chuỗi như thế này:

----+
+--+|
|+>||
|+-+|
+---+

Cung cấp cho:

abcdeabcdcbaedcbcdeabaede

In chuỗi này.

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

abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
 -> 

Hãy bình luận nếu một trường hợp thử nghiệm là không chính xác.

Hãy nhớ rằng, đây là , vì vậy mã có số byte nhỏ nhất sẽ thắng.


2
cena!sai. Nó phải phù hợp với ví dụ của bạn abcdevì cả hai đều có 5 chữ cái:cena!cenanec!anena!cec!a!
Linus

@Linus Cảm ơn bạn, tôi đã sửa nó.
Oliver Ni

Câu trả lời:


7

JavaScript (ES7), 83 80 78 77 byte

s=>s.repeat(l=s.length).replace(/./g,_=>s[(c-=--i**.5-l&1||-1)%l],c=-1,i=l*l)

Chương trình tương thích với ES3:

for(s=prompt(r=""),c=-1,l=s.length,i=l*l;i;)r+=s[(c-=l-Math.sqrt(i--)&1||-1)%l];alert(r)

Giải trình

Điều này lợi dụng thực tế là đầu ra cho ví dụ chuỗi dài 5 có thể được biểu diễn dưới dạng:

abcdeabcd cbaedcb cdeab aed e
012345678 7654321 23456 543 4

trong đó mỗi chữ số biểu thị một chỉ mục trong chuỗi (bắt đầu từ 0), điều chỉnh độ dài của chuỗi. Nói cách khác, nếu n là độ dài của chuỗi, chúng ta tăng chỉ số 2n - 1 lần, sau đó giảm nó 2 (n - 1) - 1 lần, sau đó tăng nó 2 (n - 2) - 1 lần, v.v. Điều này có thể được đơn giản hóa theo thuật toán sau:

  • Bắt đầu chỉ số i-1 .
  • Đối với mỗi số nguyên x trong phạm vi [n 2 ..1] :
    • Nếu sàn (sqrt (x)) có cùng mức chẵn (chẵn / lẻ) với n , tăng i .
    • Nếu không, giảm i .
    • Thêm ký tự tại chỉ mục i mod n vào đầu ra.

Điều này hoạt động vì sàn (sqrt (x)) chuyển đổi chẵn lẻ sau 2n - 1 lần lặp, sau đó 2 (n - 1) - 1 lần lặp, v.v.


Vô lý. Làm tốt lắm!
MayorMonty

1

Bình thường , 15 byte

.Wp.(H0_CZ.<LQU

Một chương trình lấy đầu vào của a "quoted string"và in kết quả.

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm (sửa đổi cho nhiều đầu vào).

Làm thế nào nó hoạt động

.Wp.(H0_CZ.<LQU  Program. Input: Q
            L U  Map over [0, 1, 2, 3, ..., Q-1] (implicit input):
          .< Q     Q left-shifted by that many characters
                 Call this X
.W               While
   .(H0          popping the first element of X (mutates X in-place)
  p              and printing it with no trailing newline is truthy:
         Z           X = 
        C            X transposed
       _             reversed

1

Python 2.7 (trong CMD.EXE), 91 byte

Điều này yêu cầu một thiết bị đầu cuối có backspace hoạt động ( \b) và sẽ không hoạt động trên repl.it hoặc ideone.com . Một câu lệnh in kết thúc bằng dấu phẩy phân tách đầu ra tiếp theo với khoảng trắng thay vì dòng mới hoặc trả về. Backspace cho phép chúng ta ghi đè lên không gian ngăn cách.

s=input();r=s[::-1];n=len(s)-1;i=0
while i<=n:print'\b'+s[i:]+s[:n-i]+r[i+2:]+r[:n-i],;i+=2

Python 2.7, 96 byte

Hãy thử nó trên ideone.com hoặc repl.it (cảm ơn Oliver). Đầu vào phải là một chuỗi python, ví dụ 'cena!'.

s=input();r=s[::-1];n=len(s)-1;i=0;S=''
while i<=n:S+=s[i:]+s[:n-i]+r[i+2:]+r[:n-i];i+=2
print S

Bốn lát nối bởi các vòng lặp ( s[i:], s[:n-i], r[i+2:], r[:n-i]) được lấy từ bốn cạnh của hình xoắn ốc. Ví dụ với 01234hình vuông là:

01234
12340
23401
34012
40123

Vì vậy, chúng ta lấy 01234, 0123, 210, 4321. Biến ilà chỉ số của giá trị trên cùng bên trái trong mỗi bước của quy trình. Trong vòng xoắn ốc cuối cùng, một vài lát có thể trống.


Nó có lẽ không chỉ tiết kiệm, nhưng bằng cách thay đổi để Python 3, loại bỏ các S='', print SS+=, và gói tất cả mọi thứ trước khi i+=2trong một print()tuyên bố với sep='', bạn có thể tiết kiệm 2 byte.
Kade

@Shebang Tôi không theo dõi ngay. Hãy tự thêm một câu trả lời python 3.
Linus

Bạn có thể đổi i<=nthànhn>i
Oliver Ni

Nó tiết kiệm một byte.
Oliver Ni

@Oliver, Cảm ơn ... nhưng nó không hoạt động"a string of odd length."
Linus

1

Thạch , 11 10 byte

ẋ2µṖȮṖUµÐL

Dùng thử trực tuyến! hoặc tất cả các bài kiểm tra

Làm sao?

Hình vuông không xác định là một chuỗi các lần chạy "cạnh trên cùng với cạnh phải" và "cạnh dưới cùng với cạnh trái", mỗi lần chạy ngược lại với lần chạy trước mà không có chữ cái đầu tiên và chữ cái cuối cùng là đầu vào cộng với đầu vào không có chữ cái cuối cùng (ví dụ đầu vào "abcde"có đầu ra là "abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e").

ẋ2µṖȮṖUµÐL - Main link: s                            e.g. abcde
ẋ2         - repeat s twice                          e.g. abcdeabcde
  µ    µ   - monadic chain separation
        ÐL - repeat until results are no longer unique:
   Ṗ       -     remove the last character                abcdeabcd / cbaedcb / cdeab / aed / e   / ""
    Ȯ      -     print z (with no linefeed) and return z
     Ṗ     -     remove the last character                abcdeabc  / cbaedc  / cdea  / ae  / ""  / ""
      U    -     reverse                                  cbaedcba  / cdeabc  / aedc  / ea  / ""  / "" <- no longer unique.

1

05AB1E, 12 byte

2×[DõQ#¨D?¨R

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

Giải trình:

 2×[DõQ#¨D?¨R
               # Implicit input
 2×            # Repeat twice
   [           # Begin infinite loop
┏>  DõQ#       # If empty string, break
┃       ¨      # Remove last character
┃        D     # Duplicate
┃         ?    # Print with no newline and pop
┃          ¨   # Remove last character
┃           R  # Reverse
┗━━━━━━━━━━━━┛ # Implicit end infinite loop


0

C, 95 94 byte

i,j,k,l;f(char*s){for(k=-1,l=i=strlen(s);i--;)for(j=i*2;~j--;putchar(s[(k+=(l-i)%2*2-1)%l]));}

Lấy cảm hứng từ câu trả lời @ETHproductions.


0

Perl, 99 byte

$_=<>;
chop;
@a=split//;
print(@a[$%,(@f=1-($b=@a-$%)..$b-3),$b-1?$b-2:(),reverse@f]),$%+=2 until$%>@a

Khoảng trắng không phải là một phần của chương trình và được cung cấp để dễ đọc.

Mã không cực kỳ hiệu quả. Tôi có thể rút ngắn ba dòng đầu tiên bằng cách nào đó, nhưng mọi thứ tôi đã cố gắng làm đều thất bại. Toán tử ternary đó cũng cần phải được sửa bằng cách nào đó, nhưng có nó theo cách này giúp rút ngắn mã của tôi bằng 10 byte vì tôi có thể cắt ra rất nhiều.

Mã này hoạt động bằng cách biên dịch một danh sách các palindromes, được phân tách bằng các số chẵn, đại diện cho các giá trị vị trí của chuỗi được kéo.


Bạn có thể sử dụng -F sẽ thay thế dòng 1 và 3. Cung cấp đầu vào echo -nđể loại bỏ chop. (điều đó sẽ giúp bạn có được khoảng 81 byte)
Dada

0

Trên thực tế , 21 13 byte

Thuật toán này phần lớn dựa trên câu trả lời Jelly của Jonathan Allan . Có hai cách để in kết quả dưới dạng một chuỗi. Cách tiếp cận được sử dụng ở đây sao chép một bước trung gian và sau đó thêm nó vào tổng số đang chạy trong thanh ghi 1 (một chuỗi trống theo mặc định); ;╕trong hàm, sau đó ở cuối Cách tiếp cận khác là sao chép một bước trung gian, để lại các bước trùng lặp đó trên ngăn xếp và tổng hợp chúng thành một chuỗi ở cuối; ;trong chức năng, sau đó ở cuối

Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

2*`dX;╕dXR`Y╛

Ungolfing

         Implicit input s.
2*       Push a string that repeats s two times.
`...`Y   Call the following function until there is no change from the last call
  dX       Discard the last element. Call this new string m.
  ;╕       Duplicate m and add it to the running total in register 1.
  dXR      Discard the last element again and reverse the string.
╛        Push the unspiralled string from register 1 to the stack.
         Implicit return.

0

Python 3, 59 byte

x=input()*2
while x:x=x[:-1];print(x,end='');x=x[:-1][::-1]

thay thế

Một cổng trực tiếp của câu trả lời Jelly của tôi ; chỉ một chương trình đầy đủ lấy đầu vào (chứ không phải là một chức năng).
Đây print(x,end='')là một câu lệnh in sẽ không in dòng mới mặc định.


-1

Python 3, 93 byte

s=input();r,n,i=s[::-1],len(s)-1,0
while n-i:print(s[i:]+s[:n-i]+r[i+2:]+r[:n-i],end='');i+=2

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


Thay vì print(...,end=''), hãy làmprint(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
FlipTack

1
Dù sao, giải pháp này không hiệu quả abcde, ecuối cùng nó vẫn thiếu .
FlipTack

Hãy thử i<=nthay vì n-iđiều kiện của bạn.
Linus
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.