Snakify một chuỗi


35

Một chuỗi snakified trông như thế này:

T AnE eOf ifi ing
h s x l A k e r
isI amp Sna dSt

Nhiệm vụ của bạn

Lấy một chuỗi svà một kích thước n, sau đó xuất chuỗi snakified. Các đầu vào ThisIsAnExampleOfaSnakifiedString3sẽ tạo ra ví dụ trên.

Thông số kỹ thuật

  • s sẽ chỉ chứa các ký tự ASCII giữa các điểm mã 33 và 126 (không bao gồm dấu cách hoặc dòng mới).
  • s sẽ dài từ 1 đến 100 ký tự.
  • nlà một số nguyên biểu thị kích thước của từng đoạn chuỗi đầu ra. Mỗi dòng ký tự (lên / xuống hoặc trái / phải) tạo nên các đường cong trong "con rắn" là các nký tự dài. Xem các trường hợp thử nghiệm cho ví dụ.
  • n sẽ bao gồm từ 3 đến 10.
  • Chuỗi đầu ra luôn bắt đầu hướng xuống dưới.
  • Không gian lưu trữ trên mỗi dòng được cho phép.
  • Trailing newlines ở cuối đầu ra cũng được cho phép.
  • Không gian hàng đầu không được phép.
  • có nghĩa là mã ngắn nhất trong byte thắng.

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

a 3

a

----------

Hello,World! 3

H Wor
e , l
llo d!

----------

ProgrammingPuzzlesAndCodeGolf 4

P  ngPu  Code
r  i  z  d  G
o  m  z  n  o
gram  lesA  lf

----------

IHopeYourProgramWorksForInputStringsWhichAre100CharactersLongBecauseThisTestCaseWillFailIfItDoesNot. 5

I   gramW   tStri   100Ch   gBeca   CaseW   DoesN
H   o   o   u   n   e   a   n   u   t   i   t   o
o   r   r   p   g   r   r   o   s   s   l   I   t
p   P   k   n   s   A   a   L   e   e   l   f   .
eYour   sForI   Which   cters   ThisT   FailI

----------

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 10

