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!


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




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


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.


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.



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

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)



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.


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        

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

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.


2

APL + WIN, 11 byte

Meminta untuk array bilangan bulat 2d.

m⍪⊖m←m,⌽m←⎕

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.






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
}

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

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


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.


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!


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.


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


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.