Les personnages de la chaîne tournent en rond

23

(Inspiré par une première version du défi de la ligne fractale de PhiNotPi .)

Vous obtenez une largeur W > 1, une hauteur H > 1et une chaîne composée de 2(W+H-2)caractères ASCII imprimables. La tâche consiste à imprimer cette chaîne enroulée autour d'un rectangle de la largeur et de la hauteur données, en commençant dans le coin supérieur gauche, dans le sens des aiguilles d'une montre. L'intérieur du rectangle est rempli d'espaces. Espérons que les cas de test devraient être très clairs.

Vous pouvez écrire un programme ou une fonction, en saisissant les données via STDIN (ou l'alternative la plus proche), l'argument de ligne de commande ou l'argument de la fonction, et en imprimant le résultat dans STDOUT (ou l'alternative la plus proche) ou en le renvoyant sous forme de chaîne.

Il ne doit pas y avoir d'espaces de début ou de fin (à l'exception de ceux qui pourraient se trouver dans la chaîne d'entrée). Vous pouvez éventuellement générer une seule nouvelle ligne de fin.

Il s'agit du code golf, donc la soumission la plus courte (en octets) l'emporte.

Cas de test

Chaque cas de test est "String" W Hsuivi de la sortie attendue.

"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

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

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

Martin Ender
la source
8
Vos classements sont tellement cool.
Alex A.
2
Avez-vous joué au golf votre script de classement?
mbomb007
2
@ mbomb007 Non, j'ai exécuté le code via des minificateurs, donc il ne prendrait pas beaucoup de place une fois développé. (Je suppose que la suppression des sauts de ligne aurait été suffisante.) J'ai toujours une version non réduite sur mon disque dur.
Martin Ender
2
Si vous avez renommé cela en "Les caractères de la chaîne vont et viennent", cela correspond mieux au rythme de la chanson.
Justin

Réponses:

9

CJam, 27 octets

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

Je ne suis pas vraiment CJam, mais je pense que cela bat Martin. La principale différence est que nous poussons une nouvelle ligne avant de lire l'entrée et imprimons la première ligne immédiatement, éliminant ainsi la nécessité de stocker la hauteur.

Prend la saisie dans l'ordre

H "String" W

Essayez-le en ligne.

Sp3000
la source
10

Python 2, 95 octets

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]

Imprime la première ligne, puis les deux lignes verticales, puis la dernière ligne.

Il doit y avoir quelque chose de plus court que d'écrire printtrois fois, mais tout ce que j'ai essayé jusqu'à présent avec l'enregistrement dans une variable '\n'.joinest plus long.

xnor
la source
Vous pouvez passer à Python 3 et stocker l'impression dans une variable ...
Omar
1
@Omar Cela finit par être plus long car vous devez utiliser evalsur l'entrée et mettre entre parenthèses les instructions print.
FryAmTheEggman
Oh, je n'avais pas pris evalen compte! La parenthèse ne devrait pas poser trop de problème car printen Python 2 a besoin d'un espace après. Le passage de print blahà p(blah)enregistre toujours 3 caractères.
Omar
9

CJam, 31 30 octets

