Otomatik kutu genişletici


16

Giriş

Bazen, kutularım herhangi bir şeye sığmayacak kadar küçük. Bir kutu genişletici yapmana ihtiyacım var! Yani, bu meydan okumada bir kutuyu bir kutu yapan şey.

 OOOO
O    O
O    O
O    O
 OOOO

Kutunun köşeleri her zaman boşluktur. Kutunun kendisi aynı karakterden yapılabilir. Bu karakter, boşluk hariç herhangi bir yazdırılabilir ASCII karakteri olabilir . İşte bu karakterler:

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

Yukarıdaki kutunun yan uzunlukları 4, 3'tür . Yan uzunluğun her zaman pozitif olduğunu varsayabilirsiniz . Bu, işlemeniz gereken en küçük kutu olduğu anlamına gelir:

 #
# #
 #

Bir kutuyu genişletmek için her bir kenar uzunluğunu artırmanız gerekir. Yukarıdaki örnekle bunu adım adım inceleyelim. Önce kutunun üst tarafını alırız, yani:

 OOOO

Bunu birer birer genişletiyoruz, böylece:

 OOOOO

Bu şimdi kutunun üst ve alt kısmı. Bundan sonra, sol ve sağ taraflarla aynı şeyi yapıyoruz:

O
O
O

Oluyor:

O
O
O
O

Şimdi kutuyu yeniden birleştiriyoruz, bu da şu sonuçlara yol açıyor:

 OOOOO
O     O
O     O
O     O
O     O
 OOOOO

Görev

Bir kutu verildiğinde, 1 genişletin. Kutu birden çok satırda veya bir dizide verilebilir.

Test senaryoları

 OOOO          OOOOO
O    O    >   O     O
 OOOO         O     O
               OOOOO

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

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

Bu , yani en az bayt ile gönderme kazanır!


1
kutunun önünde yeni bir satır olabilir mi?
Riley

@Riley Evet, buna izin verilir :).
Adnan

1
Kutu boşluklarla doldurulabilir mi?
Leaky Nun

@LeakyNun Evet, yapabilirsin.
Adnan

Yanıtlar:


4

V , 6 5 bayt

yêpjÄ

Çevrimiçi deneyin!

Bu aslında olması gerekenden daha uzun bir bayt. Olmalıydı:

äêjÄ

Ancak bunun bilinmeyen bir hatası var. :(

Açıklama:

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

Diğeri ne yapıyor?
Conor O'Brien

@ ConorO'Brien äyinelenen işleç (esas olarak bir baytta "y" ve "p" birlikte) yani äê"yinelenen sütun"
DJMcMayhem

11

Vim, 7 bayt

♥GYPjYp

burada ♥ Control-V'dir.

           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


Neden YPiki kez tutarlılık için kullanmıyorsunuz ?
Neil

pAnimasyonu kaydederken yanlışlıkla vurdum , bu yüzden cevabı yazarken onunla sıkıştım. Önemli mi? > _>;
Lynn

Sadece tutarsızlığı garip buldum, ama açıklamanızı beğendim.
Neil

Bu benim için bir baytlık eşleştirmeleri oluşturmak oldu sadece, tam olarak benim V cevap olarak aynı şeydir <C-v> Gve YP. Bu benim dilimi ucuz hissettiriyor. : /
DJMcMayhem

Hm, control-V telefonumda bir kalp gibi görünüyor ... ❤
Beta Çürüğü

6

JavaScript (ES6), 57 53 52 bayt

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

Açıklama: İlk normal ifade ikinci sütunu çoğaltır ve ikinci normal ifade ikinci satırı çoğaltır, böylece kutuyu istediğiniz gibi genişletir. Edit: MartinEnder ♦ sayesinde 4 bayt kaydedildi.


6

Python, 49 42 bayt

Anonim lambda:

Xnor yönünden 7

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

Önceki versiyon:

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

D, bir dizinin ikinci öğesini çoğaltan bir fonksiyondur.


1
Yeniden kullanarak fonksiyonun fikri zekidir, ama sadece kod tekrarlamak kısa gibi görünüyor: lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]].
xnor

Önceki sürüm için yan not: Sanırım map(D,D(s))43 yerine verecek
Sp3000

5

Retina , 20 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

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

Çevrimiçi deneyin! (Test senaryolarının iki satır besleme ile ayrıldığı bir test paketini etkinleştiren birkaç ek satır vardır.)

açıklama

1`¶
¶$%'¶

1Retina'yı oyuncu değişikliğini yalnızca bulduğu ilk eşleşmeye uygulamayı kısıtlayan bir sınırdır . tek bir satır beslemesiyle eşleştiğinden, yalnızca ilk satırın sonunda satır beslemesini değiştirmeyi düşünmeliyiz. Bu değiştirmeyse ¶$%'¶, burada $%'uçlar maç (bir Retina özgü ikame elemanı), aşağıdaki tüm çizgi. Bu nedenle, bu ikinci satırı çoğaltır.

%2=`.
$&$&

Burada, %hat başına mod olduğundan, her satır ayrı ayrı işlenir ve çizgiler daha sonra tekrar birleştirilir. 2=aynı zamanda bir sınırdır. Bu "ikameyi sadece ikinci maça uygula" anlamına gelir. Eşleşmenin kendisi basit bir karakterdir ve yerine koyma onu çoğaltır. Bu nedenle, bu aşama ikinci sütunu çoğaltır.


