Apakah itu cocok dengan pola digit?

23

Baru-baru ini saya mengikuti tes Matematika dan memperhatikan bahwa angka tertentu pada tes tersebut cocok dengan pola yang menarik. Angka ( 28384) cocok dengan urutan digit umum yang terlihat seperti ini

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

di mana ndan xbilangan bulat satu digit. Urutan dapat dimulai dengan salah satu xatau ndan diakhiri dengan salah satu xatau n+y.

Tugas Anda adalah, diberi bilangan bulat positif multi-digit, menampilkan nilai true atau falsey, tergantung pada apakah input cocok dengan pola. Input akan antara 4 dan 18 digit. Anda dapat mengambil input sebagai representasi string dari integer. Input tidak akan mulai dengan 0 tetapi dapat berisi atau diakhiri dengan 0s.

n+y akan selalu menjadi angka satu digit (karenanya mengapa batas panjangnya adalah 18).

Uji Kasus

Ini harus menghasilkan nilai yang benar

182838485868788898
4344
85868
12223242526

Dan ini harusnya palsu

12345
6724013635
36842478324836
1222232425
5859510511

Seperti halnya semua kode golf, kode terpendek menang! Semoga sukses dan semoga peluangnya, selalu menguntungkan Anda!

caird coinheringaahing
sumber
Bisakah kita mengambil input sebagai string?
Kritixi Lithos
@KritixiLithos "Anda dapat mengambil input sebagai representasi string dari integer."
Tn. Xcoder
Apakah keduanya xdan nbukan nol untuk angka yang sesuai dengan aturan?
Tn. Xcoder
@ Mr.Xcoder nomor tidak dapat dimulai dengan 0 tetapi dapat berisi atau diakhiri dengan 0s
caird coinheringaahing

Jawaban:

8

Python 2 , 84 81 80 79 byte

-1 byte berkat ovs

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

Cobalah online!


Python 3 , 82 79 78 77 byte

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

Cobalah online!

Sedikit lebih pendek di Python 3, tapi saya pikir itu tidak pantas jawabannya sendiri.


Penjelasan

Kami mengatur fungsi gyang mengambil string dan indeks (baik 1 atau 0). gkemudian mengembalikan apakah atau tidak len(set(x[a::2])), yaitu jumlah digit unik di setiap posisi lain, sama dengan (x[a==0::2]in"123456789"), apakah digit lainnya berada dalam urutan menaik atau tidak. Jika digit dalam urutan menaik, ini mengembalikan apakah semuanya sama atau tidak, jika tidak akan bertanya apakah set kosong, yang tidak bisa, sehingga selalu kembali salah.

Wisaya Gandum
sumber
Seperti biasa, saya telah dikalahkan>. <
Mr. Xcoder
x[a<1::2]in"123456789"bisa "0"<x[a<1::2]<":"(membandingkan karakter membandingkan karakter)
CalculatorFeline
@ CalculatorFeline Saya tidak berpikir itu benar. Itu hanya memeriksa bahwa string dimulai dengan angka.
Wheat Wizard
Oh benar, namun itu berfungsi untuk karakter tunggal.
CalculatorFeline
Tetapi apakah Anda benar-benar membutuhkan a<1? Sepertinya itu bisa adil a.
CalculatorFeline
4

Jelly , 13 11 byte

Ds2ZI’M¦Ẏ¬Ạ

Cobalah online!

Penjelasan:

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
Erik the Outgolfer
sumber
2

05AB1E , 15 byte

TG9LNýN.øŒ})˜Iå

Cobalah online!

Penjelasan

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

Ini seharusnya bekerja (test case berhasil) tetapi jika Anda menemukan kekurangan tolong beri tahu saya.

14 Bytes jika tidak ada output yang dianggap palsu:

TG9LNýN.øŒIåi1
Datboi
sumber
2

D, 117 byte

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;}

Jelas suboptimal, tetapi berfungsi dengan baik

Cobalah secara Online!

TuxCrafting
sumber
2

Haskell, 108 113 97 95 byte

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)

Contoh panggilan: f "182838485868788898"hasilTrue

Versi tidak dikoleksi dengan penjelasan:

-- 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
siracusa
sumber
2
Selamat datang di PPCG dan golf Haskell khususnya! isPrefixOftidak ada di Pendahuluan, jadi Anda harus memasukkan import Data.Listdalam kode Anda atau menggunakan alternatif, misalnya and(zipWith(==)(n:r)[n..]).
Laikoni
@Laikoni: Terima kasih atas petunjuknya! Saya mengganti fungsinya.
siracusa
1
Saya pikir x/=ybisa saja 1>0karena jika tidak x/=ymaka x==ykasus pertama menangkapnya.
CalculatorFeline
Anda juga tidak memerlukan where, mendefinisikan cdan dsebagai fungsi tambahan di luar ftidak masalah. fkemudian dapat disingkat menjadi f s@(_:n:_)=c s||c(n:s).
Laikoni
1
Maka Anda mungkin tertarik pada panduan aturan golf di Haskell . Meskipun ini bukan aturan, Anda bisa menggunakan baris baru ;. Itu jumlah byte yang sama tetapi meningkatkan keterbacaan kode.
Laikoni
1

