แปดทั้งหมดเดียว


24

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

ตัวอย่างเช่นกำหนดอินพุต

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

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

* 4 5 6 5
9 3 8 4 *
0 8 6 1 5
6 7 9 * 2
8 8 7 4 2

กฎเพิ่มเติม

  • คุณสามารถเลือกใช้ตัวเลขสองตัวเพื่อกำหนดขนาดของอาเรย์เป็นอินพุตเพิ่มเติม

  • การป้อนข้อมูลสามารถดำเนินการโดยวิธีการที่เหมาะสมใดรูปแบบมีความยืดหยุ่นตามปกติ ตัวอย่างเช่นมันอาจเป็นอาเรย์ตัวละคร 2D หรือรายการของตัวเลขหรือรายชื่อแบน

  • โปรแกรมหรือฟังก์ชั่นที่ได้รับอนุญาตในการเขียนโปรแกรมภาษา ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

  1. การป้อนข้อมูล:

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

    เอาท์พุท: 3

  2. อินพุต

    8 8
    2 3
    

    เอาท์พุท: 0

  3. การป้อนข้อมูล:

    5 3 4
    2 5 2
    

    เอาท์พุท: 0

  4. การป้อนข้อมูล:

    5 8 3 8
    

    เอาท์พุท: 2

  5. การป้อนข้อมูล:

    8
    0
    8
    

    ผลลัพธ์: 2.

  6. การป้อนข้อมูล:

    4 2 8 5
    2 6 1 8
    8 5 5 8
    

    เอาท์พุท: 1

  7. การป้อนข้อมูล:

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

    3เอาท์พุต

  8. การป้อนข้อมูล:

    8
    

    เอาท์พุท: 1

  9. การป้อนข้อมูล:

    8 5 8 1 6 8 7 7
    9 9 2 8 2 7 8 3
    2 8 4 9 7 3 2 7
    9 2 9 7 1 9 5 6
    6 9 8 7 3 1 5 2
    1 9 9 7 1 8 8 2
    3 5 6 8 1 4 7 5
    

    ผลลัพธ์: 4.

  10. การป้อนข้อมูล:

    8 1 8
    2 5 7
    8 0 1
    

    ผลลัพธ์: 3.

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

[8 4 5 6 5; 9 3 8 4 8; 0 8 6 1 5; 6 7 9 8 2; 8 8 7 4 2]
[8 8; 2 3]
[5 3 4; 2 5 2]
[5 8 3 8]
[8; 0; 8]
[4 2 8 5; 2 6 1 8; 8 5 5 8]
[4 5 4 3 8 1 8 2; 8 2 7 7 8 3 9 3; 9 8 7 8 5 4 2 8; 4 5 0 2 1 8 6 9; 1 5 4 3 4 5 6 1]
[8]
[8 5 8 1 6 8 7 7; 9 9 2 8 2 7 8 3; 2 8 4 9 7 3 2 7; 9 2 9 7 1 9 5 6; 6 9 8 7 3 1 5 2; 1 9 9 7 1 8 8 2; 3 5 6 8 1 4 7 5]
[8 1 8; 2 5 7; 8 0 1]

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

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

ขาออก:

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

17
หากคุณต้องการมันแล้วคุณควรจะได้ใส่ลงคะแนนเสียงในนั้น
หลุยส์ Mendo

เมื่อฉันอ่าน "เซลล์ที่มีค่าเท่ากับ 8" สักครู่ฉันคิดว่าคุณหมายความว่าเซลล์อาจใหญ่กว่า 1x1 chuck (NxN) ของกริด น่าจะใช้ถ้อยคำใหม่ที่ "เซลล์ที่ 8" เพื่อชี้แจงคณิตศาสตร์ไม่จำเป็นต้อง = P
Tezra

@Tezra แก้ไขแล้ว ฉันพบว่าถ้อยคำใหม่ดูเป็นธรรมชาติน้อยลง แต่ฉันไม่ใช่เจ้าของภาษาดังนั้นฉันจะไว้วางใจเกณฑ์ของคุณ
Luis Mendo

คำตอบ:


2

MATL , 21 17 10 ไบต์

8=t3Y6Z+>z

ลองออนไลน์!

ขอบคุณ Luis Mendo สำหรับความช่วยเหลือในการแชท

คำอธิบาย:

	#implicit input, m
