กล่องขยายอัตโนมัติ


16

บทนำ

บางครั้งกล่องของฉันเล็กเกินไปที่จะใส่อะไรลงไป ฉันต้องการให้คุณทำกล่องขยาย! ดังนั้นสิ่งที่ทำให้กล่องกล่องในความท้าทายนี้

 OOOO
O    O
O    O
O    O
 OOOO

มุมของกล่องเป็นช่องว่างเสมอ ตัวกล่องสามารถสร้างขึ้นมาจากตัวละครเดียวกัน อักขระนั้นสามารถเป็นอักขระ ASCII ที่พิมพ์ได้ยกเว้นช่องว่าง ดังนั้นนั่นคือตัวละครเหล่านี้:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

ความยาวด้านข้างของกล่องข้างต้นเป็น4, 3 คุณอาจจะคิดว่ามีความยาวด้านข้างอยู่เสมอในเชิงบวก นั่นหมายความว่านี่คือกล่องที่เล็กที่สุดที่คุณต้องจัดการ:

 #
# #
 #

ในการขยายกล่องคุณจำเป็นต้องเพิ่มความยาวแต่ละด้าน ลองทำอย่างนี้ทีละขั้นตอนกับตัวอย่างข้างต้น ก่อนอื่นเราเอาส่วนบนของกล่องซึ่งก็คือ:

 OOOO

เราขยายมันทีละรายการดังนั้นเราจึงได้รับ:

 OOOOO

นี่คือส่วนบนและล่างของกล่องตอนนี้ หลังจากนั้นเราทำเช่นเดียวกันกับด้านข้างทางซ้ายและขวา:

O
O
O

กลายเป็น:

O
O
O
O

ตอนนี้เรารวมกันอีกกล่องซึ่งเป็น:

 OOOOO
O     O
O     O
O     O
O     O
 OOOOO

งาน

ได้รับกล่องขยายได้ 1 กล่องสามารถได้รับในหลายบรรทัดหรือในอาร์เรย์

กรณีทดสอบ

 OOOO          OOOOO
O    O    >   O     O
 OOOO         O     O
               OOOOO

 XXXXXX        XXXXXXX
X      X  >   X       X
X      X      X       X
 XXXXXX       X       X
               XXXXXXX

 ~             ~~
~ ~       >   ~  ~
 ~            ~  ~
               ~~

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!


1
กล่องจะมีบรรทัดใหม่ก่อนหน้าได้หรือไม่
Riley

@Riley ใช่ที่ได้รับอนุญาต :)
Adnan

1
กล่องสามารถบุด้วยช่องว่างได้หรือไม่?
Leun Nun

@LeakyNun ใช่คุณสามารถทำได้
Adnan

คำตอบ:


4

V , 6 5 ไบต์

yêpjÄ

ลองออนไลน์!

นี่เป็นไบต์ที่ยาวเกินควร มันควรจะเป็น:

äêjÄ

แต่นี่มีข้อผิดพลาดที่ไม่รู้จัก :(

คำอธิบาย:

yê     "yank this colum
  p    "paste what we just yanked
   j   "move down to line 2
    Ä  "and duplicate this line

อีกคนหนึ่งทำอะไร
Conor O'Brien

@ ConorO'Brien äเป็นโอเปอเรเตอร์ที่ซ้ำกัน (โดยหลักคือ "y" และ "p" พร้อมกันในหนึ่งไบต์) ดังนั้นจึงäêเป็น "คอลัมน์ซ้ำกัน"
DJMcMayhem

11

เป็นกลุ่ม 7 ไบต์

♥GYPjYp

โดยที่♥คือ Control-V

           The cursor starts on the first non-whitespace character of the first line.
♥G         Enter visual block mode and go to bottom of document.
  YP       Duplicate this column.
    j      Move down to the second line of the file.
     Yp    Duplicate this line.

ป้อนคำอธิบายรูปภาพที่นี่


ทำไมไม่ใช้YPทั้งสองครั้งเพื่อความมั่นคง?
Neil

ฉันเผลอชนpขณะบันทึกภาพเคลื่อนไหวฉันจึงติดมันเมื่อทำการถอดคำตอบ มันสำคัญไหม > _>;
Lynn

ฉันเพิ่งพบความไม่ลงรอยกันที่แปลก แต่ฉันชอบคำอธิบายของคุณ
Neil

ตรงนี้เป็นสิ่งเดียวกับคำตอบของฉัน V เพียงว่าฉันเกิดขึ้นเพื่อสร้างการแมปหนึ่งไบต์สำหรับและ<C-v> G YPมันทำให้ภาษาของฉันรู้สึกถูก : /
DJMcMayhem

หืมการควบคุม -V ปรากฏเป็นหัวใจในโทรศัพท์ของฉัน ... ❤
Beta Decay

6

JavaScript (ES6), 57 53 52 ไบต์

s=>s.replace(/^.(.)/gm,s="$&$1").replace(/(\n.*)/,s)

คำอธิบาย: regexp แรกทำซ้ำคอลัมน์ที่สองและ regexp ที่สองทำซ้ำแถวที่สองจึงขยายกล่องตามที่ต้องการ แก้ไข: บันทึกแล้ว 4 ไบต์ขอบคุณ MartinEnder ♦


6

Python ขนาด49 42 ไบต์

แลมบ์ดานิรนาม:

-7 จากxnor

lambda s:[t[:2]+t[1:]for t in s[:2]+s[1:]]

รุ่นก่อนหน้า:

D=lambda s:s[:2]+s[1:]
lambda s:D(list(map(D,s)))

D เป็นฟังก์ชันที่ทำซ้ำรายการลำดับที่สอง


1
ความคิดของอีกครั้งโดยใช้ฟังก์ชั่นที่เป็นคนฉลาด lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]]แต่ดูเหมือนว่าจะสั้นเพียงแค่ทำซ้ำรหัส:
xnor

