JavaScript, 66 65 62 60 bytes
Pega a entrada como uma sequência, retorna true
para números não desejados, uma sequência vazia (falsey) para números de um dígito e false
outros.
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
Tente
Execute o snippet abaixo para testar 0-9
e 25 números aleatórios <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>
Explicação
Alguns truques divertidos neste, então eu acho que merece uma explicação rara para uma solução JS de mim.
()=>
Começamos, simplesmente, com uma função anônima que pega a sequência inteira como argumento quando chamada.
[s,...a]
Esse argumento é imediatamente desestruturado em 2 parâmetros: s
sendo o primeiro caractere na string e a
sendo uma matriz que contém os caracteres restantes (por exemplo, "461902"
torna s="4"
- se e a=["6","1","9","0","2"]
).
a+a&&
Primeiro, concatenamos a
consigo mesmo, que lança as duas ocorrências em seqüências de caracteres. Se a entrada for um número de um dígito, a
ficará vazia e, portanto, se tornará uma sequência vazia; uma string vazia mais uma string vazia ainda é uma string vazia e, como isso é falso no JS, paramos de processar no AND lógico e produzimos nossa string vazia. Em todos os outros casos a+a
, será verdade e, portanto, continuamos na próxima parte da função.
a.every(x=>)
Nós vamos estar verificando se cada elemento x
em a
retornos true
ao passado através de uma função.
y=s<a
Isso determina qual será nossa primeira comparação ( <
ou >
) e, em seguida, alternaremos a partir daí. Verificamos se a string s
é menor que a matriz a
, que é convertida em uma string no processo, portanto, se s
é menor que o primeiro caractere ema
, y
será true
ou false
não.
s+"<>"[++y%2]+x
Construímos uma string com o valor atual de s
no início e x
no final. No meio, indexamos a string "<>"
incrementandoy
, seu valor booleano inicial em um número inteiro e modulo em 2, fornecendo-nos 0
ou 1
.
eval()
Avalie essa corda.
s=x
Finalmente, passamos um segundo argumento para eval
, que ele ignora, e o usamos para definir o valor de s
para o valor atual de x
para a próxima iteração.