Membangun kembali array persegi panjang dari sudut

30

Saya pernah memiliki array persegi panjang yang indah. Itu sangat simetris, tetapi sayangnya telah berantakan dan sekarang saya hanya memiliki sudut kiri atas. Tugas Anda adalah membangun kembali array asli.

Program Anda akan menerima array bilangan 2 dimensi. Untuk memudahkan penguraian, Anda dapat mengasumsikan semuanya berada di antara 1 dan 9. Tugas Anda adalah membalik kolom array, barisnya, dan keduanya, menyatukan sudut-sudut yang dihasilkan, dan mengembalikan array yang dihasilkan.

Anda dapat mengasumsikan dimensi array paling tidak 1x1.

Kasus uji:

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

Ini adalah , byte terkecil menang!

Pavel
sumber
1
Saya berani bertaruh arang dapat melakukan ini di bawah 10
FantaC
1
@tbfninja chat.stackexchange.com/transcript/message/43184083#43184083 tetapi mungkin bisa lebih pendek dengan format input yang berbeda.
Pavel
@ MagicOctopusUrn ya
Pavel
2
@ tfbninja WS⟦ι⟧‖M→↓mungkin? 5 byte untuk membaca input dan 4 untuk mencerminkannya.
Neil
4
Saya 99% yakin bahwa ada lang yang melakukan ini dengan (atau karakter serupa) tidak dapat mengingat yang mana: c
Rod

Jawaban:

1

Proton , 29 byte

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

Cobalah online!

Ada beberapa pendekatan menarik lainnya:

Proton , 29 byte

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

Cobalah online!

Anda dapat mendefinisikan sub-fungsi cermin g secara online, karena Proton. Itu tidak lebih pendek.

Proton , 36 byte

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

Cobalah online!

Seharusnya (a=>zip(*(a+a[by-1])))*224 byte, tetapi fungsi zip benar-benar rusak. Pada dasarnya, Anda mirror dan zip, dan kemudian melakukannya dua kali (Anda dapat mengalikan fungsi dengan bilangan bulat positif untuk menerapkan fungsi beberapa kali).

HyperNeutrino
sumber
19

Kanvas , 1 byte

Coba di sini!

Output sebagai string multiline

dzaima
sumber
2
Bagus, @Rod menyebut itu hah! Apakah ini bahasa Anda juga Dzaima?
Magic Octopus Urn
Sial ... Seharusnya aku ingat ...
manusia
@ MagicOctopusUrn Ya, IIRC itu pada dasarnya dimaksudkan untuk menjadi SOGL II: Electric Boogaloo?
ASCII
5

Python 3, 38 byte

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

Cobalah online!

Mengambil daftar daftar dan mengembalikan daftar daftar.

Penjelasan:

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
pizzapants184
sumber
5

Retina , 13 byte

\%`$
$^$`
Vs`

Cobalah online!

Penjelasan

\%`$
$^$`

Pada setiap baris ( %), cocokkan dengan ujung garis ( $), dan masukkan kebalikan ( $^) dari seluruh baris ( $`) dan cetak hasilnya dengan linefeed baris tambahan ( \). Ini melakukan refleksi sepanjang sumbu vertikal dan mencetak paruh pertama dari output.