หมายเหตุด้านข้างสำหรับเวอร์ชั่นก่อนหน้า: ฉันคิดว่าmap(D,D(s))จะให้ 43 แทน
Sp3000

5

เรติน่า 20 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

1`¶
¶$%'¶
%2=`.
$&$&

ลองออนไลน์! (มีหลายบรรทัดเพิ่มเติมที่เปิดใช้งานชุดทดสอบที่กรณีทดสอบถูกคั่นด้วยสองบรรทัดฟีด)

คำอธิบาย

1`¶
¶$%'¶

1เป็นข้อ จำกัดที่ จำกัด เรตินาเพื่อใช้การทดแทนเฉพาะกับแมทช์แรกที่พบ ตรงกับ linefeed เดียวดังนั้นเราจำเป็นต้องพิจารณาเปลี่ยน linefeed ที่ท้ายบรรทัดแรกเท่านั้น มันจะถูกแทนที่ด้วย¶$%'¶โดยที่$%'แทรกทั้งบรรทัดหลังการแข่งขัน (องค์ประกอบทดแทนเฉพาะ Retina) ดังนั้นจึงเป็นการทำซ้ำบรรทัดที่สอง

%2=`.
$&$&

นี่%คือโหมดต่อบรรทัดดังนั้นแต่ละบรรทัดจะถูกประมวลผลแยกกันและบรรทัดจะรวมกันอีกครั้งหลังจากนั้น 2=ยังเป็นข้อ จำกัด อันนี้หมายความว่า "ใช้การเปลี่ยนตัวเพื่อการแข่งขันนัดที่สองเท่านั้น" การแข่งขันนั้นง่ายมากเพียงตัวละครตัวเดียวและการแทนที่นั้นจะซ้ำกัน ดังนั้นขั้นตอนนี้จะทำซ้ำคอลัมน์ที่สอง


5

Haskell, 24 ไบต์

f(a:b:c)=a:b:b:c
f.map f

ใช้แนวคิดของ RootTwo ในการทำซ้ำแถวและคอลัมน์ที่สอง สิ่งmap fนี้ทำกับแต่ละแถวและf.จากนั้นทำเช่นนี้กับแถว


4

PowerShell v2 +, 57 53 52 ไบต์

param($n)($n-replace'^.(.)','$&$1')[0,1+1..$n.count]

เล็กน้อยคล้ายกับนีลตอบ JavaScript การแทนที่ครั้งแรกตรงกับจุดเริ่มต้นของบรรทัดและอักขระสองตัวถัดไปและแทนที่ด้วยอักขระตัวแรกและอักขระตัวที่สอง - สองครั้ง แทนที่จะเป็นการแทนที่ครั้งที่สองมันสลับกันสำหรับการทำดัชนีอาร์เรย์เพื่อทำซ้ำบรรทัดที่สอง รับอินพุตเป็นอาร์เรย์ของสตริง ชิ้นอาร์เรย์ที่เป็นผลลัพธ์จะถูกทิ้งไว้บนไปป์ไลน์และการพิมพ์นั้นโดยนัย

บันทึกแล้ว 4 ไบต์ขอบคุณ Martin

ตัวอย่างบางส่วน:

PS C:\Tools\Scripts\golfing> .\automatic-box-expander.ps1 ' oooo ','o    o',' oooo '
 ooooo 
o     o
o     o
 ooooo 

PS C:\Tools\Scripts\golfing> .\automatic-box-expander.ps1 ' # ','# #',' # '
 ## 
#  #
#  #
 ## 

2
@ มาร์ตินใช่ขอบคุณ O Wise Regex-Sensei
AdmBorkBork


3

MATLขนาด 12 ไบต์