8=	#equal to 8? matrix of 1 where m is 8, 0 otherwise
t	#duplicate
3Y6	#push [1 1 1; 1 0 1; 1 1 1], "neighbor cells" for convolution
Z+	#2D convolution; each element is replaced by the number of neighbors that are 8
>	#elementwise greater than -- matrix of 1s where an 8 is single, 0s otherwise
z	#number of nonzero elements -- number of single eights
	#implicit output

คุณสามารถบันทึกได้ไม่กี่ไบต์โดยใช้การสนทนา (2D-) หากคุณเป็น famiiar ด้วยแนวคิด
Luis Mendo

1
@ LuisMendo 2D convolution เป็นหนึ่งในสิ่งที่ฉันไม่เข้าใจใน 1D convolution เช่นกันดังนั้นฉันจึงไม่มีความหวัง ... เสียงเหมือนโอกาสที่จะได้เรียนรู้ทั้งสองอย่าง!
Giuseppe

1
หากคุณต้องการความช่วยเหลือโปรดแจ้งให้เราทราบในห้องแชท Convolution เป็นการดำเนินการที่มีประโยชน์มาก หากคุณต้องการเรียนรู้การโน้มน้าวเริ่มต้นด้วย 1D การวางทั่วไปเป็น 2D ทันที
Luis Mendo

9

R , 117 63 59 ไบต์

function(m)sum(colSums(as.matrix(dist(which(m==8,T)))<2)<2)

ลองออนไลน์!

distคำนวณระยะทาง (ค่าเริ่มต้นคือ Euclidean) ระหว่างแถวของเมทริกซ์ whichด้วยอาร์กิวเมนต์ที่สองTRUEส่งกลับพิกัดที่เพรดิเคตเป็นจริง

พิกัดเป็นเพื่อนบ้านหากระยะห่างระหว่างพวกเขาเป็นไม่เกินรากที่สองของ 2 แต่ภายใน<2ก็เพียงพอที่ดีเพราะระยะทางที่เป็นไปได้กระโดดจากROsqrt(2)2


มันเป็นความคลางแคลงใจที่เป็นตัวเลขไม่อนุญาตให้colSums()^2<=2ทำงานได้
จูเซปเป้

@Giuseppe แน่นอนว่ามีเพียงระยะทางที่เป็นไปได้และsqrt(2)กระโดดไป2(เช่นsort(c(dist(expand.grid(1:6,1:6))), decreasing = TRUE))) ดังนั้นเราจึงฉลาดเกินไป
ngm

7

APL (Dyalog Classic) , 29 28 25 ไบต์

≢∘⍸16=2⊥¨3,⌿3,/8=(⍉0,⌽)⍣4

ลองออนไลน์!


หมายเหตุ: ไม่จำเป็นต้องมีจุดกำเนิดดัชนี 0
Zacharý

@ Zacharýฉันมักจะใช้เป็นค่าเริ่มต้นเพื่อหลีกเลี่ยงความประหลาดใจ
ngn

อาเหมือนกับคนอื่น ๆ ด้วย1(ยกเว้นไม่ได้ตั้งค่าไว้อย่างชัดเจน) นั่นทำให้รู้สึก
Zacharý

แปลกใจที่สิ่งนี้ไม่ได้ใช้ลายฉลุ มีบางอย่างที่ทำให้ลายฉลุไม่สะดวกที่นี่หรือไม่?
lirtosiast

@lirtosiast อีกต่อไป :)
ngn

5

เจลลี่ , 18 15 ไบต์

8=µ+Ż+ḊZµ⁺ỊṖḋµS

ลองออนไลน์!

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

8=µ+Ż+ḊZµ⁺ỊṖḋµS    Main link (monad). Input: digit matrix
8=              1) Convert elements by `x == 8`
  µ             2) New chain:
   +Ż+Ḋ              x + [0,*x] + x[1:] (missing elements are considered 0)
                     Effectively, vertical convolution with [1,1,1]
       Z             Transpose
        µ⁺      3) Start new chain, apply 2) again
          ỊṖ       Convert elements by `|x| <= 1` and remove last row
            ḋ      Row-wise dot product with result of 1)
             µS 4) Sum

โซลูชันก่อนหน้า 18 ไบต์

æc7B¤ZḊṖ
8=µÇÇỊḋµS

ลองออนไลน์!

ต้องการแบ่งปันวิธีการอื่นถึงแม้ว่านี่จะเป็น 1 ไบต์นานกว่าโซลูชันของ Jonathan Allanวิธีการแก้ปัญหาของโจนาธานอัลลัน

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

æc7B¤ZḊṖ    Auxiliary link (monad). Input: integer matrix
æc7B¤       Convolution with [1,1,1] on each row
     ZḊṖ    Zip (transpose), remove first and last elements

