Rakam deseniyle eşleşiyor mu?


23

Geçenlerde bir Matematik sınavına girdim ve testin belirli bir sayısının ilginç bir desenle eşleştiğini fark ettim. Number ( 28384) bu gibi görünen genel bir rakam dizisiyle eşleşti

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

Tek basamaklı tamsayılar nerede nve nerede x. Dizisi ya da başlayabilir xveya nbirlikte her iki ucundan ve xya n+y.

Göreviniz, çok basamaklı bir pozitif tamsayı verildiğinde, girişin kalıbın eşleşip eşleşmediğine bağlı olarak bir gerçek veya yanlış değer verir. Giriş 4 ila 18 rakam uzunluğunda olacak. Tamsayı bir dize temsili olarak giriş alabilir. Giriş 0 ile başlamayacak, ancak 0 ile bitebilir veya bitebilir.

n+y her zaman tek basamaklı bir sayı olacaktır (bu nedenle uzunluk sınırının 18 olması neden).

Test Kılıfları

Bunlar bir truthy değeri vermelidir

182838485868788898
4344
85868
12223242526

Ve bunlar falsey olmalı

12345
6724013635
36842478324836
1222232425
5859510511

Tüm kod golflerinde olduğu gibi, en kısa kod kazanır! İyi şanslar ve olasılıklar, sizin lehinize olsun!


Bir dize olarak girdi alabilir miyiz?
Kritixi Lithos

@KritixiLithos "Girdiyi, tamsayının dizgi gösterimi olarak alabilirsiniz."
Bay Xcoder

Her iki Are xve nkural uyan numaraları için sıfır olmayan?
Bay Xcoder

@ Mr.Xcoder sayı 0 ile başlayamaz, ancak 0s içerebilir veya
bitebilir

Yanıtlar:


8

Python 2 , 84 81 80 79 bayt

Ovs sayesinde -1 bayt

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

Çevrimiçi deneyin!


Python 3 , 82 79 78 77 bayt

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

Çevrimiçi deneyin!

Python 3'te biraz daha kısa, ancak kendi cevabını hakettiğini düşünmedim.


açıklama

gDize ve bir dizin (1 veya 0) alan bir işlev ayarladık . gdaha sonra len(set(x[a::2])), diğer tüm basamaklardaki benzersiz basamakların sayısı (x[a==0::2]in"123456789")olup olmadığını, diğer basamakların artan sırada olup olmadığına eşittir . Rakamlar artan sıradaysa, hepsinin aynı olup olmadığını döndürür, kümenin boş olup olmadığını sorar, bu da olamaz, dolayısıyla her zaman false döndürür.


Her zamanki gibi, aşıldım>. <
Bay

x[a<1::2]in"123456789"olabilir "0"<x[a<1::2]<":"(karakterleri karşılaştırmak karakterleri karşılaştırır)
CalculatorFeline

@CalculatorFeline Bunun doğru olduğunu sanmıyorum. Bu sadece dizenin bir sayı ile başladığını kontrol eder.
Buğday Sihirbazı,

Oh doğru, ancak bu tek karakter için çalışıyor.
Hesap MakinesiFeline

Ama gerçekten ihtiyacın var a<1mı? Öyle gözüküyor olabilir a.
Hesap MakinesiFeline

4

Jöle , 13 11 bayt

Ds2ZI’M¦Ẏ¬Ạ

Çevrimiçi deneyin!

Açıklama:

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 bayt

TG9LNýN.øŒ})˜Iå

Çevrimiçi deneyin!

açıklama

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

İşe yaramalı (test çalışmaları yapıldı), ancak herhangi bir kusur bulursanız lütfen bana bildirin.

14 Bayt, çıktı yanlış sayılmazsa:

TG9LNýN.øŒIåi1

2

D, 117 bayt

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

Kesinlikle kalitesiz, ama iyi çalışıyor

Çevrimiçi Deneyin!


2

Haskell, 108 113 97 95 bayt

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)

Örnek çağrı: f "182838485868788898"verimlerTrue

Açıklamaları ile Ungolfed versiyonu:

-- 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
Özellikle PPCG ve Haskell golf oynamalarına hoş geldiniz! isPrefixOfPrelude’de olmadığı için import Data.List, kodunuza eklemeniz veya bir alternatif kullanmanız gerekir, örn and(zipWith(==)(n:r)[n..]).
Laikoni

@Likonik: İpuçları için teşekkürler! Fonksiyonu buna göre değiştirdim.
siracusa

1
Bence x/=ysadece olabilir 1>0çünkü değilse x/=yo zaman x==yilk vaka yakalar o.
Hesap MakinesiFeline

Ayrıca where, ihtiyacın dışında , tanımlayıcı cve dyardımcı fonksiyonların fiyi olması gerekmez . fdaha sonra kısaltılabilir f s@(_:n:_)=c s||c(n:s).
Laikoni

