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ść!


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.


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

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

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!


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

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


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!


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)


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
)

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.


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.

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])&

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): [] & [] -> []

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]

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!


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
}

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.