没有任何附加条件!


42

介绍

墙上有3个钉子。您已经获得了一条固定在相框两端的绳子。要挂起图片,您需要用钉子将绳子缠住。但是在放开图片之前:您可以仅通过查看字符串如何缠绕在指甲上来预测图像是否会掉落吗?

在第一个示例中,图片不会掉落。在第二个示例中,图片将下降。

挑战

给定绳子绕N钉子的路径,确定图片是否会掉落。如果图像将要下降,则返回真实值,否则返回虚假值。

细节

  • 您可以假定钉子和图片以N+1正三角形排列,图片在底部。
  • 您可以假设绳索上没有打结,即可以从两端之一连续包裹绳索。
  • 每个钉子都用字母顺时针枚举。您可以假设最多有26个钉子(AZ)。
  • 用小写字母表示围绕钉子的顺时针包装,用大写字母表示逆时针包装。

上面的第一个示例将编码为BcA,第二个示例将编码为CAbBac

对于倾斜的读者:这个问题等同于确定自由组的元素(由钉生成)是否是标识。这意味着重复取消像aAAa直到达到固定点的子字符串就足够了。如果定点是空字符串,则这是中性元素,否则不是。

例子

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja

3
似乎在解放双手写下字符串的路径时,图片还是会掉下来。然后,这一挑战变得非常容易。
owacoder

@owacoder您只需要足够快就可以了:D
瑕疵的

Answers:


11

视网膜,21字节

+`(.)(?!\1)(?i)\1

^$

在线尝试!

像frickr的解决方案一样,这只是重复删除相邻的大写/小写对,然后检查结果是否为空。

至于如何匹配大写/小写对:

(.)     # Match and capture a letter.
(?!\1)  # Ensure that the next character is not the same, to avoid matching
        # "aa" and "AA".
(?i)    # Turn on case-insensitivity.
\1      # Match the backreference. In .NET, when using case insensitivity,
        # backreferences also get case-insensitive, so this *can* still match
        # iff the cases of the two letters are different.

7

MATLAB,76字节倍频程,82 79 77字节

这可能是我第一次看到MATLAB实际上比Octave (整个字节)!

MATLAB中的新答案:

c=input('');k='Aa';while k<1e5,k=k+1;c=strrep(c,65+mod(k,64),'');end;~nnz(c)

用倍频程回答:

c=input('');k='Aa';while k++<1e5,c=strrep(c,['',65+mod(k,64)],'');end;~nnz(c)

由于有瑕疵,节省了三个五个字节。~nnz(c)小于isempty(c),并且'Aa'比短两个字节[0,32]

在线尝试八度版本!


说明:

c=input('')要求用户输入。我们定义k='Aa'为字符数组。

while k++<1e5:While循环其中两个元件k被递增每次迭代中,AaBbCc等。循环将继续进行,直到最大元素为1e5,对于大多数字符串来说应该足够高。可以增加到9e9而不增加字节数。

我们将从strrep中间开始逐步使用该功能。

通过使用mod(k,64),当我们到达字母的结尾时(如果我们转换k回字符),将得到以下信息:

ans = Yy
ans = Zz
ans = [{
ans = \|
ans = ]}
ans = ^~
ans = _
ans = `�
ans = aA
ans = bB

如您所见,中间会有一些符号,但是它将环绕并重新以字母开头,但是现在首先以小写字母开头。这是同时检查Aa和的很短的方法aA

['',65+mod(k,64)]mod-call中的数字值与一个空字符串连接起来,将数字转换为字符。

strrep用于从字符串中删除元素c并返回它。它将搜索k字符串中所有出现的内容,并将其替换为空字符串。

1e5迭代之后,我们将有一个空字符串或一个非空字符串。我们检查是否有任何元素c使用nnz(c)。我们返回not(nnz(c)),因此,1如果它为空,并且0还剩下字符c


6

Minkolang 0.15,30个字节

od4&x,N.I1=$6&d3~c-$~48*=,2&xx

在这里尝试!

说明