8=µÇÇỊḋµS    Main link (monad). Input: digit matrix
8=           Convert 8 to 1, anything else to 0 (*A)
  怀        Apply aux.link twice (effective convolution with [[1,1,1]]*3)
     Ịḋ      Convert to |x|<=1, then row-wise dot product with A
       µS    Sum the result


4

J , 43, 40 37 ไบต์

-3 ไบต์ขอบคุณ Bubbler

1#.1#.3 3(16=8#.@:=,);._3(0|:@,|.)^:4

ลองออนไลน์!

คำอธิบาย:

ส่วนแรกของอัลกอริทึมทำให้มั่นใจได้ว่าเราสามารถใช้หน้าต่างแบบเลื่อน 3x3 กับอินพุตของเขา นี่คือความสำเร็จโดยการเตรียมแถวของศูนย์และการหมุน 90 องศาทำซ้ำ 4 ครั้ง

1#.1#.3 3(16=8#.@:=,);._3(0|:@,|.)^:4
                         (       )^:4 - repeat 4 times
                          0|:@,|.     - reverse, prepend wit a row of 0 and transpose
                     ;._3             - cut the input (already outlined with zeroes)
      3 3                             - into matrices with size 3x3
         (          )                 - and for each matrix do
                   ,                  - ravel (flatten)
             8    =                   - check if each item equals 8
              #.@:                    - and convert the list of 1s and 0s to a decimal
          16=                         - is equal to 16?
   1#.                                - add (the result has the shape of the input)
1#.                                   - add again

1
37 ไบต์ใช้@:|.และการเคลื่อนย้าย โปรดทราบว่า@แทนที่@:ไม่ทำงาน
Bubbler

@Bubbler ขอบคุณ!
Galen Ivanov

นี่เป็นสิ่งที่ดี อาจเพิ่มมูลค่าอย่างน้อยคำอธิบายระดับสูงของวิธีการทำงานถ้าไม่สลายรหัส ฉันใช้เวลา 10m หรือมากกว่านั้นในการคิดออก นอกจากนี้ยังเป็นที่น่าสนใจว่าเวอร์ชัน APL สั้นลงเท่าใด (ซึ่งใช้วิธีการเดียวกัน) ดูเหมือนว่าส่วนใหญ่เป็นผลมาจาก digraphs แทนที่จะเป็นสัญลักษณ์รูปถ่านเดียว ...
Jonah

@Jonah ฉันจะเพิ่มคำอธิบาย สำหรับการเปรียบเทียบกับ APL คุณสามารถดูการแก้ไขของngnโดยเฉพาะรุ่น 28 byte
Galen Ivanov

1
@Jonah เพิ่มคำอธิบาย
Galen Ivanov

3

เรติน่า 0.8.2 , 84 ไบต์

.+
_$&_
m`(?<!(?(1).)^(?<-1>.)*.?.?8.*¶(.)*.|8)8(?!8|.(.)*¶.*8.?.?(?<-2>.)*$(?(2).))

ลองออนไลน์! คำอธิบาย:

.+
_$&_

ตัดแต่ละบรรทัดด้วย8อักขระที่ไม่ใช่อักขระเพื่อให้ทุก8อักขระมีอักขระอย่างน้อยหนึ่งตัวในแต่ละด้าน

m`

นี่คือขั้นตอนสุดท้ายดังนั้นการนับการแข่งขันจึงเป็นนัย โมดิmฟายเออร์ทำให้ตัวอักษร^และ$ตรงกับจุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัดใด ๆ

(?<!...|8)

อย่าจับคู่อักขระโดยตรงหลังจาก 8 หรือ ...

(?(1).)^(?<-1>.)*.?.?8.*¶(.)*.

... อักขระต่ำกว่า 8; (?(1).)^(?<-1>.)*ตรงกับคอลัมน์เช่นเดียวกับ¶(.)*ในบรรทัดถัดไป แต่.?.?จะช่วยให้ผู้8ที่จะเป็นที่ 1 ด้านซ้ายหรือขวาของตัวละครหลังจากที่.ในบรรทัดถัดไป

8

ตรงกับ8ของ

(?!8|...)

อย่าจับคู่ 8 ทันทีก่อน 8 หรือ ...

.(.)*¶.*8.?.?(?<-2>.)*$(?(2).)

