Czy pasuje do wzoru cyfr?

23

Niedawno miałem test z matematyki i zauważyłem, że pewna liczba w teście odpowiada interesującemu wzorowi. Liczba ( 28384) pasowała do ogólnej sekwencji cyfr, która wygląda następująco

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

gdzie ni xsą liczbami całkowitymi jednocyfrowymi. Sekwencja może rozpocząć albo xczy ni kończą albo xalbo n+y.

Twoim zadaniem jest, biorąc pod uwagę wielocyfrową dodatnią liczbę całkowitą, wygenerowanie wartości true lub falsey, w zależności od tego, czy dane wejściowe pasują do wzorca. Dane wejściowe będą miały długość od 4 do 18 cyfr. Możesz wziąć dane wejściowe jako ciąg znaków reprezentujący liczbę całkowitą. Wprowadzanie nie rozpocznie się od 0, ale może zawierać lub kończyć się na 0.

n+y będzie zawsze liczbą jednocyfrową (dlatego limit długości wynosi 18).

Przypadki testowe

Powinny one generować prawdziwą wartość

182838485868788898
4344
85868
12223242526

I te powinny być falsey

12345
6724013635
36842478324836
1222232425
5859510511

Jak w przypadku wszystkich golfów kodowych, wygrywa najkrótszy kod! Powodzenia i oby szanse zawsze były na twoją korzyść!

Cairney Coheringaahing
źródło
Czy możemy brać dane wejściowe jako ciąg?
Kritixi Lithos
@KritixiLithos „Możesz przyjmować dane wejściowe jako ciąg znaków reprezentujący liczbę całkowitą.”
Pan Xcoder,
Oba xi nniezerowe numery, które pasują tę regułę?
Pan Xcoder,
@ Mr.Xcoder numer nie może zaczynać się od 0, ale może zawierać lub kończyć się 0
caird coinheringaahing

Odpowiedzi:

8

Python 2 , 84 81 80 79 bajtów

-1 bajt dzięki ovs

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

Wypróbuj online!


Python 3 , 82 79 78 77 bajtów

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

Wypróbuj online!

Nieco krótszy w Pythonie 3, ale nie sądziłem, że zasługuje na własną odpowiedź.


Wyjaśnienie

Ustawiamy funkcję, gktóra pobiera ciąg znaków i indeks (1 lub 0). gnastępnie zwraca, czy len(set(x[a::2]))liczba unikalnych cyfr w każdej innej pozycji jest równa (x[a==0::2]in"123456789"), czy pozostałe cyfry są w porządku rosnącym. Jeśli cyfry są w porządku rosnącym, to zwraca, czy wszystkie są takie same, jeśli nie, zapyta, czy zestaw jest pusty, co nie może być, dlatego zawsze zwraca false.

Kreator pszenicy
źródło
Jak zwykle zostałem rozegrany>. <
Pan Xcoder,
x[a<1::2]in"123456789"może być "0"<x[a<1::2]<":"(porównując znaki porównuje znaki)
CalculatorFeline
@CalculatorFeline Nie sądzę, że to prawda. To tylko sprawdza, czy ciąg zaczyna się od liczby.
Wheat Wizard
No tak, ale działa to na pojedyncze postacie.
CalculatorFeline
Ale czy naprawdę potrzebujesz a<1? Wygląda na to, że to może być sprawiedliwe a.
CalculatorFeline,
4

Galaretka , 13 11 bajtów

Ds2ZI’M¦Ẏ¬Ạ

Wypróbuj online!

Wyjaśnienie:

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
źródło
2

05AB1E , 15 bajtów

TG9LNýN.øŒ})˜Iå

Wypróbuj online!

Wyjaśnienie

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

Powinno to działać (sprawdziły się przypadki testowe), ale jeśli znajdziesz jakieś wady, daj mi znać.

14 bajtów, jeśli żaden wynik nie jest liczony jako fałsz:

TG9LNýN.øŒIåi1
Datboi
źródło
2

D, 117 bajtów

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

Zdecydowanie nieoptymalne, ale działa dobrze

Wypróbuj online!

TuxCrafting
źródło
2

Haskell, 108 113 97 95 bajtów

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)

Przykładowe wywołanie: f "182838485868788898"wydajnośćTrue

Wersja bez golfa z objaśnieniami:

-- 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
źródło
2
Witamy w szczególności w PPCG i Haskell! isPrefixOfnie ma w Preludium, więc musisz dołączyć do import Data.Listkodu lub użyć alternatywy, np and(zipWith(==)(n:r)[n..]).
Laikoni
@Laikoni: Dzięki za podpowiedź! Odpowiednio zastąpiłem tę funkcję.
siracusa
1
Myślę, że x/=ymoże tak być, 1>0ponieważ jeśli nie, x/=yto x==ypierwsza sprawa go złapie.
CalculatorFeline
Nie potrzebujesz również wheredefiniowania ci djako funkcji pomocniczych poza fjest w porządku. fmożna następnie skrócić do f s@(_:n:_)=c s||c(n:s).
Laikoni
1
Może zainteresuje Cię przewodnik po regułach gry w golfa w Haskell . Mimo że nie jest to regułą, zamiast tego możesz użyć znaku nowej linii ;. Jest to ta sama liczba bajtów, ale poprawia czytelność kodu.
Laikoni
1