od                            Take character from input and duplicate it
  4&                          If top of stack is truthy, jump 4 spaces
    x                         Dump top of stack
     ,                        NOT top of stack
      N.                      Output as number and stop

    I1=                       1 if stack has 1 element, 0 otherwise
       $6&                    If top of stack is truthy, jump 16 spaces (to the beginning)
          d3~c                Duplicate top two items of stack, in reversed order
              -               Subtract
               $~             Absolute value
                 48*          Push 32
                    =,        0 if top two items are equal, 1 otherwise
                      2&xx    If top of stack is truthy, dump two elements from top

此处利用Minkolang的环形特性来消除对外部循环的需要。这里的总体思路是检查堆栈的前两个元素是否相隔32个单位(这意味着它们是大写/小写对),如果存在,则将它们都弹出。可以说,由于这是“实时”完成的,因此对的嵌套是正确的。


5

Haskell,62个字节

a%l|b:t<-l,abs(a-b)==32=t|1>0=a:l
f=null.foldr((%).fromEnum)[]

在线尝试

感谢flawr的absLaikoni的fromEnum地图

helper函数%采用一个已经简化的字符串l,并a在简化结果之前添加符号。如果l以反字符开头a,则取消。否则,a只需添加。注意,在此阶段不需要进一步的简化。

主要功能f通过依次替换和简化每个字符foldr。然后,它检查结果是否为空。

要检查两个字符是否相反,是否应该取消,请查看它们的ASCII值是否相差32。每个元素fromEnum在传递给之前都要经过处理%


真好!感谢您的解释,我每次都在学习新事物!
瑕疵

4

05AB1E,17个字节

DvADu‚øDíìvyK}}õQ

在线尝试!

说明

Dv                 # input number of times do:
  A                # push lowercase alphabet
   Du              # push uppercase alphabet
     ‚ø            # zip the alphabets together (['aA', ..., 'zZ'])
       Díì         # prepend a copy with each element reversed ('Aa' ...)
          v        # for each pair in the resulting list
           yK      # remove it from the accumulated string (starts as input)
             }}    # end loops
               õQ  # check result for equality to empty string

4

Haskell98 97 85 81字节

这只是一个幼稚的实现,它反复尝试取消相邻的字母,直到没有更多更改为止,然后从中确定结果。

感谢@nimi提供-12个字节,并@xnor提供另一个-4个字节!

o=fromEnum
r(a:b:l)|abs(o a-o b)==32=l|1>0=a:r(b:l)
r x=x
f=null.until((==)=<<r)r

在线尝试!验证所有示例!


f=null.until(\a->r a==a)r.map fromEnum应该保存两个字节。
Laikoni

我认为(\a->r a==a)可以((==)=<<r)
xnor

1
在第二行中,我认为您可以更改=r ll,这样的想法是每次运行只更换一个就足够了。
xnor

谢谢!我理解第二个提示,但是我不知道怎么回事=<<,好像是魔术XD
瑕疵

1
@flawr参见此技巧。该=<<犹如>>=但交换的参数。该表达经常((==)=<<r)以“在...下面不变r”的形式出现。
xnor

3

Mathematica,102个字节

