是山区吗?


29

挑战

对于这一挑战,山区字符串是一个符合语法规则的字符串,M: x(Mx)*其中在每个产品中所有x都是相同的字符。缩进后,山峰字符串可能如下所示:

A
 B
  C
   D
  C
   E
    F
   E
  C
 B
A

如您所见,从侧面看它有点像一座山。

正式定义

  • 任何单个字符a都是多山的。
  • 如果S是多山字符串,并且a是字符,aSa则为多山,其中并置表示字符串连接。
  • 如果aSaaTa是多山的弦,那么aSaTa就是多山的弦。请注意,此规则意味着该模式适用于任意数量的重复。(即aSaTaUaaSaTaUaVaaSaTaUaVaWa...都是山区。)

例子

所有奇长回文都是山区,例如:

t
 a
  c
   o
  c
 a
t

qwertytrasdfdgdsarewqjklkjq 是一个比较简单的例子:

q
 w
  e
   r
    t
     y
    t
   r
    a
     s
      d
       f
      d
       g
      d
     s
    a
   r
  e
 w
q
 j
  k
   l
  k
 j
q

输出示例

a                           ==> true
aaa                         ==> true
mom                         ==> true
tacocat                     ==> true
qwertytrasdfdgdsarewqjklkjq ==> true
wasitacaroraratisaw         ==> true
abcbcbcbcba                 ==> true
aaaaabcbbba                 ==> true

<empty string>              ==> false
aa                          ==> false
pie                         ==> false
toohottohoot                ==> false
asdfdghgfdsa                ==> false
myhovercraftisfullofeels    ==> false

规则

  • 这是一个决策问题,因此,只要是正确的,一致的,明确的,并且程序在有限的时间内终止,则对true或false的任何表示都是有效的输出。确保在解决方案中说明您的输出约定。
    • 在不必知道输入字符串是什么的情况下确定输出是true还是false是不容易的。注意,这并不意味着真实或虚假的输出必须是恒定的,但是出于明显的原因,“如果字符串是山区的,则打印山区字符串,如果不是山区的,则是非山区字符串”的约定出于明显的原因而被禁止。
    • 另一方面,像“为false抛出异常并为true静默退出”这样的约定以及“将单个字符打印为true以及将其他任何字符打印为false”的约定都可以。
  • 这是代码高尔夫,所以最短的程序会获胜。
  • 禁止出现标准漏洞。

4
aaa这样的测试用例会很好,需要在多个级别上使用相同的字符。
Martin Ender '18

你确定wasitacaroraratisaw吗?这似乎mountanous我
吨Hospel

wasitacaroraratisaw确实是山区 AFAICT
ETHproductions '18

就是这样 我想我只是想找到一个“几乎回文”,但我偶然发现了一条山峰。
Beefster

2
我认为通过将字符串拆分为第一个字符可以很容易地解决此问题,但是像aaamake这样的情况不起作用。
xnor18年

Answers:




6

Perl,22个字节

包括+用于p

perl -pe '$_=/^((.)((?1)\2)*)$/' <<< abcbcbcbcba

打印1为真,否为假


5

Brain-Flak,78个字节

({()<<>(([{}]({}))([{}]({}))<>[({}<>)])>{[()()]((<()>))}<{}{}{}<>>}(())){{}}{}

在线尝试!

打印1为true,不打印false。

要验证一个山字,只要假设该字“下山”就足够了。



3

Prolog(SWI),29个字节

a-->[X],+X.
+X-->[];a,[X],+X.

在线尝试!

该程序定义了一个DCG规则a//0,该规则与作为山区字符串的任何字符串(字符列表)匹配。

说明

在此程序中,我对山区字符串使用的定义与挑战中所描述的稍有不同,但同等的定义:山区字符串是一个字符,c后跟一定数量(可能为零)的山区字符串,并c附加在字符串的末端。在更简洁的正则表达式派生的表示法中,多山的字符串必须与模式匹配,c(Mc)*其中M多山的字符串*是,并且意味着括号中的表达式重复零次或多次。请注意,尽管每个字符串都c必须是相同的字符,但每个M字符串不必是相同的山区字符串。

等价证明

很明显,挑战的规则1和2等同于我的规则,Mc其中分别发生0次和1次。

在这种情况下,该多山串已经Mc发生n倍,其中n > 1然后该字符串可以被改写为cMcSc其中S是后者n - 1的是次Mc发生不包括最后一个c(注意,M为任何多山串并不一定是相同的其他M)。由于M是多山的弦,因此根据规则2 cMc必须是多山的弦。要么S是一个多山的字符串在这种情况下cSc是一个多山字符串或S可改写为cMcTc其中T是后者n - 2的是次Mc发生不包括最后一个c。这种推理方法可以继续应用,直到不能保证包含多山的字符串为止Mc一次,那就意味着它也必须是多山的。因此,由于cMc是多山的,如果cMccM'c是多山的,那么cMcM'c必须是多山的,整个弦必须是多山的。

