すべてのシングルエイト


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。3つの適格なセルは、アスタリスクでマークされた次のセルになります(ただし、そのようなエントリの量だけが出力されます)。

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

追加のルール

  • オプションで、追加の入力として配列のサイズを定義する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
あなたがそれを好きなら、あなたはそれに投票する必要があります
ルイス・メンドー

「8に等しいセル」を読んだとき、しばらくの間、セルがグリッドの1x1チャック(NxN)よりも大きくなる可能性があると考えた。多分それを「8個のセル」に言い換えて、数学が不要であることを明確にしてください。= P
テズラ

@テズラ編集。私は、新しい文言が少し自然を見つけるが、私はあなたの基準を信頼しますので、私はネイティブスピーカーじゃない
ルイスMendo

回答:


2

MATL21 17 10バイト

8=t3Y6Z+>z

オンラインでお試しください!

チャットの助けと2Dコンボリューションの提案をしてくれた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

あなたがコンセプトにfamiiarしている場合は、(2D-)畳み込みを使用してかなりの数のバイトを救うことができる
ルイスMendo

1
@LuisMendo 2D畳み込みは、1D畳み込みも理解していないものの1つなので、そこに希望はありません...両方を学ぶ機会のように聞こえます!
ジュゼッペ

1
サポートが必要な場合は、チャットルームでお知らせください。畳み込みは非常に便利な操作です。畳み込みを学習する場合は、1Dから始めます。2Dへの一般化は即時です
ルイスメンドー

9

R117 63 59バイト

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

オンラインでお試しください!

dist行列の行間の距離(デフォルトはユークリッド)を計算します。which2番目の引数を指定TRUEすると、述語が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ý驚きを避けるため、常にデフォルトとして使用します。
-ngn

ああ、他の人と同様に1(明示的に設定されていない場合を除く)。それは理にかなっている。
ザカリー

驚いたことに、これはステンシルを使用していません。ここにステンシルを不便にする何かがありますか?
リルトシアスト

@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

オンラインでお試しください!

別のアプローチを共有したかったのですが、これはJonathan Allanのソリューションよりも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

J43、40の 37バイト

バブラーのおかげで-3バイト

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ありがとうございます!
ガレンイワノフ

これはいいね。おそらく、コードの内訳ではないにしても、少なくともそれがどのように機能するかについての高レベルの説明を追加する価値があります。それを理解するのに10mほどかかりました。また、APLバージョン(同じアプローチを使用)がどれくらい短いかが興味深いです。それは主に単一の文字記号ではなく有向グラフの結果だと思われます
ジョナ

@ジョナ私は説明を追加します。APLとの比較のために、あなたはのリビジョンを見ることができますNGNのソリューション、特に28バイトのバージョン
ガレン・イワノフ

1
@ジョナの説明を追加
ガレンイワノフ

3

Retina 0.8.2、84バイト

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

オンラインでお試しください!説明:

.+
_$&_

8すべて8のsが各側に少なくとも1つの文字を持つように、各行を非文字でラップします。

m`

これが最後の段階であるため、一致のカウントが暗示されます。m修飾子は作る^$文字が任意の行の先頭や末尾にマッチします。

(?<!...|8)

8の直後の文字に一致しない、または...

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

... 8未満の文字。は、次の行(?(1).)^(?<-1>.)*と同じ列に一致します¶(.)*が、次の行の後の文字の左または右に1を.?.?指定できます。8.

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

ジャワ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;}

@OlivierGrégoireのおかげで-24バイト。

ディメンションを追加パラメーター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

ゴルフの少ないテストスクリプト:

$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の検索に影響しません。

次に、正規表現(?<=[^8]{3}.{$l}[^8])8(?=[^8].{$l}[^8]{3})8、先行する8以外の数字と(?<=[^8]{3}.{$l}[^8])次の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

Clojure227 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バイト。範囲を生成するヘルパー関数を2回作成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.