""==StringDelete[""|##&@@#<>#2&~MapThread~{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}]~FixedPoint~#&

带有字母字符串作为输入并返回True或的未命名函数False

实现的核心是创建一个函数,该函数从字符串中删除所有取消对,例如"Pp""gG"。该表达式{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}产生一对有序的字符列表,第一个为{"a","b",...,"Z"},第二个为{"A","B",...,"z"}。然后#<>#2&~MapThread~生成一个列表,其中已串联了这两个列表的相应元素{"aA","bB",...,"Zz"}""|##&@@然后(通过参数序列的魔术##)有趣的表达式产生了一系列的选择"" | "aA" | "bB" | ... | "Zz"; 最后,StringDelete[...]是一个从字符串中删除所有这些替代项的出现的函数。

现在,只需将该函数重复应用于输入字符串,直到结果不变为止即可,这可以通过完成~FixedPoint~#,然后使用来测试结果是否为空字符串""==


3

JavaScript(ES6),73个字节

f=(s,t=s.replace(/(.)\1+/gi,s=>s.replace(/(.)(?!\1)./,'')))=>s==t?!s:f(t)

与.NET不同,JavaScript无法在匹配过程中关闭区分大小写的方式,因此,我们必须不区分大小写地查找重复字母的所有子字符串,然后删除任何不匹配的相邻字符对,此时必须一对大/小写字母。


3

Perl,28个字节

1 while s/.(??{$&^' '})//;$_

说明:

Perl允许在标准正则表达式中包含动态生成的正则表达式。

.匹配任何内容。

(??{是生成的正则表达式的开始。

$&到目前为止,该变量将包含整个匹配的字符串,在这种情况下,该字符串就是任何.匹配的字符串。

^操作者确实可以是数字XOR或字符串XOR,根据操作数的值。在这种情况下,它将是字符串xor。

' '仅仅是含有空间,这方便地具有ASCII(或Unicode!)的32值当空间与在范围AZ或AZ炭异或字符串,它将从上改变为小写或台钳反之亦然。

})是所生成的正则表达式的结尾。

1 while s/whatever// 将反复搜索一个模式并将其替换为空字符串。

$_是默认变量。当您不指定另一个变量时,perl会根据此变量进行有趣而令人兴奋的事情。在这里,我使用它来返回真实值或虚假值,因为长度为零的字符串为false,而长度为零的非相等字符串"0"为true。我还假设输入字符串最初放在其中。

在这里尝试


从技术上讲,这将返回与挑战所要求的相反(您应在事实不实时返回真实,反之亦然)。要解决此问题,只需!在final之前添加$_。如果可以这样保存,可以将其更改为s/.(??{$&^' '})//&&redo+1字节,以节省4个字节-p。它不能像现在那样在子例程中工作,因为它{ code }实际上不是一个循环(因此&&redo将不起作用),但-p会将其置于while循环中。
加百利·贝纳米

您也可以通过替换' '为来保存另一个字节$"看一看,看看代码是什么样子。
加布里埃尔·贝纳米

2

Prolog(SWI),151字节

f(S):-S="";string_code(I,S,X),string_code(J,S,Y),J is I+1,32is abs(X-Y),B is J+1,sub_string(S,0,I,_,T),sub_string(S,B,_,0,U),string_concat(T,U,V),f(V).

由于回溯,需要较长时间来处理更长的错误案例。

在线尝试!

不打高尔夫球

f(S):-                       The string S corresponds to a falling picture if:
  S="";                      S is the empty string, or...
  string_code(I,S,X),        X is the character code at some index I
  string_code(J,S,Y),        Y is the character code at some index J
  J is I+1,                  J is I+1
  32 is abs(X-Y),            X and Y differ by 32 (difference between lower/upper case)
  B is J+1,                  ...
  sub_string(S,0,I,_,T),     ...
  sub_string(S,B,_,0,U),     ...
  string_concat(T,U,V),      ...
  f(V).                      The concatenation of the substrings before and after 
                             the letters X and Y corresponds to a falling picture.

1

MATL,20字节

t"[]yd|32=fX<tQh(]n~

在线尝试!验证所有测试用例(需要一段时间)。

说明

t       % Input string implicitly. Duplicate
"       % Do as many times as input size
  []    %   Push empty array
  y     %   Duplicate current string onto the top
  d|    %   Absolute consecutive differences
  32=   %   Convert to true if 32, false otherwise
  fX<   %   Index of first occurrence of true, or empty of all false
  tQ    %   Duplicate, add 1. This gives the next index, or empty
  h     %   Concatenate. Gives the two consecutive indices of letters
        %   to be removed, or empty
  (     %   Assign an empty array to those positions, i.e. delete them
]       % End
n~      % Number of elements, negate

1

Mathematica,65个字节

(ToCharacterCode@#//.{x___,y_,z_,w___}/;Abs[y-z]==32:>{x,w})=={}&


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.