ตัวละครใน String Go Round และ Round


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

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


8
กระดานผู้นำของคุณเจ๋งมาก
Alex A.

2
คุณเล่นกอล์ฟกระดานผู้นำของคุณหรือไม่?
mbomb007

2
@ mbomb007 ไม่ฉันรันโค้ดผ่าน minifiers ดังนั้นมันจะไม่ใช้พื้นที่มากเมื่อขยาย (ฉันเดาว่าการลบตัวแบ่งบรรทัดจะเพียงพอแล้ว) ฉันยังมีเวอร์ชั่นที่ไม่ระบุในฮาร์ดไดรฟ์ของฉัน
Martin Ender

2
หากคุณเปลี่ยนชื่อเป็น "The Chars ใน String Go Round and Round" มันเหมาะกับจังหวะของเพลงที่ดีกว่า
Justin

คำตอบ:


9

CJam, 27 ไบต์

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

ฉันไม่ได้เป็น CJam จริงๆ แต่ฉันคิดว่านี่จะชนะ Martin ข้อแตกต่างที่สำคัญคือเราจะต้องขึ้นบรรทัดใหม่ก่อนที่จะอ่านอินพุตและพิมพ์บรรทัดแรกทันทีโดยไม่จำเป็นต้องเก็บความสูง

รับอินพุตตามลำดับ

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 และจัดเก็บงานพิมพ์ในตัวแปร ...
Omar

1
@Omar นั่นจบลงได้อีกต่อไปเพราะคุณต้องใช้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 มันเป็นความคิดที่ดี แต่ฉันจะตรวจสอบว่าฉันสามารถใช้มันในวิธีที่ต่างออกไปได้ไหม
Martin Ender

D'โอ้! คุณพูดถึงปัญหา H = 2 แล้วและฉันก็ยังลืมที่จะป้องกัน
DocMax

9

Pyth, 47 46 45 40 37 36 36 ไบต์

นี่เป็นแนวทางที่ชัดเจนที่นำมาใช้ใน Pyth มันพิมพ์บรรทัดแรกโดยการจัดทำดัชนี0:widthแล้วตรงกลางจากนั้นสิ้นสุด

ขอขอบคุณที่ @Jakube สำหรับเคล็ดลับเกี่ยวกับการใช้zและสองปัจจัยการผลิตและการใช้Qp

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

รับอินพุตจาก stdin เป็นสตริงและเป็น tuple ของมิติบรรทัดใหม่คั่น:

Hello, World! 
5, 4

และเขียนไปยัง stdout

ลองได้ที่นี่

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
Jakube

37 ตัวอักษรเป็นไปได้ด้วยวิธีการของเรา
Jakube

@Jakube ขอบคุณสำหรับเคล็ดลับ!
Maltysen

ประหยัดอีกหนึ่งถ่าน แทนการ++ใช้งานpและสลับกับzt_N *d-k2
Jakube

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.
Martin Ender

4

Pyth, 38 37

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

ตอนแรกฉันมีวิธีแก้ปัญหาที่แตกต่างกัน 38 อย่าง แต่โดยทั่วไปแล้วมันเป็นคำตอบของ Maltysen ดังนั้นฉันตัดสินใจที่จะไปแตกต่างกันเล็กน้อย

ลองมันออนไลน์

              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

@isaacg ขอบคุณเห็นสิ่งที่คล้ายกันในคำตอบของ Maltysen แล้ว
Jakube

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 : ไม่ใช่สำหรับ (จาก), ไม่มีสตริงทำซ้ำ

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 hblock ของช่องว่างและแทนที่บรรทัดแรกด้วยจุดเริ่มต้นของสายป้อน จากนั้นฉันหมุนบล็อคทวนเข็มนาฬิกาและทำซ้ำการเปลี่ยนบรรทัดแรกอีกสามครั้ง

เพื่อป้องกันการตัดตัวอักษรตัวแรกอีกครั้งหลังจากหมุน # 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 ยกเว้นว่ามันใช้ได้ ;)
Martin Ender

3

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

ส่งผ่านอินพุตเป็นบรรทัดคำสั่ง args:

$ ./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นั้นไม่เหมือนกันทุก
ประการ

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

K, 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] ... }/( ... )เพื่อใช้ฟังก์ชันซ้ำกับ tuple ซึ่งประกอบด้วยสตริงและเมทริกซ์ที่เรากำลังสร้าง ทุกครั้งที่เราทำขั้นตอนหมุนและต่อกันนี้เราก็จะตัดสตริง

แก้ไข:

อีกแนวคิดหนึ่งคือลองแยกสตริงอินพุตเป็นชิ้นส่วนที่เราต้องการในแต่ละการหมุนซึ่งจะทำให้เนื้อหาหลักของโปรแกรมง่ายขึ้น น่าเสียดายที่นี่ใช้งานได้นานกว่าเล็กน้อยที่ 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

K, 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 ...


คุณสามารถปรับปรุงนี้บิตโดยใช้ 'ใช้' (dyadic #) f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}และรายการอาร์กิวเมนต์อย่างชัดเจน: 68 ตัวอักษรโดยการนับของฉัน
JohnE

@ JohnE ขอบคุณ! ฉันรู้เกี่ยวกับรายการอาร์กิวเมนต์ที่ชัดเจน แต่อย่างใดก็ลื่นใจของฉัน; ฉันไม่มีเงื่อนงำเกี่ยวกับ dyadic #
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)



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]();
Anmol Singh Jaggi

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

ลองมันออนไลน์ (verbose)หรือลองออนไลน์ (บริสุทธิ์)

คำอธิบาย:

โดยพื้นฐานแล้วเป็น builtin สำหรับความท้าทายนี้ รับอินพุตจำนวนเต็มสองรายการแรกเป็นความกว้างและความสูงและพิมพ์กล่องที่มีอินพุตสตริงที่สามเป็นเส้นขอบ:

Box(InputNumber(), InputNumber(), InputString())
BNNS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.