自動ボックスエキスパンダー


16

前書き

箱が小さすぎて何も収まらないことがあります。ボックスエクスパンダーを作成する必要があります!それで、このチャレンジでボックスをボックスにするものは何ですか。

 OOOO
O    O
O    O
O    O
 OOOO

ボックスの角は常にスペースです。箱自体は同じキャラクターで作ることができます。その文字は、スペースを除く任意の印刷可能なASCII文字にすることができます。したがって、これらの文字は次のとおりです。

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

箱の辺の長さは、上記されている3,4。あなたは辺の長さが常に正であると仮定するかもしれません。これは、これが処理する必要がある最小のボックスであることを意味します。

 #
# #
 #

ボックスを展開するには、各辺の長さを増やす必要があります。上記の例を使用して、これを順を追って説明します。まず、ボックスの上側を取り上げます。

 OOOO

これを1つ拡張すると、次のようになります。

 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はい、許可されています:)。
アドナン

1
ボックスにスペースを埋め込むことはできますか?
リーキー修道女

@LeakyNunはい、できます。
アドナン

回答:


4

V6 5バイト

yêpjÄ

オンラインでお試しください!

これは実際には本来よりも1バイト長くなっています。次のようになっているはずです。

äêjÄ

しかし、これには未知のバグがあります。:(

説明:

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

もう1つは何をしますか?
コナーオブライエン

ConorO'Brien @ äので(1つのバイトで一緒に本質的に「Y」および「P」)重複演算子でありäê、「重複する列」である
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.

ここに画像の説明を入力してください


YP一貫性のために両方の時間を使用しないのはなぜですか?
ニール

pアニメーションの記録中に誤ってヒットしたため、答えを書き写すときにそれを使い続けました。それは重要ですか?> _>;
リン

矛盾を奇妙に感じましたが、あなたの説明が好きです。
ニール

これは私が1バイトのマッピングを作成するために起こっただけのことを、まさに私のVの答えと同じものである<C-v> GYP。それはちょっと私の言語を安く感じさせます。:/
DJMcMayhem

フム、私の携帯電話上での心のように制御-Vはショーアップ...❤
ベータ崩壊

6

JavaScript(ES6)、57 53 52バイト

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

説明:最初の正規表現は2番目の列を複製し、2番目の正規表現は2番目の行を複製するため、必要に応じてボックスを拡大します。編集:MartinEnder♦のおかげで4バイト保存されました。


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は、シーケンスの2番目の項目を複製する関数です。


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=`.
$&$&

オンラインでお試しください!(テストケースが2つの改行で区切られているテストスイートを有効にする追加の行がいくつかあります。)

説明

1`¶
¶$%'¶

1Retinaが検出した最初の一致にのみ置換を適用するよう制限する制限です。単一の改行と一致するため、最初の行の最後で改行を置き換えることだけを検討する必要があります。これはに置き換えられ¶$%'¶$%'マッチに続く行全体を挿入します(Retina固有の置換要素)。したがって、これは2行目を複製します。

%2=`.
$&$&

これ%は行単位モードであるため、各行は個別に処理され、その後、行は再び結合されます。2=制限もあります。これは、「2番目の一致にのみ置換を適用する」ことを意味します。一致自体は単純な1文字であり、置換はそれを複製します。したがって、この段階では2番目の列が複製されます。


5

Haskell、24バイト

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

2番目の行と列を複製するというRootTwoのアイデアを使用します。map f各行にこれを行い、そしてf.次に行にこれを行います。


4

PowerShell v2 +、57 53 52バイト

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

NeilのJavaScriptの回答に少し似ています。最初の置換は、行の先頭と次の2文字に一致し、それらを最初の文字と2番目の文字2回に置き換えます。2番目の置換の代わりに、2番目の行を複製するために配列のインデックス付けのために交換されます。入力を文字列の配列として受け取ります。結果の配列スライスはパイプラインに残り、印刷は暗黙的に行われます。

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ワイズ正規表現先生。
AdmBorkBork


3

MATL、12バイト

tZy"@:2hSY)!

入力はセミコロンを行の区切り文字とする2D文字配列です。たとえば、最初のテストケースには入力があります

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

オンラインでお試しください!テストケース123

説明

コードは次の2回を実行します。配列の2行目を繰り返して転置します。

m× n配列の2番目の行を繰り返すために、ベクトル[1 2 2 3 ... m]が行インデックスとして使用されます。このベクトルは[1 2 3 ... m]、range 、attach another 2、sortのように生成されます。

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 ''の部分は、rフラグに1バイトを追加し、3バイトを節約する限り必要ありません。また、コードの最初のバージョンを編集したため、最後の説明は無効になりました。
seshoumara

@Neilは、\01から始まるため、後方参照を見たときに私の目を信じることができませんでした。GNUsed のオンラインマニュアルは、それについて何も話していません。ただし、使用&は同等で短くなると思います。
seshoumara

@seshoumaraああ、それらの正規表現バージョンの微妙な...どれを使用し\0ますか?
ニール


1

K、15バイト

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

入力を文字のマトリックスとして受け取ります。

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

1回の増分ランレングスデコード()でインデックス付けされた右引数の2{…}/転置(+)に1に等しい位置のリスト()を与える関数を2回適用します(x@&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シンボルモナド⍉は行列の転置であり、90度回転するのと同じではありません。
-JohnE

1
@JohnE:もちろん。思っていたよりも疲れていたに違いありません。実際に90度回転すると、⌽⍉または⊖⍉になりますが、この場合は重要ではありません。
マリナス

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↓ から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を同時に2倍にします。

TryAPLオンライン!


0

ルビー、46バイト

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

入力を行の配列として取得する非常に簡単なソリューション。私はinsertsの複製が好きではないので、それをゴルフしようとします。


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.