I personaggi della stringa vanno in tondo


23

(Ispirato da una prima bozza della sfida della linea frattale di PhiNotPi .)

Ti viene data una larghezza W > 1, un'altezza H > 1e una stringa costituite da 2(W+H-2)caratteri ASCII stampabili. Il compito è stampare questa stringa avvolta attorno a un rettangolo della larghezza e dell'altezza indicate, iniziando nell'angolo in alto a sinistra, in senso orario. L'interno del rettangolo è pieno di spazi. Si spera che i casi di test lo chiariscano molto.

È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e stampando il risultato su STDOUT (o l'alternativa più vicina) o restituendolo come stringa.

Non ci devono essere spazi iniziali o finali (a parte quelli che potrebbero trovarsi nella stringa di input). È possibile facoltativamente generare una nuova riga finale finale.

Questo è il golf del codice, quindi vince l'invio più breve (in byte).

Casi test

Ogni caso di test è "String" W Hseguito dall'output previsto.

"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

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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


8
Le tue classifiche sono così belle.
Alex A.

2
Hai golf la tua sceneggiatura della classifica?
mbomb007,

2
@ mbomb007 No, ho eseguito il codice tramite i minificatori, quindi non occuperebbe molto spazio se espanso. (Immagino che la rimozione delle interruzioni di riga sarebbe stata sufficiente.) Ho ancora una versione non modificata sul mio disco rigido.
Martin Ender,

2
Se lo hai rinominato in "The Chars in the String Go Round and Round", si adatta meglio al ritmo della canzone.
Giustino,

Risposte:


9

CJam, 27 byte

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

Non sono davvero CJam, ma penso che questo batte Martin. La differenza principale è che spingiamo una nuova riga prima di leggere l'input e stampare immediatamente la prima riga, annullando la necessità di memorizzare l'altezza.

Accetta input nell'ordine

H "String" W

Provalo online.


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]

Stampa la prima riga, quindi le due righe verticali, quindi l'ultima riga.

Ci deve essere qualcosa di più corto che scrivere printtre volte, ma tutto ciò che ho provato finora con il salvataggio in una variabile ed '\n'.joinè stato più lungo.


Potresti passare a Python 3 e archiviare la stampa in una variabile ...
Omar

1
@Omar Questo finisce per essere più lungo perché devi usare evall'input e racchiudere le istruzioni di stampa.
FryAmTheEggman,

Oh, non avevo preso evalin considerazione! La parentesi non dovrebbe essere un grosso problema poiché printin Python 2 ha bisogno di uno spazio dopo di essa. Passare da print blaha p(blah)salva ancora 3 caratteri.
Omar,

9

CJam, 31 30 byte

Su insistenza di Optimizer, ecco il mio tentativo. Non sono un fan del vincere le mie sfide, quindi sto contando la famiglia APL (o qualcuno migliore in CJam) per batterlo. ;)

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

Accetta input nello stesso ordine indicato nella domanda:

"Hello, World! " 5 4

Provalo qui.

Un byte salvato grazie a Optimizer.

Spiegazione

Inizialmente, ho avuto un'idea davvero piacevole per iniziare con il rettangolo di spazi e poi avvolgere letteralmente la stringa attorno ad essa mentre ruotavo l'intera griglia quattro volte. Tuttavia, non riesco a farlo funzionare nel caso in cui sia larghezza, altezza o entrambi 2. Così ho provato l'approccio ingenuo (stampa superiore, passante sui lati, fondo stampa), e sorprendentemente si è rivelato molto breve.

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

