Odbuduj prostokątny układ z rogu

30

Kiedyś miałem piękny prostokątny układ. To było bardzo symetryczne, ale niestety rozpadło się i teraz mam tylko lewy górny róg. Twoim zadaniem będzie odbudowanie oryginalnej tablicy.

Twój program otrzyma 2-wymiarową tablicę liczb całkowitych. Aby ułatwić parsowanie, możesz założyć, że wszystkie mają wartość od 1 do 9. Twoim zadaniem jest odwrócenie kolumn tablicy, jej wierszy i obu elementów, zszycie powstałych narożników i zwrócenie powstałej tablicy.

Możesz założyć, że wymiary tablicy będą wynosić co najmniej 1x1.

Przypadki testowe:

Input:
1 2 3
4 5 6

Output:
1 2 3 3 2 1
4 5 6 6 5 4
4 5 6 6 5 4
1 2 3 3 2 1

Input:
1

Output:
1 1
1 1

Input:
9
9
9

Output:
9 9
9 9
9 9
9 9
9 9
9 9

To jest , wygrywa najmniej bajtów!

Pavel
źródło
1
Założę się, że węgiel drzewny może to zrobić w mniej niż 10 lat
FantaC
1
@tbfninja chat.stackexchange.com/transcript/message/43184083#43184083, ale może być krótszy z innym formatem wejściowym.
Pavel
@MagicOctopusUrn tak
Pavel
2
@tfbninja WS⟦ι⟧‖M→↓może? 5 bajtów na odczyt danych wejściowych i 4 na odzwierciedlenie.
Neil
4
Jestem w 99% pewien, że istnieje lang, który robi to z (lub jakąś podobną postacią), po prostu nie pamiętam, który: c
Rod

Odpowiedzi:

1

Proton , 29 bajtów

a=>[b+b[by-1]for b:a+a[by-1]]

Wypróbuj online!

Istnieje jednak kilka innych ciekawych podejść:

Proton , 29 bajtów

a=>map(g,(g=x=>x+x[by-1])(a))

Wypróbuj online!

Możesz zdefiniować funkcję lustrzaną gw linii, ponieważ Proton. Nie jest jednak krótszy.

Proton , 36 bajtów

(a=>[x[0]for x:zip(*(a+a[by-1]))])*2

Wypróbuj online!

Powinno to wynosić (a=>zip(*(a+a[by-1])))*224 bajty, ale funkcja zip jest całkowicie zepsuta. Zasadniczo tworzysz kopię lustrzaną i kompresujesz, a następnie robisz to dwukrotnie (możesz pomnożyć funkcję przez dodatnią liczbę całkowitą, aby zastosować tę funkcję wiele razy).

HyperNeutrino
źródło
19

Płótno , 1 bajt

Wypróbuj tutaj!

Wyjścia w postaci ciągu wielowierszowego

dzaima
źródło
2
Fajnie, @Rod nazwał to hah! Czy to też twój język Dzaima?
Magic Octopus Urn
Cholera ... Powinienem pamiętać ...
całkowicie ludzki
@MagicOctopusUrn Tak, IIRC to w gruncie rzeczy SOGL II: Electric Boogaloo?
Tylko ASCII
5

Python 3, 38 bajtów

lambda a:[b+b[::-1]for b in a+a[::-1]]

Wypróbuj online!

Pobiera listę list i zwraca listę list.

Wyjaśnienie:

lambda a:                              # anonymous lambda function
                   for b in a+a[::-1]  # for each row in the array and the upside-down array
          b+b[::-1]                    # the row with its reverse appended
         [                           ] # return in a list
pizzapanty184
źródło
5

Siatkówka , 13 bajtów

\%`$
$^$`
Vs`

Wypróbuj online!

Wyjaśnienie

\%`$
$^$`

W każdym wierszu ( %) dopasuj koniec wiersza ( $) i wstaw odwrotną stronę ( $^) całej linii ( $`) i wydrukuj wynik za pomocą końcowego wiersza ( \). To powoduje odbicie wzdłuż osi pionowej i drukuje pierwszą połowę wydruku.

