它与数字模式匹配吗?


23

最近,我进行了一次数学测试,并注意到测试中的某个数字与一个有趣的模式匹配。数字(28384)与看起来像这样的通用数字序列匹配

(n)(x)(n+1)(x)(n+2)(x)(n+3) etc...

其中nx是一位数字整数。该序列可与开始xn并用端任一xn+y

给定一个多位数的正整数,您的任务将根据输入是否匹配模式输出真值或假值。输入的长度在4到18位之间。您可以将输入作为整数的字符串表示形式。输入将不会以0开头,而可以包含或以0结尾。

n+y 将始终是一个数字(因此长度限制为18)。

测试用例

这些应该输出真实值

182838485868788898
4344
85868
12223242526

这些应该是假的

12345
6724013635
36842478324836
1222232425
5859510511

与所有代码高尔夫球一样,最短的代码获胜!祝您好运,万事如意!


我们可以将输入作为字符串吗?
Kritixi Lithos

@KritixiLithos“您可以将输入作为整数的字符串表示形式。”
Xcoder先生17年

都是xn非零为符合规则的数字?
Xcoder先生17年

@ Mr.Xcoder该数字不能以0开头,但可以包含或以0结束
caird coinheringaahing

Answers:


8

Python 2中84 81 80 79个字节

-1字节感谢ovs

lambda x:g(x,1)|g(x,0)
g=lambda x,a:len(set(x[a::2]))==(x[a<1::2]in"123456789")

在线尝试!


Python 3中82个 79 78 77字节

lambda x:g(x,1)|g(x,0)
g=lambda x,a:len({*x[a::2]})==(x[a<1::2]in"123456789")

在线尝试!

在Python 3中略短一些,但是我认为它不应该得到自己的答案。


说明

我们设置了一个g接受字符串和索引(1或0)的函数。 g然后返回len(set(x[a::2])),即每隔一个位置的唯一数字的个数(x[a==0::2]in"123456789")是否等于,其他数字是否按升序排列。如果数字按升序返回,则返回它们是否全部相同,否则,将询问集合是否为空(不能为空),因此始终返回false。


和往常一样,我>> <
Xcoder先生17年

x[a<1::2]in"123456789"可以"0"<x[a<1::2]<":"(比较字符比较字符代码)
CalculatorFeline

@CalculatorFeline我认为那不是真的。那只是检查字符串是否以数字开头。
小麦巫师

哦,对了,但是仅适用于单个字符。
CalculatorFeline

但是你真的需要a<1吗?似乎可以这样a
CalculatorFeline

4

果冻13 11字节

Ds2ZI’M¦Ẏ¬Ạ

在线尝试!

说明:

Ds2ZI’M¦Ẏ¬Ạ Accepts an integer
D           Get individual digits
  2         2
 s          Split into chunks of specific length
   Z        Zip
    I       Take deltas
     ’      Decrement
      M     Take maximal indices
       ¦    Apply at specific indices
        Ẏ   Reduce dimensionality
         ¬  Vectorized NOT
          Ạ Check if all are truthy

2

05AB1E,15个字节

TG9LNýN.øŒ})˜Iå

在线尝试!

说明

TG9LNýN.øŒ})˜Iå
TG        }     # For 1 to 9...
  9L             # Push [1 .. 9]
    Ný           # Join with current value 
      N.ø        # surround with current value
         Œ       # Push substrings
           )    # Wrap stack to array
            ˜   # Deep flatten the array
             I  # Push input
              å # Is the input in the array?
                # Implicit print

它应该可以工作(测试用例可以),但是如果您发现任何缺陷,请告诉我。

如果没有输出被视为虚假,则为14个字节:

TG9LNýN.øŒIåi1

2

D,117字节

int f(string n){int o=n[0]!=n[2],x=n[o];foreach(i,c;n){if(i%2!=o&&i>1&&c!=n[i-2]+1||i%2==o&&c!=x)return 0;}return 1;}

绝对次优,但​​效果很好

在线尝试!


2

哈斯克尔, 108 113 97 95字节

d(x:_:r)=x:d r
d r=r
c(x:n:r)=and$all(==x)(d r):zipWith(==)(d$n:r)[n..]
f s@(_:n:_)=c s||c(n:s)

看涨期权:f "182838485868788898"收益True

非高尔夫版本,并附有说明:

