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!


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




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


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.


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.



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

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)





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

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.


2

APL + WIN, 11 bajtów

Monituje o tablicę liczb całkowitych 2d.

m⍪⊖m←m,⌽m←⎕

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.






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
}

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

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


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ść.


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!


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.


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


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.


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