หัวลูกศรเมทริกซ์ของฉันหรือไม่


33

คำนิยาม

เมทริกซ์หัวลูกศรเป็นเมทริกซ์ที่มีรายการทั้งหมดเท่ากับ0ยกเว้นคนบนเส้นทแยงมุมหลักแถวบนสุดและคอลัมน์ซ้ายสุด กล่าวอีกนัยหนึ่งเมทริกซ์ควรมีลักษณะเช่นนี้:

* * * * * *
* * 0 0 0 0 0
* 0 * 0 0 0
* 0 0 * 0 0
* 0 0 0 * 0
* 0 0 0 0 0 *

โดยที่*แต่ละรายการที่ไม่เป็นศูนย์

งาน

ให้ตารางเมทริกซ์ของจำนวนเต็มไม่เป็นลบตรวจสอบว่าเป็นลูกศรตามคำนิยามข้างต้น

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

รหัสสั้นที่สุดเป็นไบต์ในแต่ละภาษาชนะ

อินพุตและเอาต์พุต

คุณสามารถเลือกรูปแบบใดรูปแบบหนึ่งต่อไปนี้เพื่อรับอินพุต:

  • เมทริกซ์ในประเภทเมทริกซ์เนทีฟ (หากภาษาของคุณมี)
  • อาร์เรย์ 2 มิติ1 (อาร์เรย์ 1D ของอาร์เรย์แต่ละแถวสอดคล้องกับหนึ่งแถว)
  • อาร์เรย์ 1D (เนื่องจากเมทริกซ์เป็นจตุรัสเสมอ)
  • สตริง (คุณเลือกการเว้นวรรค แต่โปรดอย่าใช้สิ่งนี้ในทางที่ผิด)

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

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

1: หรือเทียบเท่าภาษาของคุณ (รายการ, เวกเตอร์, ฯลฯ )

ตัวอย่าง

ลองดูตัวอย่างต่อไปนี้:

1 2 2 2
2 1 0 0
3 0 1 0
4 0 0 1

นี่คือเมทริกซ์หัวลูกศร (โปรแกรมของคุณควรจะรายงานค่า truthy ก) เพราะองค์ประกอบในแนวทแยงหลัก1 1 1 1, ผู้ที่อยู่ในแถวบนสุดที่มีและผู้ที่อยู่ในคอลัมน์ซ้ายสุดเป็น1 2 2 2 1 2 3 4รายการอื่น ๆ ทั้งหมดเป็น0ดังนั้นนี่เป็นไปตามเงื่อนไขทั้งหมด

3 5 6
7 1 0
8 0 0

เมทริกซ์นี้ไม่ใช่หัวลูกศรเพราะมี0บนเส้นทแยงมุมหลัก

9 9 9 9
9 9 0 0
9 7 9 0
9 0 0 9

อันนี้ไม่ได้ Arrowhead ทั้งเพราะมันมี7ในสถานที่ของ0

กรณีทดสอบเพิ่มเติม

Truthy:

[[1, 1, 1], [1, 1, 0], [1, 0, 1]]
[[1, 2, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]
[[1, 2, 2, 2], [2, 1, 0, 0], [3, 0, 1, 0], [4, 0, 0, 1]
[[34, 11, 35, 5], [56, 567, 0, 0], [58, 0, 679, 0], [40, 0, 0, 7]]

Falsy:

[[3, 5, 6], [7, 1, 0], [8, 0, 0]]
[[9, 9, 9, 9], [9, 9, 0, 0], [9, 7, 9, 0], [9, 0, 0, 9]
[[1, 0, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]
[[1, 6, 3, 4], [13, 2, 0, 6], [29, 0, 1, 0], [2, 0, 0, 4]

1
เป็นไปได้ไหมว่าเมทริกซ์สามารถมีจำนวนลบ
Zacharý

2
@ Zachary ไม่มีคุณอาจคิดว่าพวกเขาทั้งหมดที่ไม่ใช่เชิงลบ
Mr. Xcoder

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

@IanBush ใช่แล้วอาร์เรย์ 2 มิตินั้นดีมาก
Mr. Xcoder

9
@ Mr.Xcoder นี่จะเป็นความท้าทายที่แตกต่างและน่าสนใจพอสมควรหากหัวลูกศรสามารถชี้ไปในทิศทางใดก็ได้
dylnan

คำตอบ:


15

Javascript (ES6), 48 47 ไบต์

บันทึก 1 ไบต์ขอบคุณ edc65

m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))

ผลตอบแทนfalseสำหรับการฝึกอบรมหัวลูกศรและการฝึกอบรมที่trueไม่ใช่หัวลูกศร (ได้รับอนุญาตเนื่องจากทั้งสองค่าที่แตกต่างสามารถนำมาใช้เพื่อเป็นตัวแทนของจริงและเท็จ)

กรณีทดสอบ:


ตอนนี้เป็นวิธีที่ฉลาดจริงๆ!
Mr. Xcoder

1
ใช้งานได้ไหม f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
edc65

@ edc65 ไม่มีf=หลักสูตร;-)
Neil

11

J , 21 20 19 17 15 ไบต์

-4 ไบต์ขอบคุณ @GalenIvanov

*-:1,1,.=&/:@}.

รับอินพุตเป็นเมทริกซ์ (แถวลำดับที่ 2)

ลองออนไลน์!

คำอธิบาย

ปล่อยให้ประวัติศาสตร์การแก้ไขเป็นบทเรียนสำหรับคุณที่จะไม่ตีกอล์ฟและเขียนคำอธิบายในเวลาเดียวกัน

* -: 1, 1,. = & /: @ }.  Let m be the input matrix.
            = & /: @ }.  Identity matrix 1 smaller than m.
                     }.    Behead (m without its first row).
                   @       Composed with.
                /:         Grade up (get len(m) - 1 unique elements)
              &            Composed with.
            =              Self-classify (compare equality with
                           unique elements)
        1,.              Prepend a column of 1s
     1,                  Prepend a row of 1s
