Automatyczny ekspander pudełek

16

Wprowadzenie

Czasami moje pudełka są zbyt małe, aby zmieścić się w czymkolwiek. Potrzebuję, żebyś zrobił ekspander pudełek! Co sprawia, że ​​pudełko jest pudełkiem w tym wyzwaniu.

 OOOO
O    O
O    O
O    O
 OOOO

Narożniki pudełka to zawsze spacje. Samo pudełko może być wykonane z tej samej postaci. Ten znak może być dowolnym drukowalnym znakiem ASCII , z wyjątkiem spacji. Oto te postacie:

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

Długości boków powyższego pudełka wynoszą 4, 3 . Możesz założyć, że długość boku jest zawsze dodatnia . Oznacza to, że jest to najmniejsze pudełko, z którym trzeba sobie poradzić:

 #
# #
 #

Aby rozwinąć pole, musisz zwiększyć długość każdej strony. Przejdźmy przez to krok po kroku z powyższym przykładem. Najpierw bierzemy górną część pudełka, która jest:

 OOOO

Rozszerzamy to o jeden, dzięki czemu otrzymujemy:

 OOOOO

To jest teraz górna i dolna część pudełka. Następnie robimy to samo z bokami po lewej i prawej stronie:

O
O
O

Staje się:

O
O
O
O

Teraz ponownie składamy pudełko, co powoduje:

 OOOOO
O     O
O     O
O     O
O     O
 OOOOO

Zadanie

Biorąc pod uwagę pole, rozwiń je o 1. Pole może być podane w wielu wierszach lub w tablicy.

Przypadki testowe

 OOOO          OOOOO
O    O    >   O     O
 OOOO         O     O
               OOOOO

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

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

To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

Adnan
źródło
1
czy pudełko może mieć nową linię przed nim?
Riley,
@ Riley Tak, to jest dozwolone :).
Adnan,
1
Czy pudełko może być wypełnione spacjami?
Leaky Nun
@LeakyNun Tak, możesz to zrobić.
Adnan,

Odpowiedzi:

4

V , 6 5 bajtów

yêpjÄ

Wypróbuj online!

Jest to w rzeczywistości bajt dłuższy niż powinien. Powinno być:

äêjÄ

Ale to ma nieznany błąd. :(

Wyjaśnienie:

yê     "yank this colum
  p    "paste what we just yanked
   j   "move down to line 2
    Ä  "and duplicate this line
DJMcMayhem
źródło
Co robi ten drugi?
Conor O'Brien,
@ ConorO'Brien äjest zduplikowanym operatorem (zasadniczo „y” i „p” razem w jednym bajcie), podobnie jak äê„zduplikowana kolumna”
DJMcMayhem
11

Vim, 7 bajtów

♥GYPjYp

gdzie ♥ to 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

Lynn
źródło
Dlaczego nie wykorzystać YPobu razy dla zachowania spójności?
Neil,
Przypadkowo uderzyłem ppodczas nagrywania animacji, więc utknąłem przy transkrypcji odpowiedzi. Czy to ma znaczenie? > _>;
Lynn,
Właśnie uznałem tę niespójność za dziwną, ale podoba mi się twoje wyjaśnienie.
Neil,
To jest dokładnie to samo, co moja odpowiedź V, po prostu zdarzyło mi się tworzyć jednobajtowe mapowania dla <C-v> Gi YP. To sprawia, że ​​mój język wydaje się tani. : /
DJMcMayhem
Hm, control-V pojawia się jako serce mojego telefonu ... ❤
Beta Decay
6

JavaScript (ES6), 57 53 52 bajtów

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

Objaśnienie: Pierwsze wyrażenie regularne duplikuje drugą kolumnę, a drugie wyrażenie regularne duplikuje drugi wiersz, w ten sposób powiększając pole zgodnie z potrzebami. Edycja: Zapisano 4 bajty dzięki MartinEnder ♦.

Neil
źródło
6

Python, 49 42 bajtów

Anonimowa lambda:

-7 od xnor

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

Poprzednia wersja:

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

D jest funkcją, która powiela drugi element sekwencji.

RootTwo
źródło
1
Pomysł ponownego wykorzystania funkcji jest mądry, ale wydaje się być krótsza tylko powtórzyć kod: lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]].
xnor
Dodatkowa uwaga dla poprzedniej wersji: Myślę, map(D,D(s))że zamiast tego dałbym 43
Sp3000,
5

Siatkówka , 20 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Wypróbuj online! (Istnieje kilka dodatkowych wierszy, które umożliwiają zestaw testów, w których przypadki testowe są oddzielone dwoma kanałami.)

Wyjaśnienie

1`¶
¶$%'¶

1jest limitem, który ogranicza siatkówkę do stosowania substytucji tylko do pierwszego znalezionego dopasowania. pasuje do pojedynczego kanału, więc musimy rozważyć zastąpienie kanału na końcu pierwszej linii. Jest zamieniany na ¶$%'¶, gdzie $%'wstawia całą linię po dopasowaniu (element podstawienia specyficzny dla siatkówki). Zatem powiela to drugą linię.

%2=`.
$&$&

Tutaj %jest tryb na linię, więc każda linia jest przetwarzana osobno, a następnie linie są ponownie łączone. 2=jest również limitem. To oznacza „zastosuj zmianę tylko do drugiego meczu”. Samo dopasowanie jest prostym pojedynczym znakiem, a podstawienie go powtarza. Dlatego ten etap powiela drugą kolumnę.

Martin Ender
źródło
5

Haskell, 24 bajty

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