5

Haskell, 24 bayt

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

RootTwo'nun ikinci satırı ve sütunu çoğaltma fikrini kullanır . Bunu map fher satıra f.yapar ve sonra bunu satırlara yapar.


4

PowerShell v2 +, 57 53 52 bayt

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

Neil'in JavaScript yanıtına biraz benziyor . İlk değiştirme, satırın başlangıcı ve sonraki iki karakterle eşleşir ve bunları ilk karakter ve ikinci karakter ile iki kez değiştirir. İkinci bir değiştirme yerine, ikinci satırı çoğaltmak üzere dizi indeksleme için değiştirilir. Girdiyi dizeler dizisi olarak alır. Ortaya çıkan dizi dilimleri boru hattında bırakılır ve yazdırma örtüktür.

Martin sayesinde 4 bayt kurtardı.

Bazı örnekler:

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 Evet, teşekkür ederim Ey Bilge Regex-Sensei.
AdmBorkBork


3

MATL , 12 bayt

tZy"@:2hSY)!

Giriş, satır ayırıcı olarak noktalı virgül içeren bir 2D karakter dizisidir. Örneğin, ilk test senaryosunun girişi vardır

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

Çevrimiçi deneyin! Test senaryoları 1 , 2 , 3 .

açıklama

Kod aşağıdakileri iki kez yapar: dizinin ikinci satırını tekrarlayın ve transpoze edin.

Bir m× ndizisinin ikinci satırını tekrarlamak için , vektör [1 2 2 3 ... m]satır dizini olarak kullanılır. Bu vektör şu şekilde oluşturulur: aralık [1 2 3 ... m], başka bir tane ekle 2, sırala.

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 için 14 + 1) 15

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

1
Sadece yapamaz /.\(.\)/\0\1;2pmısın?
Neil

@Neil Bunun için her yere baktım 2p, bunu yapmanın bir yolu olduğunu düşündüm, ama bulamadım. Teşekkürler!
Riley

R bayrağı için 1 bayt eklediğiniz sürece -r '' kısmına gerek yoktur, böylece 3 bayt tasarruf edilir. Ayrıca, kodun ilk sürümünü düzenlediğiniz için, sondaki açıklama artık geçerli değil.
seshoumara

@Neil 1'den başladıkları için geri başvuruyu gördüğümde gözlerime inanamadım \0. GNU sed'in çevrimiçi kılavuzu bunların hiçbirini söylemiyor . Ancak, &kullanımı eşdeğer ve daha kısa olduğunu düşünüyorum.
seshoumara

@seshoumara Ah, şu regexp versiyon incelikleri ... \0o zaman hangisini kullanıyor ?
Neil

1

CJam , 14 bayt

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

MATL yanıtıma benzer , ancak ikinci yerine ikinci son satırı tekrarlar.

Çevrimiçi deneyin!

açıklama

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 bayt

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

Girdiyi bir karakter matrisi olarak alır:

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

Bir artı ( ) ' nın artımlı çalışma uzunluğu kod çözme ( ) ile indekslenen ( ) sağ bağımsız değişkeninin 2{…}/transpose ( +) işlevini 0 ile en fazla 1 ( ) arasındaki konumların listesini veren iki kez ( ) bir işlev uygulayın ( ) sağ bağımsız değişkenin ( ) dış boyutunun boyutu .x@&1+1=!#x

Adım adım,

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

Burada OK ile deneyin .


1

APL, 17 15 bayt

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

Ölçek:

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

Açıklama:

             ⍣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 sembolü monadik ⍉, 90 derece döndürmeyle aynı şey olmayan matris devriktir.
JohnE

1
@JohnE: tabii ki. Düşündüğümden daha yorgun olmalıydım. Aslında 90 derece döndürmek ⌽⍉ya da olurdu ⊖⍉, ama bu durumda önemli değil.
marinus

0

ListSharp , 326 bayt

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

Ben kesinlikle fonksiyonların iç içe eklemem gerekiyor, ama bu çok iyi çalışıyor

bir açıklama istiyorsanız yorum yap


0

JavaScript, 160 146 141 bayt

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 bayt

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

(

1 2, {1, 2} ekledi

1↓ bir öğe düştü

endeksler

her biri için

nın-nin

{satır sayısı, sütun sayısı}

içine endeksler

argüman

Örneğin

 XX
X  X
 XX

endeksleri buluruz; Satırlar için {1, 2, 3} ve sütunlar için {1, 2, 3, 4}. Şimdi {2, 3} ve {2, 3, 4} elde etmek için ilk öğeleri bırakıyoruz ve sonra {1, 2} ile başlıyoruz, {1, 2, 2, 3} ve {1, 2, 2, 3, 4}. Son olarak, satır ve sütunları seçmek için aynı anda satır 2 ve sütun 2'yi iki katına çıkarıyoruz.

TryAPL çevrimiçi!


0

Yakut, 46 bayt

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

Satır dizisi olarak girdi alan çok hızlı çözüm. Ben çoğaltılmış inserts sevmiyorum , bu yüzden golf için çalışacağız.


0

C #, 127124 bayt

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

Bir derleme Func<List<string>, List<string>> .

Biçimlendirilmiş sürüm:

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;
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.