ตรวจสอบว่าเมทริกซ์เป็นเมทริกซ์ Toeplitz หรือไม่


11

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

รูปแบบอินพุต:

คุณจะได้รับฟังก์ชันซึ่งใช้two-dimensionalเมทริกซ์เป็นอาร์กิวเมนต์

รูปแบบเอาท์พุท:

กลับมา1จากการทำงานถ้าเมทริกซ์เป็นToeplitz-1อื่นกลับมา

ข้อ จำกัด :

3 < n,m < 10,000,000

โดยที่nจำนวนแถวในขณะที่mจะเป็นจำนวนคอลัมน์

กรณีทดสอบตัวอย่าง:

Sample Input :
4 
5
6 7 8 9 2
4 6 7 8 9
1 4 6 7 8
0 1 4 6 7 

Sample Output : 
1 

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


8
นี่เป็นความท้าทายที่ดี แต่เราต้องการความต้องการ I / O ของ laxer ที่นี่ ผมขอแนะนำให้ปล่อยให้ทั้งสองโปรแกรมและฟังก์ชั่นเป็นค่าเริ่มต้น และเพื่ออนุญาตให้ True / False หรือ 1/0 เป็นเอาต์พุตหรืออาจเป็นเพียงแค่สองเอาต์พุตที่แตกต่างกันที่สอดคล้องกันซึ่งน่าจะเป็นที่ต้องการสำหรับปัญหาการตัดสินใจ
xnor

15
นอกจากนี้คำจำกัดความของ Toeplitz จะดีเช่นเดียวกับกรณีทดสอบเพิ่มเติมรวมถึงกรณีที่ไม่ใช่ Toeplitz ไม่แน่ใจว่าคุณหมายถึงอะไรเกี่ยวกับการเพิ่มรหัส
xnor

5
ฉันคิดว่าคุณจะต้องลดค่าสูงสุดของn,ม. มิฉะนั้นส่วนหลักของความท้าทายนี้คือการหาวิธีในการประมวลผลเมทริกซ์ 1 เทราไบต์
Stewie Griffin

1
องค์ประกอบเมทริกซ์จะเป็นจำนวนเต็มไม่ใช่ลบเสมอหรือไม่
Martin Ender

คำตอบ:


7

Mathematica ขนาด 42 ไบต์

