自动开箱器


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是的,允许:)。
阿德南(Adnan)

1
盒子可以装满空格吗?
Leaky Nun

@LeakyNun是的,您可以这样做。
阿德南

Answers:


4

V6 5字节

yêpjÄ

在线尝试!

实际上,这比应该的要长一个字节。应该是:

äêjÄ

但这有一个未知的错误。:(

说明:

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

另一个做什么呢?
科纳·奥布赖恩

@ ConorO'Brien ä是重复运算符(实际上是一个字节中的“ y”和“ p”一起),因此äê“ duplicate column”也是如此
DJMcMayhem

11

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

enter image description here


为什么不使用YP两次来保持一致性?
尼尔

p录制动画时,我不小心打了一下,所以在转录答案时坚持使用了它。有关系吗?> _>;
林恩

我只是发现不一致,但我喜欢您的解释。
尼尔

这也正是同样的事情,我的V答案,只是我碰巧为创建一个字节的映射<C-v> GYP。这有点使我的语言便宜。:/
DJMcMayhem

嗯,控制-V显示为我的电话上的心脏......❤
β衰变

6

JavaScript(ES6),57 53 52字节

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

说明:第一个正则表达式复制第二列,第二个正则表达式复制第二行,因此根据需要放大了该框。编辑:感谢MartinEnder♦,节省了4个字节。


6

蟒蛇, 49 42字节

匿名lambda:

来自xnor的 -7

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))
改成使用

5

视网膜,20字节

字节数假定为ISO 8859-1编码。

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

在线尝试!(有几条额外的线可启用一个测试套件,其中测试用例由两个换行分隔。)

说明

1`¶
¶$%'¶

1是一个限制,限制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]

有点类似于Neil的JavaScript答案。第一个替换匹配行的开头和后两个字符,并用第一个字符和第二个字符两次替换它们。代替第二次替换,它换成了数组索引以复制第二行。将输入作为字符串数组。结果数组切片保留在管道上,并且打印是隐式的。

感谢Martin,节省了4个字节。

一些例子:

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是的,谢谢,O Wise Regex-Sensei。
AdmBorkBork,2016年


3

MATL,12字节

tZy"@:2hSY)!

输入为2D字符数组,以分号作为行分隔符。例如,第一个测试用例具有输入

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

在线尝试!测试用例123

说明

该代码执行以下操作两次:重复数组的第二行并转置。

要重复m× n数组的第二行,则将矢量[1 2 2 3 ... m]用作行索引。此向量的生成方式如下:range [1 2 3 ... m],附加另一个2sort。

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(-r为14 +1)15

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

1
你不能做/.\(.\)/\0\1;2p吗?
尼尔

@Neil我到处都在寻找2p,我认为有办法做到这一点,但我找不到。谢谢!
莱利

只要为r标志添加1个字节,就不需要-r''部分,从而节省了3个字节。另外,由于您已编辑了代码的第一个版本,因此末尾的说明现在无效。
seshoumara

@Neil看到\0反向引用时我不敢相信,因为它们从1开始。GNUsed 的在线手册对此一无所知。但是,&我认为使用等效和较短。
seshoumara

@seshoumara啊,那些正则表达式版本的精妙之处…… \0那么,哪一个呢?
尼尔

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

可以在这里尝试。


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字节

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列加倍。

在线尝试APL!


0

Ruby,46个字节

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

非常简单的解决方案,将输入作为行数组。我不喜欢重复insert的,所以会尝试打高尔夫球。


0

C#,127124字节

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;
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.