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!


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

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


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 ♦.


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.


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ę.


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.


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 ' # ','# #',' # '
 ## 
#  #
#  #
 ## 

2
@MartinEnder Tak, dziękuję, O Wise Regex-Sensei.
— AdmBorkBork


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


2

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

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

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

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.


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

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


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}

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!


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.


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;
};
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.