tZy"@:2hSY)!

อินพุตเป็นอาร์เรย์ถ่าน 2 มิติโดยมีเครื่องหมายอัฒภาคเป็นตัวคั่นแถว ตัวอย่างเช่นกรณีทดสอบแรกมีอินพุต

[' OOOO ';'O    O';' OOOO ']

ลองออนไลน์! กรณีทดสอบ1 , 2 , 3

คำอธิบาย

รหัสทำสิ่งต่อไปนี้สองครั้ง: ทำซ้ำแถวที่สองของอาร์เรย์และแปลง

ในการทำซ้ำแถวที่สองของอาร์เรย์m× nเวกเตอร์[1 2 2 3 ... m]จะใช้เป็นดัชนีแถว เวกเตอร์นี้ถูกสร้างขึ้นดังนี้: ช่วง[1 2 3 ... m], แนบอีก2, เรียงลำดับ

t       % Take input implicitly. Duplicate
Zy      % Size of input as a two-element array [r, c]
"       % For each of r and c
  @     %   Push r in first iteration (or c in the second)
  :     %   Generate range [1 2 3 ... r] (or [1 2 3 ... c])
  2hS   %   Append another 2 and sort
  Y)    %   Apply as row index
  !     %   Transpose
        % End for. Display implicitly


2

SED 69 19 (14 + 1 สำหรับ -r) 15

s/.(.)/&\1/;2p   

1
ทำ/.\(.\)/\0\1;2pไม่ได้เหรอ
Neil

@ ไม่มีฉันมองไปทั่ว2pฉันคิดว่ามีวิธีที่จะทำ แต่ฉันไม่สามารถหาได้ ขอบคุณ!
Riley

ไม่จำเป็นต้องใช้ส่วนของ -r '' ตราบใดที่คุณเพิ่ม 1 ไบต์สำหรับแฟล็ก r จึงประหยัดได้ 3 ไบต์ นอกจากนี้เนื่องจากคุณแก้ไขโค้ดเวอร์ชันแรกของคุณคำอธิบายในตอนท้ายจึงไม่ถูกต้อง
seshoumara

@ Neil ไม่สามารถเชื่อสายตาของฉันเมื่อฉันเห็น\0backreference เนื่องจากพวกเขาเริ่มต้นที่ 1 คู่มือออนไลน์ของ GNU sed พูดไม่ได้เลย อย่างไรก็ตามการใช้&คือฉันคิดว่าเทียบเท่าและสั้นกว่า
seshoumara

@seshoumara อาผู้ที่ละเอียดอ่อนรุ่น regexp ... อัน\0ไหนที่ใช้แล้ว?
Neil

1

CJam , 14 ไบต์

q~{~\_@]z}2*N*

คล้ายกับคำตอบ MATL ของฉันแต่ทำซ้ำแถวที่สองสุดท้ายแทนแถวที่สอง

ลองออนไลน์!

คำอธิบาย

q                e# Read input
 ~               e# Interpret as an array
  {      }2*     e# Do this twice
   ~             e# Dump array contents onto the stack
    \            e# Swap top two elements
     _           e# Duplicate
      @          e# Rotate
       ]         e# Pack into an array again
        z        e# Zip
            N*   e# Join by newlines. Implicitly display

1

K, 15 ไบต์