JavaScript (ES6), 66 63 60 byte

Mengambil input sebagai string.

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

Uji kasus

Arnauld
sumber
1

C (gcc), 123 byte

#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;}

Cobalah online!

Steadybox
sumber
1

Python 3 , 99 96 89 byte

  • Disimpan 3 byte: penggunaan all()fungsi
  • @WheatWizard menyimpan 7 byte: shorthanding & |dan mengganti variabel tambahan dengank<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)

Cobalah online!

Penjelasan:

Pertama-tama pisahkan string menjadi dua daftar: satu dengan indeks yang aneh dan yang lainnya dengan elemen indeks yang rata. Dua daftar A dan B seharusnya sedemikian rupa sehingga:

  1. A berisi nomor yang sama dan B berisi angka berurutan dalam urutan menaik.

ATAU justru sebaliknya

  1. B berisi nomor yang sama dan A berisi angka berurutan dalam urutan menaik.

Kondisi berturut-turut diperiksa oleh: a in '123456789'

Kondisi nomor yang sama diperiksa oleh: all(i=a[x] for i in a)

officialaimm
sumber
1
Anda bisa mengganti instance idengan k<1dan meletakkan iargumen bersama-sama.
Wheat Wizard
1
Anda juga dapat mengelilingi predikat pertama di parens dan gunakan &sebagai gantinya and. Anda orjuga bisa diganti |.
Wheat Wizard
1
Saya melihat ini pada akhirnya mengarah pada jawaban Anda ..: D
officialaimm
1

PHP , 68 byte

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

Cobalah online!

Keluarkan bagian dari string pencarian mulai dari dan termasuk kemunculan input pertama hingga akhir string pencarian sebagai nilai sebenarnya dan tidak ada yang salah untuk falsy

untuk 2 Bytes lebih banyak, Anda dapat menggantinya echo$s;dengan !!echo$s;untuk mendapatkan 1nilai kebenaran

Temukan kemunculan input di salah satu string berikut dalam array

Array
(
    [0] => 0102030405060708090
    [1] => 1112131415161718191
    [2] => 2122232425262728292
    [3] => 3132333435363738393
    [4] => 4142434445464748494
    [5] => 5152535455565758595
    [6] => 6162636465666768696
    [7] => 7172737475767778797
    [8] => 8182838485868788898
    [9] => 9192939495969798999
)
Jörg Hülsermann
sumber
1

JavaScript (ES6), 54 byte

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>

Mengambil input sebagai string.

Neil
sumber
1

MATL , 15 byte

2L&),duw]hSFTX=

Cobalah online!

Dengan bantuan @LuisMendo dalam obrolan. Perhatikan bahwa, jika output kosong + kesalahan juga dianggap 'salah', maka Xdapat diabaikan, sehingga skor menjadi 14 byte .

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.
Sanchises
sumber
0

Mathematica, 121 byte

(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])&
J42161217
sumber
0

Pyth , 20 byte

ASm.+sMd.Tcz2&-GZ-H1

Output []ketika nomor cocok dengan pola digit, apa pun sebaliknya.

Cobalah online!

Penjelasan (contoh dengan input 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): [] & [] -> []
Jim
sumber
0

Pyth, 17 byte

qU2Ssm{.+d.TcjQT2

Coba di sini

Algoritma yang sama dengan jawaban Jelly saya.

Penjelasan:

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]
Erik the Outgolfer
sumber
0

Python 3 , 167 161 157 131 106 byte

-55 byte berkat saran @ 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)

Cobalah online!

Tuan Xcoder
sumber
Dapat bermain golf lebih lanjut. Saya sudah mengedit.
Tn. Xcoder
Anda mungkin telah melihat trik ini dalam jawaban saya tetapi set(c)sama dengan {*c}. (setidaknya dalam python 3)
Wheat Wizard
@WheatWizard terima kasih. Pengeditan
Tn. Xcoder
3
[t[z]for z in range(0,len(t),2)]juga hanya sambatan daftar. Anda dapat melakukannya hanya dengan t[::2]. Jika Anda tidak terbiasa dengan sintaks ini, saya sarankan untuk memeriksa dokumen, karena ini sangat berguna.
Wheat Wizard
@WheatWizard Wow, itu sangat berguna. Sayangnya, saya tidak dapat mengedit jawabannya sekarang. Saya akan melakukannya sesegera mungkin. Terima kasih banyak atas sarannya ...
Tn. Xcoder
0

Java (OpenJDK 8) , 128 119 118 108 107 104 byte

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;}

Cobalah online!

Penjelasan:

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
}
Olivier Grégoire
sumber
0

Retina , 47 byte

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

^1+;1+

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

Cobalah online!

Output 1 jika cocok dengan pola, 0 jika tidak

Penjelasan

.
$*11;

Konversi setiap digit n ke n + 1 di unary, dipisahkan oleh titik koma

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

(Trailing newline) mengonversi setiap digit menjadi perbedaan antara dirinya dan satu 2 tempat sebelumnya

^1+;1+

(Mengikuti baris baru) menghapus 2 digit pertama

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

Menghitung jumlah kecocokan dari pola ini, yang memeriksa bolak 0 dan 1

PunPun1000
sumber