Vs`

Ini hanya membalikkan seluruh string, yang setara dengan rotasi 180 derajat, atau dalam kasus kami (karena simetri horizontal) refleksi sepanjang sumbu horizontal. Cara ini berfungsi adalah Vregex default (kebalikan) (?m:^.*$), yang biasanya cocok dengan setiap baris string. Namun, kami mengaktifkan opsi singleline s, yang membuatnya. feed linefeed juga dan karenanya regex default ini benar-benar cocok dengan seluruh string.

Hasil dari ini dicetak secara otomatis di akhir program, memberi kita paruh kedua dari output.

Martin Ender
sumber
Ini tidak terlihat seperti rasa regex yang saya tahu: P
Pavel
@Pavel Karena Retina bukan hanya regex. :)
Erik the Outgolfer
@Pavel satu-satunya bagian dari kode itu yang merupakan regex aktual adalah $pada baris pertama. ;) Saya akan menambahkan penjelasan nanti.
Martin Ender
5

05AB1E , 2 byte

∞∊

Cobalah online!


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

Kredit untuk Tn. Xcoder menunjukkan bahwa array string dapat dihitung sebagai array 2D dan Pavel untuk mengkonfirmasinya.

Guci Gurita Ajaib
sumber
... 2 byte
Tn. Xcoder
Untuk memudahkan penguraian, Anda dapat mengasumsikan semuanya berada di antara 1 dan 9 - Jadi saya pikir ini valid. Menunggu konfirmasi Pavel, saya kira
Tn. Xcoder
@ Mr.Xcoder itulah yang saya miliki pada awalnya, kemudian array TIO 2D sebagai input aneh ... jadi harus muncul dengan hal-hal header itu.
Magic Octopus Urn
String adalah array karakter, jadi daftar string masih berupa array 2d. @ Solusi Mr.Xcoder valid.
Pavel
Coolio, bekerja untukku.
Magic Octopus Urn
3

Jelly , 5 byte

m€0m0

Cobalah online!

Erik the Outgolfer
sumber
Juga 5 byte: m0Z$⁺(oleh Hyper Neutrino).
Pavel
3

MATL , 5 byte

,tPv!

Cobalah online!

Penjelasan:

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

Giuseppe
sumber
3

Oktaf ,  33  29 byte

Terima kasih kepada @Giuseppe untuk bermain golf empat byte!

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

Cobalah online!

Steadybox
sumber
29 byte
Giuseppe
3

JavaScript (Node.js) , 62 55 49 46 byte

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

Cobalah online!

Karena Array.prototype.reverse()membalikkan array di tempat, saya harus membuat salinan dangkal di suatu tempat terlebih dahulu. A=>(j=x=>[...x,...x.reverse()])(A).map(j)tidak bekerja.

Shieru Asakoto
sumber
3

J , 12 byte

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

Cobalah online!

Penjelasan

         |."1 - reverse each row
       ,.     - and stitch them to the input
 (   )@       - and 
  ,|.         - append the rows in reversed order        
Galen Ivanov
sumber
3

awk, 88 byte

{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
sumber
3
Selamat datang di PPCG! Jawaban pertama yang bagus :)
HyperNeutrino
2

Triangularity , 31 byte

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

Cobalah online!

Penjelasan

Menghapus karakter yang menggantikan padding, inilah yang dilakukan oleh 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.
Tuan Xcoder
sumber
2

APL + WIN, 11 byte

Meminta untuk array bilangan bulat 2d.

m⍪⊖m←m,⌽m←⎕
Graham
sumber
2

Stax , 5 byte

:mm:m

Jalankan dan debug secara online

:mberarti cermin, yang input.concat(reverse(input)). m, dalam konteks ini berarti output setiap baris setelah menerapkan ...

Jadi, mirror array dari baris, dan kemudian mirror setiap baris dan output.

rekursif
sumber
2

Japt , 6 byte

mê1 ê1

Coba di sini


Penjelasan

           :Implicit input of 2D array
m          :Map
 ê1        :  Mirror sub array
    ê1     :Mirror main array
Shaggy
sumber
2

Ruby , 35 byte

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

Cobalah online!

Lambda menerima array 2D dan mengembalikan array 2D. Mudah, tapi ini versi yang tidak disunat:

->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
sumber
2

Java 8, 140 131 byte

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

Penjelasan:

Cobalah 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
sumber
2

J , 11 byte

Fungsi awalan diam-diam anonim.

|:@(,|.)^:2

Cobalah online!

|: mengubah urutan

@(…) hasil dari:

, Argumen diikuti oleh

|. kebalikannya

^:2 dan semua ini dilakukan dua kali

Adm
sumber
2

SNOBOL4 (CSNOBOL4) , 119 113 byte

	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	

Cobalah online!

Mengambil input sebagai string pada STDIN, tanpa spasi. Ini hanya berfungsi karena digitnya adalah 1-9dan akan gagal jika tidak.

Giuseppe
sumber
Saya dapat melihat mengapa orang tidak menggunakan bahasa ini lagi. Ini sangat aneh.
Pavel
1
@Pavel SNOBOL benar-benar bahasa yang mengerikan untuk dikerjakan. ini adalah implementasi C yang lebih modern yang memiliki fungsi builtin tambahan seperti REVERSE; yang asli hanya mendukung bilangan aritmatika juga, sejauh yang saya tahu.
Giuseppe
2

C (gcc) , 114 111 byte

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

Cobalah online!

C (gcc) , 109 byte (menyalahgunakan kemudahan parsing)

  • Terima kasih kepada Kevin Cruijssen karena menyarankan untuk hanya mengizinkan bilangan bulat input satu digit; menyimpan dua byte.
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);}

Cobalah online!

Jonathan Frech
sumber
Anda dapat menyimpan 3 byte dengan membalik loop. for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)
Kevin Cruijssen
Tidak memenuhi spesifikasi; mencetak array, bukan mengembalikannya.
" Untuk kemudahan penguraian, Anda dapat mengasumsikan mereka semua antara 1 dan 9. ", sehingga Anda dapat menghapus koma di printf("%d"untuk -1 byte tambahan.
Kevin Cruijssen
@Rogem Saya akan mengatakan pencetakan array jatuh di bawah diterima i / o
Jonathan Frech
1
@KevinCruijssen Terima kasih banyak; menggunakan kemudahan parsing saya berhasil mencukur byte lain.
Jonathan Frech
2

Arang , 5 byte

θ‖C→↓

Cobalah online!

Berkat ASCII-saja untuk format input yang lebih baik.

Erik the Outgolfer
sumber
Saya ingin tahu apakah format input ini valid, karena saya khawatir Charcoal tidak dapat menangani input sebaliknya. Jika tidak, saya dengan senang hati akan menghapus jawaban ini.
Erik the Outgolfer
Ini adalah I / o yang valid.
Pavel
@Pavel Saya hanya ingin tahu karena Anda telah mengatakan bahwa "Program Anda akan menerima array 2 dimensi bilangan bulat", sementara string adalah 1-dimensi (dan tidak, bagian luar []tidak benar-benar membuatnya menjadi 2D).
Erik the Outgolfer
@ Arang hanya ASCII benar-benar membutuhkan metode I / O yang lebih baik ...
Neil
@Neil Dia tidak di-ping di sini, tapi aku mem-pingnya di atas TNB. :)
Erik the Outgolfer
2

Tambahkan ++ , 30 byte

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

Cobalah online!

Footer hanya mengubah array bersarang ke dalam format dalam pertanyaan. Menentukan fungsi f, yang mengharapkan matriks (array bersarang) sebagai argumen.

caird coinheringaahing
sumber
1

Julia 0,6 , 55 49 byte

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

Cobalah online!

~(i)adalah fungsi untuk membuat slice dari ibawah ke1 .
Jadi ~endberikan potongannyaend:-1:1

!(x) adalah fungsi untuk melakukan pembangunan kembali array.

Lyndon White
sumber
1

V , 12 byte

yGæGPÎy$æ_|P

Cobalah online!

Penjelasan:

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
sumber