Персонажи в строке идут по кругу


23

(Вдохновлено ранним проектом проблемы фрактальной линии PhiNotPi .)

Вам даны ширина W > 1, высота H > 1и строка, состоящая из 2(W+H-2)печатных символов ASCII. Задача состоит в том, чтобы напечатать эту строку, обернутую вокруг прямоугольника заданной ширины и высоты, начиная с верхнего левого угла, по часовой стрелке. Внутри прямоугольника есть пробелы. Надеемся, что тестовые случаи должны прояснить это.

Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции, и либо печатая результат в STDOUT (или ближайшую альтернативу), либо возвращая его в виде строки.

Не должно быть начальных или конечных пробелов (кроме тех, которые могут быть во входной строке). При желании вы можете вывести один завершающий символ новой строки.

Это код гольф, поэтому выигрывает самое короткое представление (в байтах).

Тестовые случаи

Каждый тестовый пример "String" W Hсопровождается ожидаемым результатом.

"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

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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


8
Ваши списки лидеров такие крутые.
Алекс А.

2
Вы играли в гольф свой сценарий лидеров?
mbomb007

2
@ mbomb007 Нет, я запускал код через минифайеры, поэтому он не занимал много места при расширении. (Полагаю, удаления разрывов строк было бы достаточно.) У меня все еще есть незавершенная версия на жестком диске.
Мартин Эндер

2
Если вы переименовали это в «The Chars in the String Go round and Round», это лучше соответствует ритму песни.
Джастин

Ответы:


9

CJam, 27 байт

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

Я на самом деле не CJam, но я думаю, что это лучше, чем Мартин. Основное отличие состоит в том, что мы нажимаем новую строку перед чтением ввода и сразу печатаем первую строку, что исключает необходимость сохранения высоты.

Вводит заказ в порядке

H "String" W

Попробуйте онлайн.


10

Python 2, 95 байт

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]

Печатает первую строку, затем две вертикальные линии, а затем последнюю строку.

Должно быть что-то короче, чем писать printтри раза, но все, что я до сих пор пробовал с сохранением в переменную '\n'.join, было дольше.


Вы можете переключиться на Python 3 и сохранить печать в переменной ...
Омар

1
@ Омар Это становится длиннее, потому что вы должны использовать evalна входе и заключить в скобки операторы печати.
FryAmTheEggman

О, я не evalучел! Скобка не должна быть слишком большой проблемой, так как printв Python 2 после нее нужен пробел. Переход от print blahдо p(blah)все еще сохраняет 3 символа.
Омар

9

CJam, 31 30 байт

По настоянию Оптимизатора, вот моя собственная попытка. Я не фанат победы в собственных соревнованиях, поэтому я считаю, что семья APL (или кто-то лучше в CJam) победит это. ;)

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

Принимает ввод в том же порядке, как указано в вопросе:

"Hello, World! " 5 4

Проверьте это здесь.

Один байт сохранен благодаря оптимизатору.

объяснение

Первоначально у меня была действительно хорошая идея начать с прямоугольника пробелов, а затем буквально обернуть строку вокруг него, вращая всю сетку четыре раза. Тем не менее, я не мог заставить это работать в случае, когда ширина или высота или оба 2. Поэтому я попробовал наивный подход (печатать сверху, зацикливать стороны, печатать снизу), и на удивление он оказался очень коротким.

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.";

