Dizedeki Karakterler Yuvarlak ve Yuvarlak


23

( PhiNotPi'nin fraktal çizgi mücadelesinin erken bir taslağından esinlenmiştir .)

Yazdırılabilir ASCII karakterlerinden oluşan bir genişlik W > 1, yükseklik H > 1ve dize verilir 2(W+H-2). Görev, bu dizgiyi, sol üst köşeden başlayarak saat yönünde, verilen genişlik ve yüksekliğe sahip bir dikdörtgenin etrafına sarılmış olarak basmaktır. Dikdörtgenin içi boşluklarla dolu. Test vakaları umarım bunu açıkça ortaya koymalıdır.

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif) olarak yazdırarak veya bir dize olarak döndürerek bir program veya işlev yazabilirsiniz.

Baştaki veya sondaki boşluklar olmamalıdır (giriş dizesinde olabilecekler dışında). İsteğe bağlı olarak tek bir izleyen yeni satır gönderebilirsiniz.

Bu kod golf, yani en kısa gönderme (bayt cinsinden) kazanır.

Test Kılıfları

Her test durumunu "String" W Hbeklenen çıktı izler.

"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

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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


8
Lider tahtaların çok iyi.
Alex A.

2
Afiş betiğini golf yaptın mı?
mbomb007

2
@ mbomb007 Hayır, kodu minifiers aracılığıyla çalıştırdım, bu yüzden genişletildiğinde fazla yer kaplamazdı. (Satır sonlarını kaldırmak yeterli olur sanırım.) Sabit diskimde hala büyütülmemiş bir sürüm var.
Martin Ender

2
Bunu "String The Round and Round" daki Chars olarak değiştirdiyseniz, şarkının ritmine daha iyi uyar.
Justin,

Yanıtlar:


9

CJam, 27 bayt

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

Gerçekten CJam bilmiyorum, ama bence bu Martin'i yeniyor. En önemli fark, girişi okumadan önce yeni bir satır bastırmamız ve ilk satırın hemen yazdırılmasıdır, böylece yüksekliği kaydetme gereği ortadan kalkar.

Sırayla girdi alır

H "String" W

Çevrimiçi deneyin.


10

Python 2,95 bayt

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]

İlk satırı, ardından iki dikey çizgiyi ve ardından son çizgiyi yazdırır.

printÜç kez yazmaktan daha kısa bir şeyler olmalı , fakat bir değişkene kaydetme konusunda şimdiye kadar denediğim her şey daha uzun sürdü '\n'.join.


Python 3'e geçebilir ve baskıyı değişken olarak saklayabilirsiniz ...
Omar

1
@Omar Girdide kullanmanız evalve yazdırma deyimlerini desteklemeniz gerektiğinden daha uzun süren rüzgarlar .
FryAmTheEggman

Oh, evaldikkate almadım! Parantez print2'den sonra bir alana ihtiyaç duyduğundan parantez çok fazla problem olmamalıdır . 'Dan 3 karaktere print blahkadar gitmek de aynı şeyi p(blah)kaydeder.
Omar

9

CJam, 31 30 bayt

