是否有更多的硬物或软物


19

与假设分析书的开头相切。

输入是一个由空格组成的矩形,如字符串,字符串列表等,其对象由#内部组成:

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

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

对象将始终是非相交,非接触的矩形。软对象的定义是#中间没有用填充的对象,而只是边界,而硬对象则是填充的对象。具有宽度或高度的对象<=2被认为是坚硬的。所有对象都是硬的或软的。

如果输入,输出中有更多的硬对象"Hard",如果较软,则输出"Soft",如果相等则输出"Equal"

这是,因此以字节为单位的最短代码胜出!

测试用例

这些情况不是全部输入,而是每个对象应表征的内容。实际输入将类似于问题顶部的ascii艺术。

#

####

##
##

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

柔软的

###
# #
###

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

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

实际测试案例

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

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

Hard

###                
###                
###                

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

Equal

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


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

Soft

2
输出是否严格,或者可以使用任何3个明确的输出(例如H / S / E或-1/0/1)?
trichoplax

@trichoplax他们很严格
Maltysen '16

3
关于繁琐的I / O格式的元答案(不是说您不能做您选择的事情,而只是给人们一个表达他们更愿意的观点的位置)。
trichoplax

@DLosc确保可以,添加。
Maltysen '16

@LuisMendo不,添加。
Maltysen '16

Answers:


8

MATL105个 104 58 50 49字节

感谢@Neil的建议,该建议使我可以删除46个字节!

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

输入是2D字符数组,行之间用分隔;。挑战中的例子是

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

这是另一个例子:

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

这对应于

###                
###                
###                

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

因此应该给'Equal'

作为第三个示例,对应于'Soft'

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

那是,

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


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

在线尝试!

说明

这使用2D卷积来检测形状。输入被转换为带有1指示#-1空格的二维数组;并用-1值框架填充。这确保了也可以检测到原始场边缘处的形状。

软对象被掩模检测

 1   1
 1  -1

对应于对象的左上角,其中有一个空的内部点。请注意,卷积会反转掩码,因此[-1 1; 1 1]按代码中的定义进行定义。卷积等于的位置数S4是软物体的总数。

一个对象(软或硬)被掩模检测

-1  -1
-1   1

对应于对象的左上角以及一些空的外部点。此掩码是前一个掩码的取反版本,因此可以重新使用以前的卷积结果。具体而言,其结果等于的位置数T-4是对象总数。

硬物体的数量HT - S。输出字符串由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
因此,我不知道卷积是什么,但是您是否不能仅计算所有对象(通过找到例如左上角)并与两倍的软对象进行比较?
尼尔

@Neil看起来很有希望,谢谢!这样我可以将卷积从5个减少到2个。(卷积实际上是在查看某个特定模式是否在某个位置匹配)。我会稍后再尝试
Luis Mendo

...甚至只有1个卷积!非常感谢!关闭46个字节:-) @Neil
Luis

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或顶行以下的前两个字符相同,则该行较硬,否则较软。

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
丹尼斯

@丹尼斯你是对的。似乎对于单行输入,我以前的代码依赖于我修复的错误。立即修复。
user81655 '16

恕我直言~g.search(/$/m)~g.search`\n`||-1
尼尔

@尼尔真。有一个错误,所以我急忙||-1解决它,但是您的建议使我意识到,添加|$到正则表达式中总会节省2个字节。谢谢!
user81655 '16

您只能使用1个计数器n=l=... n>l?...:n<l?...:...
edc65 '16

4

果冻,50 49 46 43 38 34 33 32字节

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

在线尝试!验证所有测试用例

背景

162×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×21×1在较低和/或右边界模式中,我们将它们视为如果用空格填充,编码它们作为图4a + 2B4A + 2C4A分别。

这样,每个对象(软的或硬的)将只有一个4模式(其右下角)。每个软对象将具有两个正确的7种样式(左下角和右上角)。

因此,从输入中遇到的7个模式的数量中减去4个模式的数量将得出(s + h)-2s = h-s:= d,其中hs是它们形成的硬对象和软对象的数量。

我们打印如果d> 0如果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]

!需要一个二维Char数组作为参数。在线尝试!

怎么运行的

这几乎使用了与Jelly答案相同的想法,但有一个改进:

我们不计算所有47的数量,而是删除所有其他数字,然后减去5.5(4,7 映射到(-1.5,1.5)。这样,结果差之和的符号决定了正确的输出。


0

TSQL,328249字节

声明变量和测试数据:

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 

当存在时,它是一个软对象,否则它是一个硬对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.