Corresponde ao padrão de dígitos?

23

Recentemente, fiz um teste de matemática e notei que um determinado número no teste correspondia a um padrão interessante. O número ( 28384) corresponde a uma sequência genérica de dígitos semelhante a esta

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

onde ne xsão números inteiros de um dígito. A sequência pode começar com um xou ne terminar com um xou n+y.

Sua tarefa é, dado um número inteiro positivo de vários dígitos, gerar um valor de verdade ou falsey, dependendo se a entrada corresponde ao padrão. A entrada terá entre 4 e 18 dígitos. Você pode receber a entrada como uma representação de seqüência de caracteres do número inteiro. A entrada não começará com um 0, mas pode conter ou terminar com 0s.

n+y sempre será um número de um dígito (por isso, o limite de comprimento é 18).

Casos de teste

Isso deve gerar um valor verdadeiro

182838485868788898
4344
85868
12223242526

E estes devem ser falsey

12345
6724013635
36842478324836
1222232425
5859510511

Como em todos os campos de código, o código mais curto vence! Boa sorte e que as probabilidades estejam sempre a seu favor!

caird coinheringaahing
fonte
Podemos considerar a entrada como uma string?
Kritixi Lithos
@KritixiLithos "Você pode receber entrada como uma representação de seqüência de caracteres do número inteiro."
Mr. Xcoder
São ambos xe ndiferentes de zero para os números que se encaixam na regra?
Mr. Xcoder
@ Mr.Xcoder o número não pode começar com um 0, mas pode conter ou terminar com 0s
caird coinheringaahing

Respostas:

8

Python 2 , 84 81 80 79 bytes

-1 byte graças a ovs

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

Experimente online!


Python 3 , 82 79 78 77 bytes

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

Experimente online!

Um pouco mais curto no Python 3, mas não achei que merecesse sua própria resposta.


Explicação

Montamos uma função gque recebe string e um índice (1 ou 0). gem seguida, retorna se é ou não len(set(x[a::2]))o número de dígitos únicos em todas as outras posições, é igual a (x[a==0::2]in"123456789"), se os outros dígitos estão ou não em ordem crescente. Se os dígitos estiverem em ordem crescente, retornará se são todos iguais ou não; caso contrário, perguntará se o conjunto está vazio, o que não pode ser, retornando sempre falso.

Assistente de Trigo
fonte
Como de costume, fui derrotado>. <
Mr. Xcoder
x[a<1::2]in"123456789"pode ser "0"<x[a<1::2]<":"(comparando chars e comparando charcodes)
CalculatorFeline
@CalculatorFeline Não acho que isso seja verdade. Isso apenas verifica se a sequência começa com um número.
Assistente de trigo
Ah, certo, no entanto, isso funciona para caracteres únicos.
CalculatorFeline
Mas você realmente precisa a<1? Parece que isso pode ser justo a.
CalculatorFeline
4

Geléia , 13 11 bytes

Ds2ZI’M¦Ẏ¬Ạ

Experimente online!

Explicação:

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, o Outgolfer
fonte
2

05AB1E , 15 bytes

TG9LNýN.øŒ})˜Iå

Experimente online!

Explicação

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

Deve funcionar (os casos de teste funcionaram), mas se você encontrar alguma falha, entre em contato.

14 bytes se nenhuma saída conta como falso:

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

D, 117 bytes

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

Definitivamente abaixo do ideal, mas funciona bem

Experimente Online!

TuxCrafting
fonte
2

Haskell, 108 113 97 95 bytes

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)

Exemplo de chamada: f "182838485868788898"rendimentosTrue

Versão não destruída com explicações:

-- 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
fonte
2
Bem-vindo ao PPCG e Haskell, em particular! isPrefixOfnão está no Prelude, então você deve incluir import Data.Listno seu código ou usar uma alternativa, por exemplo and(zipWith(==)(n:r)[n..]).
Laikoni
@Laikoni: Obrigado pela dica! Substituí a função de acordo.
Siracusa
1
Eu acho que x/=ypode ser 1>0porque, se não for x/=y, x==yo primeiro caso pega.
CalculatorFeline
Você também não precisa das funções de wheredefinição ce de ajuda dexterna f. fpode então ser encurtado para f s@(_:n:_)=c s||c(n:s).
Laikoni
1
Então você pode estar interessado no guia de regras de golfe em Haskell . Mesmo que não seja uma regra, você pode usar novas linhas em vez de ;. É a mesma contagem de bytes, mas melhora a legibilidade do código.
Laikoni
1

