哪些开关打开?


12

介绍

您正与您的同事坐在一起,共进午餐,并向他/她吹嘘您正在从事的最新和据说最大的项目。他/她厌倦了不断展现的自我主义情绪,给您一个挑战,以至于您闭嘴。身为一个利己,乐于运气的人,您当然会接受(因为您必须接受每一个挑战)。的挑战,因为他/她解释是,给定一个输入含有1个或多个的每个字符的文本块的!@#$^&*输出在任何合理的格式的开关(ES)是/的坐标是“开”。

根据您的同事,开关是$,并且仅当满足以下条件中的至少一个时,开关才被分类为“打开”:

  1. 它被所有人包围^。所以...

    ^^^
    ^$^
    ^^^
    

    导致“打开”开关。

  2. 它被所有人包围&。所以...

    &&&
    &$&
    &&&
    

    导致“打开”开关。

  3. 至少在两侧完全被覆盖*。例如,

    ***
    &$&
    ***
    

    导致“打开”开关,但是

    &*&
    &$&
    &*&
    

    不会,因为开关没有完全*s 覆盖任何两侧。

  4. 周围的任何角落至少有1个!和/或1个@。如果这两个都不在角落,则不算在内。所以...

    !&&
    ^$@
    @&!
    

    由于至少有1个!和/或@至少有一个拐角(在上述情况下,有2个有效!s和1个有效@的3个拐角),因此会导致“接通”开关。和...

    &!&
    ^$@
    ^!&
    

    确实,虽然有2 !秒和1 @中,由于没有一个是在任何角部。

  5. 1个或多个#任何周围的开关侧,除非至少1 &包围开关。换句话说,如果#一个边上至少存在1 个,则除非存在一个,否则它会覆盖所有其他规则&。因此:

    #&*
    *$*
    !**
    

    会导致“ on”开关(尽管#存在),因为&该开关周围有a ,并且遵循上述规则中的至少一项。但是,如果没有这样的感叹号:

    #&*
    *$*
    ***
    

    开关将关闭,因为它不遵循以上规则中的至少一项。因此,即使开关可能被a #和a 包围,&除非遵循这些规则中的一个或多个规则,否则它仍将处于关闭状态。同样,要使开关有效,s与s 之间必须始终有> = 1:1的比率。例如,&#

    #&!
    *$*
    **#
    

    尽管遵循这些规则中的1 #条,但仍将是无效的开关,因为存在2 s,但只有1 &,因此&s与#s 之间的比率不> = 1:1 。要使其有效,必须&在任意边上添加1个或多个其他s,以平衡#s和&s out 的数量,可能是这样的:

    #&!
    *$&
    &*#
    
    3:2 ratio between &s and #s
    

    最后...

    #^^
    ^$*
    @^!
    

    会导致“关闭”开关,尽管它遵循上述规则中的1个或多个,因为它周围至少包含1个#,并且没有&s使它失去平衡。

  6. 有效开关将内部的输入,并且因此,每个有效$必须包围完全通过的有效字符的任何8。例如,如果整个输入为:

    *$*
    !$!
    !!!
    

    顶部$绝对不是有效的开关,因为该开关位于边缘,因此该开关没有被8个有效字符完全包围。在这种情况下,甚至不应考虑使用该开关。但是,中间的开关完全有效,并且实际上是“接通”的,因为它至少满足上述要求之一。

为了演示,请考虑以下字符块:

!@#^^$#!@
!@#$$*$&@
@$^!$!@&&

我们可以像这样标记坐标,称为垂直轴y和水平轴x

y

3 !@#^^$#!@
2 !@#$$*$&@
1 @$^!$!@&&

  123456789 x

必须始终(x,y)类似于二维坐标网格的格式返回坐标。现在,哪些开关打开?好吧,让我们首先找到它们。我们已经可以看到在最上面一行有1个,在最下面一行有一个。但是,由于它们没有完全被8个字符包围,因此它们自动变为无操作。

接下来是第2行。具体来说,这一个是:

#^^
#$$
^!$

我们可以看到其中有3个$符号,但是我们只想关注中间的一个,就像您可能看到的那样,它已经无效,因为它#周围有2 s,没有&s可以平衡它们。出来。此外,这甚至不遵循任何规则,因此即使它是有效的开关,也还是会“关闭”。

接下来是第二行:

^^$
$$*
!$!

同样,仅关注中间的开关。该开关处于“开”,由于其具有至少 1 !至少 1角。这一个的坐标是(5,2)

继续前进,我们终于进入最后一个开关。这也位于第二行,如下所示:

$#!
*$&
!@&

并且,您可能会看到,尽管#周围有一个,但它也是一个有效的开关,因为还有2个&使平衡#。除此之外,它还在至少!一个角中至少有一个,因此开关不仅有效,而且也处于“接通”状态。此开关的坐标为(7,2)

我们终于到了尽头,并且在整个文本块中找到了2个“ on”开关。它们的坐标是(5,2)(7,2),这是我们的最终答案,输出应该是什么。但是,此输入非常简单。输入可以得到很多更大,因为没有对文本块有多大可以得到限制。例如,输入甚至可以是200x200文本的随机块。

制约因素

  • 禁止使用标准漏洞。

  • 不能有可能是一个内置的这一点,但万一有(看你数学),使用直接解决这个内建的是禁止的。

测试用例:

格式string input -> [array output]

@#$$&^!&!# 
@*&!!^$&^@
$!#*$@#@$!   ->  [[7,3],[9,2]]
*@^#*$@&*#

#^&!$!&$@@#&^^&*&*&&
!^#*#@&^#^*$&!$!*^$$
#^#*#$@$@*&^*#^!^@&* -> [[19,3],[15,3],[8,2]]
#$@$!#@$$^!#!@^@^^*#

@!@!^&*@*@
*$*^$!*&#$
@$^*@!&&&#
**$#@$@@#!  -> [[2,8],[5,8],[6,6],[9,3]]
##*&*#!^&^
$&^!#$&^&@
^^!#*#@#$*
$@@&#@^!!&
#@&#!$$^@$


!!@##!$^#!&!@$##$*$#
$^*^^&^!$&^!^^@^&!#!
@*#&@#&*$!&^&*!@*&** -> [[9,4],[9,3]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$

更多即将推出

补充说明

  • 您可以假设输入将始终是完整块的形式(即矩形或正方形)
  • 输入中将没有任何其他字符!@#$^&*

请记住,这是一个所以最短的代码胜出!


12
似乎有点漫长而随意。
orlp 2016年

@orlp这就是我要的。无论如何,这都是一个挑战。为什么您说它是任意的?
R. Kap

6
@ R.Kap任何规则都没有道理。它们似乎无缘无故地增加了复杂性。
Fund Monica的诉讼

6
@QPaysTaxes这需要什么理由?这些都是为了应对挑战而准备的。这一个挑战,而挑战实际上可以是任何事情。它真正需要的只是一组规则,一个输入以及应该基于这些规则的输出。
R. Kap

1
我并不是说我同意,而是在解释为什么它看起来很武断。以我最流行的挑战为例:如果您剥离了所有上下文并只是说:“您得到了一组字符串。根据缩进,将它们分组,对各组进行混搭,然后对内部组进行混搭,但保留其中的成员内部组,如果它们存在,则在底部”,这没有什么意义。但是,由于它具有上下文,所有这些奇怪的规则和限制至少都假装是有意义的。
Fund Monica的诉讼

Answers:


2

Haskell,304个字节

import Data.List
s!c=sum[1|a<-s,a==c]
f t|Just w<-elemIndex '\n't,h<-t!'\n'=[c|c<-mapM(\a->[2..a-1])[w,h],s<-[(\[x,y]->t!!((h-y-1)*(w+1)+x))<$>mapM(\a->[a-2..a])c],s!!4=='$',foldr1(-)((s!)<$>"#&")<1,or$("@!"/="@!"\\map(s!!)[0,2..8]):zipWith(\c i->all(==c)$(s!!)<$>[0..8]\\(4:i))"^&**"[[],[],[1,7],[3,5]]]

这定义了f执行给定任务的功能。


2

的JavaScript(ES6),363个 339 312 309 298字节

此函数将输入作为字符串并返回坐标列表。它分为两个主要部分:将开关转换为一对坐标及其周围的角色,并根据对周围角色的挑战规则进行“是否处于启用状态”检查。

a=>[...a].map((z,p,m)=>(y-=z==B,z)=='$'&&(r=m[p-n-2]+m[p-n]+m[p+n]+m[p+n+2]+m[p-n-1]+m[p-1]+m[p+1]+m[p+n+1],r=r[L]<9?r:'')[T]`&`[L]>=r[T]`#`[L]&&(/(\^|&){8}|\*{4}(.\*\*.|\*..\*)/.exec(r)||/!|@/.exec(r.substr(0,4)))&&[1+(p-(w-y))%n,y],y=w=a[T='split'](B='\n')[L='length'],n=a.search(B)).filter(e=>e)

2

Python 2中299个 297 279 275 261 259字节

m=input()
R=range
h=len(m)
for y in R(h-2):
 for x in R(len(m[0])-2):
	a=''.join(m[y+o][x:x+3]for o in R(3))
	if(a.count('&')>=a.count('#'))*(a[:4]+a[5:]in('^'*8,'&'*8)or'*'*6in(a[:3]+a[6:],a[::3]+a[2::3])or'!'in a[::2]or'@'in a[::2])*a[4]=='$':print x+2,h+~y

在线尝试!

将输入作为字符串列表

在每行上将输出打印为一对x,y坐标

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.