Mở rộng hộp tự động


16

Giới thiệu

Đôi khi, hộp của tôi quá nhỏ để phù hợp với bất cứ điều gì trong đó. Tôi cần bạn làm một hộp mở rộng! Vì vậy, những gì làm cho một hộp một hộp trong thử thách này.

 OOOO
O    O
O    O
O    O
 OOOO

Các góc của hộp luôn là không gian. Bản thân hộp có thể được tạo ra từ cùng một nhân vật. Ký tự đó có thể là bất kỳ ký tự ASCII có thể in nào , ngoại trừ một khoảng trắng. Vì vậy, đó là những nhân vật:

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

Độ dài cạnh của hộp ở trên là 4, 3 . Bạn có thể cho rằng chiều dài bên luôn luôn tích cực . Điều đó có nghĩa là đây là hộp nhỏ nhất bạn cần xử lý:

 #
# #
 #

Để mở rộng một hộp, bạn cần tăng mỗi chiều dài mỗi bên. Chúng ta hãy đi qua điều này, từng bước một, với ví dụ trên. Đầu tiên chúng ta lấy phía trên của hộp, đó là:

 OOOO

Chúng tôi mở rộng điều này bằng một, vì vậy chúng tôi nhận được:

 OOOOO

Đây là phần trên và dưới của hộp bây giờ. Sau đó, chúng tôi làm tương tự với các bên bên trái và bên phải:

O
O
O

Trở thành:

O
O
O
O

Bây giờ chúng tôi lắp lại hộp, kết quả là:

 OOOOO
O     O
O     O
O     O
O     O
 OOOOO

Nhiệm vụ

Cho một hộp, mở rộng nó thêm 1. Hộp có thể được cho trong nhiều dòng hoặc trong một mảng.

Các trường hợp thử nghiệm

 OOOO          OOOOO
O    O    >   O     O
 OOOO         O     O
               OOOOO

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

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

Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!


1
hộp có thể có một dòng mới trước nó?
Riley

@Riley Vâng, điều đó được cho phép :).
Ad Nam

1
Hộp có thể được đệm với không gian?
Leaky Nun

@LeakyNun Vâng, bạn có thể làm điều đó.
Ad Nam

Câu trả lời:


4

V , 6 5 byte

yêpjÄ

Hãy thử trực tuyến!

Đây thực sự là một byte dài hơn nó nên được. Đáng lẽ ra phải là:

äêjÄ

Nhưng điều này có một lỗi chưa biết. :

Giải trình:

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

Người kia làm gì?
Conor O'Brien

@ ConorO'Brien älà toán tử trùng lặp (về cơ bản là "y" và "p" với nhau trong một byte), do đó, äê"cột trùng lặp"
DJMcMayhem

11

Vim, 7 byte

♥GYPjYp

Trong đó ♥ là 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.

nhập mô tả hình ảnh ở đây


Tại sao không sử dụng YPcả hai lần cho thống nhất?
Neil

Tôi vô tình nhấn ptrong khi ghi lại hình ảnh động, vì vậy tôi bị mắc kẹt với nó khi phiên âm câu trả lời. Có vấn đề gì không? > _>;
Lynn

Tôi chỉ tìm thấy sự không nhất quán kỳ lạ, nhưng tôi thích lời giải thích của bạn.
Neil

Điều này hoàn toàn giống với câu trả lời V của tôi, chỉ là tôi tình cờ tạo ra ánh xạ một byte cho <C-v> GYP. Nó làm cho ngôn ngữ của tôi cảm thấy rẻ tiền. : /
DJMcMayhem

Hừm, control-V xuất hiện như một trái tim trên điện thoại của tôi ...
Beta Decay

6

JavaScript (ES6), 57 53 52 byte

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

Giải thích: regrec thứ nhất sao chép cột thứ hai và regrec thứ hai nhân đôi hàng thứ hai, do đó mở rộng hộp theo ý muốn. Chỉnh sửa: Đã lưu 4 byte nhờ MartinEnder ♦.


6

Python, 49 42 byte

Lambda ẩn danh:

-7 từ xnor

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

Phiên bản trước:

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

D là một hàm nhân đôi mục thứ hai của chuỗi.


1
Ý tưởng sử dụng lại chức năng là thông minh, nhưng dường như ngắn hơn để chỉ lặp lại mã : lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]].
xnor

Lưu ý bên lề cho phiên bản trước: Tôi nghĩ map(D,D(s))sẽ cung cấp 43 thay thế
Sp3000

5

Võng mạc , 20 byte

Số lượng byte giả định mã hóa ISO 8859-1.

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

Hãy thử trực tuyến! (Có một số dòng bổ sung cho phép bộ kiểm thử trong đó các trường hợp kiểm thử được phân tách bằng hai nguồn cấp.)

Giải trình

1`¶
¶$%'¶

1là một giới hạn hạn chế Retina chỉ áp dụng thay thế cho trận đấu đầu tiên mà nó tìm thấy. phù hợp với một nguồn cấp dữ liệu duy nhất, vì vậy chúng tôi chỉ cần xem xét thay thế nguồn cấp dữ liệu ở cuối dòng đầu tiên. Nó được thay thế bằng ¶$%'¶, trong đó $%'chèn toàn bộ dòng sau trận đấu (một yếu tố thay thế dành riêng cho Retina). Do đó, điều này trùng lặp dòng thứ hai.

%2=`.
$&$&

Ở đây, %là chế độ trên mỗi dòng, vì vậy mỗi dòng được xử lý riêng lẻ và các dòng được nối lại sau đó. 2=cũng là một giới hạn Điều này có nghĩa là "chỉ áp dụng thay thế cho trận đấu thứ hai". Trận đấu tự nó đơn giản là một nhân vật duy nhất và sự thay thế nhân đôi nó. Do đó, giai đoạn này nhân đôi cột thứ hai.