Vs`

To po prostu odwraca cały łańcuch, co odpowiada obrotowi o 180 °, lub w naszym przypadku (z powodu symetrii poziomej) odbicie wzdłuż osi poziomej. W ten sposób działa to, że Vdomyślnym wyrażeniem regularnym (odwrotnym) jest (?m:^.*$), który zwykle pasuje do każdej linii łańcucha. Aktywujemy jednak opcję singleline s, która sprawia, że .dopasowywanie linii również się zgadza i dlatego ten domyślny regex faktycznie pasuje do całego łańcucha.

Wynik tego jest drukowany automatycznie na końcu programu, dając nam drugą połowę wyniku.

Martin Ender
źródło
Nie wygląda to na żaden znany mi regex: P
Pavel
@Pavel Ponieważ Retina nie jest tylko wyrażeniem regularnym. :)
Erik the Outgolfer
@Pavel jedyną częścią tego kodu, która jest rzeczywistym wyrażeniem regularnym, jest $pierwsza linia. ;) Dodam wyjaśnienie później.
Martin Ender,
5

05AB1E , 2 bajty

∞∊

Wypróbuj online!


   # Input:Array of String | ['12','34']
---#-----------------------+------------------------------------------
∞  # Mirror horizontally.  | [12,34]       -> [1221,3443]
 ∊ # Mirror vertically.    | [1221,3443]   -> [1221\n3443\n3443\n1221]

Podziękowania dla pana Xcodera wskazującego, że tablice ciągów znaków mogą być liczone jako tablice 2D i Pavel za potwierdzenie.

Urna Magicznej Ośmiornicy
źródło
... 2 bajty
Mr. Xcoder,
Dla ułatwienia parsowania możesz założyć, że wszystkie mają wartość od 1 do 9 - Myślę więc, że jest to poprawne. Chyba w oczekiwaniu na potwierdzenie Pavela
pana Xcodera
@ Mr.Xcoder to było to, co początkowo miałem, a następnie tablice TIO 2D jako wejście były dziwne ... więc musiałem wymyślić takie nagłówki.
Magic Octopus Urn
Ciąg jest tablicą znaków, więc lista ciągów jest nadal tablicą 2d. @ Rozwiązanie Mr.Xcoder jest prawidłowe.
Pavel
Coolio, działa dla mnie.
Magic Octopus Urn
3

Galaretka , 5 bajtów

m€0m0

Wypróbuj online!

Erik the Outgolfer
źródło
Również 5 bajtów: m0Z$⁺(przez Hyper Neutrino).
Pavel
3

MATL , 5 bajtów

,tPv!

Wypróbuj online!

Wyjaśnienie:

(implicit input)
,               # do twice:
 t              # dup top of stack
 P              # flip vertically
 v              # vertically concatenate
 !              # transpose
(implicit output)

Giuseppe
źródło
3

Oktawa ,  33  29 bajtów

Dzięki @Giuseppe za grę w golfa cztery bajty!

@(A)[B=[A;flip(A)] fliplr(B)]

Wypróbuj online!

Steadybox
źródło
29 bajtów
Giuseppe
3

JavaScript (Node.js) , 62 55 49 46 bajtów

A=>(j=x=>[...x,...[...x].reverse()])(A).map(j)

Wypróbuj online!

Ponieważ Array.prototype.reverse()odwraca tablicę na miejscu, najpierw muszę wykonać płytką kopię. A=>(j=x=>[...x,...x.reverse()])(A).map(j)nie działa.

Shieru Asakoto
źródło
3

J , 12 bajtów

(,|.)@,.|."1

Wypróbuj online!

Wyjaśnienie

         |."1 - reverse each row
       ,.     - and stitch them to the input
 (   )@       - and 
  ,|.         - append the rows in reversed order        
Galen Iwanow
źródło
3

awk, 88 bajtów

{s="";for(i=NF;i>0;i--)s=" "$i s" "$i;a[FNR]=s;print s}END{for(i=NR;i>0;i--)print a[i]}
mmuntag
źródło
3
Witamy w PPCG! Ładna pierwsza odpowiedź :)
HyperNeutrino,
2

Trójkątność , 31 bajtów

...)...
..IEM..
.DRs+}.
DRs+...

Wypróbuj online!

Wyjaśnienie

Usuwając znaki, które składają się na wypełnienie, oto co robi program:

)IEMDRs+}DRs+ – Full program. Takes a matrix as a 2D list from STDIN.
)             – Push a 0 onto the stack.
 I            – Take the input at that index.
  E           – Evaluate it.
   M    }     – For each row...
    DR        – Duplicate and replace the second copy by its reverse.
      s+      – Swap and append.
         DR   – Duplicate the result and replace the second copy by its reverse.
           s+ – Swap and append.
Pan Xcoder
źródło
2

APL + WIN, 11 bajtów

Monituje o tablicę liczb całkowitych 2d.

m⍪⊖m←m,⌽m←⎕
Graham
źródło
2

Stax , 5 bajtów

:mm:m

Uruchom i debuguj online

:moznacza lustro, które jest input.concat(reverse(input)). m, w tym kontekście oznacza wyjście każdej linii po zastosowaniu ...

Odzwierciedlaj tablicę wierszy, a następnie odbijaj każdy wiersz i dane wyjściowe.

rekurencyjny
źródło
2

Japt , 6 bajtów

mê1 ê1

Wypróbuj tutaj


Wyjaśnienie

           :Implicit input of 2D array
m          :Map
 ê1        :  Mirror sub array
    ê1     :Mirror main array
Kudłaty
źródło
2

Rubin , 35 bajtów

->a{r=->b{b+b.reverse}
r[a].map &r}

Wypróbuj online!

Lambda akceptuje tablicę 2D i zwraca tablicę 2D. To proste, ale i tak jest wersja bez golfisty:

->a{
  r=->b{ b+b.reverse } # r is a lambda that returns the argument and its reverse
  r[a].map &r          # Add the array's reverse, then add each row's reverse
}
benj2240
źródło
2

Java 8, 140 131 bajtów

m->{String r="";for(int a=m.length,b=m[0].length,i=a+a,j;i-->0;r+="\n")for(j=b+b;j-->0;)r+=m[i<a?i:a+a+~i][j<b?j:b+b+~j];return r;}

Wyjaśnienie:

Wypróbuj online.

m->{                      // Method with integer-matrix parameter and String return-type
  String r="";            //  Result-String, starting empty
  for(int a=m.length,     //  Amount of rows of the input-matrix
          b=m[0].length,  //  Amount of columns of the input-matrix
          i=a+a,j;        //  Index integers
      i-->0;              //  Loop over double the rows
      r+="\n")            //    After every iteration: append a new-line to the result
     for(j=b+b;j-->0;)    //   Inner loop over double the columns
       r+=                //    Append the result with:
          m[i<a?          //     If `i` is smaller than the amount of rows
             i            //      Use `i` as index in the input-matrix
            :             //     Else:
             a+a+~i]      //      Use `a+a+i-1` as index instead
           [j<b?          //     If `j` is smaller than the amount of columns
             j            //      Use `j` as index in the input-matrix
            :             //     Else:
             b+b+~j];     //      Use `b+b+j-1` as index instead
  return r;}              //  Return the result-String
Kevin Cruijssen
źródło
2

J , 11 bajtów

Anonimowa ukryta funkcja prefiksu.

|:@(,|.)^:2

Wypróbuj online!

|: transponować

@(…) wynik:

, argument, po którym następuje

|. odwrotnie

^:2 i wszystko to zrobiono dwa razy

Adám
źródło
2

SNOBOL4 (CSNOBOL4) , 119 113 bajtów

	T =TABLE()
I	X =X + 1
	I =INPUT	:F(D)
	OUTPUT =T<X> =I REVERSE(I)	:(I)
D	X =X - 1
	OUTPUT =GT(X) T<X>	:S(D)
END	

Wypróbuj online!

Pobiera dane wejściowe jako ciągi znaków na STDIN, bez spacji. Działa to tylko dlatego, 1-9że w przeciwnym razie cyfry są i mogłyby zawieść.

Giuseppe
źródło
Rozumiem, dlaczego ludzie już nie używają tego języka. To takie dziwne.
Pavel
1
@Pavel SNOBOL to naprawdę okropny język do pracy. jest to bardziej nowoczesna implementacja C, która ma dodatkowe wbudowane funkcje, takie jak REVERSE; o ile wiem, oryginalna obsługiwana była również arytmetyka liczb całkowitych.
Giuseppe
2

C (gcc) , 114 111 bajtów

j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)printf("%d,",A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]);}

Wypróbuj online!

C (gcc) , 109 bajtów (nadużywanie łatwości parsowania)

  • Podziękowania dla Kevina Cruijssena za sugestię, aby zezwolić tylko na jednocyfrowe liczby całkowite wejściowe; zapisane dwa bajty.
j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)putchar(A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]+48);}

Wypróbuj online!

Jonathan Frech
źródło
Możesz zapisać 3 bajty, odwracając pętle. for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)
Kevin Cruijssen
Nie spełnia specyfikacji; wypisuje tablicę, zamiast ją zwracać.
Dla ułatwienia parsowania możesz założyć, że wszystkie mają wartość od 1 do 9. ”, więc możesz usunąć przecinek z printf("%d"dodatkowego bajtu -1.
Kevin Cruijssen
@Rogem Powiedziałbym, że drukowanie tablicy podlega akceptowanemu We / Wy.
Jonathan Frech
1
@KevinCruijssen Wielkie dzięki; korzystając z łatwości parsowania udało mi się wygolić kolejny bajt.
Jonathan Frech,
2

Węgiel drzewny , 5 bajtów

θ‖C→↓

Wypróbuj online!

Dzięki tylko ASCII dla lepszego formatu wejściowego.

Erik the Outgolfer
źródło
Zastanawiam się, czy ten format wejściowy jest prawidłowy, ponieważ obawiam się, że węgiel drzewny inaczej nie poradzi sobie z wprowadzaniem danych. Jeśli nie, chętnie usunę tę odpowiedź.
Erik the Outgolfer
To jest poprawne I / O.
Pavel
@Pavel Właśnie się zastanawiałem, ponieważ powiedziałeś, że „Twój program otrzyma 2-wymiarową tablicę liczb całkowitych”, podczas gdy łańcuch jest jednowymiarowy (i nie, zewnętrzny []nie robi dokładnie 2D).
Erik the Outgolfer
@ Węgiel tylko ASCII naprawdę potrzebuje lepszej metody We / Wy ...
Neil
@Neil Nie został pingowany tutaj, ale wysłałem go przez TNB. :)
Erik the Outgolfer
2

Dodaj ++ , 30 bajtów

D,f,@,bU€{r}B]{r}
D,r,@,dbR+

Wypróbuj online!

Stopka po prostu przekształca zagnieżdżoną tablicę do formatu w pytaniu. Definiuje funkcję f, która oczekuje macierzy (tablicy zagnieżdżonej) jako argumentu.

Cairney Coheringaahing
źródło
1

Julia 0.6 , 55 49 bajtów

~i=i:-1:1
!x=[x x[:,~end];x[~end,:] x[~end,~end]]

Wypróbuj online!

~(i)to funkcja służąca do tworzenia wycinka od ido 1.
Więc ~enddaje plasterekend:-1:1

!(x) jest funkcją do przebudowania tablicy.

Lyndon White
źródło
1

V , 12 bajtów

yGæGPÎy$æ_|P

Wypróbuj online!

Wyjaśnienie:

yG              " Yank every line
  æG            " Reverse the order of the lines
    P           " Paste what we yanked
     Î          " On every line:
      y$        "   Yank the whole line
        æ_      "   Reverse the whole line
          |     "   Move to the beginning of the line
           P    "   Paste what we yanked
DJMcMayhem
źródło