Kotak expander otomatis

16

pengantar

Terkadang, kotak saya terlalu kecil untuk memuat apa pun di dalamnya. Saya ingin Anda membuat kotak expander! Jadi, apa yang membuat kotak sebuah kotak dalam tantangan ini.

 OOOO
O    O
O    O
O    O
 OOOO

Sudut kotak selalu spasi. Kotak itu sendiri dapat dibuat dari karakter yang sama. Karakter itu dapat berupa karakter ASCII yang dapat dicetak , kecuali spasi. Jadi, itulah karakter-karakter ini:

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

Panjang sisi kotak di atas adalah 4, 3 . Anda dapat mengasumsikan bahwa panjang sisi selalu positif . Itu berarti bahwa ini adalah kotak terkecil yang perlu Anda tangani:

 #
# #
 #

Untuk memperluas kotak, Anda harus menambah setiap sisi. Mari kita lalui ini, langkah demi langkah, dengan contoh di atas. Kami pertama-tama mengambil sisi atas kotak, yaitu:

 OOOO

Kami memperluas ini satu per satu, jadi kami mendapatkan:

 OOOOO

Ini adalah bagian atas dan bawah kotak sekarang. Setelah itu, kita melakukan hal yang sama dengan sisi-sisi di kiri dan kanan:

O
O
O

Menjadi:

O
O
O
O

Sekarang kami memasang kembali kotak, yang menghasilkan:

 OOOOO
O     O
O     O
O     O
O     O
 OOOOO

Tugas

Diberikan sebuah kotak, perluas dengan 1. Kotak tersebut dapat diberikan dalam beberapa baris, atau dalam sebuah array.

Uji kasus

 OOOO          OOOOO
O    O    >   O     O
 OOOO         O     O
               OOOOO

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

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

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Adnan
sumber
1
dapatkah kotak memiliki baris baru sebelumnya?
Riley
@Riley Ya, itu diizinkan :).
Adnan
1
Bisakah kotak diisi dengan spasi?
Leaky Nun
@ LeakyNun Ya, Anda dapat melakukannya.
Adnan

Jawaban:

4

V , 6 5 byte

yêpjÄ

Cobalah online!

Ini sebenarnya satu byte lebih lama dari yang seharusnya. Seharusnya:

äêjÄ

Tetapi ini memiliki bug yang tidak dikenal. :(

Penjelasan:

yê     "yank this colum
  p    "paste what we just yanked
   j   "move down to line 2
    Ä  "and duplicate this line
DJMcMayhem
sumber
Apa yang dilakukan yang lain?
Conor O'Brien
@ ConorO'Brien äadalah operator duplikat (pada dasarnya "y" dan "p" bersama dalam satu byte) demikian äêjuga "kolom duplikat"
DJMcMayhem
11

Vim, 7 byte

♥GYPjYp

di mana ♥ adalah 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.

masukkan deskripsi gambar di sini

Lynn
sumber
Mengapa tidak menggunakan YPkedua kali untuk konsistensi?
Neil
Saya tidak sengaja menekan psaat merekam animasi, jadi saya terjebak dengannya ketika menuliskan jawabannya. Apakah itu penting? > _>;
Lynn
Saya baru saja menemukan inkonsistensi yang aneh, tetapi saya suka penjelasan Anda.
Neil
Ini persis sama dengan jawaban V saya, hanya saja saya kebetulan membuat pemetaan satu byte untuk <C-v> Gdan YP. Itu agak membuat bahasa saya terasa murahan. : /
DJMcMayhem
Hm, control-V muncul seperti hati di ponsel saya ... ❤
Beta Decay
6

JavaScript (ES6), 57 53 52 byte

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

Penjelasan: Regexp pertama menduplikasi kolom kedua dan regexp kedua menduplikasi baris kedua, sehingga memperbesar kotak yang diinginkan. Sunting: Disimpan 4 byte berkat MartinEnder ♦.

Neil
sumber
6

Python, 49 42 byte

Lambda anonim:

-7 dari xnor

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

Versi sebelumnya:

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

D adalah fungsi yang menduplikasi item kedua dari suatu urutan.

RootTwo
sumber
1
Ide ulang menggunakan fungsi ini pintar, tapi tampaknya lebih pendek untuk hanya mengulang kode: lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]].
xnor
Catatan untuk versi sebelumnya: Saya pikir map(D,D(s))akan memberikan 43 sebagai gantinya
Sp3000
5

Retina , 20 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Cobalah online! (Ada beberapa baris tambahan yang memungkinkan suite uji di mana kasus uji dipisahkan oleh dua baris baris.)

Penjelasan

1`¶
¶$%'¶

1adalah batas yang membatasi Retina untuk menerapkan substitusi hanya pada pertandingan pertama yang ditemukannya. cocok dengan satu linefeed, jadi kami hanya perlu mempertimbangkan mengganti linefeed di akhir baris pertama. Itu diganti dengan ¶$%'¶, di mana $%'memasukkan seluruh baris setelah pertandingan (elemen substitusi khusus-Retina). Karenanya, ini menggandakan baris kedua.

%2=`.
$&$&

Di sini, %adalah mode per-baris, sehingga setiap baris diproses secara terpisah, dan baris-baris tersebut digabungkan lagi sesudahnya. 2=juga merupakan batasan. Ini berarti "menerapkan substitusi hanya pada pertandingan kedua". Pertandingan itu sendiri sederhana satu karakter dan substitusi menggandakannya. Karenanya, tahap ini menduplikasi kolom kedua.

