สร้างอาร์เรย์สี่เหลี่ยมจากมุมใหม่


30

ฉันเคยมีอาร์เรย์เป็นรูปสี่เหลี่ยมผืนผ้าที่สวยงาม มันค่อนข้างสมมาตร แต่โชคไม่ดีที่มันพังทลายและตอนนี้ฉันมีมุมซ้ายบนเท่านั้น งานของคุณคือการสร้างอาร์เรย์เดิมขึ้นมาใหม่

โปรแกรมของคุณจะได้รับอาร์เรย์จำนวนเต็มสองมิติ เพื่อความสะดวกในการวิเคราะห์คุณอาจคิดว่ามันอยู่ระหว่าง 1 ถึง 9 งานของคุณคือการกลับคอลัมน์ของแถว, แถวของมันและทั้งสองกลับเข้าที่มุมผลลัพธ์และกลับอาร์เรย์ผลลัพธ์

คุณสามารถสันนิษฐานได้ว่าขนาดของอาร์เรย์จะมีอย่างน้อย 1x1

กรณีทดสอบ:

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

นี่คือ , ไบต์ที่น้อยที่สุดชนะ!


1
ฉันจะเดิมพันว่าถ่านสามารถทำได้ภายใน 10 วัน
FantaC

1
@tbfninja chat.stackexchange.com/transcript/message/43184083#43184083แต่อาจสั้นกว่านี้ด้วยรูปแบบอินพุตอื่น
Pavel

@MagicOctopusUrn ใช่
Pavel

2
@tfbninja WS⟦ι⟧‖M→↓อาจจะ? 5 ไบต์เพื่ออ่านอินพุตและ 4 เพื่อสะท้อน
Neil

4
ฉันแน่ใจว่า 99% ว่ามี lang ที่ทำสิ่งนี้ด้วย(หรือตัวละครที่คล้ายกัน) เพียงจำไม่ได้ว่าอันไหน: c
Rod

คำตอบ:


1

โปรตอน , 29 ไบต์

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

ลองออนไลน์!

มีวิธีที่น่าสนใจอื่น ๆ อีกสองสามประการดังนี้:

โปรตอน , 29 ไบต์

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

ลองออนไลน์!

คุณสามารถกำหนดฟังก์ชั่นย่อยของมิเรอร์gในบรรทัดได้เนื่องจาก Proton มันไม่ได้สั้นกว่า

โปรตอนขนาด 36 ไบต์

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

ลองออนไลน์!

นี่ควร(a=>zip(*(a+a[by-1])))*2เป็น 24 ไบต์ แต่ฟังก์ชันซิปเสียอย่างสมบูรณ์ โดยทั่วไปคุณสะท้อนและ zip แล้วทำสองครั้ง (คุณสามารถคูณฟังก์ชันด้วยจำนวนเต็มบวกเพื่อใช้ฟังก์ชันหลายครั้ง)


19

Canvas , 1 ไบต์

ลองที่นี่!

ส่งออกเป็นสตริงหลายบรรทัด


2
เยี่ยม @Rod เรียกว่าหนึ่งฮ่า! นี่เป็นภาษาของคุณด้วย Dzaima เหรอ?
Magic Octopus Urn

ประณาม ... ฉันควรจะจำได้ ...
สิ้นเชิงมนุษย์

@ MagicOctopusUrn ใช่ใช่ IIRC มันหมายถึงโดยทั่วไปแล้วจะเป็น SOGL II: Electric Boogaloo?
ASCII เท่านั้นเท่านั้น


5

Python 3, 38 ไบต์

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

ลองออนไลน์!

ใช้รายการของรายการและส่งคืนรายการ

คำอธิบาย:

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

เรติน่า 13 ไบต์

\%`$
$^$`
Vs`

ลองออนไลน์!

คำอธิบาย

\%`$
$^$`

ในแต่ละบรรทัด ( %) จับคู่ส่วนท้ายของบรรทัด ( $) และใส่ย้อนกลับ ( $^) ของทั้งบรรทัด ( $`) และพิมพ์ผลลัพธ์ด้วยการป้อนบรรทัดต่อท้าย ( \) สิ่งนี้จะสะท้อนกลับไปตามแกนตั้งและพิมพ์ครึ่งแรกของเอาต์พุต