-- Take every other element from the string, starting with the first
d (x:_:r) = x : d r
d r       = r
c (x:n:r) = and $ all (== x) (d r)              -- Every other char is equal to the first
                : zipWith (==) (d $ n:r) [n..]  -- The remaining chars are a prefix of n(n+1)(n+2)...
f s@(_:n:_) = c s      -- The case where s already starts with x
           || c (n:s)  -- If not, prepend a dummy x and try again

2
欢迎来到PPCG,尤其是Haskell高尔夫!isPrefixOf不在Prelude中,因此您必须import Data.List在代码中包含或使用其他替代方法,例如and(zipWith(==)(n:r)[n..])
Laikoni

@Laikoni:谢谢提示!我相应地替换了功能。
siracusa

1
我认为x/=y可能是1>0因为如果不是x/=y这样x==y,那么第一种情况就会抓住​​它。
CalculatorFeline

您也不需要where,在外部定义cd辅助功能f就可以了。f然后可以缩短为f s@(_:n:_)=c s||c(n:s)
Laikoni

1
然后,您可能会对Haskell中的高尔夫规则指南感兴趣。即使这不是规则,您也可以使用换行符代替;。字节数相同,但提高了代码的可读性。
Laikoni

1

JavaScript(ES6),66 63 60字节

将输入作为字符串。

s=>[...s].every((d,i)=>d-s[j^(k=i+j&1)]==k*i>>1,j=s[2]-s[0])

测试用例


1

C(gcc),123个字节

#define X*s&&*s++-++n&&(r=0)
t,n,x,r;f(char*s){t=*s==s[2];for(r=1,n=s[t],x=s[!t],s+=2;*s;)t||X,*s&&*s++-x&&(r=0),t&&X;n=r;}

在线尝试!


1

Python 3 99个96 89字节

  • 保存3个字节:使用 all()功能
  • @WheatWizard节省了7个字节:简写& |并用k<1
lambda x,g=lambda x,k:(x[k<1::2]in'123456789')&all(j==x[k]for j in x[k::2]):g(x,0)|g(x,1)

在线尝试!

说明:

首先将字符串分成两个列表:一个包含奇数索引元素,另一个包含偶数索引元素。假定两个列表A和B可以是:

  1. A包含相同的数字,B包含按升序排列的连续数字。

或正好相反

  1. B包含相同的数字,A包含按升序排列的连续数字。

连续条件通过以下方式检查: a in '123456789'

通过以下方式检查相同编号的条件: all(i=a[x] for i in a)


1
你可以替换的情况下,ik<1拖放的i参数都在一起。
小麦巫师

1
您也可以将第一个谓词包含在括号中,并使用&代替and。您or也可以替换|为。
小麦巫师

1
我看到这最终会收敛到您的答案。:D
Officialaimm

1

的PHP,68字节

for(;$v<10;)$s.=strstr(+$v.join(+$v,range(1,9)).+$v++,$argn);echo$s;

在线尝试!

搜索字符串的输出部分,从输入的第一个匹配项开始并包括在搜索字符串的末尾,作为真实值,对于虚假则不包含任何内容

2个字节越多,你可以替换echo$s;!!echo$s;获得1为truthy值

在数组的以下字符串之一中查找输入的出现

Array
(
    [0] => 0102030405060708090
    [1] => 1112131415161718191
    [2] => 2122232425262728292
    [3] => 3132333435363738393
    [4] => 4142434445464748494
    [5] => 5152535455565758595
    [6] => 6162636465666768696
    [7] => 7172737475767778797
    [8] => 8182838485868788898
    [9] => 9192939495969798999
)

1

JavaScript(ES6),54个字节

f=
s=>[...s].every((e,i)=>i<2|e-s[i-2]==(s[2]!=s[0])^i%2)
<input oninput=o.textContent=this.value[3]?f(this.value):``><pre id=o>

将输入作为字符串。


1

MATL,15字节

2L&),duw]hSFTX=

在线尝试!

在聊天中@LuisMendo的帮助下。请注意,如果空输出+错误也被视为“虚假”,则X可以将其忽略,从而使得分达到14个字节