*                        Signum (0 becomes 0, n > 0 becomes 1)
  -:                     Does it match the generated arrowhead matrix?

คำอธิบายภาพ

โปรดทราบว่าสิ่งนี้ทำบน REPL (อินพุตถูกกำหนดให้เริ่มต้นด้วยช่องว่างสามช่องและส่งออกโดยไม่มีช่องว่างนำหน้า) ด้วยเหตุนี้บางครั้งฉันจึงละเว้นฟังก์ชั่นการแต่งเพลงเช่น@และ&เนื่องจากสิ่งต่าง ๆ บน REPL ถูกประเมินจากขวาไปซ้าย (ฟังก์ชั่นมีความซับซ้อนมากขึ้น)

สมมติว่าคุณมีเมทริกซ์ตัวอย่างต่อไปนี้:

   ] m =. 4 4 $ 1 2 3 4 1 1 0 0 1 0 1 0 1 0 0 1
1 2 3 4
1 1 0 0
1 0 1 0
1 0 0 1

ครั้งแรกที่ผมอยากจะอธิบาย (และให้ ShoutOut ไป) @ วิธีที่ฉลาดมาก GalenIvanov =&/:@}.ของการสร้างเมทริกซ์เอกลักษณ์ซึ่งเป็นดังต่อไปนี้

ก่อนอื่นเราตัดหัวเมทริกซ์อินพุต ( }.)

   }. m
1 1 0 0
1 0 1 0
1 0 0 1

จากนั้นเราจะได้รับดัชนีแต่ละแถวจะอยู่ในแถวที่เรียงลำดับโดยใช้/:- เกรดขึ้น

   /: }. m
2 1 0

โปรดทราบว่าดัชนีที่เกิดขึ้นนั้นไม่ซ้ำกัน : รายการไม่มีองค์ประกอบที่ซ้ำกัน (และเพราะเหตุใดมันจึงไม่มีวิธีที่จะวางสององค์ประกอบในตำแหน่งเดียวกันในอาร์เรย์)

ในที่สุดเราใช้ช่อง แต่เป็นประโยชน์=- จัดประเภทเอง Monad นี้จะเปรียบเทียบองค์ประกอบที่ไม่ซ้ำกันกับองค์ประกอบอื่น ๆ ทั้งหมดในอาร์เรย์ โปรดจำไว้ว่าฉันพูดถึงมันเป็นสิ่งสำคัญที่บ่งชี้ผลลัพธ์ที่ไม่ซ้ำกัน? ตั้งแต่=-self-ประเภทไม่เปรียบเทียบในการสั่งซื้อที่องค์ประกอบที่ไม่ซ้ำปรากฏในรายการผลผลิตที่เกิดขึ้นจะเป็นเมทริกซ์เอกลักษณ์สำหรับการป้อนข้อมูลที่ไม่ซ้ำกัน (นี่คือเหตุผลที่=@i.เป็นวิธีที่คุณสามารถทำให้การเมทริกซ์เอกลักษณ์ของความยาวที่กำหนด)

   = /: }. m
1 0 0
0 1 0
0 0 1
   NB. This is what is happening
   (2 = 2 1 0) , (1 = 2 1 0) ,: (0 = 2 1 0)
1 0 0
0 1 0
0 0 1

เมื่อเรามีเมทริกซ์เอกลักษณ์แล้วมันเป็นเรื่องของการเพิ่มแถวของแถวและคอลัมน์ของคอลัมน์ซึ่งทำได้ง่ายมาก (ถ้าให้อะตอม - เช่นองค์ประกอบเดียว - ,ครอบครัวจะทำซ้ำเพื่อเติมเมื่อมีการเพิ่ม) :

   1,. (=&/:@}. m)
1 1 0 0
1 0 1 0
1 0 0 1
   1, (1,. =&/:@}. m)
1 1 1 1
1 1 0 0
1 0 1 0
1 0 0 1

จากนั้นเราก็เปรียบเทียบเมทริกซ์หัวลูกศรที่สร้างขึ้นกับสัญญาณของอินพุตเมทริกซ์

   * m
1 1 1 1
1 1 0 0
1 0 1 0
1 0 0 1
   (* m) -: (1, 1,. =&/:@}. m)
1

2
ไม่*เพียงพอแทน0@<(สำหรับ 17 ไบต์) ลองใช้ดู
Galen Ivanov

1
@ GalenIvanov จับที่ดีฉันคิดอย่างนั้น ขอบคุณ! ถึงเวลาแก้ไขคำอธิบายอีกครั้ง
โคล

1
ฉันคิดว่าฉันพบวิธีใหม่ในการสร้าง matrix matrix: =&/:เมื่อฉันรวมเข้ากับ}.ฉันได้รับ*-:1,1,.=&/:@}.15 ไบต์ลองออนไลน์!
Galen Ivanov

1
@ GalenIvanov วิธีการที่ยอดเยี่ยม (ทั้งการใช้/:เกรดและ}.หัว) ขอบคุณอีกครั้ง! ฉันจะแก้ไขมันค่ะ
โคล

