숫자 패턴과 일치합니까?


23

최근에 수학 테스트를 받았으며 테스트의 특정 숫자가 흥미로운 패턴과 일치 함을 알았습니다. 숫자 ( 28384)는 다음과 같은 일반적인 숫자 시퀀스와 일치합니다.

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

nx한 자리 정수입니다. 순서 중 하나를 시작할 수 x또는 n과 양쪽 끝과 xn+y.

작업에 여러 자리 양의 정수가 제공되면 입력이 패턴과 일치하는지 여부에 따라 참 또는 거짓 값을 출력합니다. 입력 길이는 4 ~ 18 자리입니다. 정수의 문자열 표현으로 입력을받을 수 있습니다. 입력은 0으로 시작하지 않지만 0을 포함하거나 0으로 끝날 수 있습니다.

n+y 항상 한 자리 숫자입니다 (따라서 길이 제한이 18 인 이유).

테스트 사례

이것들은 진실한 가치를 산출해야한다

182838485868788898
4344
85868
12223242526

그리고 이것들은 거짓이어야합니다

12345
6724013635
36842478324836
1222232425
5859510511

모든 코드 골프와 마찬가지로 가장 짧은 코드가 승리합니다! 행운을 빕니다.


입력을 문자열로 할 수 있습니까?
Kritixi Lithos 2016

@KritixiLithos "정수의 문자열 표현으로 입력을받을 수 있습니다."
Mr. Xcoder 2016 년

모두 xn규칙에 맞게 숫자 0이 아닌가?
Mr. Xcoder 2016 년

@ Mr.Xcoder 숫자는 0으로 시작할 수 없지만 0을 포함하거나 0으로 끝날 수 있습니다
caird coinheringaahing

답변:


8

파이썬 2 , 84 81 80 79 바이트

ovs 덕분에 -1 바이트

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

온라인으로 사용해보십시오!


파이썬 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")숫자가 오름차순인지 아닌지 여부 , 즉 다른 모든 위치의 고유 숫자 수 인지 여부를 반환합니다 . 숫자가 오름차순 인 경우 모두 같은지 여부를 반환합니다. 그렇지 않은 경우 세트가 비어 있는지 묻습니다.


평소와 같이, 나는 outgolfed>. <
Mr. Xcoder

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

하스켈, 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 2016 년

@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

자바 스크립트 (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

파이썬 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;얻을 수 1truthy 값으로

배열의 다음 문자열 중 하나에서 입력 항목을 찾으십시오.

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

1

자바 스크립트 (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

파이썬 3 , 167161157131106 바이트

@WheatWizard의 제안 덕분에 -55 바이트

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)

온라인으로 사용해보십시오!


더 골프를 칠 수 있습니다. 이미 편집했습니다.
Mr. Xcoder 2016 년

내 대답 에서이 트릭을 보았지만와 set(c)동일합니다 {*c}. (적어도 파이썬 3에서)
밀 마법사

@WheatWizard 감사합니다. 편집
Mr. Xcoder

3
[t[z]for z in range(0,len(t),2)]또한리스트 스플 라이스입니다. 당신은 이것을 간단히 할 수 있습니다 t[::2]. 이 구문에 익숙하지 않다면 문서를 살펴 보는 것이 좋습니다.
밀 마법사

@WheatWizard 와우, 정말 유용합니다. 안타깝게도 지금 답변을 편집 할 수 없습니다. 가능한 빨리 그렇게하겠습니다. 조언을 많이 받아 ...
Xcoder 씨

0

자바 (오픈 JDK 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+

(트레일 링 줄 바꿈)은 처음 두 자리를 제거합니다.

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

이 패턴의 일치 횟수를 계산하여 0과 1을 번갈아 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.