5

Haskell, 24 byte

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

Sử dụng ý tưởng của RootTwo về sao chép hàng và cột thứ hai. Cái map fnày làm cho mỗi hàng, và f.sau đó làm điều này cho các hàng.


4

PowerShell v2 +, 57 53 52 byte

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

Hơi giống với câu trả lời JavaScript của Neil . Thay thế đầu tiên khớp với đầu dòng và hai ký tự tiếp theo, và thay thế chúng bằng ký tự đầu tiên và ký tự thứ hai - hai lần. Thay vì thay thế thứ hai, nó được hoán đổi để lập chỉ mục mảng để nhân đôi dòng thứ hai. Đưa đầu vào như một mảng của chuỗi. Các lát mảng kết quả được để lại trên đường ống và in ấn là ẩn.

Lưu được 4 byte nhờ Martin.

Vài ví dụ:

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
@MartinEnder Vâng, cảm ơn bạn, O Wise Regex-Sensei.
admBorkBork


3

MATL , 12 byte

tZy"@:2hSY)!

Đầu vào là một mảng char 2D, với dấu chấm phẩy là dấu phân cách hàng. Ví dụ, trường hợp thử nghiệm đầu tiên có đầu vào

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

Hãy thử trực tuyến! Các trường hợp thử nghiệm 1 , 2 , 3 .

Giải trình

Mã này thực hiện hai lần sau: lặp lại hàng thứ hai của mảng và hoán vị.

Để lặp lại hàng thứ hai của một mảng m× n, vectơ [1 2 2 3 ... m]được sử dụng làm chỉ mục hàng. Vector này được tạo ra như sau: phạm vi [1 2 3 ... m], đính kèm khác 2, sắp xếp.

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 cho -r) 15

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

1
Bạn không thể làm gì /.\(.\)/\0\1;2p?
Neil

@ Tôi đã tìm kiếm tất cả về điều đó 2p, tôi đoán rằng có một cách để làm điều đó, nhưng tôi không thể tìm thấy nó. Cảm ơn!
Riley

Phần -r '' không cần thiết miễn là bạn thêm 1 byte cho cờ r, do đó tiết kiệm được 3 byte. Ngoài ra, vì bạn đã chỉnh sửa phiên bản mã đầu tiên của mình, phần giải thích ở cuối không có giá trị.
seshoumara

@Neil Không thể tin vào mắt mình khi tôi nhìn thấy phản hồi \0, vì chúng bắt đầu từ 1. Hướng dẫn trực tuyến của GNU sed không nói gì về nó. Tuy nhiên, sử dụng &là tôi nghĩ tương đương và ngắn hơn.
seshoumara

@seshoumara Ah, những sự tinh tế của phiên bản regrec ... cái nào được sử dụng \0sau đó?
Neil

1

CJam , 14 byte

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

Tương tự như câu trả lời MATL của tôi , nhưng lặp lại hàng thứ hai thay vì hàng thứ hai.

Hãy thử trực tuyến!

Giải trình

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 byte

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

Đưa đầu vào dưới dạng ma trận các ký tự:

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

Áp dụng một hàm hai lần ( 2{…}/) cho phép chuyển vị ( +) của đối số bên phải được lập chỉ mục ( x@) bằng cách giải mã độ dài chạy tăng dần ( &) của một cộng ( 1+) một danh sách các vị trí bằng 1 (1= ) trong phạm vi từ 0 đến ( !) kích thước của kích thước bên ngoài của đối số bên phải ( #x).

Từng bước một,

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

Hãy thử nó ở đây với oK.


1

APL, 17 15 byte

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

Kiểm tra:

      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 │
└────┴───────┘

Giải trình:

             ⍣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

Ký hiệu APL monadic ⍉ là ma trận chuyển vị, không giống với xoay 90 độ.
JohnE

1
@ John: tất nhiên. Tôi đã phải mệt mỏi hơn tôi nghĩ. Thực tế xoay 90 độ sẽ là ⌽⍉hoặc ⊖⍉, nhưng trong trường hợp này nó không thành vấn đề.
bến tàu

0

ListSharp , 326 byte

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

Tôi chắc chắn cần phải thêm các hàm lồng nhau, nhưng điều này hoạt động rất tốt

bình luận nếu bạn muốn một lời giải thích


0

JavaScript, 160 146 141 byte

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

APL Dyalog , 14 byte

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

(

1 2, {1, 2} dự kiến

1↓ một yếu tố rơi từ

các chỉ số

của mỗi

của

{đếm hàng, đếm cột}

lập chỉ mục vào

tranh luận

Ví dụ cho

 XX
X  X
 XX

chúng tôi tìm thấy các chỉ số; {1, 2, 3} cho các hàng và {1, 2, 3, 4} cho các cột. Bây giờ chúng tôi bỏ các phần tử ban đầu để nhận {2, 3} và {2, 3, 4}, sau đó thêm vào {1, 2}, đưa ra {1, 2, 2, 3} và {1, 2, 2, 3, 4}. Cuối cùng, chúng tôi sử dụng điều này để chọn các hàng và cột, đồng thời nhân đôi hàng 2 và cột 2.

Dùng thử trực tuyến!


0

Ruby, 46 byte

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

Giải pháp rất căng thẳng, lấy đầu vào là mảng của các dòng. Tôi không thích các bản sao insert, vì vậy sẽ cố gắng chơi gôn.


0

C #, 127 124 byte

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

Biên dịch thành một Func<List<string>, List<string>> .

Phiên bản được định dạng:

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;
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.