2L&)     % Split the input into odd and even-indexed elements
    ,   ] % Do twice (new feature since MATL v20.0), i.e., on both halves of the input
     d     % Pairwise differences of the array. Results in [0,0,...] for the 'constant' part,
            %  and [1,1,...] for the 'increasing' part.
      u      % Get unique elements. Results in [0] for the constant part, [1] for the increasing part.
       w      % Swap the stack to do the same for the other half of the input.
         hS    % Horizontal concatenation followed by sort. Results in [0,1] for the desired string.
           FTX= % Check if the result is indeed [0,1]. Implicit display.

0

Mathematica,121个字节

(m[x_]:=Take[s=IntegerDigits@#,{x,Length@s,2}];w[b_,n_]:=Union@Differences@m@b=={1}&&Length@Union@m@n==1;w[1,2]||w[2,1])&

0

Pyth,20个字节

ASm.+sMd.Tcz2&-GZ-H1

[]当数字与数字模式匹配时输出,否则返回其他值。

在线尝试!

说明(输入示例85868

ASm.+sMd.Tcz2&-GZ-H1

          cz2           # Chop the input in pairs: ['85', '86', '8']
        .T              # Transpose, ignore absences: ['888', '56']
     sM                 # Convert to integers: [[8, 8, 8], [5, 6]]
  m.+  d                # Compute deltas: [[0, 0], [1]]
 S                      # Sort: [[0, 0], [1]]
A                       # Assign first list to G and second list to H
              -GZ       # Filter 0 on G (on absence): [0, 0] -> []
                 -H1    # Filter 1 on H (on absence): [1] -> []
             &          # Check both lists are empty (logical and): [] & [] -> []

0

Pyth,17个字节

qU2Ssm{.+d.TcjQT2

在这里尝试

与果冻答案相同的算法。

说明:

qU2Ssm{.+d.TcjQT2 Accepts an integer
             jQT  Take digits of input
            c   2 Split in pairs
          .T      Transpose
     m            Map the following on each of the two resulting lists:
       .+d          Take deltas
      {             Deduplicate
    s             The list is now in [[a, b, ...], [A, B, ...]] format, convert it to [a, b, ..., A, B, ...]
   S              Sort
qU2               Check if equal to [0, 1]

0

Python 3中167个161 157 131 106字节

-55字节,感谢@WheatWizard的建议

def g(t):k,c,f,j=t[::2],t[1::2],'123456789',''.join;return(len({*k})and j(c)in f)or(len({*c})and j(k)in f)

在线尝试!


可以进一步打高尔夫球。我已经编辑了
Xcoder先生17年

您可能已经在我的回答中看到了这个技巧,但set(c)与相同{*c}。(至少在python 3中)
Wheat Wizard

@WheatWizard谢谢。编辑
Xcoder先生,2015年

3
[t[z]for z in range(0,len(t),2)]只是列表拼接。您只需使用即可完成此操作t[::2]。如果您不熟悉此语法,建议您仔细阅读一下文档,因为它非常有用。
小麦巫师

@WheatWizard哇,这真的很有用。遗憾的是,我现在无法编辑答案。我会尽快这样做。非常感谢您的建议...
Xcoder先生17年

0

的Java(OpenJDK的8) 128个 119 118 108 107 104字节

s->{int i=3,a=s[2]-s[0],b=s[3]-s[1];for(;++i<s.length;)a+=b-(b=s[i]-s[i-2]==a?a:2);return(a|b)==1&a!=b;}

在线尝试!

说明:

s->{                             // lambda
  int i=3,                       //  iterating index
      a=s[2]-s[0],               //  diff of even-indexed characters
      b=s[3]-s[1];               //  diff of odd-indexed characters
  for(;++i<s.length;)            //  iterate
    a+=b-(b=                     //   swap a and b
        s[i]-s[i-2]==a?a:2       //    or set b to 2 if the diffs don't match
      ));                        //
  return (a|b)==1                //  return true if both a and b are in (0,1)
        &a!=b;                   //         but different
}

0

视网膜,47字节

.
$*11;
(1+)(?<=\1;1+;\1)

^1+;1+

^;?(;1;)+;?$

在线尝试!

如果与模式匹配,则输出1;如果与模式不匹配,则输出0

说明

.
$*11;

将每个数字n转换为一元数的n + 1,以分号分隔

(1+)(?<=\1;1+;\1)

(尾随换行符)将每个数字转换为其自身与前两位之间的差

^1+;1+

(尾随换行符)删除前2位数字

^;?(;1;)+;?$

计算此模式的匹配数,该模式检查0和1的交替

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.