À l'insistance d'Optimizer, voici ma propre tentative. Je ne suis pas fan de gagner mes propres défis, donc je compte la famille APL (ou quelqu'un de meilleur à CJam) pour battre cela. ;)

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

Prend la saisie dans le même ordre que celui indiqué dans la question:

"Hello, World! " 5 4

Testez-le ici.

Un octet enregistré grâce à l'Optimizer.

Explication

À l'origine, j'avais une très bonne idée de commencer par le rectangle d'espaces, puis d'enrouler littéralement la chaîne tout en faisant tourner la grille entière quatre fois. Cependant, je n'arrivais pas à obtenir que cela fonctionne dans le cas où la largeur ou la hauteur ou les deux sont 2. J'ai donc essayé l'approche naïve (haut imprimé, boucle sur les côtés, bas imprimé), et étonnamment, cela s'est avéré être vraiment court.

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.";
Martin Ender
la source
Parce que nous pouvons obtenir la longueur de la chaîne et que nous avons V, il n'est pas nécessaire d'enregistrer H. Répétez simplement le bloc jusqu'à ce qu'il ne reste que V caractères. l~;:V/(N@s{)V2-S*@(N@_,V-}gW%enregistre 1 car.
DocMax
@DocMax Malheureusement, cela ne fonctionne pas pour la hauteur 2. C'est une bonne idée cependant, je vais voir si je peux l'utiliser d'une manière différente.
Martin Ender
Oh! Vous avez même mentionné le problème H = 2 et j'ai toujours oublié de m'en prémunir.
DocMax
9

Pyth, 47 46 45 40 37 36 octets

C'est l'approche évidente implémentée en Pyth. Il imprime la première ligne par indexation 0:widthpuis le milieu, puis la fin.

Merci à @Jakube pour l'astuce avec using zet Qpour deux entrées et using p.

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

Prend l'entrée de stdin comme une chaîne et comme un tuple de dimensions, la nouvelle ligne est séparée:

Hello, World! 
5, 4

et écrit à stdout.

Essayez-le ici .

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
Maltysen
la source
Utiliser zpour lire la chaîne économise pas mal de caractères. C'est aussi t_Nla même chose que -_N1.
Jakube
37 caractères sont possibles avec notre approche.
Jakube
@Jakube merci pour les conseils!
Maltysen
Encore une économie de char. Au lieu d' ++utiliser pet de basculer le zt_Navec *d-k2.
Jakube
5

J, 61 octets

Méthode:

À partir d'un (height-2)*(width-2)bloc d'espaces, nous prenons le nombre nécessaire de caractères à la fin de la chaîne et l'ajoutons au bloc actuel. Nous répétons cela 4 fois. Les 5 états au total illustrés par l' 'Hello, World! ' 5 4exemple (espaces remplacés par Xs pour plus de lisibilité):

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

Le code:

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

Définition de fonction explicite. La fonction à deux opérandes prend une chaîne comme argument de gauche et une liste de deux entiers comme argument de droite.

Exemple d'utilisation:

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

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

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

Essayez-le en ligne ici.

randomra
la source
Wow, je suis impressionné que cela fonctionne pour la largeur et la hauteur 2 en J.
Martin Ender
4

Pyth, 38 37

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

J'avais à l'origine une solution 38 différente, mais c'était essentiellement une solution golfique de la réponse de Maltysen. J'ai donc décidé d'aller un peu différent.

Essayez-le en ligne .

              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]
Jakube
la source
_>z_ttHest équivalent à <_zttH.
isaacg
@isaacg Merci, déjà vu quelque chose de similaire dans la réponse de Maltysen.
Jakube
4

JavaScript (ES6), 110 115

Fonction avec 3 paramètres, renvoyant une chaîne

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 version 119 : pas de format court pour les fonctions, pas de paramètres par défaut. Aucune raison d'utiliser for(of)même s'il est pris en charge

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 version 126 : non pour (de), pas de chaîne.

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
}

Non golfé

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

Tester dans la console 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)))

Sortie

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
edc65
la source
3

Python 2, 97 octets

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]

Adopter l'approche directe.

Sp3000
la source
3

Haskell, 164 156 octets

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

La fonction pn'imprime pas la sortie, mais la renvoie sous forme de chaîne, par exemple p 4 5 "+--+|||+--+|||"-> "+--+\n| |\n| |\n| |\n+--+\n". Pour une meilleure utilisation de l'affichage putStr:

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

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

Comment ça marche: je crée un bloc wx hd'espaces et remplace la première ligne par le début de la chaîne d'entrée. Ensuite, je fais pivoter le bloc dans le sens antihoraire et répète en remplaçant la première ligne encore trois fois.

Pour éviter de couper à nouveau le premier caractère après le tour # 4, je l'ajoute à la chaîne d'entrée avant de commencer.

"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

Edit: a trouvé un meilleur moyen de résoudre le problème de la coupure du premier caractère après le tour # 4.

nimi
la source
Ah bien ... c'est similaire à ce que j'ai essayé dans CJam, sauf que ça marche. ;)
Martin Ender
3

Postscript, 62 octets

Cela utilise bien sûr des jetons binaires, mais cela équivaut à:

/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

Voici un hexdump du fichier ( 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}..]..

Courir comme:

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

La sortie est vraiment petite (en raison de la non-mise à l'échelle de la police), vous devez donc zoomer un peu pour la voir.

Cela permet à l' xyshowopérateur d'écrire la chaîne en utilisant des espacements de caractères personnalisés. Dans ce cas, j'utilise l'espacement vertical négatif pour écrire, puis l'espace horizontal négatif pour écrire en arrière, puis l'espace vertical positif pour écrire vers le haut. Pour cette raison, je n'ai besoin d'aucune sorte de manipulation de chaîne.

AJMansfield
la source
3

> <>, 82 80 + 3 = 83 octets

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

Page Esolang pour> <> (Poisson)

Cela s'est avéré être plus court que ce à quoi je m'attendais. Il utilise l'approche simple consistant à imprimer la première ligne, puis les colonnes rembourrées avec les espaces centraux, puis la dernière ligne.

Entrez la chaîne via STDIN et la hauteur et la largeur via la ligne de commande avec le -vdrapeau, comme ceci:

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

Explication

: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)
Sp3000
la source
2

Bash + coreutils, 124

Un script shell pour vous aider à démarrer:

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

Passez l'entrée comme arguments de ligne de commande:

$ ./roundnround.sh 5 4 "Hello, World! "
Hello
    ,