2Boole[#==ToeplitzMatrix[#&@@@#,#&@@#]]-1&

Mathematica ไม่มีการติดตั้งเพื่อตรวจสอบว่ามีเมทริกซ์ Toeplitz หรือไม่ แต่มีบิวด์อินเพื่อสร้าง ดังนั้นเราสร้างหนึ่งจากคอลัมน์แรก ( #&@@@#) และแถวแรก ( #&@@#) ของอินพุตและตรวจสอบว่ามันเท่ากับอินพุท การแปลงTrue/ Falseผลการ1/ -1เราใช้Boole(ที่จะให้1หรือ0) 2x-1แล้วก็เปลี่ยนผลด้วย


6

อ็อกเทฟ 30 ไบต์

ฉันสมมติว่าฉันไม่ต้องจัดการกับ 1,000,000x1,000,000 เมทริกซ์ตามที่ระบุไว้ในความท้าทาย สิ่งนี้ใช้ได้กับเมทริกซ์ที่ไม่เกินหน่วยความจำที่มี (น้อยกว่า 1 TB ในกรณีของฉัน)

@(x)x==toeplitz(x(:,1),x(1,:))

ลองออนไลน์!

สิ่งนี้ใช้เมทริกซ์xเป็นอินพุตและสร้างเมทริกซ์ Toeplitz ตามค่าในคอลัมน์แรกและแถวแรก จากนั้นจะตรวจสอบแต่ละองค์ประกอบของเมทริกซ์เพื่อความเท่าเทียมกัน หากองค์ประกอบทั้งหมดเท่ากันอินพุตจะเป็นเมทริกซ์ Toeplitz

เอาต์พุตจะเป็นเมทริกซ์ที่มีขนาดเดียวกันกับอินพุต หากมีศูนย์ใด ๆ ในผลลัพธ์ก็จะถือว่าเป็นเท็จเป็นคู่

แก้ไข:

เพิ่งสังเกตเห็นรูปแบบผลลัพธ์ที่เข้มงวด:

ใช้งานได้ 41 ไบต์ อาจเป็นไปได้ที่จะเล่นกอล์ฟแบบไบท์หรือสองเวอร์ชั่น แต่ฉันหวังว่ากฎเอาต์พุตจะผ่อนคลายเล็กน้อย

@(x)2*(0||(x==toeplitz(x(:,1),x(1,:))))-1


5

05AB1E , 11 ไบต์

Œ2ùvy`¦s¨QP

ลองออนไลน์!

คำอธิบาย

Œ             # get all sublists of input
 2ù           # keep only those of length 2
   v          # for each such pair
    y`        # split to separate lists
      ¦       # remove the first element of the second list
       s¨     # remove the last element of the first list
         Q    # compare for equality
          P   # product of stack

4

Haskell , 43 ไบต์

f(a:b:t)|init a==tail b=f$b:t|1>0= -1
f _=1

ลองออนไลน์!


แดงทับมันอีกครั้ง อยากรู้อยากเห็นฉันได้รับที่ลงถึง 39 bytes ด้วยความจริง / ออกเท็จดังนั้นหาก Toeplitz = Falseได้รับอนุญาตฉันอาจตีมันทีละ byte
Ørjan Johansen

3

Mathematica, 94 ไบต์

l=Length;If[l@Flatten[Union/@Table[#~Diagonal~k,{k,-l@#+1,l@#[[1]]-1}]]==l@#+l@#[[1]]-1,1,-1]&

อินพุต

{{6, 7, 8, 9, 2}, {4, 6, 7, 8, 9}, {1, 4, 6, 7, 8}, {0, 1, 4, 6, 7}}

อีกอันหนึ่งขึ้นอยู่กับอัลกอริทึมของStewie Griffin

Mathematica ขนาด 44 ไบต์

If[#==#[[;;,1]]~ToeplitzMatrix~#[[1]],1,-1]&

2
คุณจำเป็นต้องกำหนดsหรือไม่? คุณไม่สามารถใช้#แทนได้หรือ
ไม่ใช่ต้นไม้

ใช่! คุณพูดถูก!
J42161217

3

Java 7, 239 233 220 113 ไบต์

int c(int[][]a){for(int i=a.length,j;i-->1;)for(j=a[0].length;j-->1;)if(a[i][j]!=a[i-1][j-1])return -1;return 1;}

-107 ไบต์หลังจากที่ปลายของการใช้มีประสิทธิภาพมากขึ้นขอบคุณอัลกอริทึมไป@Neil

คำอธิบาย:

ลองที่นี่

int c(int[][]a){                // Method with integer-matrix parameter and integer return-type
  for(int i=a.length,j;i-->1;)  //  Loop over the rows (excluding the first)
    for(j=a[0].length;j-->1;)   //   Loop over the columns (excluding the first)
      if(a[i][j]!=a[i-1][j-1])  //    If the current cell doesn't equal the one top-left of it:
        return -1;              //     Return -1
                                //   End of columns loop (implicit / single-line body)
                                //  End of rows loop (implicit / single-line body)
  return 1;                     //  Return 1
}                               // End of method

R & C ในฟังก์ชั่นแรกคืออะไร?
มิกกี้แจ็ค

@MickeyJack แถวและคอลัมน์ ( r= nและc= mถ้าคุณเปรียบเทียบกับความท้าทาย)
Kevin Cruijssen

คุณไม่ควรส่งอาร์เรย์เป็นพารามิเตอร์ไปยังฟังก์ชันหรือไม่ นอกจากนี้ยังมีอัลกอริทึมที่มีประสิทธิภาพมากขึ้นสำหรับสิ่งนี้ซึ่งจะลดจำนวนไบต์ของคุณลงประมาณ 50%
Neil

1
@KevinCruijssen เพียงตรวจสอบว่าองค์ประกอบทั้งหมดที่ไม่ได้อยู่ในแถวหรือคอลัมน์แรกเท่ากับองค์ประกอบนั้นตามแนวทแยงมุมจากซ้ายไป
Neil

1
อาคุณต้องใช้-->โอเปอร์เรเตอร์ด้วย!
Neil

3

Haskell , 51 ไบต์

t รับรายการจำนวนเต็มและคืนค่าจำนวนเต็ม

t m=1-sum[2|or$zipWith((.init).(/=).tail)=<<tail$m]

ลองออนไลน์!

นี่อาจเป็น 39 หรือ 38 ไบต์กับเอาต์พุตที่เป็นความจริง / เท็จ

แนวคิดที่จะใช้initนั้นได้แรงบันดาลใจจากคำตอบ 05AB1E ของ Emigna ซึ่งใช้วิธีการที่คล้ายกันมาก ก่อนหน้านั้นฉันใช้การซิปแบบซ้อนกัน

มันทำงานอย่างไร

  • zipWith((.init).(/=).tail)=<<tail\m->zipWith(\x y->tail x/=init y)(tail m)mเป็นรูปแบบจุดฟรี
  • วิธีนี้จะรวมแถวของแต่ละคู่ติดต่อกันmโดยตรวจสอบว่าการลบองค์ประกอบแรกกับองค์ประกอบแรกนั้นแตกต่างจากส่วนที่สองโดยลบองค์ประกอบที่สองออกหรือไม่
  • orแล้วรวมการตรวจสอบสำหรับทุกคู่ของแถว
  • 1-sum[2|...] แปลงรูปแบบผลลัพธ์


2

Ruby , 54 ไบต์

->a,b,m{m.reduce{|x,y|x[0..-2]==y[1,b]?y:[]}.size<=>1}

ตรงตามที่ระบุไว้สามารถเล่นกอล์ฟได้มากขึ้นหากยอมรับอินพุต / เอาต์พุตแบบยืดหยุ่น

คำอธิบาย:

ทำซ้ำเมทริกซ์และเปรียบเทียบแต่ละบรรทัดด้วยบรรทัดด้านบนเลื่อนจากหนึ่งไปทางขวา ถ้ามันแตกต่างกันให้ใช้อาร์เรย์ว่างสำหรับการทำซ้ำครั้งถัดไป ในตอนท้ายให้ส่งคืน -1 หากอาร์เรย์สุดท้ายว่างเปล่าหรือ 1 ถ้าอย่างน้อย 2 องค์ประกอบ (เนื่องจากเมทริกซ์ที่เล็กที่สุดที่เป็นไปได้คือ 3x3 นี่เป็นจริงถ้าการเปรียบเทียบทั้งหมดกลับเป็นจริง)

ลองออนไลน์!


ใช้<=>เพื่อคำนวณผลลัพธ์!
Neil

วิธีการเกี่ยวกับ|(*x,_),y|ดังนั้นคุณจึงไม่จำเป็นต้องชิ้นx?
Stefan Pochmann


1

Python, 108

r=range
f=lambda x,n,m:all([len(set([x[i][j] for i in r(n) for j in r(m) if j-i==k]))==1 for k in r(1-n,m)])

ไม่ได้มีประสิทธิภาพเลยเพราะมันสัมผัสทุกn+mครั้งที่องค์ประกอบขณะกรอง diagonals จากนั้นตรวจสอบว่ามีองค์ประกอบที่ไม่ซ้ำกันมากกว่าหนึ่งรายการในแนวทแยงหรือไม่


1

ความจริง 121 ไบต์

f(m)==(r:=nrows(m);c:=ncols(m);for i in 1..r-1 repeat for j in 1..c-1 repeat if m(i,j)~=m(i+1,j+1)then return false;true)

m ต้องเป็นเมทริกซ์ขององค์ประกอบบางอย่างที่อนุญาตให้ ~ =; ถอดมันออก

f m ==
  r := nrows(m)
  c := ncols(m)
  for i in 1..(r - 1) repeat
    for j in 1..(c - 1) repeat
      if m(i,j)~=m(i + 1,j + 1)     then return(false)
  true

1

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

m(1`\d+
$*#
1`#\n\d+\n
@
+`(#*)#@([^#\n]*(#*)\n)(.*)$
$1# $2$1@$4 #$3
@

+`##
# #
+(+s`^(\d+)\b(.*)^\1\b
$1$2#
s`.*^\d.*^\d.*
-1
)%`^[^- ]+ ?

\s+
1

ลองออนไลน์!

เมทริกซ์อินพุต N × M

6 7 8 9 2 0
4 6 7 8 9 2
1 4 6 7 8 9
0 1 4 6 7 8

จะถูกแปลงเป็นเมทริกซ์ N × (N + M-1) เป็นครั้งแรกโดยจัดแนวทแยงมุมด้วยวิธีนี้:

# # # 6 7 8 9 2 0
# # 4 6 7 8 9 2 #
# 1 4 6 7 8 9 # #
0 1 4 6 7 8 # # #

จากนั้นคอลัมน์แรกจะถูกตรวจสอบซ้ำ ๆ เพื่อให้มีหมายเลขที่ไม่ซ้ำกันและจะถูกลบออกหากเป็นเช่นนั้น เมทริกซ์คือ Toeplitz ถ้าเอาต์พุตว่างเปล่า


โอ้มันไม่ได้ทำงานกับตัวเลขที่ติดลบ, ต้องแก้ไขปัญหานี้ :)
eush77

1

MATL 11 ไบต์

T&Xd"@Xz&=v

ลองออนไลน์!

ตรงไปตรงมา "สร้าง Toeplitz matrix และตรวจสอบกับมัน" วิธีการที่คำตอบไม่กี่อันดับแรกใช้อย่างใดรู้สึกเบื่อกับฉัน (และดูเหมือนว่าจะเป็น 1 ไบต์อีกต่อไปแล้ว) ดังนั้นฉันจึงไป "ตรวจสอบแต่ละเส้นทแยงมุมมีค่าที่ไม่ซ้ำกันหนึ่งค่าเท่านั้น"

T&Xd - แยก diagonals ของอินพุตและสร้างเมทริกซ์ใหม่ด้วยคอลัมน์ (padding ด้วยศูนย์ตามต้องการ)

" - วนซ้ำผ่านคอลัมน์ของสิ่งนั้น

@Xz - ผลักตัวแปรซ้ำ (คอลัมน์ปัจจุบัน) และลบ (padding) ศูนย์จากมัน

&=- การตรวจสอบความเท่าเทียมกันในการออกอากาศ - สิ่งนี้จะสร้างเมทริกซ์ที่มี 1s ทั้งหมด (ความจริง) หากค่าที่เหลือทั้งหมดมีค่าเท่ากันมิฉะนั้นเมทริกซ์จะมี 0 บางส่วนที่เป็นเท็จ

v - เชื่อมค่าผลลัพธ์เข้าด้วยกันเพื่อสร้างเวกเตอร์ผลลัพธ์สุดท้ายซึ่งเป็นจริง (ทั้งหมด 1 วินาที) หรือเท็จ (บาง 0 วินาที)



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