Всі одиночні вісімки


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

Додаткові правила

Тестові справи

  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
Якщо вам це подобається, тоді ви мали б проголосувати за нього
Луїс Мендо

Коли я прочитав "клітинки, що дорівнюють 8", я на мить подумав, що ти маєш на увазі, що комірка може бути більшою, ніж 1х1 патрон (NxN) сітки. Напевно, слід перефразувати це слово "клітинкам, яким 8", щоб уточнити, математика не потрібна. = P
Тезра

@Tezra Відредаговано. Я вважаю нове формулювання трохи менш природним, але я не є носієм мови, тому буду довіряти вашому критерію
Луїс Мендо

Відповіді:


2

MATL , 21 17 10 байт

8=t3Y6Z+>z

Спробуйте в Інтернеті!

Дякуємо Луїсу Мендо за допомогу у чаті та за те, що він запропонував 2D згортку.

Пояснення:

	#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-) згортки, якщо ви знайомі з цією концепцією
Луїс Мендо

1
@LuisMendo 2D згортання - одна з тих речей, де я також не розумію 1D згортки, тому надію на мене там немає ... звучить як можливість навчитися обом!
Джузеппе

1
Якщо вам потрібна допомога в цьому, повідомте мене в чаті. Згортання - дуже корисна операція. Якщо ви хочете навчитися згортці, почніть з 1D. Узагальнення до 2D негайне
Луїс Мендо

9

R , 117 63 59 байт

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

Спробуйте в Інтернеті!

distобчислює відстані (за замовчуванням є Евклідова) серед рядків матриці. whichз другим аргументом TRUEповертає координати, де предикат є істинним.

Координати є сусідами, якщо відстань між ними не більше квадратного кореня 2, але внутрішня <2досить хороша, оскільки можлива відстань стрибає з sqrt(2)ro 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 байт довше рішення Джонатана Аллана .

Як це працює

æ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

Спробуйте в Інтернеті!

Пояснення:

Перша частина алгоритму запевняє, що ми можемо застосувати розсувне вікно 3х3 до введення. Це досягається заздалегідь, попередньо повторивши ряд нулів і обертання на 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 Дякую!
Гален Іванов

Це добре. Напевно, варто додати принаймні пояснення на високому рівні, як це працює, якщо не розбивка коду. На це мені знадобилося 10 м або близько того. Також цікаво, наскільки коротша версія APL (яка використовує той самий підхід). Схоже, це головним чином результат графіків замість одинарних символів ...
Йона

@Jonah Я додам пояснення. Для порівняння з APL ви можете переглянути версії рішення ngn , особливо 28- байтну версію
Гален Іванов,

1
@Jonah Пояснення додано
Гален Іванов

3

Сітківка 0,8,2 , 84 байти

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

Спробуйте в Інтернеті! Пояснення:

.+
_$&_

Оберніть кожен рядок не 8символами, щоб усі 8s мали принаймні один символ з кожної сторони.

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 .

У цьому рішенні ми переміщуємо матрицю у 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
Ви забули прибрати пробіл між ~і>
Гален Іванов

@GalenIvanov Виправлено зараз. Дякую.
Йона

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(кількість стовпців).

Осередки перевіряються приблизно так, як я робив у своїй відповіді на тренажері Fryer .

Спробуйте в Інтернеті.

Пояснення:

(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

Менш тестовий сценарій для гольфу:

$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 : 

Пояснення:

По-перше, сценарій обчислює довжину першого рядка.

По-друге, це додає додаткові рамки для рядків. Удосконалений рядок реальності подобається:

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

представляє багаторядковий рядок:

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

Примітка 1: кількість =достатня для рядка будь-якої довжини.

Примітка 2: велика кількість =не впливає на пошук восьми.

Далі, регулярний вираз (?<=[^8]{3}.{$l}[^8])8(?=[^8].{$l}[^8]{3})шукає цифру 8з попередніми вісімками (?<=[^8]{3}.{$l}[^8])та такими не-восьми (?=[^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 О, дякую. Тепер виправлено.
Арнольд

1

Clojure , 227 198 байт

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

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.