Poiché possiamo ottenere la lunghezza della stringa e abbiamo V, non è necessario salvare H. Ripeti il ​​blocco fino a quando rimangono solo i caratteri V. l~;:V/(N@s{)V2-S*@(N@_,V-}gW%salva 1 carattere.
DocMax,

@DocMax Sfortunatamente, ciò non funziona per l'altezza 2. È una buona idea, vedrò se in qualche modo posso usarlo in un modo diverso.
Martin Ender,

D'oh! Hai anche menzionato il problema H = 2 e ho ancora dimenticato di proteggermi.
DocMax,

9

Pyth, 47 46 45 40 37 36 byte

Questo è l'approccio ovvio implementato in Pyth. Stampa la prima riga indicizzando 0:widthe quindi il centro, quindi la fine.

Grazie a @Jakube per il suggerimento sull'uso ze Qper due ingressi e utilizzo p.

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

Prende input da stdin come stringa e come tupla di dimensioni, newline separato:

Hello, World! 
5, 4

e scrive su stdout.

Provalo qui .

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

L'uso zper leggere la stringa consente di risparmiare parecchi caratteri. Inoltre t_Nè la stessa cosa di -_N1.
Jakube,

37 caratteri sono possibili con il nostro approccio.
Jakube,

@Jakube grazie per i suggerimenti!
Maltysen,

Un altro risparmio di carbone. Invece di ++usare pe cambiare zt_Ncon *d-k2.
Jakube,

5

J, 61 byte

Metodo:

A partire da un (height-2)*(width-2)blocco di spazi prendiamo la quantità necessaria di caratteri dalla fine della stringa e la aggiungiamo al blocco corrente. Lo ripetiamo 4 volte. I 5 stati totali illustrati con l' 'Hello, World! ' 5 4esempio (spazi sostituiti con Xs per leggibilità):

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

Il codice:

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

Definizione esplicita della funzione. La funzione a due operandi accetta una stringa come argomento a sinistra e un elenco di due numeri interi come argomento a destra.

Esempio di utilizzo:

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

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

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

Provalo online qui.


Wow, sono impressionato dal fatto che questo funzioni per larghezza e altezza 2 in J.
Martin Ender il

4

Pyth, 38 37

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

Inizialmente avevo una diversa soluzione 38, ma era sostanzialmente una soluzione golfistica della risposta di Maltysen. Quindi ho deciso di andare un po 'diverso.

Provalo online .

              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è equivalente a <_zttH.
isaacg,

@isaacg Grazie, ho già visto qualcosa di simile nella risposta di Maltysen.
Jakube,

4

JavaScript (ES6), 110 115

Funziona con 3 parametri, restituendo una stringa

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 versione 119 : nessun formato breve per le funzioni, nessun parametro predefinito. Nessun motivo da utilizzare for(of)anche se è supportato

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 versione 126 : no per (of), no 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

Test nella console di 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)))

Produzione

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]

Adottare l'approccio diretto.


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

La funzione pnon stampa l'output, ma lo restituisce come una stringa, ad es. p 4 5 "+--+|||+--+|||"-> "+--+\n| |\n| |\n| |\n+--+\n". Per un migliore utilizzo del display putStr:

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

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

Come funziona: creo un blocco wx hdi spazi e sostituisco la prima riga con l'inizio della stringa di input. Quindi giro il blocco in senso antiorario e ripeto sostituendo la prima riga altre tre volte.

Per evitare di tagliare di nuovo il primo carattere dopo il turno n. 4, lo aggiungo alla stringa di input prima di iniziare.

"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

Modifica: trovato un modo migliore per risolvere il problema del cut-off-first-character-after-turn- # 4.


Ah bello ... questo è simile a quello che ho provato in CJam, tranne che funziona. ;)
Martin Ender,

3

Postscript, 62 byte

Questo ovviamente usa token binari, ma equivale a:

/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

Ecco un hexdump del file ( 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}..]..

Correre come:

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

L'output è davvero piccolo (a causa del fatto che non si ridimensiona affatto il carattere), quindi è necessario ingrandire un po 'per vederlo.

Questo si avvale del xyshow operatore per scrivere la stringa usando spaziature di caratteri personalizzate. In questo caso, uso la spaziatura verticale negativa per scrivere, quindi lo spazio orizzontale negativo per scrivere all'indietro, quindi lo spazio verticale positivo per scrivere verso l'alto. Per questo motivo, non ho bisogno di usare alcun tipo di manipolazione delle stringhe.


3

> <>, 82 80 + 3 = 83 byte

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

Pagina Esolang per> <> (Pesce)

