JavaScript, 66 65 62 60 bytes
Toma la entrada como una cadena, regresa true
para números ondulantes, una cadena vacía (falsey) para números de un solo dígito y de false
otra manera.
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
Intentalo
Ejecute el fragmento a continuación para probar 0-9
y 25 números aleatorios <10,000,000
.
f=
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
tests=new Set([...Array(10).keys()])
while(tests.add(Math.random()*1e7|0).size<35);
o.innerText=[...tests].map(x=>(x=x+``).padStart(7)+` = `+JSON.stringify(f(x))).join`\n`
<pre id=o></pre>
Explicación
Algunos trucos divertidos en este caso, así que creo que justifica una explicación rara para mí de una solución JS.
()=>
Comenzamos, simplemente, con una función anónima que toma la cadena entera como argumento cuando se llama.
[s,...a]
Ese argumento se desestructura de inmediato en 2 parámetros: s
ser el primer carácter de la cadena y a
ser una matriz que contiene los caracteres restantes (por ejemplo, se "461902"
convierte en s="4"
y a=["6","1","9","0","2"]
).
a+a&&
Primero, nos concatenamos a
consigo mismos, lo que convierte ambas ocurrencias en cadenas. Si la entrada es un número de un solo dígito, a
estará vacío y, por lo tanto, se convertirá en una cadena vacía; una cadena vacía más una cadena vacía sigue siendo una cadena vacía y, como eso es falsey en JS, detenemos el procesamiento en el AND lógico y sacamos nuestra cadena vacía. En todos los demás casos a+a
será veraz y, por lo tanto, continuaremos con la siguiente parte de la función.
a.every(x=>)
Comprobaremos si cada elemento x
en a
devuelve true
cuando se pasa a través de una función.
y=s<a
Esto determina cuál será nuestra primera comparación ( <
o >
) y luego alternaremos desde allí. Verificamos si la cadena s
es menor que la matriz a
, que se convierte en una cadena en el proceso, por lo que, si s
es menor que el primer carácter a
, y
será true
o false
no.
s+"<>"[++y%2]+x
Construimos una cadena con el valor actual de s
al principio y x
al final. En el medio, indexamos en la cadena "<>"
incrementando y
, convirtiendo su valor booleano inicial en un número entero, y el módulo en 2, dándonos 0
o 1
.
eval()
Evalúa esa cuerda.
s=x
Finalmente, pasamos un segundo argumento a eval
, que ignora, y lo usamos para establecer el valor de s
al valor actual de x
para la próxima iteración.