자동 박스 익스팬더


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
상자에 공백을 채울 수 있습니까?
Leaky Nun

@LeakyNun 예, 그렇게 할 수 있습니다.
아드 난

답변:


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

다른 사람은 무엇을합니까?
코너 오브라이언

@ ConorO'Brien ä은 중복 연산자 (본질적으로 "y"와 "p"를 1 바이트로 묶음)이므로 äê"중복 열"
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일관성을 위해 두 시간을 모두 사용하지 않는 이유는 무엇 입니까?
Neil

p애니메이션을 기록하는 중에 실수로 부딪 쳤 으므로 답변을 작성할 때이 문제가 발생했습니다. 상관이 있나? > _>;
Lynn

불일치가 이상하다는 것을 알았지 만 설명이 마음에 듭니다.
Neil

이것은 내가 하나 바이트 맵핑을 작성하는 일이 그냥 정확히 내 V 대답과 같은 일 <C-v> G하고 YP. 그것은 내 언어가 싸다고 느끼게합니다. : /
DJMcMayhem

흠, control-V가 내 폰
Beta Decay

6

자바 스크립트 (ES6), 57 53 52 바이트

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

설명 : 첫 번째 정규 표현식은 두 번째 열을 복제하고 두 번째 정규 표현식은 두 번째 행을 복제하여 원하는대로 상자를 확대합니다. 편집 : MartinEnder ♦ 덕분에 4 바이트가 절약되었습니다.


6

파이썬, 49 42 바이트

익명 람다 :

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))대신 43을 줄 것 입니다
Sp3000

5

레티 나 , 20 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

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

온라인으로 사용해보십시오! (테스트 사례가 두 개의 줄 바꿈으로 구분되는 테스트 스위트를 사용 가능하게하는 몇 개의 추가 라인이 있습니다.)

설명

1`¶
¶$%'¶

1A는 한계 망막은 찾은 첫 경기에 대체를 적용하는 제한합니다. 단일 줄 바꿈과 일치하므로 첫 줄 끝의 줄 바꿈 만 교체하면됩니다. 로 대체됩니다 ¶$%'¶. 여기서 $%'일치하는 항목 (레티 나별 대체 요소) 다음에 전체 행을 삽입합니다. 따라서 두 번째 줄이 복제됩니다.

%2=`.
$&$&

여기서는 %라인 별 모드이므로 각 라인이 개별적으로 처리되고 라인이 나중에 다시 결합됩니다. 2=또한 한계입니다. 이것은 "두 번째 일치에만 대체 적용"을 의미합니다. 일치 자체는 단일 문자이며 대체는이를 복제합니다. 따라서이 단계는 두 번째 열을 복제합니다.


5

하스켈, 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 answer . 첫 번째 바꾸기는 줄의 시작과 다음 두 문자를 일치시키고 첫 번째 문자와 두 번째 문자를 두 번 바꿉니다. 두 번째 교체 대신 배열 인덱싱을 위해 두 번째 줄을 복제하기 위해 교체되었습니다. 입력을 문자열 배열로 취합니다. 결과 배열 슬라이스는 파이프 라인에 남아 있으며 인쇄는 암시 적입니다.

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


3

MATL , 12 바이트

tZy"@:2hSY)!

입력은 행 분리 자로 세미콜론이있는 2D 문자 배열입니다. 예를 들어 첫 번째 테스트 사례에는 입력이 있습니다.

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

온라인으로 사용해보십시오! 테스트 사례 1 , 2 , 3 .

설명

코드는 다음을 두 번 수행합니다. 배열의 두 번째 행을 반복하고 조 옮깁니다.

m× n배열 의 두 번째 행을 반복하기 위해 벡터 [1 2 2 3 ... m]가 행 인덱스로 사용됩니다. 이 벡터는 다음과 같이 생성됩니다 : range [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 (-r의 경우 14 + 1) 15

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

1
그냥 할 수 없어 /.\(.\)/\0\1;2p?
Neil

@ Neil 나는 그것을 위해 온통 보았다 2p. 나는 그것을 할 수있는 방법이 있다고 생각했지만 그것을 찾을 수 없었다. 감사!
Riley

r 플래그에 1 바이트를 추가하여 3 바이트를 절약하는 한 -r ''부분은 필요하지 않습니다. 또한 첫 번째 코드 버전을 편집 했으므로 마지막 설명이 이제 유효하지 않습니다.
seshoumara

@Neil 백 레퍼런스 \0가 1에서 시작하기 때문에 역 참조를 보았을 때 내 눈을 믿을 수 없었 습니다. 그러나 사용하는 &것이 동등하고 짧다고 생각합니다.
seshoumara

@seshoumara 아, 그 정규 표현식 버전 미묘한 ... \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 ")

0에서 최대 1 사이의 1 ( ) 과 같은 위치 목록에 1을 더한 증분 런-길이 디코드 ( )로 인덱스 된 오른쪽 인수 2{…}/의 조옮김 ( +)을 두 번 ( ) 적용합니다. ( ) 오른쪽 인수의 외부 치수 크기 (x@&1+1=!#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

자바 스크립트, 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를 두 배로 늘립니다.

TryAPL 온라인!


0

루비, 46 바이트

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

입력을 라인 배열로 취하는 매우 독창적 인 솔루션. 나는 inserts를 좋아하지 않기 때문에 그것을 골프하려고합니다.


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;
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.