JavaScript, 66 65 62 60 байт
Принимает ввод в виде строки, возвращает true
для неоправданных чисел, пустую строку (Falsey) для однозначных чисел и в false
противном случае.
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
Попытайся
Запустите фрагмент ниже, чтобы проверить 0-9
и 25 случайных чисел <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>
объяснение
Несколько забавных маленьких трюков в этом, так что я думаю, что это оправдывает редкое объяснение решения JS от меня.
()=>
Мы начинаем просто с анонимной функции, которая принимает целочисленную строку в качестве аргумента при вызове.
[s,...a]
Этот аргумент сразу же разбивается на 2 параметра: s
первый символ в строке и a
массив, содержащий оставшиеся символы (например, "461902"
становится s="4"
и a=["6","1","9","0","2"]
).
a+a&&
Во-первых, мы объединяем a
себя, что приводит оба вхождения к строкам. Если ввод представляет собой однозначное число, то оно a
будет пустым и, следовательно, станет пустой строкой; пустая строка плюс пустая строка по-прежнему является пустой строкой, и, поскольку в JS это неправильно, мы прекращаем обработку в логическом И и выводим нашу пустую строку. Во всех остальных случаях a+a
будет правдой, и поэтому мы переходим к следующей части функции.
a.every(x=>)
Мы будем проверять , если каждый элемент x
в a
возвратах true
при прохождении через функцию.
y=s<a
Это определяет, каким будет наше первое сравнение ( <
или >
), и затем мы будем чередоваться оттуда. Мы проверяем, s
меньше ли строка, чем массив a
, который получает приведение к строке в процессе, поэтому, если s
он меньше, чем первый символ в a
, y
будет true
или false
не будет.
s+"<>"[++y%2]+x
Мы строим строку с текущим значением s
в начале и x
в конце. В промежутке мы индексируем строку "<>"
, увеличивая y
ее начальное логическое значение на целое и по модулю 2, давая нам 0
или 1
.
eval()
Оцените эту строку.
s=x
Наконец, мы передаем второй аргумент eval
, который он игнорирует, и используем его, чтобы установить s
текущее значение x
для следующей итерации.