Поскольку мы можем получить длину строки и у нас есть V, нет необходимости сохранять H. Просто повторяйте блок, пока не останутся только символы V. l~;:V/(N@s{)V2-S*@(N@_,V-}gW%экономит 1 символ
DocMax

@DocMax К сожалению, это не работает для высоты 2. Хотя это хорошая идея, я посмотрю, смогу ли я как-то использовать ее по-другому.
Мартин Эндер

D'о! Вы даже упомянули о проблеме H = 2, и я все еще забыл защититься от нее.
DocMax

9

Pyth, 47 46 45 40 37 36 байт

Это очевидный подход, реализованный в Pyth. Он печатает первую строку путем индексации, 0:widthа затем в середине, а затем в конце.

Спасибо @Jakube за подсказку с использованием zи Qза два ввода и использования p.

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

Принимает ввод из stdin в виде строки и кортежа измерений, разделенных новой строкой:

Hello, World! 
5, 4

и пишет в стандартный вывод.

Попробуй это здесь .

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

Использование zдля чтения строки экономит довольно много символов. И t_Nтоже самое -_N1.
Якуб

37 символов возможны с нашим подходом.
Якуб

@Jakube спасибо за советы!
Maltysen

Еще одно сохранение символа. Вместо ++использования pи переключите zt_Nс *d-k2.
Якуб

5

J 61 байт

Метод:

Начиная с (height-2)*(width-2)блока пробелов, мы берем необходимое количество символов в конце строки и добавляем его в текущий блок. Мы повторяем это 4 раза. Всего 5 состояний, показанных в 'Hello, World! ' 5 4примере (пробелы заменены на Xs для удобства чтения):

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

Код:

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

Явное определение функции. Функция с двумя операндами принимает строку в качестве левого аргумента и список из двух целых чисел в качестве правого аргумента.

Пример использования:

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

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

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

Попробуйте это онлайн здесь.


Вау, я впечатлен, что это работает для ширины и высоты 2 в J.
Мартин Эндер

4

Пиф, 38 37

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

Изначально у меня было другое решение, но это было в основном решение от Мальтисена. Поэтому я решил пойти немного по-другому.

Попробуйте онлайн .

              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_ttHэквивалентно <_zttH.
Исаак

@isaacg Спасибо, уже видел что-то похожее в ответе Малтысена.
Якуб

4

JavaScript (ES6), 110 115

Функция с 3 параметрами, возвращающая строку

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 версии 119 : нет короткого формата для функций, нет параметров по умолчанию. Нет смысла использовать, for(of)даже если он поддерживается

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 версия 126 : нет для (из), нет string.repeat

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
}

Ungolfed

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

Тест в консоли 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)))

Выход

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 байт

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]

Принимая прямой подход.


3

Haskell, 164 156 байт

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))

Функция pне печатает вывод, но возвращает его в виде строки, например p 4 5 "+--+|||+--+|||"-> "+--+\n| |\n| |\n| |\n+--+\n". Для лучшего отображения используйте putStr:

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

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

Как это работает: я создаю блок wx hпробелов и заменяю первую строку началом входной строки. Затем я поворачиваю блок против часовой стрелки и повторяю замену первой строки еще три раза.

Чтобы предотвратить повторение первого символа после поворота № 4, я добавляю его во входную строку перед началом.

"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

Редактировать: нашел лучший способ решить проблему «обрезать первый символ после поворота # 4».


Ах, хорошо ... это похоже на то, что я пробовал в CJam, за исключением того, что это работает. ;)
Мартин Эндер

3

Постскриптум, 62 байта

Это, конечно, использует двоичные токены, но это эквивалентно:

/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

Вот hexdump файла ( 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}..]..

Беги как:

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

Вывод очень маленький (из-за того, что шрифт вообще не масштабируется), поэтому вам нужно немного увеличить его, чтобы увидеть.

Это позволяет xyshowоператору записать строку с использованием пользовательских интервалов символов. В этом случае я использую отрицательное вертикальное расстояние для записи, затем отрицательное горизонтальное пространство для записи назад, затем положительное вертикальное пространство для записи вверх. Из-за этого мне не нужно использовать какие-либо манипуляции со строками.


3

> <>, 82 80 + 3 = 83 байта

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

Страница Esolang для> <> (Рыба)

Это оказалось короче, чем я ожидал. Он использует простой подход печати первой строки, затем столбцов, дополненных центральными пробелами, а затем последней строки.

Введите строку через STDIN, а высоту и ширину через командную строку с -vфлагом, например:

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

объяснение

: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

Сценарий оболочки, чтобы вы начали:

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}"

Передайте ввод как аргументы командной строки:

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

