¿Coincide con el patrón de dígitos?

23

Recientemente tuve una prueba de matemáticas y noté que cierto número en la prueba coincidía con un patrón interesante. El número ( 28384) coincide con una secuencia de dígitos genéricos que se ve así

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

donde ny xson enteros de un solo dígito. La secuencia puede comenzar con uno xo ny terminar con uno xo n+y.

Su tarea es, dado un entero positivo de varios dígitos, generar un valor verdadero o falso, dependiendo de si la entrada coincide con el patrón. La entrada tendrá entre 4 y 18 dígitos. Puede tomar la entrada como una representación de cadena del número entero. La entrada no comenzará con un 0 pero puede contener o terminar con 0.

n+y siempre será un número de un solo dígito (de ahí que el límite de longitud sea 18).

Casos de prueba

Estos deberían generar un valor verdadero

182838485868788898
4344
85868
12223242526

Y estos deberían ser falsey

12345
6724013635
36842478324836
1222232425
5859510511

Como con todos los códigos de golf, ¡el código más corto gana! ¡Buena suerte y que las probabilidades estén siempre a tu favor!

caird coinheringaahing
fuente
¿Podemos tomar la entrada como una cadena?
Kritixi Lithos
@KritixiLithos "Puede tomar la entrada como una representación de cadena del número entero".
Sr. Xcoder
¿Son ambos xy nno cero para los números que se ajustan a la regla?
Sr. Xcoder
@ Mr.Xcoder el número no puede comenzar con un 0 pero puede contener o terminar con 0s
caird coinheringaahing

Respuestas:

8

Python 2 , 84 81 80 79 bytes

-1 byte gracias 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")

Pruébalo en línea!


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")

Pruébalo en línea!

Un poco más corto en Python 3, pero no pensé que mereciera su propia respuesta.


Explicación

Configuramos una función gque toma una cadena y un índice (ya sea 1 o 0). gluego devuelve si o no len(set(x[a::2])), es decir, el número de dígitos únicos en cualquier otra posición, es igual a (x[a==0::2]in"123456789"), si los otros dígitos están en orden ascendente o no. Si los dígitos están en orden ascendente, esto devuelve si son todos iguales o no, de lo contrario, preguntará si el conjunto está vacío, lo que no puede ser, por lo tanto siempre devuelve falso.

Asistente de trigo
fuente
Como de costumbre, me han superado>. <
Sr. Xcoder
x[a<1::2]in"123456789"puede ser "0"<x[a<1::2]<":"(comparar caracteres compara códigos de acceso)
CalculatorFeline
@CalculatorFeline No creo que sea cierto. Eso solo comprueba que la cadena comienza con un número.
Wheat Wizard
Ah, claro, sin embargo, eso funciona para personajes individuales.
CalculatorFeline
¿Pero realmente lo necesitas a<1? Parece que eso puede ser justo a.
CalculatorFeline
4

Jalea , 13 11 bytes

Ds2ZI’M¦Ẏ¬Ạ

Pruébalo en línea!

Explicación:

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 el Outgolfer
fuente
2

05AB1E , 15 bytes

TG9LNýN.øŒ})˜Iå

Pruébalo en línea!

Explicación

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

Debería funcionar (los casos de prueba funcionaron), pero si encuentra algún defecto, hágamelo saber.

14 bytes si ninguna salida cuenta como falso:

TG9LNýN.øŒIåi1
Datboi
fuente
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 subóptimo, pero funciona bien

¡Pruébelo en línea!

TuxCrafting
fuente
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)

Llamada de muestra: f "182838485868788898"rendimientosTrue

Versión sin golf con explicaciones:

-- 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
fuente
2
¡Bienvenido a PPCG y al golf Haskell en particular! isPrefixOfno está en Prelude, por lo que debe incluir import Data.Listen su código o utilizar una alternativa, por ejemplo and(zipWith(==)(n:r)[n..]).
Laikoni
@Laikoni: ¡Gracias por la pista! Reemplacé la función en consecuencia.
siracusa
1
Creo que x/=ypuede ser 1>0porque si no es x/=yasí x==yy el primer caso lo atrapa.
CalculatorFeline
Tampoco necesita las funciones wheredefinitorias cy dauxiliares fuera de festá bien. fentonces se puede acortar a f s@(_:n:_)=c s||c(n:s).
Laikoni
1
Entonces te puede interesar la guía de reglas de golf en Haskell . Aunque no es una regla, puede usar nuevas líneas en lugar de ;. Es el mismo recuento de bytes, pero mejora la legibilidad del código.
Laikoni
1