Vs`

นี่แค่ย้อนกลับสตริงทั้งหมดซึ่งเทียบเท่ากับการหมุน 180 องศาหรือในกรณีของเรา (เนื่องจากสมมาตรแนวนอน) การสะท้อนตามแนวแกนนอน วิธีนี้ใช้งานได้คือVregex เริ่มต้นของ (ย้อนกลับ) (?m:^.*$)ซึ่งโดยทั่วไปจะจับคู่แต่ละบรรทัดของสตริง อย่างไรก็ตามเราเปิดใช้งานตัวเลือก singleline sซึ่งทำให้การ.จับคู่ linefeeds เป็นอย่างดีและทำให้ regex เริ่มต้นนี้ตรงกับสตริงทั้งหมด

ผลลัพธ์ของสิ่งนี้จะถูกพิมพ์โดยอัตโนมัติเมื่อสิ้นสุดโปรแกรมทำให้เราได้ผลลัพธ์ครึ่งหลัง


นี่ไม่เหมือนรส regex ใด ๆ ที่ฉันรู้: P
Pavel

@Pavel เพราะ Retina ไม่ได้เป็นแค่ regex :)
Erik the Outgolfer

@Pavel ส่วนเดียวของรหัสนั้นคือ regex ที่แท้จริงคือ$ในบรรทัดแรก ;) ฉันจะเพิ่มคำอธิบายในภายหลัง
Martin Ender

5

05AB1E , 2 ไบต์

∞∊

ลองออนไลน์!


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

เครดิตสำหรับนาย Xcoderชี้ให้เห็นว่าอาร์เรย์ของสตริงอาจนับเป็นอาร์เรย์ 2 มิติและพาเวลสำหรับการยืนยัน



เพื่อความสะดวกในการวิเคราะห์คุณอาจคิดว่ามันอยู่ระหว่าง 1 ถึง 9 - ดังนั้นฉันคิดว่ามันถูกต้อง รอการยืนยันจากพาเวลฉันเดาว่า
Mr. Xcoder

@ Mr.Xcoder นั่นคือสิ่งที่ฉันมีในตอนแรกจากนั้นอาร์เรย์ TIO 2D ในขณะที่การป้อนข้อมูลเป็นเรื่องแปลก ... จึงต้องเกิดขึ้นกับส่วนหัวของสิ่งนั้น
Magic Octopus Urn

สตริงคืออาร์เรย์ของอักขระดังนั้นรายการสตริงจึงยังคงเป็นอาร์เรย์ 2d @ ทางออกของ Mr.Xcoder ถูกต้อง
Pavel

Coolio ทำงานให้ฉัน
Magic Octopus Urn






3

awk, 88 ไบต์

{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
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี :)
HyperNeutrino

2

รูปสามเหลี่ยม 31 ไบต์

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

ลองออนไลน์!

คำอธิบาย

การลบอักขระที่ใช้สำหรับการขยายนี่คือสิ่งที่โปรแกรมทำ:

)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

Stax , 5 ไบต์

:mm:m

เรียกใช้และตรวจแก้จุดบกพร่องออนไลน์

:minput.concat(reverse(input))หมายถึงกระจกซึ่งเป็น mในบริบทนี้หมายถึงเอาต์พุตแต่ละบรรทัดหลังจากใช้ ...

ดังนั้นทำมิเรอร์อาร์เรย์ของแถวจากนั้นทำมิเรอร์แต่ละแถวและเอาต์พุต






2

Ruby , 35 ไบต์

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

ลองออนไลน์!

แลมบ์ดายอมรับอาร์เรย์ 2D แล้วส่งกลับอาร์เรย์ 2D มันตรงไปตรงมา แต่นี่เป็นเวอร์ชั่นที่ไม่ดีต่อสุขภาพ:

->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 ไบต์

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

คำอธิบาย:

ลองออนไลน์

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 ไบต์

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

|:@(,|.)^:2

ลองออนไลน์!

|: transpose

@(…) ผลลัพธ์ของ:

, อาร์กิวเมนต์ตามมาด้วย

|. มันกลับ

^:2 และทั้งหมดนี้ทำสองครั้ง


2

SNOBOL4 (CSNOBOL4) , 119 113 ไบต์

	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	

ลองออนไลน์!

รับอินพุตเป็นสตริงบน STDIN โดยไม่มีช่องว่าง ใช้งานได้เพียงเพราะตัวเลขเป็น1-9และจะล้มเหลวเป็นอย่างอื่น


ฉันเห็นได้ว่าทำไมผู้คนไม่ใช้ภาษานี้อีกต่อไป นี่มันแปลกมาก
Pavel

1
@Pavel SNOBOL เป็นภาษาที่น่ากลัวอย่างแท้จริงในการทำงานกับ นี่เป็นการใช้งาน C ที่ทันสมัยกว่าซึ่งมีฟังก์ชัน builtin เพิ่มเติมเช่นREVERSE; เลขคณิตที่เป็นเลขจำนวนเต็มต้นฉบับเท่านั้นที่รองรับเท่าที่ฉันสามารถบอกได้
Giuseppe

2

C (gcc) , 114 111 bytes

  • บันทึกสามไบต์ด้วยKevin Cruijssen ; กลับหัวกลับหาง
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)]);}

ลองออนไลน์!

C (gcc) , 109 ไบต์ (ใช้งานง่ายในการแยกวิเคราะห์)

  • ขอบคุณKevin Cruijssen ที่แนะนำให้อนุญาตให้ใช้เฉพาะจำนวนเต็มจำนวนเต็มเท่านั้น บันทึกสองไบต์
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);}

ลองออนไลน์!


คุณสามารถบันทึกได้ 3 ไบต์โดยการย้อนกลับลูป for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)
Kevin Cruijssen

ไม่ตอบสนองสเป็ค; พิมพ์อาร์เรย์แทนที่จะส่งคืน

" เพื่อความสะดวกในการวิเคราะห์คำคุณอาจคิดว่ามันอยู่ระหว่าง 1 ถึง 9 " ดังนั้นคุณสามารถลบเครื่องหมายจุลภาคในprintf("%d"-1 ไบต์เพิ่มเติมได้
Kevin Cruijssen

@Rogem ฉันจะบอกว่าการพิมพ์อาร์เรย์ตกอยู่ภายใต้การได้รับการยอมรับ i / o
Jonathan Frech

1
@KevinCruijssen ขอบคุณมาก ใช้ความสะดวกในการแยกวิเคราะห์ฉันจัดการเพื่อกำจัดไบต์อื่น
Jonathan Frech

2

ถ่าน 5 ไบต์

θ‖C→↓

ลองออนไลน์!

ขอบคุณASCII-onlyสำหรับรูปแบบอินพุตที่ดีขึ้น


ฉันสงสัยว่ารูปแบบอินพุตนี้ถูกต้องหรือไม่เนื่องจากฉันกลัวว่า Charcoal ไม่สามารถจัดการอินพุตเป็นอย่างอื่นได้ ถ้าไม่ใช่ฉันจะลบคำตอบนี้อย่างมีความสุข
Erik the Outgolfer

นี่เป็น I / o ที่ถูกต้อง
Pavel

@Pavel ฉันแค่สงสัยเพราะคุณบอกว่า "โปรแกรมของคุณจะได้รับจำนวนเต็มสองมิติของอาร์เรย์" ในขณะที่สตริงเป็น 1 มิติ (และไม่ใช่ด้านนอก[]ไม่ได้ทำให้มันเป็น 2 มิติ)
Erik the Outgolfer

@ ASCII เท่านั้นถ่านจริงๆต้องดีกว่า I / O วิธีการ ...
นีล

@Neil เขาไม่ได้ส่ง Ping ไปที่นี่ แต่ฉันส่ง Ping ไปที่ TNB :)
Erik the Outgolfer

2

เพิ่ม ++ , 30 ไบต์

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

ลองออนไลน์!

ส่วนท้ายเพียงแปลงอาร์เรย์ที่ซ้อนกันเป็นรูปแบบในคำถาม กำหนดฟังก์ชั่นfซึ่งคาดว่าเมทริกซ์ (อาร์เรย์ที่ซ้อนกัน) เป็นอาร์กิวเมนต์



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.