Questo si è rivelato essere più breve di quanto mi aspettassi. Utilizza l'approccio diretto di stampare la prima riga, quindi le colonne riempite con gli spazi centrali, quindi l'ultima riga.

Immettere la stringa tramite STDIN e l'altezza e la larghezza tramite riga di comando con il -vflag, in questo modo:

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

Spiegazione

: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

Uno script di shell per iniziare:

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

Passa l'input come arg dalla riga di comando:

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

2

JavaScript, 161 160 158 byte

Il metodo che ho escogitato si è rivelato troppo lungo, ma vabbè, è stata pratica. (Inoltre, ho avuto modo di precisare 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}

Per input che non hanno senso l'output è indefinito (letteralmente e un sacco di volte), ma funziona per tutti i casi di test.


sliceè più corto di substr, non è esattamente lo stesso ma in questo caso puoi usarlo
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()}

chiamata:

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

produzione:

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

2

K, 55 54 byte

Utilizzando lo stesso approccio dell'implementazione J di randomra; Inizia con un blocco di spazi e aggiungi dalla coda della corda al bordo mentre ruota quattro volte:

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

E alcuni esempi:

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

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

Abbattendo un po 'per leggibilità,

Genera un blocco NxM:

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

Ruota di 90 gradi usando transpose ( +) e reverse-each ( |:'):

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

Quindi, se abbiamo un blocco di spazi te di una stringa s, possiamo anteporre una fetta della coda di sa t:

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

Usiamo il modulo 4 {[x] ... }/( ... )per applicare ripetutamente una funzione a una tupla composta dalla stringa e dalla matrice che stiamo costruendo. Ogni volta che eseguiamo questo passaggio di rotazione e concatenazione, tagliamo anche la stringa.

modificare:

Un'altra idea è quella di provare a dividere la stringa di input nei frammenti che vogliamo ad ogni rotazione, il che semplifica il corpo principale del programma. Sfortunatamente questo risulta essere leggermente più lungo a 56 byte:

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

Se c'è un modo migliore per calcolare quei punti di divisione, sono aperto ai suggerimenti.

EDIT2:

Riorganizzare leggermente mi consente di rimuovere un paio di parentesi. 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}

Abbreviato da 80 grazie a @JohnE.

Originale:

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

So a malapena come funziona questa cosa.

Esempio di utilizzo:

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

Ci sono alcune possibili ottimizzazioni, ma continuo a rendere Kona segfault ...


È possibile migliorare questo un po 'utilizzando 'take'(diadica #) e una lista di argomenti esplicito: f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}. 68 caratteri dal mio conteggio.
Giovanni

@JohnE Grazie! Sapevo dell'elenco esplicito degli argomenti, ma in qualche modo mi è sfuggito di mente; Non avevo idea di diadica #, però.
Kirbyfan64sos,

2

R, 178

Questa è una funzione senza nome che assume s, w, hcome parametri. Vorrei che ci fosse un modo migliore per dividere la corda.

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

Prova

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

Sebbene sia ancora terribilmente lungo, questo si è rivelato un po 'più semplice (e più breve) di quanto pensassi in una query. Implementato come una funzione con valori di tabella incorporata per 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

Questo ricorre attraverso la stringa @h volte. Clip di prima ricorsione @ W caratteri dalla stringa. Le ricorsioni intermedie prendono l'ultimo e il primo dalla stringa rimanente con il riempimento di stringa tra. L'ultima ricorsione inverte ciò che resta. Esistono alcuni caratteri persi relativi al modo in cui SQL Server tratta gli spazi finali su VARCHARS.

Prova

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

Compilatore utilizzato - GCC 4.9.2 con -std=c++14flag

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

Provalo qui.

Spiegazione

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

}

Non potresti salvare i caratteri usando char[][]invece?
corsiKa

No, vector<vector<char>> M;M.resize(h,vector<char>(w,0));è leggermente più corto dichar** 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";

Sono sicuro che questo può essere notevolmente migliorato. Sono un noob. >, <


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

Provalo online (NOTA: String.repeat(int)è emulato comerepeat(String,int) per lo stesso conteggio byte, poiché Java 11 non è ancora su TIO.)

Spiegazione:

(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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.