JavaScript (ES6), 66 63 60 bytes

Recebe a entrada como uma sequência.

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

Casos de teste

Arnauld
fonte
1

C (gcc), 123 bytes

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

Experimente online!

Steadybox
fonte
1

Python 3 , 99 96 89 bytes

  • 3 bytes salvos: uso da all()função
  • O @WheatWizard salvou 7 bytes: abreviação & |e substitui a variável extra pork<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)

Experimente online!

Explicação:

Primeiro, divida a sequência em duas listas: uma com elementos ímpares e outra com elementos pares. As duas listas A e B devem ser tais que:

  1. A contém o mesmo número e B contém números consecutivos em ordem crescente.

OU exatamente o oposto

  1. B contém o mesmo número e A contém números consecutivos em ordem crescente.

A condição consecutiva é verificada por: a in '123456789'

A condição de mesmo número é verificada por: all(i=a[x] for i in a)

officialaimm
fonte
1
você pode substituir instâncias de icom k<1e soltar o iargumento todos juntos.
Assistente de trigo
1
Você também pode colocar o primeiro predicado entre parênteses e usá-lo em &vez de and. O seu também orpode ser substituído |.
Assistente de trigo
1
Eu vejo isso eventualmente convergindo para a sua resposta ..: D
officialaimm
1

PHP , 68 bytes

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

Experimente online!

Parte de saída da string de pesquisa iniciando e incluindo a primeira ocorrência de entrada até o final da string de pesquisa como valor de verdade e nada para falsidade

por mais 2 bytes você pode substituir echo$s;por !!echo$s;para obter o 1valor mais verdadeiro

Encontre a ocorrência da entrada em uma das seguintes seqüências de caracteres na matriz

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
fonte
1

JavaScript (ES6), 54 bytes

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>

Recebe a entrada como uma sequência.

Neil
fonte
1

MATL , 15 bytes

2L&),duw]hSFTX=

Experimente online!

Com alguma ajuda de @LuisMendo no chat. Observe que, se a saída vazia + o erro também for considerado 'falso', ele Xpoderá ser deixado de fora, aumentando a pontuação para 14 bytes .

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
fonte
0

Mathematica, 121 bytes

(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
fonte
0

Pitão , 20 bytes

ASm.+sMd.Tcz2&-GZ-H1

Saída []quando o número corresponde ao padrão de dígitos, qualquer outra coisa.

Experimente online!

Explicações (exemplo com entrada 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
fonte
0

Pitão, 17 bytes

qU2Ssm{.+d.TcjQT2

Experimente aqui

O mesmo algoritmo da minha resposta Jelly.

Explicação:

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, o Outgolfer
fonte
0

Python 3 , 167 161 157 131 106 bytes

-55 bytes graças às sugestões de @ 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)

Experimente online!

Mr. Xcoder
fonte
Pode ser jogado ainda mais. Eu já edito.
Mr. Xcoder
Você pode ter visto esse truque na minha resposta, mas set(c)é o mesmo que {*c}. (pelo menos em python 3)
Assistente de trigo
@WheatWizard thanks. Edição
Mr. Xcoder
3
[t[z]for z in range(0,len(t),2)]também é apenas uma emenda da lista. Você pode fazer isso simplesmente com t[::2]. Se você não estiver familiarizado com esta sintaxe, sugiro dar uma olhada nos documentos, porque é bastante útil.
Assistente de trigo
@ WheatWizard Uau, isso é realmente útil. Infelizmente, não posso editar a resposta agora. Eu farei isso o mais rápido possível. Thaks muito para o conselho ...
Mr. Xcoder
0

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

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

Experimente online!

Explicação:

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
fonte
0

Retina , 47 bytes

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

^1+;1+

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

Experimente online!

Emite 1 se corresponder ao padrão, 0 se não corresponder

Explicação

.
$*11;

Converta cada dígito n em n + 1 em unário, separados por ponto e vírgula

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

(Trailing newline) converte cada dígito na diferença entre si e os dois pontos anteriores

^1+;1+

(Trailing newline) remove os 2 primeiros dígitos

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

Conta o número de correspondências desse padrão, que verifica 0s e 1s alternados

PunPun1000
fonte