ハードオブジェクトまたはソフトオブジェクトはもっとありますか


19

What-Ifブックのオープニングに触発されました。

入力は、文字列、文字列のリストなどとしてのスペースの長方形で、#内部にで作成されたオブジェクトがあります。

########          
#      #          
########          

   ###        ####
   ###        ####
   ###             

オブジェクトは常に交差せず、触れない長方形になります。ソフトオブジェクトは#、中央がで埋められておらず、境界のみであるオブジェクトとして定義されます。ハードオブジェクトは、塗りつぶされたオブジェクトです。幅または高さのあるオブジェクト<=2はハードと見なされます。すべてのオブジェクトはハードまたはソフトです。

入力にさらに硬いオブジェクトがある"Hard"場合、output 、より柔らかい場合、output "Soft"、それらが等しい場合、output "Equal"

これはなので、バイト単位の最短コードが勝ちです!

テストケース

これらのケースは完全な入力ではなく、各オブジェクトを特徴付けるべきものです。実際の入力は、質問の上部にあるascii-artのようになります。

ハード

#

####

##
##

##########
##########
##########

柔らかい

###
# #
###

###################
#                 #
#                 #
#                 #
###################

####
#  #
#  #
#  #
#  #
#  #
#  #
#  #
####

実際のテストケース

########          
#      #          
########          

   ###        ####
   ###        ####
   ###             

Hard

###                
###                
###                

###################
#                 #
#                 #
#                 #
###################

Equal

   ######    
   #    #    
   ######    
          ###
   ##  #  # #
          ###


 ########    
 #      #    
 ########  

Soft

2
出力は厳密ですか、または3つの明確な出力(H / S / Eまたは-1/0/1など)を使用できますか?
-trichoplax

@trichoplax彼らは厳しいです
Maltysen

3
面倒なI / O形式に関するメタ回答(選択したことを実行できないと言うのではなく、希望する場合に人々がよりきめ細かい意見を述べるための場所を提供するためだけです)。
-trichoplax

@DLoscは、それが問題ないことを確認して追加します。
マルティセン

@LuisMendoいいえ、追加しています。
マルティセン

回答:


8

MATL105の 104 58 50 49バイト

46バイトを削除できる提案をしてくれた@Neilに感謝します!

2\TTYaEq4:HeqgEqZ+K/Zot0>+ss'Soft Hard Equal'Ybw)

入力は、行がで区切られた2D文字配列;です。チャレンジの例は

['########          ';'#      #          ';'########          ';'                  ';'   ###        ####';'   ###        ####';'   ###            ']

別の例を次に示します。

['###                ';'###                ';'###                ';'                   ';'###################';'#                 #';'#                 #';'#                 #';'###################']

これは

###                
###                
###                

###################
#                 #
#                 #
#                 #
###################

したがって、与える必要があります'Equal'

に対応する3番目の例として'Soft'

['   ######    ';'   #    #    ';'   ######    ';'          ###';'   ##  #  # #';'          ###';'             ';'             ';' ########    ';' #      #    ';' ########    ']

あれは、

   ######    
   #    #    
   ######    
          ###
   ##  #  # #
          ###


 ########    
 #      #    
 ########  

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

説明

これは、2Dコンボリューションを使用して形状を検出します。入力を有する2次元配列に変換される1指示#及び-1スペースのため、-1値のフレームが埋め込まれます。これにより、元のフィールドの端の形状も確実に検出されます。

ソフトオブジェクトは、マスクによって検出されます

 1   1
 1  -1

これは、1つの空の内部ポイントを持つオブジェクトの左上隅に対応します。畳み込みはマスクを反転するため[-1 1; 1 1]、コードのように定義されることに注意してください。畳み込みが等しい位置の数S4、ソフトオブジェクトの総数です。

オブジェクトが(ソフトまたはハード)マスクによって検出されます

-1  -1
-1   1

これは、オブジェクトの左上隅と空の外部ポイントに対応しています。このマスクは以前のマスクの否定バージョンであるため、以前の畳み込み結果を再利用できます。具体的には、その結果が等しい位置の数T-4、オブジェクトの総数です。

ハードオブジェクトの数HTSです。出力文字列は、S - H = 2 * S - Tの符号によって決定されます。