2{+x@&1+1=!#x}/

รับอินพุตเป็นเมทริกซ์ของอักขระ:

  b: (" OOOO ";"O    O";" OOOO ")
(" OOOO "
 "O    O"
 " OOOO ")

ใช้ฟังก์ชั่นสองครั้ง ( 2{…}/) ซึ่งจะให้การโยกย้าย ( +) ของการโต้แย้งที่ถูกจัดทำดัชนี ( x@) โดยการถอดรหัสความยาวรันที่เพิ่มขึ้น ( &) ของหนึ่งบวก ( 1+) รายการของสถานที่ตั้งเท่ากับ 1 (1= ) ในช่วงตั้งแต่ 0 ถึง ( !) ขนาดของมิติข้อมูลด้านนอกของอาร์กิวเมนต์ที่ถูกต้อง ( #x)

เป็นขั้นเป็นตอน,

  #b
3
  !#b
0 1 2
  1=!#b
0 1 0
  1+1=!#b
1 2 1
  &1+1=!#b
0 1 1 2
  b@&1+1=!#b
(" OOOO "
 "O    O"
 "O    O"
 " OOOO ")
  +b@&1+1=!#b
(" OO "
 "O  O"
 "O  O"
 "O  O"
 "O  O"
 " OO ")
  2{+x@&1+1=!#x}/b
(" OOOOO "
 "O     O"
 "O     O"
 " OOOOO ")

ลองที่นี่ด้วย oK


1

APL, 17 15 ไบต์

{⍉⍵⌿⍨1+2=⍳≢⍵}⍣2

ทดสอบ:

      smallbox largebox
┌───┬──────┐
│ # │ OOOO │
│# #│O    O│
│ # │O    O│
│   │O    O│
│   │ OOOO │
└───┴──────┘
      {⍉⍵⌿⍨1+2=⍳≢⍵}⍣2 ¨ smallbox largebox
┌────┬───────┐
│ ## │ OOOOO │
│#  #│O     O│
│#  #│O     O│
│ ## │O     O│
│    │O     O│
│    │ OOOOO │
└────┴───────┘

คำอธิบาย:

             ⍣2   run the following function 2 times:
{           }     stretch the box vertically and transpose
         ⍳≢⍵      indices of rows of box
       2=         bit-vector marking the 2nd row
  ⍵/⍨1+           replicate the 2nd row twice, all other rows once
 ⍉                transpose

สัญลักษณ์ APL monadic ⍉คือทรานสดิวเซอร์เมทริกซึ่งไม่เหมือนกับการหมุน 90 องศา
JohnE

1
@ JohnE: แน่นอน ฉันคงจะเหนื่อยมากกว่าที่คิด จริงๆแล้วการหมุน 90 องศาน่าจะเป็น⌽⍉หรือ⊖⍉แต่ในกรณีนี้มันไม่สำคัญ
marinus

0

ListSharp , 326 ไบต์

STRG a=READ[<here>+"\\a.txt"]
ROWS p=ROWSPLIT a BY ["\r\n"]
ROWS p=GETLINES p [1 TO p LENGTH-1]
ROWS p=p+p[1]+p[0]
STRG o=p[0]
ROWS y=EXTRACT COLLUM[2] FROM p SPLIT BY [""]
ROWS x=EXTRACT COLLUM[3] FROM p SPLIT BY [""]
[FOREACH NUMB IN 1 TO o LENGTH-1 AS i]
ROWS m=COMBINE[m,x] WITH [""]
ROWS m=COMBINE[y,m,y] WITH [""]
SHOW=m

แน่นอนค่ะต้องเพิ่มการทำรังของการทำงาน แต่ตอนนี้ทำงานเป็นอย่างดี

แสดงความคิดเห็นหากคุณต้องการคำอธิบาย


0

JavaScript, 160 146 141 bytes

s=>{a=s[1];r="";l=s.split("\n");m=l.length;n=l[0].length;for(i=0;i<=m;i++){for(j=0;j<=n;j++)r+=!(i%m)&&j%n||i%m&&!(j%n)?a:" ";r+="\n"}return r}

0

Dyalog APL ขนาด 14 ไบต์

(1 2,1↓⍳)¨∘⍴⌷⊢

(

1 2, {1, 2} ต่อท้าย

1↓ องค์ประกอบหนึ่งลดลงจาก

ดัชนี

ของแต่ละคน

ของ

{จำนวนแถวนับคอลัมน์}

จัดทำดัชนีเป็น

อาร์กิวเมนต์

เช่นสำหรับ

 XX
X  X
 XX

เราค้นหาดัชนี; {1, 2, 3} สำหรับแถวและ {1, 2, 3, 4} สำหรับคอลัมน์ ตอนนี้เราปล่อยอิลิเมนต์เริ่มต้นเพื่อรับ {2, 3} และ {2, 3, 4} จากนั้นเติมด้วย {1, 2} โดยให้ {1, 2, 2, 3} และ {1, 2, 2, 3, 4} สุดท้ายเราใช้สิ่งนี้เพื่อเลือกแถวและคอลัมน์พร้อมกันเป็นสองเท่าของแถวที่ 2 และคอลัมน์ที่ 2

ลองใช้ออนไลน์!


0

ทับทิมขนาด 46 ไบต์

->a{a.map{|r|r.insert(2,r[1])}.insert(2,a[1])}

วิธีการแก้ปัญหาที่ตรงไปตรงมามากรับอินพุตเป็นอาร์เรย์ของเส้น ฉันไม่ชอบเกมที่ซ้ำซ้อนinsertดังนั้นจะพยายามเล่นกอล์ฟ


0

C #, 127 124 ไบต์

s=>{int n=s.Count-1,i=0;s[0]=s[n]=s[0].Insert(1,s[0][1]+"");s.Insert(1,s[1]);for(;i++<n;)s[i]=s[i].Insert(1," ");return s;};

Func<List<string>, List<string>>รวบรวมไป

เวอร์ชันที่จัดรูปแบบ:

s =>
{
    int n = s.Count - 1, i = 0;

    s[0] = s[n] = s[0].Insert(1, s[0][1] + "");

    s.Insert(1, s[1]);

    for (; i++ < n;)
        s[i] = s[i].Insert(1, " ");

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