Doktor’un ısrarı ile işte benim kendi girişimim. Kendi zorluklarımı kazanma hayranı değilim, bu yüzden bunu yenmek için APL ailesini (veya CJam'da daha iyi birini) sayıyorum. ;)

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

Girdiyi, soruda verilen sırayla alır:

"Hello, World! " 5 4

Burada test et.

Doktoru sayesinde bir bayt kurtarıldı.

açıklama

Başlangıçta, boşlukların dikdörtgeni ile başlamak ve daha sonra tam anlamıyla dört kez döndürürken ipi etrafına sarmak için gerçekten güzel bir fikrim vardı. Bununla birlikte, genişlik veya yükseklik veya her ikisinin de bulunduğu durumlarda bunun işe yarayacağını göremedim 2. Bu yüzden saf yaklaşımı denedim (üst baskı, iki tarafın üzerinde döngü, alt baskı) ve şaşırtıcı bir şekilde kısa olduğu ortaya çıktı.

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

Dizenin uzunluğunu alabildiğimiz ve V ye sahip olduğumuz için, H'yi kaydetmeye gerek yok. Sadece V karakterleri kalana kadar bloğu tekrarlayın. l~;:V/(N@s{)V2-S*@(N@_,V-}gW%1 karakter kaydeder.
DocMax

@DocMax Ne yazık ki, bu yükseklik 2 için işe yaramaz. Yine de, iyi bir fikir, onu bir şekilde farklı bir şekilde kullanıp kullanamayacağımı araştıracağım.
Martin Ender

D'oh! H = 2 probleminden bile bahsettiniz ve ben hala buna karşı korumayı unuttum.
DocMax

9

Pyth, 47 46 45 40 37 36 bayt

Pyth'ta uygulanan açık yaklaşım budur. İlk satırı indeksleme 0:width, ardından orta, sonra sonunu yazdırır .

@Jakube'e bahşiş veren zve Qiki girişi olan ve kullananlar için teşekkürler p.

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

Girdiyi bir dizge olarak ve bir boyut dizisi olarak alır, yeni satır ayrılmış:

Hello, World! 
5, 4

ve stdout'a yazar.

Burada dene .

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

Dizeyi zokumak için kullanmak oldukça fazla sayıda karakter kazandırır. Ayrıca t_Naynı şey -_N1.
Jakube

Bizim yaklaşımımızla 37 karakter mümkün.
Jakube

@Jakube ipuçları için teşekkürler!
Maltysen

Bir tane daha char tasarrufu. Yerine ++kullanımı pve geçiş zt_Nile *d-k2.
Jakube, 13.03.2015

5

J, 61 bayt

Yöntem:

Bir (height-2)*(width-2)boşluk bloğundan başlayarak , dizgenin sonundan gerekli miktarda karakteri alır ve onu geçerli bloğa ekleriz. Bunu 4 kez tekrarlıyoruz. Örnekle gösterilen toplam 5 durum 'Hello, World! ' 5 4( Xokunabilirlik için s ile değiştirilen boşluklar ):

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

Kod:

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

Açık fonksiyon tanımı. Two-operand işlevi, sol argüman olarak bir dize ve sağ argüman olarak iki tamsayının listesini alır.

Örnek kullanım:

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

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

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

Burada çevrimiçi deneyin.


Vay canına, bunun J'deki genişlik ve yükseklik 2 için işe yaradığına etkilendim
Martin Ender

4

Pyth, 38 37

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

Aslında farklı bir 38 çözümüm vardı, ama temelde Maltysen'in cevabını çözdüğü bir çözümdü. Bu yüzden biraz farklı gitmeye karar verdim.

Çevrimiçi deneyin .

              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_ttHeşittir <_zttH.
isaacg

@isaacg Teşekkürler, zaten Maltysen'in cevabında benzer bir şey gördüm.
Jakube, 13.03.2015

4

JavaScript (ES6), 110 115

3 parametreli işlev, bir dizge döndürme

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 sürüm 119 : işlevler için kısa biçim yok, varsayılan parametreler yok. for(of)Desteklense bile kullanmak için hiçbir sebep yok

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 sürüm 126 : (için) hayır, hiçbir 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 konsolunda test edin

;[["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)))

Çıktı

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 bayt

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]

Direkt yaklaşımı alarak.


3

Haskell, 164 156 bayt

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

İşlev pçıktıyı yazdırmaz, ancak bir dize olarak döndürür, örneğin p 4 5 "+--+|||+--+|||"-> "+--+\n| |\n| |\n| |\n+--+\n". Daha iyi görüntü kullanımı için putStr:

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

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

Nasıl çalışır: Bir wx hboşluk yaratır ve ilk satırı girdi dizesinin başlangıcıyla değiştiririm. Sonra bloğu saatin tersi yönde döndürürüm ve ilk satırın yerini üç kez değiştiririm.

İlk karakterin 4. turdan sonra tekrar kesilmesini önlemek için başlamadan önce onu giriş dizgisine ekliyorum.

"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

Düzenleme: kesme-ilk karakter-sıra-dönüş-4 sorununu çözmek için daha iyi bir yol buldu.


Ah güzel ... bu işe yaraması dışında, CJam'da denediklerime benziyor. ;)
Martin Ender

3

Postscript, 62 bayt

Elbette bu ikili belirteçleri kullanır, ancak buna eşdeğerdir:

/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

İşte dosyanın ( xxd round.ps) bir hexdump :

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}..]..

Olarak çalıştırmak:

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

Çıktı gerçekten küçüktür (yazı tipini hiç ölçeklememenin bir sonucu olarak), bu nedenle görmek için adil bir parçaya yakınlaştırma yapmanız gerekir.

Bu, xyshowözel karakter aralıklarını kullanarak dizeyi yazmak için operatörden faydalanır . Bu durumda, yazmak için negatif dikey boşluğu, sonra geriye doğru yazmak için negatif yatay boşluğu, sonra yukarı doğru yazmak için pozitif dikey boşluğu kullanın. Bu nedenle, herhangi bir tür string manipülasyon kullanmama gerek yok.


3

> <>, 82 80 + 3 = 83 bayt

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

Esolang sayfası> <> (Balık)