2\                 % Input. Modulo 2: '#' gives 1, ' ' gives 0
TTYa               % Add a frame of zeros
Eq                 % Convert 0 to -1
4:HeqgEq           % Generate mask [-1 1; 1 1], for soft objects
Z+                 % 2D convolution, preserving size
K/Zo               % Divide by 4 and round towards 0. Gives 1 or -1 for 4 or -4
t0>                % Duplicate. 1 for positive entries (soft objects), 0 otherwise
+                  % Add. This corresponds to the factor 2 that multiplies number S
ss                 % Sum of 2D array. Gives 2*S-T
'Soft Hard Equal'  % Push this string
Yb                 % Split by spaces. Gives cell array
w)                 % Swap. Apply (modular) index to select one string

1
だから、畳み込みが何であるかはわかりませんが、すべてのオブジェクトを数えて(たとえば左上隅を見つけて)、ソフトオブジェクトの数の2倍と比較することはできませんか?
ニール

とても有望に見える@Neil、ありがとう!そうすれば、畳み込みを5から2に減らすことができます。(畳み込みは、特定のパターンが特定の位置で一致するかどうかを本質的に確認しています)。後で試してみます
ルイスメンドー

...またはたった1回の畳み込みですら!どうもありがとう!46バイトオフ:-) @Neil
ルイスメンドー

3
それはほとんどJSと同等でした... @Neilはどちら側にいますか
;

6

JavaScript(ES6)、123 121 118バイト