Wykorzystuje pomysł RootTwo polegający na powieleniu drugiego wiersza i kolumny. map fCzyni to każdy wiersz, a f.następnie ma to rzędów.

xnor
źródło
4

PowerShell v2 +, 57 53 52 bajty

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

Nieco podobny do odpowiedzi JavaScript Neila . Pierwsza zamiana dopasowuje początek linii i dwa następne znaki i zastępuje je pierwszym znakiem i drugim znakiem dwa razy. Zamiast drugiego zastąpienia jest zamieniany na indeksowanie tablic w celu zduplikowania drugiej linii. Pobiera dane wejściowe jako tablicę ciągów. Wynikowe wycinki tablic są pozostawione w potoku i drukowanie jest niejawne.

Zaoszczędź 4 bajty dzięki Martinowi.

Kilka przykładów:

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
źródło
2
@MartinEnder Tak, dziękuję, O Wise Regex-Sensei.
AdmBorkBork
4

Brachylog , 28 26 bajtów

2 bajty dzięki Fatalize.

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

Wypróbuj online!

Leaky Nun
źródło
@Fatalize Nigdy nie wiedziałem, że możesz to zrobić w ten sposób ...
Leaky Nun
3

MATL , 12 bajtów

tZy"@:2hSY)!

Dane wejściowe to tablica znaków 2D z średnikiem jako separatorem wierszy. Na przykład pierwszy przypadek testowy ma dane wejściowe

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

Wypróbuj online! Przypadki testowe 1 , 2 , 3 .

Wyjaśnienie

Kod wykonuje następujące czynności dwa razy: powtórz drugi wiersz tablicy i transponuj.

Aby powtórzyć drugi wiersz tablicy m× n, wektor [1 2 2 3 ... m]jest używany jako indeks wiersza. Ten wektor jest generowany w następujący sposób: zasięg [1 2 3 ... m], dołącz inny 2, sortuj.

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
źródło
2

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

s/.(.)/&\1/;2p   
Riley
źródło
1
Nie możesz po prostu zrobić /.\(.\)/\0\1;2p?
Neil,
@ Nee Poszukałem tego 2p, pomyślałem, że jest na to sposób, ale nie mogłem go znaleźć. Dzięki!
Riley,
Część -r nie jest potrzebna, jeśli dodasz 1 bajt dla flagi r, oszczędzając w ten sposób 3 bajty. Ponadto, ponieważ edytowałeś pierwszą wersję kodu, wyjaśnienie na końcu jest teraz niepoprawne.
seshoumara
@Neil Nie mogłem uwierzyć własnym oczom, kiedy zobaczyłem \0odniesienie, ponieważ zaczynają się od 1. Instrukcja online GNU sed nic nie mówi. Jednak używanie &jest moim zdaniem równoważne i krótsze.
seshoumara
@seshoumara Ah, te subtelności wersji wyrażenia regularnego ... z których \0wtedy korzystasz ?
Neil
1

CJam , 14 bajtów

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

Podobnie do mojej odpowiedzi MATL , ale powtarza wiersz przedostatni zamiast drugiego.

Wypróbuj online!

Wyjaśnienie

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
źródło
1

K, 15 bajtów

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

Pobiera dane wejściowe jako macierz znaków:

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

Zastosuj funkcję dwukrotnie ( 2{…}/), która daje transpozycji ( +) prawego argumentu indeksowanego ( x@) przez przyrostowe dekodowanie długości przebiegu ( &) jednego plus ( 1+) listy lokalizacji równych 1 ( 1=) w zakresie od 0 do ( !) rozmiar zewnętrznego wymiaru właściwego argumentu (#x ).

Krok po kroku,

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

Wypróbuj tutaj z ok.

JohnE
źródło
1

APL, 17 15 bajtów

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

Test:

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

Wyjaśnienie:

             ⍣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
źródło
Symbol APL monadyczny ⍉ to transpozycja macierzy, co nie jest tym samym, co obrót o 90 stopni.
JohnE
1
@JohnE: oczywiście. Musiałem być bardziej zmęczony niż myślałem. W rzeczywistości obracanie o 90 stopni byłoby ⌽⍉lub ⊖⍉, ale w tym przypadku nie ma to znaczenia.
marinus
0

ListSharp , 326 bajtów

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

I na pewno trzeba dodać zagnieżdżania funkcji, ale działa bardzo dobrze

skomentuj, jeśli chcesz wyjaśnienia

downrep_nation
źródło
0

JavaScript, 160 146 141 bajtów

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
źródło
0

Dyalog APL , 14 bajtów

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

(

1 2, {1, 2} wcześniej

1↓ jeden element spadł z

wskaźniki

każdego

z

{liczba wierszy, liczba kolumn}

indeksuje do

argument

Np. Dla

 XX
X  X
 XX

znajdujemy wskaźniki; {1, 2, 3} dla wierszy i {1, 2, 3, 4} dla kolumn. Teraz upuszczamy początkowe elementy, aby uzyskać {2, 3} i {2, 3, 4}, a następnie przygotowujemy z {1, 2}, dając {1, 2, 2, 3} i {1, 2, 2, 3, 4}. Na koniec używamy tego do wybierania wierszy i kolumn, jednocześnie podwajając wiersz 2 i kolumnę 2.

Wypróbuj APL online!

Adám
źródło
0

Rubinowy, 46 bajtów

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

Bardzo proste rozwiązanie, przyjmujące dane wejściowe jako tablicę wierszy. Nie lubię duplikatów insert, więc spróbuję zagrać w golfa.

Leibrug
źródło
0

C #, 127 124 bajtów

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

Kompiluje do Func<List<string>, List<string>>.

Wersja sformatowana:

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
źródło