反之,对于cScTc其中cSccTccSc为山的弦,则规则2或规则3为山性弦。如果规则2为山性弦,则S还必须为山性弦。如果根据规则3是多山的弦,则cSc其形式必须为cUcVcwhere cUccVc多山的弦。由于的较长cUccVc必须比cSc规则短至少两个字符,并且规则3要求至少应用5个字符,因此在有限数量的规则3应用之后,规则3的应用所c选择的s 之间的每个字符串都必须是多山的串。可以将相同的推理应用于cTc 因此,根据我的定义,弦乐是多山的。

由于任何与我的定义匹配的字符串都是多山的,而我的定义与所有山形字符串都匹配,因此它等同于问题中给出的字符串。

代码说明

总的来说a//0,第一行定义的DCG规则与任何山区字符串匹配。在第二行上定义的+//1DCG规则(如谓词,DCG规则可以赋予运算符名称),它匹配由零个或多个山字符串组成的任何字符串,并将作为其参数的字符传递的字符X附加到它们的末尾。或者借用我上面使用的类似于regex的符号,a//0匹配c(Mc)*但将实际匹配的工作外包(Mc)*+//1c作为参数X

逐行代码的行为如下:

a-->[X],+X.

这行定义了DCG规则a。该[X]州第一个字符必须等于当前不确定的变量X。这导致X设置为等于第一个字符。该+X则指出,字符串的其余部分必须与DCG规则匹配+//1与字符X设置为作为其参数。

+X-->[];a,[X],+X.

此行定义+//1DCG规则。中;的或表示Prolog中的,表示字符串可以匹配[]a,[X],+X。该[]代表空串,所以+//1总是能够空字符串匹配。如果字符串不为空,则其开头必须匹配a//0,因此必须是多山的字符串。然后,必须在此之后X设置任何字符。最后,字符串的其余部分必须匹配+X


2

外壳,15个字节

εωφΓ§?t·:⁰`(=←t

在线尝试! 类型推断大约需要40秒钟,因此请耐心等待。

说明

εωφΓ§?t·:⁰`(=←t  Implicit input, say s = "abacdca"
 ω               Apply until fixed point is reached
  φ              this self-referential anonymous function (accessed with ⁰):
                  Argument is a string x.
   Γ              Deconstruct x into head h and tail t.
    §?t·:⁰`(=←t   Call this function on h and t. It is interpreted as §(?t)(·:⁰)(`(=←t)).
                  § feeds h to (·:⁰) and (`(=←t)), and calls (?t) on the results.
                  The semantics of ? cause t to be fed to all three functions.
          `(=←t   First, check whether h equals the first element (←) of the tail of t.
     ?t           If it does (e.g. if h='a' and t="bacdca"), return tail of t ("acdca").
                  Otherwise (e.g. if h='b' and t="acdca"),
       · ⁰        call the anonymous function recursively on t: "aca"
        :         and prepend h to the result: "baca".
                 Final result is "a".
ε                Is it a 1-element string? Implicitly print 0 or 1.

我们的想法是反复更换形式的子abaa直到不再可能。当且仅当这会导致一个单字符字符串(这是ε测试内容)时,输入才是山区。唯一危险的情况是当我们有一个像这样的字符串时,aba似乎不是一个峰值:

a
 b
  a
   c
  a
   d
  a
 b
a

幸运的是,我们总是可以将其转换为一个:

a
 b
a
 c
a
 d
a
 b
a

我认为,返回true个案的单个字符,否则返回“一致”。
乔纳森·艾伦

实际上,这可能正在推动它,因为在该操作和无操作(“多山时返回多山字符串,否则就返回多山字符串”)之间没有明确的界限,这显然是一个漏洞。
乔纳森·艾伦

@JonathanAllan单个字符与其他字符串对我来说也似乎有点模糊,尤其是因为它与真实性关系不大(在Husk中只有空字符串是虚假的)。
Zgarb

是的,“任何代表制”显然太宽松了-我在OP上发表了评论:)
Jonathan Allan '18

我实际上希望定义是自由的,因为它允许更多创造性的解决方案。我将措词从“一致”更改为“明确”,尽管我也可以补充一点,即在没有上下文的情况下应该明确。与之类似,应该清楚地知道输入字符串是什么,无论结果是true还是false。因此,将单个字符表示为true,将没有任何字符表示为false。
Beefster '18


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.