Bu beklediğimden daha kısa olduğu ortaya çıktı. İlk satırı, sonra merkezi boşluklarla doldurulmuş sütunları, sonra son satırı yazdırma basit bir yaklaşım kullanır.

Dize STDIN üzerinden ve yükseklik ve genişlikten -vbayrak ile komut satırı üzerinden girin , şöyle:

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

açıklama

: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

Başlamanız için bir kabuk betiği:

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

Girdiyi komut satırı argümanları olarak ilet:

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

2

JavaScript, 161 160 158 bayt

Karşılaştığım yöntem çok uzun sürdü, ama ah, peki, pratikti. (Ayrıca, hecelemesini sağladım 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}

Mantıklı gelmeyen girdi için çıktı tanımlanmamıştır (kelimenin tam anlamıyla ve bir kaç kez), ancak tüm test durumlarında işe yarar.


slicedaha kısa substr, tamamen aynı değil, ancak bu durumda kullanabilirsiniz
edc65

2

Harika, 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()}

aramak:

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

çıktı:

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

2

K, 55 54 bayt

Randomra'nın J uygulamasıyla aynı yaklaşımı kullanarak; Bir boşluk bloğu ile başlayın ve dört kez döndürürken dizenin kuyruğundan kenara ekleyin:

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

Ve bazı örnekler:

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

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

Okunabilirlik için biraz parçalamak,

Bir NxM bloğu oluşturun:

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

Transpose ( +) kullanarak ve her birini ters çevirerek ( ) 90 derece döndürün |:':

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

Biz alanlarda bir blok var Yani eğer tve bir dize s, biz kuyruğuna bir dilim başa ekleyebilir siçin 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] ... }/( ... )Bir işlevi tekrar tekrar kullanmak için , dizgeden ve oluşturduğumuz matristen oluşan bir demet uygulamak için formu kullanırız . Bu döndürme ve birleştirme adımını her yaptığımızda, dizeyi de kesiyoruz.

Düzenle:

Başka bir fikir, giriş dizesini programın ana gövdesini basitleştiren her bir dönüşte istediğimiz parçalara bölmeyi denemek. Ne yazık ki bu 56 baytta biraz daha uzun olacak

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

Bu bölme noktalarını hesaplamanın daha iyi bir yolu varsa, önerilere açığım.

edit2:

Hafifçe yeniden düzenlemek, bir parantez çıkarmamı sağlar. 54 bayt!

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

2

K, 80 68 bayt

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

@JohnE sayesinde 80'den kısaltıldı.

Orijinal:

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

Bu şeyin nasıl çalıştığını bile bilmiyordum.

Örnek kullanım:

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

Bazı olası optimizasyonlar var, ancak Kona'yı segfault yapmaya devam ediyorum ...


Sen 'take' (diyadik #) ve açık bir argüman listesini kullanarak bu biraz iyileştirebilir: f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}. Sayıma göre 68 karakter.
JohnE,

@JohnE Teşekkürler! Açık tartışma listesini biliyordum, ama bir şekilde fikrimi değiştirdi; Yine de, dyadic # hakkında hiçbir fikrim yoktu.
kirbyfan64sos

2

R, 178

Bu, s, w, hparametre olarak alan adsız bir işlevdir . Dizeyi bölmenin daha güzel bir yolu olmasını isterdim.

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

Test sürüşü

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

Yine de korkunç derecede uzun olsa da, bunun bir sorguda düşündüğümden biraz daha kolay (ve daha kısa) olduğu ortaya çıktı. T-SQL için bir satır içi tablo değerli işlev olarak uygulanır.

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

Bu, @h zamanları dizgisinde yeniden canlandırır. İlk özyineleme, dizeden @W karakterleri alır. Orta yinelemeler, kalan dizgiden birincisini ve dize dolgusunu alır. Son özyineleme kalanı tersine çevirir. SQL Server'ın VARCHARS üzerindeki takip eden boşlukları işleme biçimini ele alan birkaç kayıp karakter var.

Test sürüşü

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 bayt

Derleyici kullanılan - GCC 4.9.2 ile -std=c++14bayrak

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

Burada test et.

açıklama

#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[][]Bunun yerine karakterleri kaydedemez miydiniz ?
corsiKa

Hayır, vector<vector<char>> M;M.resize(h,vector<char>(w,0));biraz daha kısadırchar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Anmol Singh Jaggi

1

Perl, 193 195 bayt

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

Bunun büyük ölçüde geliştirilebileceğinden eminim. Acemiyim. >, <


0

Java 11, 180 bayt

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

Online Deneyin (NOT: String.repeat(int)olarak taklit edilir repeat(String,int). Java 11 henüz TIO olmadığı için, aynı bayt sayım için)

Açıklama:

(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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.