JavaScript (ES6), 66 63 60 bajtów

Pobiera dane wejściowe jako ciąg.

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

Przypadki testowe

Arnauld
źródło
1

C (gcc), 123 bajty

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

Wypróbuj online!

Steadybox
źródło
1

Python 3 , 99 96 89 bajtów

  • Zapisane 3 bajty: użycie all()funkcji
  • @WheatWizard zapisał 7 bajtów: stenografia & |i zastąp dodatkową zmienną przezk<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)

Wypróbuj online!

Wyjaśnienie:

Najpierw podziel ciąg na dwie listy: jedną z elementami o nieparzystym indeksowaniu, a drugą z elementami o parzystym indeksowaniu. Dwie listy A i B powinny być takie, aby:

  1. A zawiera tę samą liczbę, a B kolejne liczby w porządku rosnącym.

LUB wręcz przeciwnie

  1. B zawiera tę samą liczbę, a A kolejne liczby w porządku rosnącym.

Kolejny warunek jest sprawdzany przez: a in '123456789'

Warunek o tym samym numerze jest sprawdzany przez: all(i=a[x] for i in a)

Officialaimm
źródło
1
można zastąpić wystąpień iz k<1i upuść iargumentu razem.
Kreator pszenicy,
1
Możesz także otoczyć pierwszy predykat parenami i używać &zamiast niego and. Twój ormoże być również zastąpiony |.
Wheat Wizard
1
Widzę, że ostatecznie zbiega się to w kierunku twojej odpowiedzi ..: D
officialaimm
1

PHP , 68 bajtów

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

Wypróbuj online!

Wyjściowa część ciągu wyszukiwania zaczynająca się od pierwszego wystąpienia danych wejściowych na końcu ciągu wyszukiwania i od niego jako wartość zgodna z prawdą i bez fałszu

dla 2 bajty więcej można zastąpić echo$s;z !!echo$s;dostać 1jako wartość truthy

Znajdź wystąpienie danych wejściowych w jednym z poniższych ciągów w tablicy

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
źródło
1

JavaScript (ES6), 54 bajty

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>

Pobiera dane wejściowe jako ciąg.

Neil
źródło
1

MATL , 15 bajtów

2L&),duw]hSFTX=

Wypróbuj online!

Z pomocą @LuisMendo na czacie. Zauważ, że jeśli puste wyjście + błąd jest również uważane za „fałsz”, Xmożna je pominąć , zwiększając wynik do 14 bajtów .

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
źródło
0

Mathematica, 121 bajtów

(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
źródło
0

Pyth , 20 bajtów

ASm.+sMd.Tcz2&-GZ-H1

Wyprowadzane, []gdy liczba pasuje do wzorca cyfry, wszystko inne.

Wypróbuj online!

Objaśnienia (przykład z wejściem 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
źródło
0

Pyth, 17 bajtów

qU2Ssm{.+d.TcjQT2

Wypróbuj tutaj

Ten sam algorytm jak moja odpowiedź na galaretkę.

Wyjaśnienie:

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
źródło
0

Python 3 , 167 161 157 131 106 bajtów

-55 bajtów dzięki sugestiom @ 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)

Wypróbuj online!

Pan Xcoder
źródło
Można dalej grać w golfa. Już edytuję.
Pan Xcoder,
Być może widziałeś tę sztuczkę w mojej odpowiedzi, ale set(c)jest taka sama jak {*c}. (przynajmniej w python 3)
Wheat Wizard
@WheatWizard dzięki. Montaż
Mr. Xcoder,
3
[t[z]for z in range(0,len(t),2)]jest także tylko splotem listy. Możesz to zrobić po prostu za pomocą t[::2]. Jeśli nie znasz tej składni, sugeruję przejrzenie dokumentacji, ponieważ jest ona bardzo przydatna.
Wheat Wizard
@WheatWizard Wow, to jest naprawdę przydatne. Niestety nie mogę teraz edytować odpowiedzi. Zrobię to tak szybko, jak to możliwe. Bardzo dużo rady ...
Pan Xcoder,
0

Java (OpenJDK 8) , 128 119 118 108 107 104 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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
źródło
0

Siatkówka , 47 bajtów

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

^1+;1+

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

Wypróbuj online!

Zwraca 1, jeśli pasuje do wzorca, 0, jeśli nie

Wyjaśnienie

.
$*11;

Konwertuj każdą cyfrę n na n + 1 w jedności, oddzielone średnikami

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

(Końcowy znak nowej linii) konwertuje każdą cyfrę na różnicę między nią a jedną 2 punktami przed nią

^1+;1+

(Końcowy znak nowej linii) usuwa pierwsze 2 cyfry

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

Liczy liczbę dopasowań tego wzorca, który sprawdza naprzemienne zera i jedynki

PunPun1000
źródło