JavaScript (ES6), 66 63 60 bytes

Toma la entrada como una cadena.

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

Casos de prueba

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

Pruébalo en línea!

Steadybox
fuente
1

Python 3 , 99 96 89 bytes

  • 3 bytes guardados: uso de la all()función
  • @WheatWizard guardó 7 bytes: shorthanding & |y reemplazar variable adicional 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)

Pruébalo en línea!

Explicación:

Primero divida la cadena en dos listas: una con elementos indexados impares y otra con elementos indexados pares. Se supone que las dos listas A y B son tales que:

  1. A contiene el mismo número y B contiene números consecutivos en orden ascendente.

O todo lo contrario

  1. B contiene el mismo número y A contiene números consecutivos en orden ascendente.

La condición consecutiva es verificada por: a in '123456789'

La condición del mismo número se verifica mediante: all(i=a[x] for i in a)

officialaimm
fuente
1
puede reemplazar instancias de icon k<1y soltar el iargumento todos juntos.
Wheat Wizard
1
También puede rodear el primer predicado en parens y usarlo en &lugar de and. Tuor puede ser reemplazado con |también.
Wheat Wizard
1
Veo que esto finalmente converge hacia su respuesta ...: D
officialaimm
1

PHP , 68 bytes

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

Pruébalo en línea!

Salida de parte de la cadena de búsqueda a partir de e incluyendo la primera aparición de entrada al final de la cadena de búsqueda como valor verdadero y nada falso

para 2 Bytes más se puede reemplazar echo$s;con !!echo$s;obtener 1como valor Truthy

Encuentre la aparición de la entrada en una de las siguientes cadenas de la 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
fuente
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>

Toma la entrada como una cadena.

Neil
fuente
1

MATL , 15 bytes

2L&),duw]hSFTX=

Pruébalo en línea!

Con algo de ayuda de @LuisMendo en el chat. Tenga en cuenta que, si la salida vacía + error también se considera 'falso', Xse puede omitir, llevando la puntuación a 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
fuente
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
fuente
0

Pyth , 20 bytes

ASm.+sMd.Tcz2&-GZ-H1

Salida [] cuando el número coincide con el patrón de dígitos, cualquier otra cosa.

Pruébalo en línea!

Explicaciones (ejemplo con 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
fuente
0

Pyth, 17 bytes

qU2Ssm{.+d.TcjQT2

Pruébalo aquí

El mismo algoritmo que mi respuesta Jelly.

Explicación:

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 el Outgolfer
fuente
0

Python 3 , 167161157131106 bytes

-55 bytes gracias a las sugerencias 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)

Pruébalo en línea!

Sr. Xcoder
fuente
Se puede jugar más al golf. Ya edito.
Sr. Xcoder
Es posible que hayas visto este truco en mi respuesta, pero set(c)es lo mismo que {*c}. (al menos en Python 3)
Wheat Wizard
@WheatWizard gracias. Edición
Sr. Xcoder
3
[t[z]for z in range(0,len(t),2)]También es solo un empalme de lista. Puedes hacer esto simplemente con t[::2]. Si no está familiarizado con esta sintaxis, le sugiero que eche un vistazo a los documentos, porque es bastante útil.
Wheat Wizard
@WheatWizard Wow, eso es realmente útil. Lamentablemente, no puedo editar la respuesta en este momento. Lo haré tan pronto como pueda. Gracias por el consejo ...
Sr. 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;}

Pruébalo en línea!

Explicación:

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

Retina , 47 bytes

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

^1+;1+

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

Pruébalo en línea!

Emite 1 si coincide con el patrón, 0 si no coincide

Explicación

.
$*11;

Convierta cada dígito n en n + 1 en unario, separados por punto y coma

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

(Nueva línea final) convierte cada dígito a la diferencia entre sí mismo y los dos puntos anteriores.

^1+;1+

(Nueva línea final) elimina los primeros 2 dígitos

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

Cuenta el número de coincidencias de este patrón, que comprueba si hay 0 y 1 alternados

PunPun1000
fuente