1
O zaman Haskell'deki golf kuralları hakkında bir rehber olabilirsiniz . Kural olmasa da, yerine yeni satırları kullanabilirsiniz ;. Aynı bayt sayısı, ancak kodun okunabilirliğini artırır.
Laikoni

1

JavaScript (ES6), 66 63 60 bayt

Bir dize olarak girdi alır.

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

Test durumları


1

C (gcc), 123 bayt

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

Çevrimiçi deneyin!


1

Python 3 , 99 96 89 bayt

  • 3 bayt kaydedildi: all()işlev kullanımı
  • @WheatWizard 7 bayt kaydetti: shorthanding & |ve ekstra değişkenleri değiştirerekk<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)

Çevrimiçi deneyin!

Açıklama:

İlk önce dizeyi iki listeye ayırın: biri tek dizinli, diğeri çift dizinli elemanlar. İki A ve B listesinin şu şekilde olduğu varsayılmaktadır:

  1. A aynı sayıyı içerir ve B artan sırada ardışık sayıları içerir.

VEYA tam tersi

  1. B aynı sayıyı ve A artan düzende ardışık sayıları içerir.

Ardışık durum şu şekilde kontrol edilir: a in '123456789'

Aynı sayı koşulu şu şekilde kontrol edilir: all(i=a[x] for i in a)


1
iile örneklerini değiştirebilir k<1ve iargümanı hep birlikte bırakabilirsiniz .
Buğday Sihirbazı

1
Ayrıca ilk yüklemeyi parens içinde çevreleyip &yerine kullanabilirsiniz and. Sizinle orde değiştirilebilir |.
Wheat Wizard

1
Sonunda cevabınıza yaklaşırken görüyorum ..: D
officialaimm

1

PHP , 68 bayt

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

Çevrimiçi deneyin!

Arama dizesinin başlangıç ​​kısmından başlayan ve arama dizgesinin sonuna kadar olan ve truthy değeri olan falsy için hiçbir şey içermeyen çıktı dizisi

2 bayt için daha sen yerini alabilir echo$s;ile !!echo$s;almak için 1truthy değer olarak

Girişin oluşumunu dizede aşağıdaki dizelerden birinde bulun

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 bayt

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>

Bir dize olarak girdi alır.


1

MATL , 15 bayt

2L&),duw]hSFTX=

Çevrimiçi deneyin!

Sohbet sırasında @LuisMendo'nun yardımı ile. Boş çıktı + hatasının da 'sahte' olduğu düşünülürse X, skoru 14 bayta getirerek bırakılabileceğini unutmayın .

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 bayt

(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 bayt

ASm.+sMd.Tcz2&-GZ-H1

Çıktı []Sayı, sayı deseniyle eşleştiğinde, başka bir şey olduğunda .

Çevrimiçi deneyin!

Açıklamalar (girişli örnek 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 bayt

qU2Ssm{.+d.TcjQT2

Burada dene

Jelly cevabımla aynı algoritma.

Açıklama:

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 bayt

@ WheatWizard'ın önerileri sayesinde -55 bayt

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)

Çevrimiçi deneyin!


Daha fazla golf yapılabilir. Ben zaten düzenledim.
Bay Xcoder

Cevabımda bu numarayı görmüş olabilirsin ama set(c)aynı {*c}. (en azından python 3'te)
Buğday Sihirbazı,

@WheatWizard teşekkürler. Düzenleme
Bay Xcoder

3
[t[z]for z in range(0,len(t),2)]aynı zamanda sadece bir liste ekidir. Bunu basitçe yapabilirsin t[::2]. Bu sözdizimine aşina değilseniz, dokümanlara bir göz atmanızı öneririm, çünkü oldukça kullanışlıdır.
Buğday Sihirbazı,

@WheatWizard Vay, bu gerçekten yararlıdır. Ne yazık ki, şu anda cevabı düzenleyemiyorum. Bunu olabildiğince çabuk yapacağım. Tavsiye için çok teşekkürler ...
Bay Xcoder

0

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

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

Çevrimiçi deneyin!

Açıklama:

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

Retina , 47 bayt

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

^1+;1+

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

Çevrimiçi deneyin!

Desene uyuyorsa 1, uymuyorsa 0 çıktı

açıklama

.
$*11;

Her haneyi n'den n + 1'e, tek tek noktalı virgüllerle ayırarak dönüştürün

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

(Trailing newline) her basamağı kendisiyle kendisinden önceki 2 nokta arasındaki farka dönüştürür.

^1+;1+

(Trailing newline) ilk 2 haneyi kaldırır

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

Değişken 0 ve 1 ler için denetleyen bu kalıbın eşleşme sayısını sayar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.