2

JavaScript, 161 160 158 байт

Метод, который я придумала, оказался слишком длинным, но, ну, это была практика. (Кроме того, я получил это разобрать 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}

Для ввода, который не имеет смысла, вывод не определен (буквально и несколько раз), но он работает для всех тестовых случаев.


sliceкороче substr, это не совсем то же самое, но в этом случае вы можете использовать его
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()}

вызов:

f('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 

2

К, 55 54 байта

Использование того же подхода, что и в реализации J от Randomra; Начните с блока пробелов и добавьте от конца строки к краю, вращая четыре раза:

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

И несколько примеров:

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

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

Разбить его немного для удобства чтения,

Создайте блок NxM:

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

Повернуть на 90 градусов с помощью transpose ( +) и reverse-each ( |:'):

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

Поэтому, если у нас есть блок пробелов tи строка s, мы можем добавить часть хвоста sк t:

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

Мы используем форму 4 {[x] ... }/( ... )для многократного применения функции к кортежу, состоящему из строки и матрицы, которую мы строим. Каждый раз, когда мы делаем этот шаг поворота и объединения, мы также вырубаем строку.

редактировать:

Другая идея состоит в том, чтобы попытаться разбить входную строку на фрагменты, которые мы хотим при каждом повороте, что упрощает основную часть программы. К сожалению, получается 56 длиннее: 56 байт:

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

Если есть лучший способ рассчитать эти точки разделения, я открыт для предложений.

edit2:

Небольшая перестановка позволяет мне убрать пару скобок. 54 байта!

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

2

К, 80 68 байт

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

Укорочено с 80 благодаря @JohnE.

Оригинал:

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

Я даже не знаю, как это работает.

Пример использования:

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

Есть несколько возможных оптимизаций, но я продолжаю делать Kona Segfault ...


Вы можете улучшить этот бит, используя «взять» (двоично - #) и явный список аргументов: f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}. 68 символов по моим подсчетам.
JohnE

@JohnE Спасибо! Я знал о явном списке аргументов, но он каким-то образом ускользнул от меня; Я понятия не имел о диадическом #, хотя.
kirbyfan64sos

2

R 178

Это безымянная функция, принимающая в s, w, hкачестве параметров. Хотелось бы, чтобы был более хороший способ разбить нить.

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='')}

Ungolfed

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

Тестовый забег

> (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

Хотя все еще ужасно долго, это оказалось немного проще (и короче), чем я думал в запросе. Реализовано как встроенная табличная функция для 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

Это повторяется через строку @h раз. Первая рекурсия обрезает символы @W из строки. Средние рекурсии берут последнюю и первую из оставшейся строки с отступом между ними. Последняя рекурсия меняет то, что осталось. Есть несколько потерянных символов, связанных с тем, как SQL Server обрабатывает конечные пробелы в VARCHARS.

Тестовый забег

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 байт

Используемый компилятор - GCC 4.9.2 с -std=c++14флагом

#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;}}

Проверьте это здесь.

объяснение

#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;
    }

}

Не могли бы вы сохранить символы, используя char[][]вместо этого?
CorsiKa

Нет, vector<vector<char>> M;M.resize(h,vector<char>(w,0));немного корочеchar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Анмол Сингх Джагги

1

Perl, 193 195 байт

($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";

Я уверен, что это может быть значительно улучшено. Я нуб. >, <


0

Java 11, 180 байт

(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();}

Попробуйте это онлайн (ПРИМЕЧАНИЕ: String.repeat(int)эмулируется как repeat(String,int)для того же подсчета байтов, потому что Java 11 еще не на TIO.)

Объяснение:

(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

0

Древесный уголь , 4 байта

BNNS

Попробуйте онлайн (подробно) или онлайн (чисто) .

Объяснение:

В основном встроенный для этого вызова. Возьмите первые два целочисленных ввода в качестве ширины и высоты и напечатайте поле с третьей строкой ввода в качестве границы:

Box(InputNumber(), InputNumber(), InputString())
BNNS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.