อืมจริงๆแล้วใช้*-:1,1,.=@}.งานได้ดี - ไม่ต้องใช้วิธีการแฟนซีเพื่อค้นหาเมทริกซ์เอกลักษณ์ =คุณสามารถสร้างเมทริกซ์เอกลักษณ์จากตารางเมทริกซ์ตัวเองได้ง่ายๆโดยการ ดังนั้นปล่อยหนึ่งแถวด้วย}.ทำเมทริกซ์เอกลักษณ์ด้วย= เพิ่มแถวและคอลัมน์ด้วย1เป็นต้น
Galen Ivanov

9

ภาษา Wolfram (Mathematica) , 47 ไบต์

Clip@#==Array[If[1<#!=#2>1,0,1]&,{1,1}Tr[1^#]]&

ลองออนไลน์!

คำอธิบาย: Clip@#แทนที่ตัวเลขที่ไม่เป็นศูนย์ทั้งหมดในเมทริกซ์ด้วย 1s จากนั้นเราเปรียบเทียบสิ่งนี้กับอาร์เรย์ที่มีขนาด{1,1}Tr[1^#]= {Length@#, Length@#}กับ 0 ในตำแหน่งi,jเมื่อ1 < i != j > 1และ 1 เป็นอย่างอื่น

(ขึ้นอยู่กับคำตอบของ Uriel อย่างหยาบ)

นี่คือแนวคิดอื่นที่ยาวกว่า 16 ไบต์ - อย่าลังเลที่จะขโมยหากคุณสามารถลงสนาม