Martin Ender
sumber
5

Haskell, 24 byte

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

Menggunakan ide RootTwo untuk menduplikasi baris dan kolom kedua. Ini map fmelakukan ini untuk setiap baris, dan f.kemudian melakukan ini ke baris.

Tidak
sumber
4

PowerShell v2 +, 57 53 52 byte

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

Sedikit mirip dengan jawaban JavaScript Neil . Pengganti pertama cocok dengan awal baris dan dua karakter berikutnya, dan menggantinya dengan karakter pertama dan kedua-karakter-dua kali. Alih-alih ganti kedua, itu diganti untuk array-indexing untuk menduplikasi baris kedua. Mengambil input sebagai array string. Irisan array yang dihasilkan ditinggalkan pada pipa dan pencetakan tersirat.

Disimpan 4 byte berkat Martin.

Beberapa contoh:

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 ' # ','# #',' # '
 ## 
#  #
#  #
 ## 
AdmBorkBork
sumber
2
@ MartinEnder Ya, terima kasih, O Wise Regex-Sensei.
AdmBorkBork
4

Brachylog , 28 26 byte

2 byte berkat Fatalize.

{bB,?~c[A:C]hl2,A:Bc.}:1a.

Cobalah online!

bocor Nun
sumber
@Fatalisasi Saya tidak pernah tahu Anda bisa melakukannya dengan cara itu ...
Leaky Nun
3

MATL , 12 byte

tZy"@:2hSY)!

Input adalah array char 2D, dengan titik koma sebagai pemisah baris. Misalnya, kotak uji pertama memiliki input

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

Cobalah online! Uji kasus 1 , 2 , 3 .

Penjelasan

Kode melakukan dua hal berikut: ulangi baris kedua array dan transpos.

Untuk mengulangi baris kedua array m× n, vektor [1 2 2 3 ... m]digunakan sebagai indeks baris. Vektor ini dihasilkan sebagai berikut: rentang [1 2 3 ... m], lampirkan yang lain 2, urutkan.

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
Luis Mendo
sumber
2

SED 69 19 (14 +1 untuk -r) 15

s/.(.)/&\1/;2p   
Riley
sumber
1
Tidak bisakah kamu melakukannya /.\(.\)/\0\1;2p?
Neil
@Neil Saya mencari-cari semuanya 2p, saya pikir ada cara untuk melakukannya, tetapi saya tidak dapat menemukannya. Terima kasih!
Riley
Bagian -r '' tidak diperlukan selama Anda menambahkan 1 byte untuk flag r, sehingga menghemat 3 byte. Juga, karena Anda mengedit versi kode yang pertama, penjelasan di bagian akhir sekarang tidak valid.
seshoumara
@Neil Tidak bisa mempercayai mata saya ketika saya melihat \0referensi balik , karena mereka mulai dari 1. Manual online GNU sed tidak berbicara tentang itu. Namun, penggunaannya &menurut saya setara dan lebih pendek.
seshoumara
@seshoumara Ah, seluk-beluk versi regexp ... yang mana yang menggunakan \0itu?
Neil
1

CJam , 14 byte

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

Mirip dengan jawaban MATL saya , tetapi ulangi baris kedua terakhir bukan yang kedua.

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
1

K, 15 byte

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

Mengambil input sebagai matriks karakter:

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

Terapkan fungsi dua kali ( 2{…}/) yang memberikan transpose ( +) dari argumen yang tepat diindeks ( x@) oleh decode run-length tambahan ( &) dari satu tambah ( 1+) daftar lokasi sama dengan 1 (1= ) dalam kisaran dari 0 hingga ( !) ukuran dimensi luar dari argumen yang benar ( #x).

Selangkah demi selangkah,

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

Coba di sini dengan OK.

JohnE
sumber
1

APL, 17 15 byte

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

Uji:

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

Penjelasan:

             ⍣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
marinus
sumber
Simbol APL monadik ⍉ adalah matriks transpos, yang tidak sama dengan memutar 90 derajat.
JohnE
1
@ JohnE: tentu saja. Saya pasti lebih lelah dari yang saya kira. Sebenarnya berputar dengan 90 derajat akan ⌽⍉atau ⊖⍉, tetapi dalam hal ini tidak masalah.
marinus
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

Saya pasti perlu menambahkan fungsi bersarang, tetapi ini bekerja dengan sangat baik

berkomentar jika Anda ingin penjelasan

downrep_nation
sumber
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}
kamoroso94
sumber
0

Dyalog APL , 14 byte

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

(

1 2, {1, 2} ditambahkan ke

1↓ satu elemen jatuh dari

indeks

setiap

dari

{jumlah baris, jumlah kolom}

indeks menjadi

argumen

Misalnya untuk

 XX
X  X
 XX

kami menemukan indeks; {1, 2, 3} untuk baris, dan {1, 2, 3, 4} untuk kolom. Sekarang kita letakkan elemen awal untuk mendapatkan {2, 3} dan {2, 3, 4}, dan kemudian tambahkan dengan {1, 2}, memberi {1, 2, 2, 3} dan {1, 2, 2, 3, 4}. Akhirnya, kami menggunakan ini untuk memilih baris dan kolom, sekaligus menggandakan baris 2 dan kolom 2.

TryAPL online!

Adám
sumber
0

Ruby, 46 byte

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

Solusi yang sangat lurus, mengambil input sebagai array garis. Saya tidak suka duplikat insert, jadi akan mencoba golf itu.

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

Kompilasi ke a Func<List<string>, List<string>> .

Versi yang diformat:

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