... อักขระที่มี 8 ในบรรทัดด้านล่าง; อีกครั้ง(?<-2>.)*$(?(2).)ตรงกับคอลัมน์เดียวกันกับ(.)*¶ในบรรทัดก่อนหน้า แต่.?.?อนุญาตให้8เป็น 1 ซ้ายหรือขวาของ8ก่อน.หน้าในบรรทัดก่อนหน้า


3

เยลลี่ขนาด 17 ไบต์

=8ŒṪµŒcZIỊȦƲƇẎ⁸ḟL

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

=8ŒṪµŒcZIỊȦƲƇẎ⁸ḟL - Link: list of lists of integers (digits)
=8                - equals 8?
  ŒṪ              - multidimensional truthy indices (pairs of row & column indices of 8s)
    µ             - start a new monadic chain
     Œc           - all pairs (of the index-pairs) 
            Ƈ     - filter keep if:  (keep those that represent adjacent positions)
           Ʋ      -   last four links as a monad:
       Z          -     transpose
        I         -     incremental differences
         Ị        -     insignificant? (abs(x) <= 1)
          Ȧ       -     all?
             Ẏ    - tighten (to a list of all adjacent 8's index-pairs, at least once each)
              ⁸   - chain's left argument (all the index-pairs again)
               ḟ  - filter discard (remove those found to be adjacent to another)
                L - length (of the remaining pairs of indices of single 8s)

3

J, 42 ไบต์

[:+/@,8=]+[:+/(<:3 3#:4-.~i.9)|.!.0(_*8&=)

ลองออนไลน์!

คำอธิบาย

วิธีการระดับสูงที่นี่คล้ายกับวิธีที่ใช้ในโซลูชัน APL แบบคลาสสิกกับเกมแห่งชีวิต: https://www.youtube.com/watch?v=a9xAKttWgP4 https://www.youtube.com/watch?v=a9xAKttWgP4

ในการแก้ปัญหานั้นเราเปลี่ยนเมทริกซ์ของเราในทิศทางเพื่อนบ้าน 8 ที่เป็นไปได้สร้างข้อมูลที่ซ้ำกัน 8 รายการซ้อนกันแล้วเพิ่ม "ระนาบ" เข้าด้วยกันเพื่อให้นับเพื่อนบ้านของเรา

ที่นี่เราใช้เคล็ดลับ "คูณด้วยอินฟินิตี้" เพื่อปรับแก้ปัญหาสำหรับปัญหานี้

[: +/@, 8 = ] + [: +/ (neighbor deltas) (|.!.0) _ * 8&= NB. 
                                                        NB.
[: +/@,                                                 NB. the sum after flattening
        8 =                                             NB. a 0 1 matrix created by
                                                        NB. elmwise testing if 8
                                                        NB. equals the matrix
            (the matrix to test for equality with 8   ) NB. defined by...
            ] +                                         NB. the original input plus
                [: +/                                   NB. the elmwise sum of 8
                                                        NB. matrices defined by
                                                _ *     NB. the elmwise product of 
                                                        NB. infinity and
                                                    8&= NB. the matrix which is 1
                                                        NB. where the input is 8
                                                        NB. and 0 elsewhere, thus
                                                        NB. creating an infinity-0
                                                        NB. matrix
                                        (|.!.0)         NB. then 2d shifting that 
                                                        NB. matrix in the 8 possible
                                                        NB. "neighbor" directions
                      (neighbor deltas)                 NB. defined by the "neighbor
                                                        NB. deltas" (see below)
                                                        NB. QED.
                                                        NB. ***********************
                                                        NB. The rest of the
                                                        NB. explanation merely
                                                        NB. breaks down the neighbor
                                                        NB. delta construction.


                      (neighbor deltas  )               NB. the neighbor deltas are
                                                        NB. merely the cross product
                                                        NB. of _1 0 1 with itself,
                                                        NB. minus "0 0"
                      (<: 3 3 #: 4 -.~ i.9)             NB. to create that...
                       <:                               NB. subtract one from
                          3 3 #:                        NB. the base 3 rep of
                                       i.9              NB. the numbers 0 - 8
                                 4 -.~                  NB. minus the number 4
                                                        NB.
                                                        NB. All of which produces
                                                        NB. the eight "neighbor"
                                                        NB. deltas:
                                                        NB. 
                                                        NB.       _1 _1
                                                        NB.       _1  0
                                                        NB.       _1  1
                                                        NB.        0 _1
                                                        NB.        0  1
                                                        NB.        1 _1
                                                        NB.        1  0
                                                        NB.        1  1

1
คุณลืมลบช่องว่างระหว่าง~และ>
Galen Ivanov

@GalenIvanov แก้ไขแล้ว ขอขอบคุณ.
Jonah

3

Java 8, 181 157 156 ไบต์

(M,R,C)->{int z=0,c,f,t;for(;R-->0;)for(c=C;c-->0;z+=f>1?0:f)for(f=0,t=9;M[R][c]==8&t-->0;)try{f+=M[R+t/3-1][c+t%3-1]==8?1:0;}catch(Exception e){}return z;}

-24 ไบต์ขอบคุณที่@ OlivierGrégoire

ใช้ขนาดเป็นพารามิเตอร์เพิ่มเติมR(จำนวนแถว) และC(จำนวนคอลัมน์)

เซลล์จะถูกตรวจสอบสวยเหมือนกันเป็นผมในของฉันจำลองทอดคำตอบ

ลองออนไลน์

คำอธิบาย:

(M,R,C)->{                    // Method with integer-matrix as parameter & integer return
  int z=0,                    //  Result-counter, starting at 0
      c,f,t;                  //  Temp-integers, starting uninitialized
  for(;R-->0;)                //  Loop over the rows:
    for(c=C;c-->0             //   Inner loop over the columns:
           ;                  //     After every iteration:
            z+=f==1?          //      If the flag-integer is larger than 1:
                0             //       Leave the result-counter the same by adding 0
               :              //      Else:
                f)            //       Add the flag-integer (either 0 or 1)
      for(f=0,                //    Reset the flag to 0
          t=9;M[R][c]==8&     //    If the current cell contains an 8:
              t-->0;)         //     Inner loop `t` in the range (9, 0]:
        try{f+=               //      Increase the flag by:
               M[R+t/3-1]     //       If `t` is 0, 1, or 2: Look at the previous row
                              //       Else-if `t` is 6, 7, or 8: Look at the next row
                              //       Else (`t` is 3, 4, or 5): Look at the current row
                [c+t%3-1]     //       If `t` is 0, 3, or 6: Look at the previous column
                              //       Else-if `t` is 2, 5, or 8: Look at the next column
                              //       Else (`t` is 1, 4, or 7): Look at the current column
                ==8?          //       And if the digit in this cell is 8:
                 1            //        Increase the flag-integer by 1
                :0;           //       Else: leave it the same
        }catch(Exception e){} //      Catch and ignore ArrayIndexOutOfBoundsExceptions
                              //      (try-catch saves bytes in comparison to if-checks)
  return z;}                  //  And finally return the counter


2

Powershell ขนาด 121 ไบต์

param($a)(($b='='*4*($l=($a|% Le*)[0]))+($a|%{"!$_!"})+$b|sls "(?<=[^8]{3}.{$l}[^8])8(?=[^8].{$l}[^8]{3})" -a|% m*).Count

สคริปต์ทดสอบ golfed น้อย:

$f = {

param($a)

$length=($a|% Length)[0]
$border='='*4*$length
$pattern="(?<=[^8]{3}.{$length}[^8])8(?=[^8].{$length}[^8]{3})"
$matches=$border+($a|%{"!$_!"})+$border |sls $pattern -a|% Matches
$matches.count

}

@(

,(3,"84565","93848","08615","67982","88742")
,(0,"88","23")
,(0,"534","252")
,(2,"5838")
,(2,"8","0","8")
,(1,"4285","2618","8558")
,(3,"45438182","82778393","98785428","45021869","15434561")
,(1,"8")
,(4,"85816877","99282783","28497327","92971956","69873152","19971882","35681475")
,(3,"818","257","801")
,(0,"")

) | % {
    $expected,$a = $_
    $result = &$f $a
    "$($result-eq$expected): $result : $a"
}

เอาท์พุท:

True: 3 : 84565 93848 08615 67982 88742
True: 0 : 88 23
True: 0 : 534 252
True: 2 : 5838
True: 2 : 8 0 8
True: 1 : 4285 2618 8558
True: 3 : 45438182 82778393 98785428 45021869 15434561
True: 1 : 8
True: 4 : 85816877 99282783 28497327 92971956 69873152 19971882 35681475
True: 3 : 818 257 801
True: 0 : 

คำอธิบาย:

ก่อนอื่นสคริปต์จะคำนวณความยาวของสตริงแรก

ประการที่สองจะเพิ่มเส้นขอบพิเศษให้กับสตริง Augmended ความเป็นจริงเช่นเดียวกับสตริง:

....=========!84565! !93848! !08615! !67982! !88742!===========....

แสดงถึงสตริงหลายบรรทัด:

...=====
=======
!84565!
!93848!
!08615!
!67982!
!88742!
=======
========...

หมายเหตุ 1: จำนวน=เพียงพอสำหรับสตริงที่มีความยาวใด ๆ

หมายเหตุ 2: จำนวนมาก =ไม่มีผลต่อการค้นหาแปด

ถัดไปนิพจน์ทั่วไป(?<=[^8]{3}.{$l}[^8])8(?=[^8].{$l}[^8]{3})จะค้นหาตัวเลข8ด้วยค่าที่ไม่ใช่ eights ก่อนหน้า(?<=[^8]{3}.{$l}[^8])และค่า non-แปดต่อไปนี้(?=[^8].{$l}[^8]{3}):

.......
<<<....
<8>....
>>>....
.......

ในที่สุดจำนวนของการแข่งขันจะถูกส่งกลับเป็นผล


2

เยลลี่ 12 ไบต์

œẹ8ạṀ¥þ`’Ạ€S

ลองออนไลน์!

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

œẹ8ạṀ¥þ`’Ạ€S  Main link. Argument: M (matrix)

œẹ8           Find all multidimensional indices of 8, yielding an array A of pairs.
      þ`      Table self; for all pairs [i, j] and [k, l] in A, call the link to the
              left. Return the results as a matrix.
   ạ              Absolute difference; yield [|i - k|, |j - l|].
    Ṁ             Take the maximum.
        ’     Decrement all the maxmima, mapping 1 to 0.
         Ạ€   All each; yield 1 for each row that contains no zeroes.
           S  Take the sum.

1

JavaScript (ES6), 106 ไบต์

a=>a.map((r,y)=>r.map((v,x)=>k+=v==8&[...'12221000'].every((d,i,v)=>(a[y+~-d]||0)[x+~-v[i+2&7]]^8)),k=0)|k

ลองออนไลน์!


วิธีการแบบสองทาง 110 ไบต์

a=>a.map(r=>r.map(v=>x=x*2|v==8,x=k=0)|x).map((n,y,b)=>a[0].map((_,x)=>(n^1<<x|b[y-1]|b[y+1])*2>>x&7||k++))&&k

ลองออนไลน์!


วิธีการแบบสองทางล้มเหลวในวันที่[[7]]
l4m2

@ lm42 โอ้ขอบคุณ แก้ไขแล้ว
Arnauld

1

Clojure , 227 198 bytes

(fn[t w h](let[c #(for[y(range %3 %4)x(range % %2)][x y])e #(= 8(get-in t(reverse %)0))m(fn[[o p]](count(filter e(c(dec o)(+ o 2)(dec p)(+ p 2)))))](count(filter #(= 1(m %))(filter e(c 0 w 0 h))))))

อุ๊ยตาย ไม่สั้นแน่นอนที่นี่ด้วยวิธีใด ๆ วงเล็บ 54 ไบต์เป็นนักฆ่า ฉันยังค่อนข้างมีความสุขกับมัน

-29 ไบต์โดยการสร้างฟังก์ชั่นผู้ช่วยที่สร้างช่วงตั้งแต่ผมทำที่สองการเปลี่ยนแปลงreduceไปสู่การ(count (filterติดตั้งและการกำจัดของแมโครเกลียวหลังจากการเล่นกอล์ฟ

(defn count-single-eights [td-array width height]
  ; Define three helper functions. One generates a list of coords for a given range of dimensions, another checks if an eight is
  ; at the given coord, and the other counts how many neighbors around a coord are an eight
  (letfn [(coords [x-min x-max y-min y-max]
            (for [y (range y-min y-max)
                  x (range x-min x-max)]
              [x y]))
          (eight? [[x y]] (= 8 (get-in td-array [y x] 0)))
          (n-eights-around [[cx cy]]
            (count (filter eight?
                           (coords (dec cx) (+ cx 2), (dec cy) (+ cy 2)))))]

    ; Gen a list of each coord of the matrix
    (->> (coords 0 width, 0 height)

         ; Remove any coords that don't contain an eight
         (filter eight?)

         ; Then count how many "neighborhoods" only contain 1 eight
         (filter #(= 1 (n-eights-around %)))
         (count))))

(mapv #(count-single-eights % (count (% 0)) (count %))
      test-cases)
=> [3 0 0 2 2 1 3 1 4 3]

ที่ไหน test-casesอาร์เรย์ "กรณีทดสอบ Python"

ลองออนไลน์!

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