!        <=>?@ABCDE        `abcdefghi
"        ;        F        _        j
#        :        G        ^        k
$        9        H        ]        l
%        8        I        \        m
&        7        J        [        n
'        6        K        Z        o        ~
(        5        L        Y        p        }
)        4        M        X        q        |
*+,-./0123        NOPQRSTUVW        rstuvwxyz{

Tôi đoán thử thách tiếp theo sẽ là chuyển đổi một chuỗi snakified trở lại 2 tham số ban đầu ...
abligh

@ableigh Tôi không có kế hoạch gì thêm, nhưng đó thực sự có vẻ là một ý tưởng hay. Có thể có một số hình thức trùng lặp, vì vậy tôi cần kiểm tra trước. Hãy theo dõi!
dùng81655

thử thách ngược sẽ vui hơn nếu con rắn có thể có hình dạng tùy ý ...
abligh

@abligh Đó chính xác là những gì tôi đã dự định làm haha!
dùng81655

@ableigh Xong!
dùng81655

Câu trả lời:


9

Pyth, 48 45 44 43 42 byte

=Y0juXGZX@G~+Z-!J%/HtQ4q2J~+Y%J2@zHlzm*;lz

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

Cách tiếp cận này thực hiện lạm dụng khoảng trắng tương tự như câu trả lời của Ruby.


3
Vượt qua 44 vẫn là 44 ... vẫn còn.
Arcturus

12

Ruby, 87 byte

->s,n{p=0
a=(' '*(w=s.size)+$/)*n
w.times{|i|a[p]=s[i];p+=[w+1,1,-w-1,1][i/(n-1)%4]}
a}

Một số lạm dụng quy tắc nhỏ Trailing spaces on each line are allowed.Mỗi dòng đầu ra wdài ký tự, cộng với một dòng mới, trong đów độ dài của chuỗi gốc, tức là đủ dài để giữ toàn bộ đầu vào. Do đó có khá nhiều khoảng trắng không cần thiết ở bên phải cho lớn n.

Ungolfed trong chương trình thử nghiệm

f=->s,n{
  p=0                            #pointer to where the next character must be plotted to
  a=(' '*(w=s.size)+$/)*n        #w=length of input. make a string of n lines of w spaces, newline terminated
  w.times{|i|                    #for each character in the input (index i)
    a[p]=s[i]                    #copy the character to the position of the pointer
    p+=[w+1,1,-w-1,1][i/(n-1)%4] #move down,right,up,right and repeat. change direction every n-1 characters
  }
a}                               #return a

puts $/,f['a',3]

puts $/,f['Hello,World!',3]

puts $/,f['ProgrammingPuzzlesAndCodeGolf',4]

puts $/,f['IHopeYourProgramWorksForInputStringsWhichAre100CharactersLongBecauseThisTestCaseWillFailIfItDoesNot.',5]

puts $/,f['!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~',10]

7

JavaScript (ES6), 143 byte

(s,n)=>[...s].map((c,i)=>(a[x][y]=c,i/=n)&1?y++:i&2?x--:x++,a=[...Array(n--)].map(_=>[]),x=y=0)&&a.map(b=>[...b].map(c=>c||' ').join``).join`\n`

Trường hợp \nđại diện cho một dòng mới theo nghĩa đen. Ung dung:

function snakify(string, width) {
    var i;
    var result = new Array(width);
    for (i = 0; i < width; i++) result[i] = [];
    var x = 0;
    var y = 0;
    for (i = 0; i < string.length; i++) {
       result[x][y] = string[i];
       switch (i / (width - 1) & 3) {
       case 0: x++; break;
       case 1: y++; break;
       case 2: x--; break;
       case 3: y++; break;
    }
    for (i = 0; i < width; i++) {
        for (j = 0; j < r[i].length; j++) {
            if (!r[i][j]) r[i][j] = " ";
        }
        r[i] = r[i].join("");
    }
    return r.join("\n");
}

7

Pyth, 85 74 59 byte

Kl@Q0J0=Y*]d-+*@Q1K@Q1 1FNr1@Q1=XY-+*KNN1b;VK=XYJ@@Q0N=+J@[+K1 1-_K1 1).&3/N-@Q1 1;sY

=G@Q1=H@Q0KlHJ0=Y*]dt+*GKGFNr1G=XYt+*KNNb;VK=XYJ@HN=+J@[hK1t_K1).&3/NtG;sY

Klz=Ym;+*QKQVQ=XYt+*KhNhNb;VK=XYZ@zN=+Z@[hK1_hK1).&3/NtQ;sY

Cảm ơn @FryAmTheEggman đã giúp tôi rất nhiều!

Chơi golf nhiều nhất có thể. Hãy thử nó ở đây! Đối với một số lý do, gói dòng làm cho đầu ra kỳ lạ. Bạn có thể muốn xem đầu ra trên toàn trang

Giải trình

Hít một giây, và tập trung. Điều này có thể được chia thành ba phần, giống như hầu hết mọi thuật toán "cổ điển".

Phần đầu tiên

Đó là nơi các biến được khởi tạo. Nó có thể được chia thành hai phần:

Klz=Ym;+*QKQ
Klz                Assign len(input[0]) to K. (length of input String)
   =Ym;+*QKQ       Assign an empty list to Y of length K*input[1]-input[1]-1, where input[1] is the size of the snake 
                   (thus the height of the final string)

phần thứ hai :

VQ=XYt+*KhNhNb;
VQ                       For N in range(0, input[1]), where input[1] is the size of the snake 
  =                        Assign to Y. Y is implicit, it is the last variable we used.
   XYt+*KhNhNb               Y[K*N+N-1]="\n". Can be broken down in four parts :
   X                           Replace function. X <A: list> <B: int> <C: any> is A[B]=C
    Y                          A: The array we initialized in the first section.
     t+*KhNhN                  B: K*(N+1)+N+1 (N is the for loop variable)
             b                 C: Newline character ("\n")
              ;          End the loop.

Phần thứ hai

Nó chứa logic thực tế.

VK=XYZ@zN=+Z@[hK1_hK1).&3/NtQ;
VK                                         For N in range(0, K), where K is the length of the input string (see first section)
  =                                          Assign to Y. Y is implicit, it is the last variable we used.
   XYZ@zN                                    Same as in section 2. This is a replacement function. Y[Z] = input[0][N]. Z is initially 0.
         =+Z@[hK1_hK1).&3/NtQ                Again this can be broken down :
         =+Z                                   Add to Z
             [hK1_hK1)                         Array containing directions. Respectively [K+1, 1, -K-1, 1]
            @         .&3/NtQ                  Lookup in the array, on index .&3/N-@Q1 1:
                      .&3                        Bitwise AND. .& <int> <int>
                         /NtQ                    (input[1]-1)/N, where input[1] is the size of the snake
                             ;             End the loop

Phần thứ ba

Đây là phần đầu ra. Không thực sự thú vị ...

sY    Join the array Y. Implicitly print.

THƯỞNG

Tôi đã viết chương trình pyth từ kịch bản python này.

input=["ThisIsAnExampleOfASnakifiedString", 4];
width=len(input[0]);
height=input[1];
pointer=0;
directions = [width+1,1,-width-1,1] #Respectively Down, right, up, right (left is replaced by right because of snake's nature. Doesn't go left).
output=[' ' for i in range(0, width*height+height-1)];
for N in range(1, height):
    output[width*N+N-1]="\n";
for N in range(0, len(input[0])):  
    output[pointer]=input[0][N];
    pointer+=directions[3&(N/(height-1))];
print "".join(output);

5

JavaScript (ES6), 122 byte

document.write("<pre>"+(

// --- Solution ---
s=>n=>[...s].map((c,i)=>(a[p]=c,p+=[l+1,1,-l-1,1][i/n%4|0]),p=0,a=[...(" ".repeat(l=s.length)+`
`).repeat(n--)])&&a.join``
// ----------------

)("IHopeYourProgramWorksForInputStringsWhichAre100CharactersLongBecauseThisTestCaseWillFailIfItDoesNot.")(5))

Thuật toán tương tự như câu trả lời của @ LevelRiverSt.


4

C, 138 byte

char*h[]={"\e[B\e[D","","\e[A\e[D",""},t[999];i;main(n){system("clear");for(scanf("%s%d",t,&n),--n;t[i];++i)printf("%c%s",t[i],h[i/n%4]);}

Điều này sử dụng thoát ANSI. Hoạt động trong thiết bị đầu cuối linux.

Ung dung:

char*h[]={"\e[B\e[D","","\e[A\e[D",""},
    /* cursor movement - h[0] moves the cursor one down and one left,
    h[2] moves the cursor one up and one left. */
t[999];i;
main(n){
    system("clear");
    for(scanf("%s%d",t,&n),--n;t[i];++i)
        printf("%c%s",t[i],h[i/n%4]);
}

1

JavaScript (ES6), 131

Thuật toán: lập bản đồ vị trí x,yở đầu ra cho các chỉ số trong chuỗi đầu vào, bằng cách nào đó như này (không liên quan) câu trả lời.

Tôi đã mượn từ @LevelRiverSt mẹo giữ chiều rộng ngang bằng với chiều dài đầu vào.

a=>m=>eval('for(--m,t=y=``;y<=m;++y,t+=`\n`)for(x=0;a[x];)t+=a[2*(x-x%m)+((h=x++%(2*m))?h-m?!y&h>m?h:y<m|h>m?NaN:m+h:m-y:y)]||`.`')

Ít chơi gôn

Đây là dự thảo làm việc đầu tiên trước khi chơi golf

f=(a,n)=>{
  l=a.length
  m=n-1
  s=m*2 // horizontal period

  b=-~(~-l/s)*m // total horizontal len, useless in golfed version
  t=''
  for(y=0;y<n;y++)
  {
    for(x=0;x<b;x++)
    {
      k = x / m | 0
      h = x % s
      if (h ==0 )
        c=k*s+y
      else if (h == m)
        c=k*s+m-y
      else if (y == 0 && h>m)
        c=k*s+h
      else if (y == m && h<m)
        c=k*s+m+h
      else
        c=-1
      t+=a[c]||' '
    }
    t+='\n'
  }
  return t
}  

Kiểm tra

F=a=>m=>eval('for(--m,t=y=``;y<=m;++y,t+=`\n`)for(x=0;a[x];)t+=a[2*(x-x%m)+((h=x++%(2*m))?h-m?!y&h>m?h:y<m|h>m?NaN:m+h:m-y:y)]||` `')

function test()
{
  var n=+N.value
  var s=S.value
  O.textContent=F(s)(n)
}  

test()
#S {width:80%}
#N {width:5%}
<input id=N value=5 type=number oninput='test()'>
<input id=S 5 oninput='test()'
value='IHopeYourProgramWorksForInputStringsWhichAre100CharactersLongBecauseThisTestCaseWillFailIfItDoesNot.'>
<pre id=O></pre>


0

Bình, 122 byte

=k@Q0J-@Q1 1K*4J=T*@Q1[*lkd;Vlk=Z+*%NJ/%N*J2J*/N*J2J=Y.a-+**/%N*J2J!/%NK*J2J*%NJ!/%N*J2J**!/%N*J2J/%NK*J2J XTYX@TYZ@kN;jbT

Tôi đã thực hiện một công thức để tính toán vị trí x, y của từng ký tự dựa trên kích thước phân đoạn / modulo, nhưng chúng lớn hơn tôi mong đợi: c

Giải trình:

=k@Q0                                                                                                                     # Initialize var with the text
     J-@Q1 1                                                                                                              # Initialize var with the segment size (minus 1)
            K*4J                                                                                                          # Initialize var with the "block" size (where the pattern start to repeat)
                =T*@Q1[*lkd;                                                                                              # Initialize output var with an empty array of strings
                            Vlk                                                                                           # Interate over the text
                               =Z+*%NJ/%N*J2J*/N*J2J                                                                      # Matemagics to calculate X position
                                                    =Y.a-+**/%N*J2J!/%NK*J2J*%NJ!/%N*J2J**!/%N*J2J/%NK*J2J                # Matemagics to calculate Y position
                                                                                                          XTYX@TYZ@kN;    # Assign the letter being iterated at x,y in the output
                                                                                                                      jbT # Join with newlines and print the output

Kiểm tra tại đây

Đối với các công thức Toán học, tôi đã sử dụng mod để tạo các cờ 0/1 và sau đó nhân với một yếu tố dựa trên đầu vào n, thêm bảng tính với mỗi bước trên đoạn trích dưới đây


Bạn có thể giải thích về MHRagics? tức là viết chúng theo cách thời trang hơn con người?
FliiFe

@FliiFe thực hiện c:
Rod

0

PHP, 127 126 124 120 119 118 117 110 106 byte

Sử dụng mã hóa ISO-8859-1.

for(;($q=&$o[$y+=$d]||$q=~ÿ)&&~Ï^$q[$x+=!$d]=$argv[1][$a];$a++%($argv[2]-1)?:$d-=-!$y?:1)?><?=join(~õ,$o);

Chạy như thế này (chỉ -dthêm tính thẩm mỹ):

php -r 'for(;($q=&$o[$y+=$d]||$q=~ÿ)&&~Ï^$q[$x+=!$d]=$argv[1][$a];$a++%($argv[2]-1)?:$d-=-!$y?:1)?><?=join(~õ,$o);' "Hello W0rld!" 3 2>/dev/null;echo

Ung dung:

// Iterate over ...
for (
    ;
    // ... the characters of the input string. Prepend `0` so a 0 in the input
    // becomes truthy.
    0 . $char = $argv[1][$a];

    // Use modulo to determine the end of a stretch (where direction is
    // changed).
    // Change direction (`0` is right, `-1` is up and `1` is down). When
    // y coordinate is `0`, increment the direction, else decrement.
    $a++ % ($argv[2] - 1) ?: $direction += $y ? -1 : 1
)

    (
        // Increase or decrease y coordinate for direction -1 or 1 respectively.
        // Check whether the array index at new y coordinate is already set.
        $reference =& $output[$y += $direction] ||
        // If not, create it as a string (otherwise would be array of chars).
        // Null byte, won't be printed to prevent leading char.
        $reference = ~ÿ;

        // Increment x coordinate for direction 0. Set the output char at the
        // current coordinates to the char of the current iteration.
    ) & $reference[$x += !$direction] = $char;

// Output all lines, separated by a newline.
echo join(~õ, $output);

Tinh chỉnh

  • Đã lưu một byte bằng cách sử dụng <thay vì!=
  • Đã lưu 2 byte bằng cách đặt chuỗi thành 0lúc đầu, vì vậy tôi không phải trả trước một chuỗi khác 0(trong trường hợp đầu ra đầu tiên trong một dòng là a 0), mang lại sự thật 00.
  • Đã lưu 4 byte bằng cách sử dụng tham chiếu thay vì lặp lại $o[$y]
  • Đã lưu một byte bằng cách sử dụng modulo thay vì ==so sánh hướng với 1 để thay đổi tọa độ x
  • Đã lưu một byte bằng cách loại bỏ kiểu truyền nullsang phần intbù chuỗi, vì phần bù chuỗi được truyền sang int
  • Đã lưu một byte bằng cách sử dụng thẻ in ngắn
  • Đã lưu 7 byte bằng cách cải thiện logic hướng
  • Đã lưu 4 byte bằng cách gán trực tiếp char để ngăn chặn trung gian $c
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.