Wszystkie pojedyncze ósemki

24

Biorąc pod uwagę niepustą prostokątną tablicę liczb całkowitych od 0do 9, wypisz liczbę komórek, które są 8i nie mają sąsiada, który jest 8. Sąsiedztwo jest tutaj rozumiane w sensie Moore'a , to znaczy obejmuje przekątne. Każda komórka ma 8sąsiadów, z wyjątkiem komórek na krawędziach tablicy.

Na przykład biorąc pod uwagę dane wejściowe

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

wyjście powinno być 3. Trzy kwalifikujące się komórki byłyby następujące, oznaczone gwiazdką (ale należy wypisać tylko liczbę takich wpisów):

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

Dodatkowe zasady

Przypadki testowe

  1. Wkład:

    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
    

    Wydajność: 3

  2. Wkład

    8 8
    2 3
    

    Wydajność: 0

  3. Wkład:

    5 3 4
    2 5 2
    

    Wydajność: 0

  4. Wkład:

    5 8 3 8
    

    Wydajność: 2

  5. Wkład:

    8
    0
    8
    

    Wyjście: 2.

  6. Wkład:

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

    Wydajność: 1

  7. Wkład:

    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
    

    Wyjście 3.

  8. Wkład:

    8
    

    Wydajność: 1

  9. Wkład:

    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
    

    Wyjście: 4.

  10. Wkład:

    8 1 8
    2 5 7
    8 0 1
    

    Wyjście: 3.

Dane wejściowe w formacie 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]

Dane wejściowe w formacie 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]]

Wyjścia:

3, 0, 0, 2, 2, 1, 3, 1, 4, 3
Luis Mendo
źródło
17
Jeśli ci się podoba, powinieneś był głosować
Luis Mendo
Kiedy czytałem „komórki równe 8”, przez chwilę myślałem, że masz na myśli, że komórka może być większa niż uchwyt 1x1 (NxN) siatki. Powinien prawdopodobnie sformułować to inaczej w „komórkach, które są 8”, aby wyjaśnić, że nie jest wymagana matematyka. = P
Tezra,
@Tezra Edytowane. Uważam, że nowe sformułowanie jest trochę mniej naturalne, ale nie jestem native speakerem, więc zaufam Twojemu kryterium
Luis Mendo,

Odpowiedzi:

2

MATL , 21 17 10 bajtów

8=t3Y6Z+>z

Wypróbuj online!

Podziękowania dla Luisa Mendo za pomoc na czacie i sugestię splotu 2D.

Wyjaśnienie:

	#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
Giuseppe
źródło
Możesz zaoszczędzić sporo bajtów za pomocą splotu (2D-), jeśli znasz tę koncepcję
Luis Mendo,
1
@LuisMendo 2D splot jest jedną z tych rzeczy, w których nie rozumiem splotu 1D, więc nie ma dla mnie nadziei ... brzmi jak okazja do nauki obu!
Giuseppe,
1
Jeśli potrzebujesz pomocy, daj mi znać na czacie. Konwolucja jest bardzo przydatną operacją. Jeśli chcesz nauczyć się splotu, zacznij od 1D. Uogólnienie na 2D jest natychmiastowe
Luis Mendo,
9

R , 117 63 59 bajtów

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

Wypróbuj online!

distoblicza odległości (domyślnie euklidesowe) między rzędami macierzy. whichz drugim argumentem TRUEzwraca współrzędne, w których predykat jest prawdziwy.

Współrzędne są sąsiadami, jeśli odległość między nimi nie jest większa niż pierwiastek kwadratowy z 2, ale wewnętrzna <2jest wystarczająco dobra, ponieważ możliwa odległość skacze z sqrt(2)ro 2.

ngm
źródło
szkoda, że ​​niedokładność liczbowa nie pozwala colSums()^2<=2na działanie.
Giuseppe,
@Giuseppe oczywiście jest tylko kilka możliwych odległości i sqrt(2)skacze do 2(np. sort(c(dist(expand.grid(1:6,1:6))), decreasing = TRUE))), Więc byliśmy tam zbyt sprytni.
ngm
7

APL (Dyalog Classic) , 29 28 25 bajtów

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

Wypróbuj online!

ngn
źródło
Uwaga: Początek indeksu 0 nie jest nawet potrzebny.
Zacharý
@ Zacharý Zawsze używam tego domyślnie, aby uniknąć niespodzianek.
ngn
Ach, tak jak inni z 1( z wyjątkiem, że nie jest wyraźnie ustawiony). To ma sens.
Zacharý
Zaskoczony, że nie używa szablonu. Czy jest coś, co sprawia, że ​​szablon jest niewygodny?
lirtosiast
@lirtosiast to już dłużej z nim :)
ngn
5

Galaretka , 18 15 bajtów

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

Wypróbuj online!

Jak to działa

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

Poprzednie rozwiązanie, 18 bajtów

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

Wypróbuj online!

Chciałem podzielić się innym podejściem, choć jest to 1 bajt dłużej niż rozwiązanie Jonathana Allana .

Jak to działa

æ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
Bubbler
źródło
4

J , 43, 40 37 bajtów

-3 bajty dzięki Bubblerowi

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

Wypróbuj online!

Wyjaśnienie:

Pierwsza część algorytmu zapewnia, że ​​możemy zastosować przesuwne okno 3x3 do danych wejściowych. Uzyskuje się to, przygotowując rząd zer i obrót o 90 stopni, powtórzony 4 razy.

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
Galen Iwanow
źródło
1
37 bajtów przy użyciu @:i przenoszeniu|. . Pamiętaj, że @zamiast @:nie działa.
Bubbler,
@Bubbler Dziękujemy!
Galen Iwanow
To jest miłe. Prawdopodobnie warto dodać przynajmniej ogólne wyjaśnienie tego, jak to działa, jeśli nie rozbicie kodu. Zrozumienie tego zajęło mi około 10 metrów. Interesujące jest także, jak krótsza jest wersja APL (która używa tego samego podejścia). Wygląda na to, że to głównie wynik digrafów zamiast symboli pojedynczego znaku ...
Jonah,
@Jonah dodam wyjaśnienie. Dla porównania z APL możesz zobaczyć wersje rozwiązania ngn , zwłaszcza wersję 28-bajtową
Galen Iwanow
1
@Jonah wyjaśnił dodane
Galen Iwanow
3

Retina 0.8.2 , 84 bajtów

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

Wypróbuj online! Wyjaśnienie:

.+
_$&_

Zawiń każdą linię w 8znaki inne niż wszystkie, aby wszystkie 8s miały przynajmniej jeden znak po każdej stronie.

m`

To jest ostatni etap, więc implikowane jest liczenie meczów. mModyfikator czyni ^i $znaków pasuje na początku lub na końcu każdej linii.

(?<!...|8)

Nie dopasowuj postaci bezpośrednio po 8 lub ...

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

... postać poniżej 8; (?(1).)^(?<-1>.)*dopasowuje samą kolumnę jak ¶(.)*w następnym wierszu, ale .?.?pozwala 8być 1 w lewo lub prawo od znaku po .w następnym wierszu.

8

Dopasuj 8s.

(?!8|...)

Nie dopasowuj 8 bezpośrednio przed 8 lub ...

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

... postać z 8 w linii poniżej; ponownie, (?<-2>.)*$(?(2).)dopasowuje tę samą kolumnę, co w (.)*¶poprzednim wierszu, ale .?.?pozwala na 81 w lewo lub w prawo 8przed .poprzednim w poprzednim wierszu.

Neil
źródło
3

Galaretka , 17 bajtów

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

Wypróbuj online! Lub zobacz zestaw testowy .

W jaki sposób?

=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)
Jonathan Allan
źródło
3

J, 42 bajty

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

Wypróbuj online!

wyjaśnienie

Podejście wysokiego poziomu jest podobne do tego zastosowanego w klasycznym rozwiązaniu APL do gry życia: https://www.youtube.com/watch?v=a9xAKttWgP4 .

W tym rozwiązaniu przesuwamy naszą macierz w 8 możliwych kierunkach sąsiadów, tworząc 8 duplikatów danych wejściowych, układamy je w stos, a następnie dodajemy „płaszczyzny” razem, aby uzyskać liczbę naszych sąsiadów.

W tym przypadku używamy sztuczki „pomnóż przez nieskończoność”, aby dostosować rozwiązanie tego problemu.

[: +/@, 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
Jonasz
źródło
1
Zapomnieli usunąć spację między ~i>
Galen Iwanow
@GalenIvanov Naprawiono teraz. Dziękuję Ci.
Jonasz
3

Java 8, 181 157 156 bajtów

(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 bajty dzięki @ OlivierGrégoire .

Traktuje wymiary jako dodatkowe parametry R(ilość wierszy) i C(ilość kolumn).

Komórki są sprawdzane dość podobnie jak w mojej odpowiedzi symulatora Fryer .

Wypróbuj online.

Wyjaśnienie:

(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
Kevin Cruijssen
źródło
2

Python 2 , 130 bajtów

lambda a:sum(sum(u[~-c*(c>0):c+2].count(8)for u in a[~-r*(r>0):r+2])*8==8==a[r][c]for r in range(len(a))for c in range(len(a[0])))

Wypróbuj online!

Chas Brown
źródło
Wydaje się krótszy, jeśli weźmie długość od args
l4m2
2

PowerShell, 121 bajtów

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

Skrypt testu mniej golfowego:

$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"
}

Wydajność:

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 : 

Wyjaśnienie:

Najpierw skrypt oblicza długość pierwszego ciągu.

Po drugie, dodaje dodatkowe obramowanie do łańcuchów. Ciąg rzeczywistości rozszerzonej lubi:

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

reprezentuje ciąg multilinii:

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

Uwaga 1: liczba =jest wystarczająca dla ciągu dowolnej długości.

Uwaga 2: duża liczba =nie wpływa na wyszukiwanie ósemek.

Następnie wyrażenie regularne (?<=[^8]{3}.{$l}[^8])8(?=[^8].{$l}[^8]{3})szuka cyfry 8z poprzedzającymi nie-ósemkami (?<=[^8]{3}.{$l}[^8])i następującymi nie-ósemkami (?=[^8].{$l}[^8]{3}):

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

Na koniec zwracana jest liczba dopasowań.

mazzy
źródło
2

Galaretka , 12 bajtów

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

Wypróbuj online!

Jak to działa

œẹ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.
Dennis
źródło
1

JavaScript (ES6), 106 bajtów

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

Wypróbuj online!


Podejście bitowe, 110 bajtów

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

Wypróbuj online!

Arnauld
źródło
Bitowe podejście [[7]]
kończy się
@ lm42 Oh, dzięki. Teraz naprawione.
Arnauld,
1

Clojure , 227 198 bajtów

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

Ojej. Zdecydowanie nie najkrótszy tutaj pod żadnym względem. 54 bajty nawiasu to zabójca. Jednak nadal jestem z tego względnie zadowolony.

-29 bajtów poprzez utworzenie funkcji pomocnika, który generuje szereg ponieważ robiłem to dwa razy, zmieniając reducedo (count (filterkonfiguracji i pozbycie makro gwintowania po golfa.

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

Gdzie test-cases jest tablica zawierająca wszystkie „przypadki testowe Pythona”

Wypróbuj online!

Carcigenicate
źródło