s=>s.replace(/#+/g,(m,i)=>s[i+l]>" "?0:n+=!m[1]|s[i-l+1]==s[i-l]||-1,n=l=~s.search`
|$`)|n>l?"Hard":n<l?"Soft":"Equal"

@ edc65のおかげで2バイト節約されました!

入力をスペースで埋められた複数行の文字列として受け取り、グリッドを形成します。

説明/テスト

MATLの長さに非常に近い!基本的に、#各オブジェクトのsの一番上の行を検索し、一番上の行の長さが2未満であるか、一番上の行の下の最初の2文字が同じである場合、それは硬く、それ以外は柔らかです。

var solution =

s=>
  s.replace(/#+/g,(m,i)=>        // for each run of consecutive # characters
    s[i+l]>" "?                  // if the position above the match contains a #
      0                          // do nothing (this object has already been counted)
    :n+=                         // add 1 to the counter (hard) if
      !m[1]                      // the match is only 1 # wide
      |s[i-l+1]==s[i-l]          // or the characters below are the same
      ||-1,                      // else decrement the counter (soft)
    n=                           // n = counter, hard objects increase n, soft decrease
    l=~s.search`\n|$`            // l = (negative) line length
  )
  |n>l?"Hard":n<l?"Soft":"Equal" // return the result string

// Test
document.write("<pre>" + [`

########          
#      #          
########          
                  
   ###        ####
   ###        ####
   ###            

`,`

###                
###                
###                
                   
###################
#                 #
#                 #
#                 #
###################

`,`

   ######    
   #    #    
   ######    
          ###
   ##  #  # #
          ###
             
             
 ########    
 #      #    
 ########    

`,`

########          
#      #          
########          
                  
   ###        ####
   # #        ####
   ###            

`,`

########          
#      #          
########          
                  
   ###  ###   ####
   ###  # #   ####
   ###  ###       

`,`

#

`,`

##

`,`

#
#

`,`

###
# #
###

`].map((test) => solution(test.slice(2, -2))).join("\n")
)


単一行の入力に問題があるようです。###を返しますEqual
デニス

@Dennisそのとおりです。単一行の入力では、以前のコードは修正したバグに依存していたようです。修正されました。
user81655

私見~g.search(/$/m)は、やや読みやすいです~g.search`\n`||-1
ニール

@Neil True。バグがあったので、私はそれを修正するために急いで取り組み||-1ましたが、あなたの提案|$は正規表現に追加することでとにかく2バイト節約できることを実感しました。ありがとう!
user81655

使用できるカウンターは1つだけです n=l=... n>l?...:n<l?...:...
-edc65

4

ゼリー、50 49 46 43 38 34 33 32バイト

Ḥ+ḊZ
>⁶ÇÇFµċ7_ċ4$Ṡị“¤Ỵf“¢*ɦ“¡⁺ƒ»

オンラインでお試しください!または、すべてのテストケースを確認します

バックグラウンド

あります16個の異なる2×2ブロックとスペースのパターンは:

|  |  |  | #|  | #| #|# | #|# |# |##|# |##|##|##|
|  | #|# |  |##| #|# |  |##| #|# |  |##| #|# |##|

これらのうち、2つのオブジェクトは決して接触しないため、

| #|# |
|# | #|

入力では決して発生しないため、14の可能なパターンが残ります。

  値0を割り当てる #1をと、2×2パターンをエンコードできます

|ab|
|cd|

2(2A + C)+(2B + D)= 4A + 2B + 2C + D、次の値残し14のパターン。

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

部分用の2×1 1×2または1×1スペースが埋め込まれているかのように、下および/または右の境界でパターン、我々は、それらをコードする、扱うう4A + 2B4A + 2C及び図4aをそれぞれ、 。

この方法では、各オブジェクト(ソフトまたはハード)には4つのパターン(右下隅)が1つだけあります。各ソフトオブジェクトには、正確に2つの7パターン(左下隅と右上隅)があります。

したがって、入力で検出された7パターンの数から4パターンの量を引くと、(s + h)-2s = h-s:= dが得られます。。ここで、hsは、それらが形成するハードオブジェクトとソフトオブジェクトの量です。

d> 0の場合はハード印刷、dの場合はソフト印刷 D <0等しい場合、D = 0

使い方

Ḥ+ḊZ                         Helper link. Input: M (n×m matrix)

Ḥ                            Unhalve; multiply all entries of M by 2.
  Ḋ                          Dequeue; remove the first row of M.
 +                           Perform vectorized addition.
                             This returns 2 * M[i] + M[i + 1] for each row M[i].
                             Since the M[n] is unpaired, + will not affect it,
                             as if M[n + 1] were a zero vector.
   Z                         Zip; transpose rows with columns.


>⁶ÇÇFµċ7_ċ4$Ṡị“¤Ỵf“¢*ɦ“¡⁺ƒ»  Main link. Input: G (character grid)

>⁶                           Compare each character with ' ', yielding 1 for '#'
                             and 0 for ' '.
  Ç                          Call the helper link.
                             This will compute (2a + c) for each pattern, which is
                             equal to (2b + d) for the pattern to its left.
   Ç                         This yields 2(2a + c) + (2b + d) for each pattern.
    F                        Flatten; collect all encoded patterns in a flat list.

     µ                       Begin a new, monadic link. Argument: A (list)
      ċ7                     Count the amount of 7's.
         ċ4$                 Count the amount of 4's.
        _                    Subtract the latter from the former.
            Ṡ                Yield the sign (1, -1 or 0) of the difference.
              “¤Ỵf“¢*ɦ“¡⁺ƒ»  Yield ['Hard', 'Soft', Equal'] by indexing into a
                             built-in dictionary.
             ị               Retrieve the string at the corresponding index.

1

ジュリア、99 95 93バイト

~=t->2t'+[t[2:end,:];0t[1,:]]'
!x=("Hard","Equal","Soft")[sign(~~(x.>32)∩(4,7)-5.5|>sum)+2]

! 引数として2次元のChar配列が必要です。 オンラインでお試しください!

使い方

これは、ほぼ同じアイデアを使用します 私のJelly answerますが、改善点が1つあります。

47の量をカウントする代わりに、他のすべての数値を削除し、5.5を減算して4、7)(-1.5、1.5 にマッピングします。このようにして、結果の差の合計の符号が正しい出力を決定します。


0

TSQL、328 249バイト

変数とテストデータの宣言:

DECLARE @l int = 20
DECLARE @ varchar(max)=''
SELECT @+=LEFT(x + replicate(' ', @l), @l)
FROM (values
(' xxxx'),
(' xxxx'),
(' xxxx'),
('x'),
(''),
('xxx'),
('x x  xxx'),
('xxx  x x'),
('     xxx    ')) x(x)

コード:

SELECT substring('Soft EqualHard',sign(sum(iif(substring(@,N,@l+2)like'xx'+replicate('_', @l-2)+'x ',-1,1)))*5+6,5)FROM(SELECT row_number()OVER(ORDER BY Type)N FROM sys.all_objects)x WHERE n<=len(@)AND' x'=substring(@,N-1,2)AND''=substring(@,N-@l,1)

収縮したコード:

SELECT
  substring('Soft EqualHard',
    sign(sum(iif(substring(@,N,@l+2)like'xx'+replicate('_', @l-2)+'x ',-1,1)))*5+6,5)
FROM(SELECT row_number()OVER(ORDER BY Type)N FROM sys.all_objects)x
WHERE n<=len(@)AND' x'=substring(@,N-1,2)AND''=substring(@,N-@l,1)

説明:

スクリプトはパターンのテキストをスキャンしています:

      space
space x

これらはそれぞれボックスの始まりです

これらの位置については、スクリプトはパターンをチェックしています。最初のxをチェックする必要はありません。

  x
x space 

それが存在する場合、それはソフトオブジェクトであり、そうでない場合はハードオブジェクトです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.