数字のパターンと一致しますか?


23

最近、数学のテストを受けましたが、テストの特定の数が興味深いパターンに一致していることに気付きました。番号(28384)は、次のような一般的な数字列と一致しました

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

ここでnおよびxは1桁の整数です。シーケンスのいずれかで始めることができxたりnと、いずれかの端にxn+y

タスクは、複数桁の正の整数が与えられると、入力がパターンに一致するかどうかに応じて、真偽値または偽値を出力します。入力は4〜18桁です。入力を整数の文字列表現として受け取ることができます。入力は0で始まりませんが、0を含むか、0で終わることができます。

n+y 常に1桁の数字になります(したがって、長さの制限が18である理由)。

テストケース

これらは真実の値を出力するはずです

182838485868788898
4344
85868
12223242526

そして、これらは偽物でなければなりません

12345
6724013635
36842478324836
1222232425
5859510511

すべてのコードゴルフと同様に、最短のコードが勝ちます!幸運と可能性があります、あなたの好意でこれまで!


入力を文字列として受け取ることはできますか?
クリティキシリトス

@KritixiLithos「入力を整数の文字列表現としてとることができます。」
ミスターXcoder

両方あるxnルールに合わせ番号の非ゼロは?
ミスターXcoder

Mr.Xcoder @数は0で始めることはできませんが含まれているか、最後の0を持つことができます
coinheringaahing caird

回答:


8

パイソン284の 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")

オンラインでお試しください!


Pythonの382の 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]<":"(charsとcharcodesの比較)をすることができます
CalculatorFeline

@CalculatorFelineそれは本当だとは思いません。これは、文字列が数字で始まることを確認するだけです。
小麦ウィザード

ああ、しかし、それは単一の文字で機能します。
電卓

しかし、実際に必要a<1ですか?そのように思えaます。
CalculatorFeline


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"yieldsTrue

説明なしのゴルフバージョン:

-- 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..])
ライコニ

@ライコニ:ヒントをありがとう!それに応じて関数を置き換えました。
シラクーサ

1
私は考えるx/=yだけでことができ1>0ていない場合ので、x/=yその後、x==y第1ケースはそれをキャッチ。
電卓

あなたはまた、必要としないwhere定義、cおよびd外補助機能をようfで結構です。fその後、に短縮できf s@(_:n:_)=c s||c(n:s)ます。
ライコニ

1
次に、Haskellのゴルフルールガイドに興味があるかもしれません。ルールではありませんが、の代わりに改行を使用できます;。同じバイトカウントですが、コードの可読性が向上します。
ライコニ

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

Pythonの399の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)

オンラインでお試しください!

説明:

最初に、文字列を2つのリストに分割します。1つは奇数インデックス付き要素、もう1つは偶数インデックス付き要素です。2つのリストAとBは、次のいずれかです。

  1. Aには同じ番号が含まれ、Bには昇順で連続した番号が含まれます。

またはちょうど反対

  1. Bには同じ番号が含まれ、Aには昇順で連続した番号が含まれます。

連続条件は、次の方法で確認されます。 a in '123456789'

同じ番号の条件は、次の方法で確認されます。 all(i=a[x] for i in a)


1
のインスタンスをiwithに置き換えk<1i引数をまとめて削除できます。
小麦ウィザード

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ます

配列内の次の文字列のいずれかで入力のオカレンスを検索します

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の3167の161 157 131 106バイト

@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)

オンラインでお試しください!


さらにゴルフすることができます。すでに編集しています。
ミスターXcoder

あなたは私の答えでこのトリックを見たかもしれませんset(c)が、と同じ{*c}です。(少なくともpython 3)
小麦ウィザード

@WheatWizardありがとう。編集
ミスターXcoder

3
[t[z]for z in range(0,len(t),2)]また、単なるリストスプライスです。これは単にを使用して行うことができますt[::2]。この構文に慣れていない場合は、ドキュメントを参照することをお勧めします。これは非常に便利だからです。
小麦ウィザード

@WheatWizardうわー、それは本当に便利です。残念ながら、私は今すぐ答えを編集できません。できるだけ早くそうします。アドバイス...のためにたくさんThaks
氏Xcoder

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)

(末尾の改行)各桁を、それ自体と、その前の2つのスポットとの差に変換します

^1+;1+

(末尾の改行)最初の2桁を削除します

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

このパターンの一致数をカウントします。これは、0と1を交互にチェックします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.