Union@@Array[{1,#}~Tuples~2&,Length@#]==Most@Keys@ArrayRules@#&

ลองออนไลน์!


8

APL (Dyalog Classic) , 19 16 15 13 ไบต์

-1 ไบต์ขอบคุณ @ErikTheOutgolfer

( ⎕IO←0)

×≡(∧=⌊)/¨∘⍳∘⍴

ลองออนไลน์!

-2 ไบต์ต้องขอบคุณ @ngn และ @ H.PWiz

อย่างไร?

(อินพุตเมทริกซ์ 2D S )

  • ×≡ตรวจสอบว่าSเป็นบวกเฉพาะใน ...
  • (∧=⌊ ... เส้นทแยงมุมหรือแถวบนสุดและคอลัมน์ซ้าย ...
  • )/¨∘⍳∘⍴... ของเอ

การใช้ประโยชน์ที่ดีของ⍳∘⍴ผลิตภัณฑ์คาร์ทีเซียน
Uriel

×≡(=/∨1∊⊢)¨∘⍳∘⍴
Erik the Outgolfer

1
(=/∨1∊⊢)->(~≠⌊⌊)/
ngn

2
@ngn ดียิ่งขึ้น: (∧=⌊)/แน่นอนว่าทั้งคู่ต้องการ⎕IO←0
H.PWiz

7

PowerShell , 112 108 ไบต์

param($a)$o=+!(0-in$a[0]);1..($x=$a.count-1)|%{$i=$_;0..$x|%{$o*=(!($y=$a[$i][$_]),$y)[!$_-or$_-eq$i]}};!!$o

ลองออนไลน์!

รับอินพุตและปรับเปลี่ยนเป็นอาร์เรย์ของอาร์เรย์เนื่องจาก PowerShell ไม่สนับสนุนเมทริกซ์ (นอกการสนับสนุนการแปลงเมทริกซ์. NET Direct3D ซึ่งเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง)

อัลกอริทึมทั้งหมดขึ้นอยู่กับความจริงที่ว่าตัวเลขที่ไม่ใช่ศูนย์นั้นเป็นจริงและศูนย์นั้นเป็นเท็จใน PowerShell และใช้การคูณเพื่อกำหนดค่าความจริง / เท็จเหล่านั้น

ก่อนอื่นเราจะนำแถวแรก$a[0]และตรวจสอบว่า0เป็น-inอาร์เรย์นั้นหรือไม่เก็บไว้ใน$oตัวแปร utput ของเรา หากมีสิ่งใดในแถวที่เป็นศูนย์แล้ว$oยังเป็นศูนย์มิฉะนั้นมันเป็นหนึ่งทำได้โดยการโยนไป int +อย่างรวดเร็วด้วย

ต่อไปเราวนซ้ำจาก1ไปจนถึง$a.count-1ตั้งค่า$xตามทาง - เราจะวนรอบแต่ละแถวทีละครั้ง

การวนซ้ำแต่ละครั้งที่เราตั้งค่าตัวแปรตัวช่วย$iเพื่อติดตามแถวที่เราอยู่จากนั้นวนซ้ำจาก0ไป$xยังการย้ำแต่ละองค์ประกอบในแถวนี้ ภายในวงด้านในเราจะคูณอีกครั้ง$oคราวนี้โดยเลือกจากการตั้งค่า tuple เป็นโอเปอเรเตอร์เทียม

tuple เป็นเงื่อนไข !$_-or$_-eq$iกล่าวว่า "เมื่อเราอยู่ในคอลัมน์ที่ 0 หรือคอลัมน์ตรงกับแถว (กล่าวคือเส้นทแยงมุมหลัก)" เพื่อเลือกช่วงครึ่งหลังของ tuple เมื่อความจริงหรือครึ่งแรกเมื่อถูกลวง tuple !($y=$a[$i][$_]), $yที่ประกอบด้วย ครึ่งแรกกำหนด$yไว้สำหรับการเล่นครึ่งหลัง แต่อย่างใดเราเลือกองค์ประกอบปัจจุบัน ครึ่งแรกนั้นเป็นการบูลีนที่ถูกปฏิเสธในขณะที่ครึ่งหลังนั้นเป็นเพียงองค์ประกอบ ดังนั้นหากเราไม่ได้อยู่ในคอลัมน์ที่ 0 หรือแนวทแยงมุมหลักเรามั่นใจว่าองค์ประกอบนั้นเป็นศูนย์โดยการใช้บูลีน - ไม่ใช่ของมัน ในทำนองเดียวกันเรามั่นใจว่าคอลัมน์ที่ 0 หรือแนวทแยงมุมหลักนั้นไม่ใช่ศูนย์

ดังนั้นตอนนี้เราได้วนซ้ำทุกองค์ประกอบในเมทริกซ์$oอาจเป็นได้0ว่าองค์ประกอบบางอย่างไม่ถูกต้องหรือจำนวนเต็มไม่ใช่ศูนย์ถ้าเป็นเมทริกซ์หัวลูกศร เราดับเบิลบูลีน - ไม่ว่าจะได้รับอย่างใดอย่างหนึ่งFalseหรือTrueตามลำดับเพื่อให้การส่งออกของเราสอดคล้องและที่เหลืออยู่ในท่อที่มีการพิมพ์โดยปริยาย


+= [int]? นั่นเป็นสิ่งที่ดี
รูต

@root หนึ่งในเคล็ดลับ PowerShell
AdmBorkBork

7

เยลลี่ , 14 12 ไบต์

ŒDµḢ;Ḣ€Ȧ>FẸ$

-2 ไบต์จาก Pietu1998

ลองออนไลน์!

คำอธิบาย

[[9,7,1],
 [7,1,0],
 [7,0,1]]

ใช้เมทริกซ์ด้านบนเป็นตัวอย่างอินพุต

ŒDµḢ;Ḣ€Ȧ>FẸ$
ŒD              Diagonals → [[9, 1, 1], [7, 0], [1], [7], [7, 0]]
  µ             New monadic link
   Ḣ            Head → [9, 1, 1]. Alters diagonals list.
    ;Ḣ€         Append with the head of each of the other diagonals → [9, 1, 1, 7, 1, 7, 7]
       Ȧ        Logical all → 1
         FẸ$    Flatten what's left in diagonals then take logical any → [[0],[],[],[0]] → [0,0] → 0
        >       Matrix is an arrowhead iff result of Ȧ > result of Ẹ

@ wizzwizz4 ฉันไม่แน่ใจว่าคุณหมายถึงอะไร
dylnan

@ wizzwizz4 รหัสนี้แสดงให้เห็นว่าองค์ประกอบของเมทริกซ์จะถูกจัดกลุ่มใหม่ มันใช้เส้นทแยงมุมด้านบนซ้ายและหลัก นี่คือสิ่งที่คุณหมายถึง?
dylnan

ฉันหมายถึงการแสดงภาพที่แท้จริงของรหัสที่คุณให้ไว้ในคำอธิบายของคุณ ฉันพยายามจะตลก แต่เห็นได้ชัดว่าไม่ได้ผล ฉันจะล้างความคิดเห็นเหล่านี้
wizzwizz4

7

APL (Dyalog) , 21 18 17 ไบต์

×≡11,(=/¨∘⍳1-⍨⍴)

ลองออนไลน์!

อย่างไร?

อันนี้ไปทางอื่น -

=/¨∘⍳ - สร้างเมทริกซ์เอกลักษณ์

1-⍨⍴ - สำหรับ n - 1

1⍪1, - เติมคอลัมน์และแถวละ 1s

- เปรียบเทียบกับ

× - เมทริกซ์ดั้งเดิมหลังจากที่มันหายไปการเข้าสู่ระบบองค์ประกอบที่ชาญฉลาด


6

MATL , 15 ไบต์

gtZyXy,!llY(]X=

อินพุตเป็นเมทริกซ์ (ใช้;เป็นตัวคั่นแถว) เอาท์พุท1สำหรับหัวลูกศร0มิฉะนั้น

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

g        % Implicit input. Convert to logical values (nonzero becomes true and
         % zero becomes false)
t        % Duplicate
Zy       % Size
Xy       % Identity matrix of that size
,        % Do twice
  !      %   Transpose
  ll     %   Push 1 twice
  Y(     %   Write 1 at all entries of row 1
]        % End
X=       % Are the two matrices (input and constructed) equal? Implicit display

1
เมทริกซ์ Indeityคืออะไร
Erik the Outgolfer

13
@EriktheOutgolfer เห็นได้ชัดว่าเมทริกซ์ที่มีเทพ
โคล

5
@cole อาจเกี่ยวข้องกับเมทริกซ์เหนือสนาม Elysian
jld

5

C (gcc) ,80 75 ไบต์

i;f(A,n)int*A;{for(i=0;i<n*n;i++)n=A[i]>0^(i<n||i%n<1||i/n==i%n)?0:n;n=!n;}

ลองออนไลน์!

บันทึก 5 ไบต์ด้วย scottinet!

นำรหัสทดสอบกลับมาใช้ซ้ำจากคำตอบนี้

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

การเข้ารหัสข้อมูลของอาร์เรย์ 2 มิติในมิติเดียวนำไปสู่ชุดเงื่อนไขที่ค่อนข้างง่าย ถ้าเราปล่อยให้iดัชนีของเราเป็น 0 ลงในnอาร์เรย์มิติให้i<nอธิบายแถวแรก ในทำนองเดียวกันi%n==0อธิบายคอลัมน์แรกและi/n==i%nอธิบายแนวทแยงมุม

เคล็ดลับที่ดีที่สุดที่ฉันพบในการจัดการผลตอบแทนคือการตั้งค่ามิติเป็นศูนย์เมื่อพบข้อผิดพลาด สิ่งนี้ทำให้ลูปสิ้นสุดในทันทีจากนั้นส่งคืนการปฏิเสธเชิงตรรกะของมิติจะให้หนึ่งในสองค่าที่แตกต่าง สกอตติเนทพบวิธีที่จะทำให้ GCC กลับมาอย่างดียิ่งขึ้น


-2 ไบต์กับการเล่นกอล์ฟเพิ่มเติม
ติเน็ต

และเพิ่มเติม-4 ไบต์โดยใช้วิธีคืนค่า
gcc ที่ไม่เหมาะสม

@scottinet ขอบคุณ! ฉันมีปัญหาในการหาค่าที่ฉันควรตั้งค่าให้ใช้เคล็ดลับนั้น
FryAmTheEggman

จริงๆแล้วฉันไม่เชื่อว่างานกอล์ฟครั้งแรกของคุณจะทำงานได้ มันผ่านกรณีทดสอบเพราะไม่เคยมีศูนย์ในตำแหน่งแรก เพิ่มเคสและหวนคืนการเปลี่ยนแปลงนั้น
FryAmTheEggman

int test0 [] = {0, 1, 1, 1, 1, 0, 1, 0, 1}; printf ("% d \ n", f (ทดสอบ 0, 3)); ต้องส่งคืน 0 ไม่ใช่ 1 (ถ้าเป็น 3x3 matrx 011 110 101) เนื่องจาก [0,0] เป็น 0
RosLuP

5

Python 2 , 75 ไบต์

lambda m,E=enumerate:all((x[j]>0)-(i>0<j!=i)for i,x in E(m)for j,y in E(m))

ลองออนไลน์!

Python 2 , 85 ไบต์

รับอาร์เรย์เป็นเมทริกซ์ 1D:

def f(m):s=len(m)**.5;print all((v<1)^(0in(p>s,p%s,p//s-p%s))for p,v in enumerate(m))

ลองออนไลน์!


คุณหมายถึง "1D matrix" ในคำตอบสูงสุด
NikoNyrh

@NikoNyrh แก้ไขแล้ว
FlipTack

5

R , 78 70 69 68 54 53 ไบต์

function(m){d=diag(nrow(m))
d[1,]=d[,1]=1
all(d!=!m)}

ลองออนไลน์!

แจง คำตอบที่หลุยส์ Mendo ของเป็นมากน้อยกว่าวิธีการในอดีตของฉัน

ขอบคุณ rturnbull ที่ชี้ให้เห็นข้อผิดพลาดและเล่นกอล์ฟแบบไบท์!

คำตอบเก่า 68 ไบต์:

function(m,i=which(!m,T))all(i[,1]-i[,2],i!=1,sum(m>0)==3*nrow(m)-2)

ลองออนไลน์!

คำตอบของ duckmayrทดสอบว่ารายการทั้งหมดในแนวทแยงมุมหลักและแถวแรก / คอลัมน์ (m[i] ) ไม่ใช่ศูนย์และส่วนที่เหลือ ( m[-i]) เป็นศูนย์โดยใช้เลขคณิตที่ดีเพื่อให้ได้เส้นทแยงมุมและแถวแรก

อย่างไรก็ตามคำตอบนี้การทดสอบเพื่อให้แน่ใจว่า (1) รายการศูนย์ไม่ได้อยู่ในแนวทแยงมุมหลักหรือแถวแรก / คอลัมน์แรกและ (2) ที่มีอยู่ให้รับn x nเมทริกซ์3*n-2รายการที่ไม่ใช่ศูนย์

whichส่งคืนดัชนีที่อินพุตอยู่TRUEและarr.ind=Tส่งคืนอาร์เรย์ของดัชนีสำหรับแต่ละมิติอาร์เรย์ในกรณีนี้คือสอง

ดังนั้นเมื่อany(i[,1]==i[,2])มีศูนย์อยู่บนเส้นทแยงมุมและเมื่อใดที่any(i==1)มีศูนย์อยู่ในแถวแรกหรือคอลัมน์แรก

ในที่สุดการแสดงทางคณิตศาสตร์น้อยที่จำนวนของรายการภัณฑ์จะต้อง3*n-2, nจากคอลัมน์แรกn-1จากเส้นทแยงมุมและn-1จากแถวแรก


สิ่งนี้ดูเหมือนจะไม่ทำงานสำหรับการฝึกอบรมของลูกศรที่ค่าไม่ได้ 1 คุณหมายถึงall(!m==!d)ในบรรทัดสุดท้ายหรือไม่?
rturnbull

@rturnbull ah! ขอขอบคุณ. ไวยากรณ์ของโอเปอเรเตอร์ R นั้นแปลกมาก ฉันหมายจริงๆ(!!m)==dแต่มีความสำคัญต่ำกว่า! ==ฉันคิดว่าd==!!mควรทำเคล็ดลับแม้ว่า
Giuseppe

ดูเหมือนว่าd!=!mจะทำเช่นเดียวกันสำหรับน้อยหนึ่งไบต์ คุณสามารถบันทึกไบต์อื่นโดยใช้pryr::fไวยากรณ์มากกว่าfunctionเกินไป
rturnbull

ผมพยายามที่จะเล่นกอล์ฟ แต่ที่ดีที่สุดที่ฉันสามารถทำยังคงเป็น 53
JayCe

@JayCe nah ทั้งคำตอบของคุณและของฉันสามารถเล่นกอล์ฟได้ถึง 52 และฉันไม่แน่ใจว่าทำไมมันไม่เคยเกิดขึ้นกับฉันมาก่อน ... ฉันโพสต์ของคุณแยกต่างหาก วิธีการหนึ่งบรรทัดค่อนข้างดีและฉันสงสัยว่าอาจมีห้องพักสำหรับการปรับปรุงในของคุณอีกมากมาย
Giuseppe


3

Haskell , 62 ไบต์

-3 ไบต์ขอบคุณ Mr. Xcoder -13 ไบต์ขอบคุณ user28667 -5 ไบต์ขอบคุณ Zgarb

z=zip[0..]
f m=and[(i==j||i*j<1)==(a>0)|(i,r)<-z m,(j,a)<-z r]

ลองออนไลน์!


1
80 ไบต์ .... คุณเกือบลืมไป<1แล้วและกลอุบายต่าง ๆ เหรอ? : P
Mr. Xcoder

1
(x==y||x==0||y==0)==(m!!y!!x/=0)ควรสั้นกว่า
user28667

1
62 ไบต์x*y<1โดยซิปแทนการจัดทำดัชนีและทำ
Zgarb


3

Python 3 , 72 71 ไบต์

lambda x,e=enumerate:any(0**n^(0<i!=j>0)for i,r in e(x)for j,n in e(r))

ขอบคุณ @xnor สำหรับการเล่นกอล์ฟ 1 ไบต์!

ลองออนไลน์!


ฉันคิดว่า0<i!=j>0ประหยัดไบต์
xnor

@xnor ขอบคุณ! ฉันไม่คิดว่าฉันเคยอีกครั้งใช้ตัวเลขในห่วงโซ่การเปรียบเทียบ ...
เดนนิส

2

Pyth, 22 21 ไบต์

นี่ไม่ใช่ภาษาสำหรับการจัดการเมทริกซ์อย่างแน่นอน

.As.e+!MWk.Db,0k,@bkh

สำหรับแต่ละแถวbและดัชนีkในเมทริกซ์ ( .e) คว้าแรกและkรายการ TH (ด้านซ้ายและเส้นทแยงมุม) ด้วย,@bkhและ ( +) ทุกรายการอื่น ๆ .Db,0kที่มี หากkไม่ใช่ 0 ให้สอดคล้องกับแถวแรก ( Wk) แสดงว่า!ไม่ใช่Mทุกรายการ เมื่อเลือกทั้งหมดแล้วให้แน่ใจว่าทั้งหมดนั้นเป็นจริง ( .As) หากมี 0 ที่ไม่ควรมีตำแหน่งที่เกี่ยวข้องจะถูกจับตามที่เป็นอยู่และเลอะและถ้ามีศูนย์ที่ไม่ควรมีมันจะได้รับการ!ประกาศเป็น 0 ซึ่งเป็น ยังเป็นเท็จ

ชุดทดสอบ

-1 ไบต์สำหรับการสลับคำสั่งซื้อ


1
ว้าวโซลูชันนี้ดีมากเนื่องจาก Pyth ค่อนข้างขนานกับการจัดการเมทริกซ์ อาจเป็นไปได้ว่าจะมีการต่อสู้แบบ Pyth ต่อไปในวันพรุ่งนี้: P
Mr. Xcoder

คุณสามารถย่อให้สั้นลงได้โดยใช้ทั้ง@VQUQหรือ.DVQUQ สำหรับเส้นทแยงมุม / การลบเส้นทแยงมุม แต่นั่นจะต้องใช้วิธีการที่แตกต่างอย่างสิ้นเชิง ไม่แน่ใจว่า ... (BTW ลืมอัปเดตลิงก์หรือไม่)
Mr. Xcoder

@ Mr.Xcoder คงที่ลิงก์ฉันจะพยายามยุ่งกับกลยุทธ์อื่น ๆ ในวันพรุ่งนี้
Steven H.

ฉันมาถึงทางเลือกที่ 21 ไบต์โดยใช้VQUQความคิดของฉัน: >.A++hCQhQ.(VQUQsstCt. ดูเหมือนว่าจะมีความซ้ำซ้อนสูง คุณอาจสามารถปรับแต่งเพื่อบันทึกสองสามไบต์
Mr. Xcoder

2

Pip , 31 23 22 ไบต์

{0<_!=B>0MC#a==0=_MMa}

นี่คือฟังก์ชั่นที่รับรายการตัวเลขซ้อนกันแบบสองมิติ ลองออนไลน์!

คำอธิบาย

มีการเปรียบเทียบมากมายเกิดขึ้นที่นี่ สิ่งแรกที่ต้องรู้คือผู้ประกอบการเปรียบเทียบใน Pip สามารถถูกล่ามโซ่ไว้ด้วยกันเช่นเดียวกับใน Python: 5>4>3คือ5>4 and 4>3(จริง) ไม่ใช่(5>4)>3(เท็จ) อย่างที่สองก็คือสิ่งนี้ไม่ได้นำไปใช้กับ==ผู้ประกอบการ "เท่ากับ" ข้อแตกต่าง: การเปรียบเทียบปกติมีความสำคัญสูงกว่าตัวดำเนินการการแมปMCและMMสามารถนำมาใช้ในการแสดงออกแลมบ์ดาในขณะที่==มีความสำคัญลดลงและไม่สามารถ

{                    }  Define a function with argument a:
 0<_!=B>0MC#a            Generate a matrix (as nested lists) that has 0 on the first row,
                          first column, and main diagonal, and 1 elsewhere (see below for
                          details)
               0=_MMa    Map the function 0=_ to the elements of the elements of a,
                          generating a matrix that is 0 where a is nonzero and vice versa
             ==          Test if the two matrices are equal, returning 0 or 1 accordingly

ในการสร้างเมทริกซ์แรกเราใช้ MC "map-coords" โอเปอเรเตอร์นี้ใช้ตัวเลขสร้างตารางพิกัดสี่เหลี่ยมจัตุรัสขนาดนั้นและแมปฟังก์ชันกับแต่ละคู่ (x, y) พิกัดคู่กลับรายการของผลลัพธ์ ยกตัวอย่างเช่นจะให้ผล{a+b} MC 3[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]

ที่นี่ขนาดของกริดคือ#aขนาดของอาร์กิวเมนต์ดั้งเดิมของเรา ฟังก์ชันคือ0<_!=B>0ซึ่งเป็นวิธีการเขียนที่สั้นกว่า{0 < a != b > 0}:

{        }  Function; a and b are the arguments (in our case, row and column)
 0<a        Return 1 (truthy) if a is greater than 0
    !=b     and a is not equal to b
       >0   and b is greater than 0

สิ่งนี้จะคืนค่า 0 สำหรับแถว / คอลัมน์แรกและแนวทแยงมุมหลักและ 1 ที่อื่น


2

Husk , 12 11 bytes

S≡ȯ´Ṫ§^*=ŀL

ลองออนไลน์!

คำอธิบาย

S≡ȯ´Ṫ§^*=ŀL  Input is a k×k array A.
          L  The length, k.
         ŀ   The range [0,1..k-1].
  ȯ´Ṫ        Outer product with itself by this function:
              Arguments are two numbers x and y.
        =     Equality of x and y
     §^       to the power of
       *      x times y.
S≡           Does the result have the same shape and distribution of truthy values as A?

แนวคิดคือ Husk นิยาม 0 ถึงพลังของ 0 เป็น 1 ดังนั้นผลิตภัณฑ์ชั้นนอกมี 1s ในแถวและคอลัมน์แรก นอกจากนี้ 1 ต่อกำลังของจำนวนใด ๆ คือ 1 ดังนั้นผลิตภัณฑ์ชั้นนอกจึงมี 1s เป็นแนวทแยง รายการอื่น ๆ ที่มี 0 ถึงพลังของจำนวนบวกบางส่วนซึ่งเป็น 0. นี้จะช่วยให้หัวลูกศรเมทริกซ์ไบนารีซึ่งเราเปรียบเทียบกับการป้อนข้อมูลด้วย



2

Clojure, 128 95 92 85 ไบต์

#(every? neg?(for[R[(range(count %))]i R j R]((if((set[i(- i j)j])0)- dec)((% i)j))))

มันเป็นเรื่องที่น่าตื่นเต้นเสมอที่จะเห็นวงเล็บเปิดสองอันติดต่อกัน

รุ่นเดิม:

#(and(apply =(map assoc(for[i(rest %)](subvec i 1))(range)(repeat 0)))(every? pos?(concat(map nth %(range))(% 0)(map first %))))

ส่วนแรกทำงานโดยใช้assocองค์ประกอบแนวทแยงของเมทริกซ์ย่อยเป็นศูนย์และตรวจสอบว่าแถวทั้งหมดเท่ากัน :) ฉันใช้กลอุบายที่คล้ายกันในวิธีการของจาโคเบียนวิธีการจาโคเบียน

ส่วนหลังconcatทำให้เกิดเส้นทแยงมุม + แถวแรกและคอลัมน์และตรวจสอบว่าเป็นบวก


2

Javascript (ES6), 58 ไบต์

โซลูชันของฉันสำหรับ Javascript:

m=>m.some((r,i)=>m[0][i]*r[0]*r[i]==0|r.filter(c=>i*c)[2])

ไม่ฉลาดเท่าคำตอบของเฮอร์แมนแต่ฉันรู้สึกเหมือนฉันควรโพสต์ไว้ที่นี่เช่นกัน


3
ยินดีต้อนรับสู่ PPCG!
Steadybox

2

Clojure, 212 206 188 ไบต์

-6 ไบต์โดยการลบช่องว่างที่ไม่ได้รับและการลัดrangeออก ฉันอาจจะต้องปล่อยให้เรื่องนี้นั่งเพื่อที่ฉันจะได้คิดวิธีที่ดีกว่า

-18 ไบต์ขอบคุณที่ @NikoNyrh mapและทางลัดสำหรับการสร้าง

(fn[m](let[r range a map z zero?](and(every? #(not(z %))(concat(m 0)(rest(a #(% 0)m))(a get m(r))))(every? z(apply concat(into(a #(take(dec %)%2)(r)(a rest m))(a take-last(r)(reverse(rest m)))))))))

น่ากลัวเพียงน่ากลัว ฉันไม่รู้ว่าทำไมฉันไม่สามารถคาดศีรษะแก้ปัญหาด้วยเหตุผลได้

ใช้เวกเตอร์ที่ซ้อนกันเป็นอินพุต

(defn arrowhead? [matrix]
  (let [; Get the 0th cell of the 0th row, then the 1st cell of the 1st row...
        main-diagonal (map get matrix (range))

        ; Get the 0th cell of each row
        first-col (rest (map #(% 0) matrix))
        arrowhead (concat (matrix 0) first-col main-diagonal)

        ;
        right-rest (map take-last (range) (reverse (rest matrix)))
        left-rest (map #(take (dec %) %2) (range) (map rest matrix))
        rest-matrix (apply concat (into left-rest right-rest))]

    ; And check them
    (and (every? pos? %) arrowhead
         (every? zero? rest-matrix))))

ฉันลองเขียนใหม่ตั้งแต่ต้นโดยใช้วิธีที่ต่างกันและมันก็จะนานขึ้น แทนที่จะแกะสลักส่วนที่เหลือของเมทริกซ์ด้วยตนเองฉันจึงตัดสินใจลองสร้างพิกัดทั้งหมดในเมทริกซ์สร้างพิกัดของหัวลูกศรจากนั้นใช้clojure.set/differenceเพื่อรับเซลล์ที่ไม่ใช่ลูกศร น่าเสียดายที่การโทรหาบิวด์อินนั้นมีค่าใช้จ่ายสูง:

223 ไบต์

(fn[m](let[l(range(count m))g #(get-in m(reverse %))e every? a(for[y l x l][x y])k #(map % l)r(concat(k #(do[% %]))(k #(do[0%]))(k #(do[% 0])))](and(e #(zero?(g %))(clojure.set/difference(set a)(set r)))(e #(pos?(g %)))r)))

(defn arrowhead? [matrix]
  (let [length-range (range (count matrix))
        get-cell #(get-in matrix (reverse %))
        all-coords (for [y length-range
                         x length-range]
                     [x y])

        k #(map % length-range)

        diag (k #(do[% %]))
        top-side (k #(do [0 %]))
        left-side (k #(do [% 0]))
        arrowhead (concat diag top-side left-side)

                   ; 22 bytes! Ouch
        rest-cells (clojure.set/difference (set all-coords) (set arrowhead))]

    (and (every? #(zero? (get-cell %)) rest-cells)
         (every? #(pos? (get-cell %)) arrowhead))))

มีห้องพักสำหรับการปรับปรุงค่อนข้างมากตัวอย่างเช่น#(drop 1 %)เดียวกับrestและ#(not(zero? %))เหมือนกับpos?(เนื่องจากเรามีตัวเลขที่ไม่เป็นลบ) คุณอาจต้องการดูคำตอบแบบ 128 ไบต์ของฉันซึ่งมีวิธีการแบบเดียวกันนี้ หลังจากการใช้งานที่ฉันรู้ว่ามันสั้นมากที่จะจัดการกับการเข้าถึงฐานดัชนีใน for-loop
NikoNyrh

@NikoNyrh Ya ฉันไม่ได้อยู่ในร่องที่ดีมากในวันนั้น ฉันไม่รู้ว่าฉันลืมไปrestได้อย่างไร ฉันน่าจะลองเรื่องนี้และลองใหม่อีกครั้ง
Carcigenicate

2

Stax , 11 ไบต์CP437

ä¢⌠┐xⁿtH↔BU

ลองออนไลน์!

เวอร์ชันที่คลายการบีบอัดมี 13 ไบต์:

B|AsF:10i^\=*

ในที่สุดผูก Husk และแพ้โดย Jelly เพียงหนึ่งไบต์ ...

คำอธิบาย

B                Push tail (all except 1st row) of the input array, then push the head (1st row)
 |A              All elements in the head are truthy
                 This will be used as an accumulator
   sF            For each element in the tail, execute the rest of the program
     :1          All truthy indices
       0i^\      Expected truthy indices (0 and the current row number)
           =     The truthy indices are as expected
            *    Perform logical "and" with the accumulator
                 Implicit output of the final accumulator

1

R , 81 79 ไบต์

function(x){n=nrow(x);i=c(seq(1,n^2,n+1),1:n,seq(1,n^2,n));all(x[i]>0,x[-i]<1)}

-2 ไบต์ขอบคุณ Mr. Xcoder

ลองออนไลน์!


79 ไบต์
Mr. Xcoder

ดีมาก; ฉันจัดการเพื่อค้นหา78 byterที่ทำสิ่งที่แปลกมาก แต่ฉันยังพบ76 byte golf ของคุณ
Giuseppe

69 ไบต์แต่ฉันปรับปรุงของฉันเป็น 68!
Giuseppe


1

PowerShell , 186 ไบต์

$a=$($args);if($a[0]-contains0){0;exit};0..($a.Length-1)|%{if($a[$_][0]-eq0-or$a[$_][$_]-eq0){0;exit};$r=$a[$_];$d=$_;if($_-ne0){1..($r.Length-1)|%{if($r[$_]-ne0-and$_-ne$d){0;exit}}}};1

ลองออนไลน์!


2
Some golfs -- use param($a) to take input, the -contains can be swapped for an -in and all of the -eq0 can be swapped for !. Finally, you can loop from 1 up to $a.length and get rid of the if($_-ne0) in the loop body.
AdmBorkBork




1

K (oK), 27 30 bytes

Solution:

x~a*x|a:a|+(a:1,(#1_x)#0)|=#x:

Try it online!

Explanation:

I must be doing something dumb as the APL solutions are less than half the byte count...

24 bytes spent creating the arrowhead. or together the following three matrices:

/ assume 4x4 matrix
=#x
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

+(a:1,(#1_x)#0)
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0

a
1 1 1 1
0 0 0 0
0 0 0 0
0 0 0 0

Full breakdown:

x~a*x|a:a|+(a:1,(#1_x)#0)|=#x: / the solution
                            x: / save input as x
                           #   / count length
                          =    / identity matrix
                         |     / or with
           (            )      / do this together
                      #0       / take from 0
                ( 1_x)         / drop first of x
                 #             / count
              1,               / prepend 1
            a:                 / save as a
          +                    / flip rows/cols
         |                     / or with
        a                      / a
      a:                       / save as a
     |                         / or with
    x                          / x
  a*                           / multiply by arrowhead
x~                             / matches input?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.