!    
dlroW
$ 
Traumatisme numérique
la source
2

JavaScript, 161 160 158 octets

La méthode que j'ai élaborée s'est avérée beaucoup trop longue, mais bon, c'est une pratique. (De plus, je l'ai expliqué 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}

Pour une entrée qui n'a pas de sens, la sortie n'est pas définie (littéralement et plusieurs fois), mais elle fonctionne pour tous les cas de test.

vvye
la source
sliceest plus court que substr, ce n'est pas exactement la même chose mais dans ce cas, vous pouvez l'utiliser
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()}

appel:

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

sortie:

rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 
Kamil Mikolajczyk
la source
2

K, 55 54 octets

En utilisant la même approche que l'implémentation J de randomra; Commencez avec un bloc d'espaces et ajoutez de la queue de la chaîne au bord tout en tournant quatre fois:

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

Et quelques exemples:

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

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

Le décomposer un peu pour la lisibilité,

Générez un bloc NxM:

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

Faites pivoter de 90 degrés en utilisant la transposition ( +) et l'inverse de chaque ( |:'):

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

Donc, si nous avons un bloc d'espaces tet une chaîne s, nous pouvons ajouter une tranche de la queue de sà t:

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

Nous utilisons le formulaire 4 {[x] ... }/( ... )pour appliquer à plusieurs reprises une fonction à un tuple composé de la chaîne et de la matrice que nous construisons. Chaque fois que nous effectuons cette étape de rotation et de concaténation, nous coupons également la chaîne.

modifier:

Une autre idée est d'essayer de diviser la chaîne d'entrée en fragments que nous voulons à chaque rotation, ce qui simplifie le corps principal du programme. Malheureusement, cela s'avère être légèrement plus long à 56 octets:

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

S'il existe une meilleure façon de calculer ces points de partage, je suis ouvert aux suggestions.

edit2:

Réorganiser légèrement me permet de supprimer une paire de parenthèses. 54 octets!

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

K, 80 68 octets

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

Raccourci de 80 grâce à @JohnE.

Original:

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

Je sais à peine comment ça marche.

Exemple d'utilisation:

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

Il y a quelques optimisations possibles, mais je continue de faire Kona segfault ...

kirbyfan64sos
la source
Vous pouvez améliorer cela un peu en utilisant « prendre » (dyadique #) et une liste d'arguments explicites: f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}. 68 caractères par mon compte.
JohnE
@JohnE Merci! Je connaissais la liste des arguments explicites, mais elle m'a en quelque sorte glissé l'esprit; Cependant, je n'avais aucune idée de dyadic #.
kirbyfan64sos
2

R, 178

Il s'agit d'une fonction sans nom prenant s, w, hcomme paramètres. Je souhaite qu'il y ait une meilleure façon de diviser la chaîne.

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

Non golfé

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

Essai

> (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
> 
MickyT
la source
2

T-SQL, 307

Bien que toujours horriblement long, cela s'est avéré être un peu plus facile (et plus court) que je ne le pensais dans une requête. Implémenté en tant que fonction de valeur de table en ligne pour 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

Cela revient à travers la chaîne @h fois. La première récursion coupe @W caractères de la chaîne. Les récursions du milieu prennent la dernière et la première de la chaîne restante avec un remplissage de chaîne entre les deux. La dernière récursion inverse ce qui reste. Il y a quelques caractères perdus qui traitent de la façon dont SQL Server traite les espaces de fin sur VARCHARS.

Essai

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)
MickyT
la source
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])
knedlsepp
la source
1

C ++, 398 octets

Compilateur utilisé - GCC 4.9.2 avec -std=c++14indicateur

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

Testez-le ici.

Explication

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

}
Anmol Singh Jaggi
la source
Ne pourriez-vous pas enregistrer des caractères en utilisant à la char[][]place?
corsiKa
Non, vector<vector<char>> M;M.resize(h,vector<char>(w,0));est légèrement plus court quechar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Anmol Singh Jaggi
1

Perl, 193 195 octets

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

Je suis sûr que cela peut être considérablement amélioré. Je suis un noob. >, <

Stephen Menton
la source
0

Java 11, 180 octets

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

Essayez-le en ligne (REMARQUE: String.repeat(int)est émulé commerepeat(String,int) pour le même nombre d'octets, car Java 11 n'est pas encore sur TIO.)

Explication:

(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
Kevin Cruijssen
la source
0

Fusain , 4 octets

BNNS

Essayez-le en ligne (verbeux) ou essayez-le en ligne (pur) .

Explication:

Fondamentalement, une fonction intégrée pour ce défi. Prenez les deux premières entrées entières comme largeur et hauteur, et imprime une boîte avec la troisième chaîne d'entrée comme bordure:

Box(InputNumber(), InputNumber(), InputString())
BNNS
Kevin Cruijssen
la source