Các nhân vật trong chuỗi đi vòng và vòng


23

(Lấy cảm hứng từ một dự thảo ban đầu về thử thách đường gãy của PhiNotPi's .)

Bạn được cung cấp chiều rộng W > 1, chiều cao H > 1và chuỗi bao gồm2(W+H-2) ký tự ASCII có thể in được. Nhiệm vụ là in chuỗi này quấn quanh một hình chữ nhật có chiều rộng và chiều cao cho trước, bắt đầu ở góc trên cùng bên trái, theo chiều kim đồng hồ. Hình chữ nhật bên trong chứa đầy không gian. Các trường hợp thử nghiệm hy vọng sẽ làm cho điều này rất rõ ràng.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và in kết quả sang STDOUT (hoặc thay thế gần nhất) hoặc trả về dưới dạng chuỗi.

Không được có khoảng trắng ở đầu hoặc cuối (ngoài các khoảng trắng có thể có trong chuỗi đầu vào). Bạn có thể tùy ý xuất một dòng mới duy nhất.

Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.

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

Mỗi trường hợp thử nghiệm được "String" W Htheo sau bởi đầu ra dự kiến.

"Hello, World! "
5 4
Hello
    ,
!    
dlroW

"+--+|||+--+|||"
4 5
+--+
|  |
|  |
|  |
+--+

">v<^"
2 2
>v
^<

"rock beats scissors beats paper beats "
11 10
rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 

Note that the following string contains an escaped '"'.
"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
46 3
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~                                            O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes


8
Bảng xếp hạng của bạn rất tuyệt
Alex A.

2
Bạn đã đánh golf kịch bản bảng xếp hạng của bạn?
mbomb007

2
@ mbomb007 Không, tôi đã chạy mã thông qua các công cụ khai thác, vì vậy nó sẽ không chiếm nhiều dung lượng khi được mở rộng. (Tôi đoán loại bỏ ngắt dòng là đủ.) Tôi vẫn có một phiên bản chưa hoàn thành trên ổ cứng.
Martin Ender

2
Nếu bạn đổi tên này thành "The Chars in the String Go Round and Round", nó phù hợp với nhịp điệu của bài hát hơn.
Justin

Câu trả lời:


9

CJam, 27 byte

Nl~:L/(os\2-{)L2-S*@(N@}*W%

Tôi không thực sự là CJam, nhưng tôi nghĩ điều này đánh bại Martin. Sự khác biệt chính là chúng tôi đẩy một dòng mới trước khi đọc đầu vào và in dòng đầu tiên ngay lập tức, phủ nhận sự cần thiết phải lưu trữ chiều cao.

Đưa đầu vào theo thứ tự

H "String" W

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


10

Python 2, 95 byte

s,m,n=input()
print s[:n]
for i in range(m-2):print s[~i]+' '*(n-2)+s[n+i]
print s[1-m::-1][:n]

In dòng đầu tiên, sau đó là hai dòng dọc, sau đó là dòng cuối cùng.

Phải có một cái gì đó ngắn hơn viết printba lần, nhưng tất cả mọi thứ tôi đã cố gắng lưu vào một biến và '\n'.joinđã dài hơn.


Bạn có thể chuyển sang Python 3 và lưu trữ bản in trong một biến ...
Omar

1
@Omar Điều đó sẽ kéo dài hơn bởi vì bạn phải sử dụng evaltrên đầu vào và đóng khung các câu lệnh in.
FryAmTheEggman 13/03/2015

Ồ, tôi đã không tính evalđến! Dấu ngoặc đơn không nên có quá nhiều vấn đề vì printtrong Python 2 cần một khoảng trắng sau nó. Đi từ print blahđể p(blah)vẫn tiết kiệm 3 ký tự.
Omar

9

CJam, 31 tuổi 30 byte

Với sự nhấn mạnh của Trình tối ưu hóa, đây là nỗ lực của riêng tôi. Tôi không phải là người thích chiến thắng các thử thách của riêng mình, vì vậy tôi đang đếm gia đình APL (hoặc ai đó giỏi hơn ở CJam) để đánh bại điều này. ;)

l~:H;:V/(N@s{)V2-S*@(N@}H2-*W%

Đưa đầu vào theo thứ tự như được đưa ra trong câu hỏi:

"Hello, World! " 5 4

Kiểm tra nó ở đây.

Một byte được lưu nhờ Trình tối ưu hóa.

Giải trình

Ban đầu, tôi có một ý tưởng thực sự hay khi bắt đầu với hình chữ nhật của các khoảng trắng và sau đó quấn chuỗi xung quanh nó theo nghĩa đen trong khi xoay toàn bộ lưới bốn lần. Tuy nhiên, tôi dường như không thể làm cho nó hoạt động trong trường hợp chiều rộng hoặc chiều cao hoặc cả hai 2. Vì vậy, tôi đã thử cách tiếp cận ngây thơ (in trên cùng, vòng qua hai bên, in dưới cùng), và đáng ngạc nhiên là nó thực sự ngắn.

l~                             "Read and evaluate the input.";
  :H;                          "Store the height in H and discard it.";
     :V/                       "Store the width in V and split the input into chunks of size V.";
        (N                     "Slice off the first such chunk and push a newline.";
          @s                   "Pull up the other chunks and join them back together.";
            {          }H2-*   "Repeat this block H-2 times, printing the sides.";
             )                 "Slice off the last character of the string.";
              V2-S*            "Push V-2 spaces.";
                   @(          "Pull up the remaining string and slice off the first character.";
                     N@        "Push a newline and pull up the remaining string.";
                            W% "Reverse the remainder of the string, which is the bottom row.";

Bởi vì chúng ta có thể có được độ dài của chuỗi và chúng ta có V, không cần phải lưu H. Chỉ cần lặp lại khối cho đến khi chỉ còn lại các ký tự V. l~;:V/(N@s{)V2-S*@(N@_,V-}gW%tiết kiệm 1 char.
DocMax 13/03/2015

@DocMax Thật không may, điều đó không hiệu quả đối với chiều cao 2. Mặc dù vậy, đó là một ý tưởng hay, tôi sẽ xem xét liệu tôi có thể sử dụng nó theo một cách khác không.
Martin Ender

Ôi! Bạn thậm chí đã đề cập đến vấn đề H = 2 và tôi vẫn quên bảo vệ chống lại nó.
DocMax

9

Pyth, 47 46 45 40 37 36 byte

Đây là cách tiếp cận rõ ràng được thực hiện trong Pyth. Nó in dòng đầu tiên bằng cách lập chỉ mục0:width và sau đó là giữa, sau đó là kết thúc.

Cảm ơn @Jakube về mẹo sử dụng zQcho hai đầu vào và sử dụng p.

AkYQ<zkV-Y2p*d-k2@zt_N@z+kN;<_<z-2Yk

Lấy đầu vào từ stdin dưới dạng một chuỗi và dưới dạng một bộ kích thước, dòng mới được tách ra:

Hello, World! 
5, 4

và viết lên thiết bị xuất chuẩn.

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

A              Double assignment
 kY            The vars k and Y
 Q             The dimension tuple
<zk            Prints out first line by doing z[:width]
V-Y2           For N in height-2
 p             Print out everything
  *d           Repeat " "
   -k2         Width-2 times
  @z           Index z
   -_N1        At index -N-1
  @z           Index z
   +kN         At index k+N
;              Close out loop
<_<z-2Yk       Print last line

Sử dụng zđể đọc chuỗi tiết kiệm khá nhiều ký tự. Cũng t_Nlà điều tương tự như -_N1.
Jakube

37 ký tự có thể với cách tiếp cận của chúng tôi.
Jakube 13/03/2015

@Jakube cảm ơn vì lời khuyên!
Maltysen 13/03/2015

Thêm một tiết kiệm char. Thay vì ++sử dụng pvà chuyển đổi zt_Nvới *d-k2.
Jakube

5

J, 61 byte

Phương pháp:

Bắt đầu từ một (height-2)*(width-2)khối khoảng trắng, chúng ta lấy số lượng ký tự cần thiết từ cuối chuỗi và thêm nó vào khối hiện tại. Chúng tôi lặp lại điều này 4 lần. Tổng số 5 trạng thái được minh họa bằng 'Hello, World! ' 5 4ví dụ (khoảng trắng được thay thế bằng Xs để dễ đọc):

XXX   !_   orld   ,_W   Hello
XXX   XX   XXX!   XXo   _XXX,
      XX   XXX_   XXr   !XXX_
      XX          XXl   dlroW
                  _!d   

Mật mã:

4 :'|:>{:((}.~{:@$);({.~{:@$)|.@|:@,])&>/^:4(|.x);'' ''$~y-2'

Định nghĩa hàm rõ ràng. Hàm hai toán hạng lấy một chuỗi làm đối số bên trái và danh sách hai số nguyên làm đối số bên phải.

Ví dụ sử dụng:

   wrap_on=.4 :'|:>{:((}.~{:@$);({.~{:@$)|.@|:@,])&>/^:4(|.x);'' ''$~y-2'

   'Hello, World! ' wrap_on 5 4
Hello
    ,
!    
dlroW

   '>v<^' wrap_on 2 2
>v
^<

Hãy thử trực tuyến tại đây.


Ồ, tôi rất ấn tượng vì nó hoạt động cho chiều rộng và chiều cao 2 trong J.
Martin Ender

4

Bình dương, 38 37

AGHQ<zGFNC,_>z_ttH>zGj*dttGN)<>_zttHG

Ban đầu tôi có một giải pháp 38 khác nhau, nhưng về cơ bản, đó là giải pháp đánh gôn của Maltysen. Vì vậy, tôi quyết định đi một chút khác nhau.

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

              implicit: z=string from input, Q=pair of numbers from input
AGHQ          G=Q[0] (width), H=Q[1] (height)
<zG           print z[:G]
    _>z_ttH     last H-2 chars reversed
    >zG         all chars from the Gth position to end
  C,           zip these 2 strings to pairs
FN            for each pair N:
  j*dttGN       seperate the two chars by (G-2) spaces and print
)             end for
<>_zttHG     print last line z[::-1][H-2:][:G]

_>z_ttHtương đương với <_zttH.
isaacg

@isaacg Cảm ơn, đã thấy một cái gì đó tương tự trong câu trả lời của Maltysen.
Jakube

4

JavaScript (ES6), 110 115

Hàm có 3 tham số, trả về một chuỗi

F=(s,w,h,q=h+(w-=2),t=b='')=>
[for(c of s)q?t+=q<h?c+'\n'+s[w+h+w+q--]+' '.repeat(q&&w):(b+=s[w+q--],c):q]
&&t+b

Chrome phiên bản 119 : không có định dạng ngắn cho các chức năng, không có tham số mặc định. Không có lý do để sử dụng for(of)ngay cả khi nó được hỗ trợ

function F(s,w,h){
  for(q=h+(w-=2),t=b=i='';
      q;
      q<h?t+='\n'+s[w+h+w+q--]+' '.repeat(q&&w):b+=s[w+q--])
    t+=s[i++];
  return t+b
}

ES5 phiên bản 126 : không cho (của), không có chuỗi. Hoàn thành

function F(s,w,h){
  for(q=h+(w-=2),t=b=i='';
      q;
      q<h?t+='\n'+s[w+h+w+q--]+Array(q&&-~w).join(' '):b+=s[w+q--])
    t+=s[i++];
  return t+b
}

Bị đánh cắp

F=(s,w,h)=>
{
  var q = h+(w-=2), // middle length 
      t = '', // top and body
      b = ''; // bottom row
  for(c of s)
    if (q > 0)
    {
      if (q < h)
      {
        t += c+'\n'; // right side, straight
        t += s[w+h+w+q]; // left side, backwards 
        if (q > 1) // body fill, except for the last line
          t += ' '.repeat(w)
      }
      else
      {
        t+=c, // top, straight
        b+=s[w+q] // bottom, backwards
      }
      --q
    }
  return t+b

Kiểm tra trong bảng điều khiển Firefox / FireBug

;[["Hello, World! ", 5, 4],["+--+|||+--+|||",4,5],[">v<^",2,2]
,["rock beats scissors beats paper beats ",11,10]
,["!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",46,3]]
.forEach(test => console.log(F(...test)))

Đầu ra

Hello
    ,
!    
dlroW

+--+
|  |
|  |
|  |
+--+

>v
^<

rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 

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

3

Python 2, 97 byte

def f(s,w,h):print s[:w];i=0;exec'print s[~i]+" "*(w-2)+s[w+i];i+=1;'*(h-2);print s[1-h:w+h-3:-1]

Lấy cách tiếp cận trực tiếp.


3

Haskell, 164 156 byte

import Data.List
r=replicate
p w h(s:t)=unlines$fst$n$n$n$n(r h$r w ' ',(w,h,s:t++[s]))
n(_:b,(w,h,s))=(transpose$map reverse$(take w s):b,(h,w,drop(w-1)s))

Hàm pkhông in đầu ra, nhưng trả về dưới dạng chuỗi, ví dụ p 4 5 "+--+|||+--+|||"-> "+--+\n| |\n| |\n| |\n+--+\n". Để sử dụng màn hình tốt hơn putStr:

putStr $ p 4 5 "+--+|||+--+|||"

+--+
|  |
|  |
|  |
+--+

Cách thức hoạt động: Tôi tạo một khối wx hkhông gian và thay thế dòng đầu tiên bằng đầu chuỗi đầu vào. Sau đó, tôi xoay khối ngược chiều kim đồng hồ và lặp lại thay thế dòng đầu tiên ba lần nữa.

Để ngăn việc cắt lại ký tự đầu tiên sau lượt 4, tôi nối nó vào chuỗi đầu vào trước khi bắt đầu.

"Hello World" example, 5 x 4


         |  Start               Turn #1          Turn #2     Turn #3   Turn #4
---------+--------------------------------------------------------------------
String   |  "Hello, World! H"   "o, World! H"    "World! H"  "d! H"    ""
left     | 
         |
Block    |  <empty>             Hello            o, W        World     d! H
before   |                                       l                     l  e
rotating |                                       l           ,         r  l
         |                                       e           olleH     o  l
         |                                       H                     W ,o

Chỉnh sửa: tìm thấy một cách tốt hơn để giải quyết vấn đề giới hạn đầu tiên-sau-lần-sau-lượt-4.


Thật tuyệt ... điều này tương tự như những gì tôi đã thử ở CJam, ngoại trừ nó hoạt động. ;)
Martin Ender

3

Bản ghi, 62 byte

Điều này tất nhiên sử dụng mã thông báo nhị phân, nhưng nó tương đương với:

/Courier findfont setfont

0 h moveto

s [
    w {1 0} repeat pop pop
    h {0 -1} repeat pop pop
    w {-1 0} repeat pop pop
    h {0 1} repeat
] xyshow

Đây là một hexdump của tệp ( xxd round.ps):

0000000: 91c7 9243 9295 3020 6892 6b73 5b77 7b31  ...C..0 h.ks[w{1
0000010: 2030 7d92 8392 7592 7568 7b30 202d 317d   0}...u.uh{0 -1}
0000020: 9283 9275 9275 777b 2d31 2030 7d92 8392  ...u.uw{-1 0}...
0000030: 7592 7568 7b30 2031 7d92 835d 92c3       u.uh{0 1}..]..

Chạy như:

gs -dw=11 -dh=10 -ss="rock beats scissors beats paper beats " round.ps

Đầu ra thực sự rất nhỏ (kết quả của việc không thu nhỏ phông chữ), vì vậy bạn cần phóng to một chút công bằng để xem nó.

Điều này lợi dụng xyshowtoán tử để viết ra chuỗi bằng cách sử dụng các khoảng cách ký tự tùy chỉnh. Trong trường hợp này, tôi sử dụng khoảng cách dọc âm để viết xuống, sau đó không gian ngang âm để viết ngược, sau đó là không gian dọc dương để viết lên trên. Vì điều này, tôi không cần sử dụng bất kỳ loại thao tác chuỗi nào.


3

> <>, 82 80 + 3 = 83 byte

:2-&\
v!?:<oi-1
/?(0:i
\~ao{2-{~}
\{:?!v1-}o&:&
>:?v!~{{o}ao4.
^  >" "o1-
o;!?l<

Trang Esolang cho> <> (Cá)

Điều này hóa ra là ngắn hơn tôi mong đợi. Nó sử dụng cách tiếp cận đơn giản là in dòng đầu tiên, sau đó các cột được đệm với các khoảng trắng ở giữa, sau đó là dòng cuối cùng.

Nhập chuỗi qua STDIN và chiều cao và chiều rộng qua dòng lệnh với -vcờ, như vậy:

py -3 fish.py round.fish -v <height> <width>

Giải trình

:2-&           Put W-2 in the register
:?!v1-io       Directly print the first W characters of the input
i:0(?/         Read the rest of the input
~ao{2-{~}      Pop a few leftovers 0s from above, decrement H by 2 and print a newline
               Stack now consists of H = H-2 at the bottom and the rest of the input reversed

[loop]

{:?!v          If H is 0...
  ~                Pop the 0
  l?!;o            Print the rest of the (reversed) input

               Otherwise...
  1-}              Decrement H
  o                Output the top of stack
  &:&              Copy I = W-2 from the register
  :?               If I is nonzero...
    " "o1-             Print a space and decrement I, then repeat from the previous line
  {{o}ao           Print the bottom input character and output a newline
  4.               Jump to the start of the loop (note that I = 0 is leftover from above)

2

Bash + coreutils, 124

Một kịch bản shell để giúp bạn bắt đầu:

echo "${3:0:$1}"
fold -1<<<"${3:$1*2+$2-2}"|tac|paste - <(fold -1<<<"${3:$1:$2-2}")|expand -t$[$1-1]
rev<<<"${3:$1+$2-2:$1}"

Truyền đầu vào dưới dạng đối số dòng lệnh:

$ ./roundnround.sh 5 4 "Hello, World! "
Hello
    ,
!    
dlroW
$ 

2

JavaScript, 161 160 158 byte

Phương pháp mà tôi đã nghĩ ra quá lâu, nhưng ồ, đó là thực hành. (Ngoài ra, tôi đã nhận nó để đánh vần r+o[u]+'\n':d.)

function f(o,w,n){s=o.slice(0,w)+'\n';o=o.slice(w);n-=2;r='';for(u=w-2;u--;)r+=' ';for(u=d=0;d=o[2*n+w+~u],u<w+n;u++)s+=(u<n)?(d||' ')+r+o[u]+'\n':d;return s}

Đối với đầu vào không có nghĩa là đầu ra không được xác định (theo nghĩa đen và một loạt các lần), nhưng nó hoạt động cho tất cả các trường hợp thử nghiệm.


slicengắn hơn substr, nó không hoàn toàn giống nhau nhưng trong trường hợp này bạn có thể sử dụng nó
edc65

2

Groovy, 140

f={a,x,y->println a.substring(0,x);(1..y-2).each{println a[a.length()-it]+' '*(x-2)+a[it+x-1]}println a.substring(x+y-2,2*x+y-2).reverse()}

gọi điện:

f('rock beats scissors beats paper beats ',11,10)

đầu ra:

rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 

2

K, 55 54 byte

Sử dụng phương pháp tương tự như triển khai J của Randomra; Bắt đầu với một khối khoảng trắng và thêm từ đuôi chuỗi vào cạnh trong khi xoay bốn lần:

f:{`0:*4{((,r#*|x),|:'+*x;(r:-#*x)_*|x)}/((y-2)#" ";x)}

Và một số ví dụ:

  f["Hello,_World!_";4 5]
Hello
_   ,
!   _
dlroW

  f[">v<^";2 2]
>v
^<

Phá vỡ nó một chút để dễ đọc,

Tạo khối NxM:

  t:2 3#!6
(0 1 2
 3 4 5)

Xoay 90 độ bằng cách sử dụng chuyển vị (+ ) và đảo ngược mỗi ( |:'):

  |:'+t
(3 0
 4 1
 5 2)

Vì vậy, nếu chúng ta có một khối các không gian tvà một chuỗis , chúng ta có thể thêm vào trước một lát đuôi của sđể t:

  s: 12 18 17 8 9
12 18 17 8 9
  (,(-#t)#s),|:'+t
(8 9
 3 0
 4 1
 5 2)

Chúng tôi sử dụng biểu mẫu 4 {[x] ... }/( ... )để liên tục áp dụng một hàm cho một bộ bao gồm chuỗi và ma trận chúng tôi đang xây dựng. Mỗi lần chúng ta thực hiện bước xoay và nối này, chúng ta cũng cắt chuỗi.

chỉnh sửa:

Một ý tưởng khác là thử chia chuỗi đầu vào thành các đoạn mà chúng ta muốn ở mỗi vòng quay, điều này giúp đơn giản hóa phần chính của chương trình. Thật không may, điều này làm việc dài hơn một chút ở 56 byte:

f:{`0:((y-2)#" "){|:'(,y),+x}/(+\(0,y[0 1 0]-2 1 1))_|x}

Nếu có cách tốt hơn để tính các điểm phân chia đó, tôi sẽ mở các đề xuất.

chỉnh sửa2:

Sắp xếp lại một chút cho phép tôi loại bỏ một cặp dấu ngoặc đơn. 54 byte!

f:{`0:((y-2)#" "){|:'(,y),+x}/(0,+\y[0 1 0]-2 1 1)_|x}

2

K, 80 68 byte

f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}

Rút ngắn từ 80 nhờ @JohnE.

Nguyên:

f:{s:x;n:z;`0:(,s@!n),({s[(#s)+-2-x],({" "}'!n-2),s@n+x}'!y-2),,(|s@!-4+#s)@!n}

Tôi hầu như không biết làm thế nào điều này hoạt động.

Ví dụ sử dụng:

f["Hello, world! ";5;4]

Có một số tối ưu hóa có thể, nhưng tôi tiếp tục tạo ra Kona segfault ...


Bạn có thể cải thiện điều này một chút bằng cách sử dụng 'lấy' (dyadic #) và danh sách đối số rõ ràng : f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}. 68 ký tự của tôi.
JohnE 15/03/2015

@JohnE Cảm ơn! Tôi biết về danh sách đối số rõ ràng, nhưng bằng cách nào đó nó đã trượt tâm trí của tôi; Tôi không có manh mối về dyadic #, mặc dù.
kirbyfan64sos

2

R, 178

Đây là một hàm không tên lấy s, w, htham số. Tôi ước có một cách tốt hơn để chia chuỗi.

function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')}

Bị đánh cắp

W=w+h-1;                                 # additional index points
H=w+W-1;                                 # additional index points
S=strsplit(s,'')[[1]];                   # vectorize the string
O=array(" ",c(h,w+1));                   # create an array of spaces
O[,w+1]="\n";                            # set newlines
O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);    # build middles lines
O=t(O);                                  # transpose array
O[1:w,c(1,h)]=c(S[1:w],S[H:W]);          # build top and bottom lines
cat(O,sep='')                            # cat out results

Chạy thử nghiệm

> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("Hello, World! ",5,4)
Hello
    ,
!    
dlroW
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("+--+|||+--+|||",4,5)
+--+
|  |
|  |
|  |
+--+
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})(">v<^",2,2)
>v
^<
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("rock beats scissors beats paper beats ",11,10)
rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb
> # Escaped the \ as well 
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",46,3)
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~                                            O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP
> 

2

T-SQL, 307

Mặc dù vẫn còn dài khủng khiếp, nhưng điều này hóa ra lại dễ dàng hơn một chút (và ngắn hơn) so với tôi nghĩ trong một truy vấn. Được triển khai như một hàm nội tuyến có giá trị cho T-SQL.

CREATE FUNCTION f(@S VARCHAR(MAX),@ INT,@H INT)RETURNS TABLE RETURN WITH R AS(SELECT 2i,LEFT(@S,@)S,STUFF(@S,1,@,'')+'|'R UNION ALL SELECT i+1,CASE WHEN i<@H THEN LEFT(RIGHT(R,2),1)+REPLICATE(' ',@-2)+LEFT(R,1)ELSE REVERSE(LEFT(R,@))END,STUFF(STUFF(R,LEN(R)-1,1,''),1,1,'')FROM R WHERE i<=@H)SELECT S FROM R

Điều này đệ quy thông qua chuỗi @h lần. Clip đệ quy đầu tiên @W ký tự từ chuỗi. Các lần truy cập ở giữa lấy chuỗi cuối cùng và đầu tiên từ chuỗi còn lại với phần đệm chuỗi giữa. Đệ quy cuối cùng đảo ngược những gì còn lại. Có một vài ký tự bị mất xử lý cách SQL Server xử lý các khoảng trắng ở VARCHARS.

Chạy thử nghiệm

WITH TestSet AS (
    SELECT *
    FROM (VALUES
        ('Hello, World! ',5,4),
        ('+--+|||+--+|||',4,5),
        ('>v<^',2,2),
        ('rock beats scissors beats paper beats ',11,10),
        ('!"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~andfoure',50,3)
        ) Test(S,W,H)
)
SELECT x.S 
FROM TestSet 
    CROSS APPLY (
        SELECT S FROM dbo.F(S,W,H)
        )x

S
----------------------------
Hello
    ,
!    
dlroW
+--+
|  |
|  |
|  |
+--+
>v
^<
rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR
e                                                S
ruofdna~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUT

(24 row(s) affected)


2

MATLAB, 101

function f(H,W,S)
w=1:W;h=(0:H-3).';n=W+H-2;S(3*n)=' ';S([w;[2*n-h,3*n*ones(H-2,W-2),h+W+1];n-w+W+1])

1

C ++, 398 byte

Trình biên dịch được sử dụng - GCC 4.9.2 với -std=c++14cờ

#include<bits/stdc++.h>
using namespace std;string s;vector<vector<char>> M;int w,h,p,i,j;void F(int x,int y){if(p<s.size()&&(((!y||y==h-1)&&x>=0&&x<w)||((!x||x==w-1)&&y>=0&&y<h))&&!M[y][x])M[y][x]=s[p++],F(x+1,y),F(x,y+1),F(x-1,y),F(x,y-1);}int main(){getline(cin,s);cin>>w>>h;M.resize(h,vector<char>(w,0));F(0,0);while(i<h){j=0;while(j<w){if(!M[i][j])M[i][j]=32;cout<<M[i][j++];}i++;cout<<endl;}}

Kiểm tra nó ở đây.

Giải trình

#include<bits/stdc++.h>
using namespace std;

string s; // input string
vector<vector<char>> M; // output matrix
int w, h, p, i, j;
// w = width
// h = height
// p = iterator over s
// i, j = iterators used later for printing answer

void F( int x, int y )
{
    // If the coordinates (x, y) are either on the first row/column or the last row/column and are not already populated with the input characters, populate them
    if ( p < s.size() && ( ( ( y == 0 || y == h - 1 ) && x >= 0 && x < w ) || ( ( x == 0 || x == w - 1 ) && y >= 0 && y < h ) ) && !M[y][x] )
    {
        M[y][x] = s[p++];
        F( x + 1, y );
        F( x, y + 1 );
        F( x - 1, y );
        F( x, y - 1 );
    }
}

int main()
{
    getline( cin, s );
    cin >> w >> h;
    // Input taken !!

    M.resize( h, vector<char>( w, 0 ) ); // Fill the matrix with null characters initially

    F( 0, 0 ); // This function does all the work

    // Now printing the matrix
    while ( i < h )
    {
        j = 0;
        while ( j < w )
        {
            if ( !M[i][j] )
            {
                M[i][j] = ' ';  // Replace '\0' with ' '
            }
            cout << M[i][j++];
        }
        i++;
        cout << endl;
    }

}

Bạn không thể lưu các ký tự bằng cách sử dụng char[][]thay thế?
corsiKa

Không, vector<vector<char>> M;M.resize(h,vector<char>(w,0));ngắn hơn một chút so vớichar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Anmol Singh Jaggi

1

Perl, 193 195 byte

($s,$w,$h,$i,$y)=(@ARGV,0,2);
$o.=substr$s,$i,$w;
$i+=$w;
$o.=sprintf"\n%s%*s",substr($s,2*($w+$h)-$y++-3,1)||' ',$w-1,substr($s,$i++,1)while$y<$h;
print$o."\n".reverse(substr($s,$i,$w))."\n";

Tôi chắc chắn rằng điều này có thể được cải thiện rất nhiều. Tôi là người mới. >, <


0

Java 11, 180 byte

(s,w,h)->{var r=s.substring(0,w)+"\n";int i=w;for(var S=s.split("");i<w+h-2;)r+=S[3*w+2*h-i-5]+" ".repeat(w-2)+S[i++]+"\n";return r+new StringBuffer(s.substring(i,i+w)).reverse();}

Dùng thử trực tuyến (LƯU Ý: String.repeat(int)được mô phỏng làrepeat(String,int) cho cùng một số byte, vì Java 11 chưa có trên TIO.)

Giải trình:

(s,w,h)->{               // Method with String & 2 int parameters and String return-type
  var r=s.substring(0,w)+"\n";
                         //  Result-String, starting at the the first row of output,
                         //  which is a substring in the range [0, `w`)
  int i=w;               //  Index-integer, starting at `w`
  for(var S=s.split(""); //  Split the input-String into a String-array of characters
      i<w+h-2;)          //  Loop `i` in the range [`w`, `w+h-2`)
    r+=                  //   Append the result-String with:
       S[3*w+2*h-i-5]    //    The character at index `2*w+2*h-4 - i+w-1`
       +" ".repeat(w-2)  //    Then append `w-2` amount of spaces
       +S[i++]           //    Then append the character at index `i`
       +"\n";            //    And a trailing new-line
  return r               //  After the loop, return `r` as result
         +new StringBuffer(s.substring(i,i+w)).reverse();
                         //  Appended with the last row of output,
                         //  which is a substring in the range [`i`, `i+w`) reversed

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.