JavaScript, 66 65 62 60 byte
Lấy đầu vào dưới dạng một chuỗi, trả về true
các số không có giá trị, một chuỗi trống (falsey) cho các số có một chữ số và mặt false
khác.
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
Thử nó
Chạy đoạn trích dưới đây để kiểm tra 0-9
và 25 số ngẫu nhiên <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>
Giải trình
Một vài thủ thuật nhỏ thú vị trong bài này vì vậy tôi nghĩ rằng nó đảm bảo một lời giải thích hiếm hoi cho một giải pháp JS từ tôi.
()=>
Chúng ta bắt đầu, đơn giản, với một hàm ẩn danh lấy chuỗi số nguyên làm đối số khi được gọi.
[s,...a]
Đối số đó ngay lập tức bị phá hủy thành 2 tham số: s
là ký tự đầu tiên trong chuỗi và a
là một mảng chứa các ký tự còn lại (ví dụ: "461902"
trở thành s="4"
và a=["6","1","9","0","2"]
).
a+a&&
Đầu tiên, chúng ta ghép nối a
với chính nó, điều này tạo ra cả hai lần xuất hiện cho chuỗi. Nếu đầu vào là một số có một chữ số thì a
sẽ trống và do đó, trở thành và chuỗi rỗng; một chuỗi rỗng cộng với một chuỗi rỗng vẫn là một chuỗi rỗng và vì đó là lỗi trong JS, chúng ta dừng xử lý ở logic VÀ và xuất chuỗi rỗng của chúng ta. Trong tất cả các trường hợp khác a+a
sẽ là sự thật và vì vậy chúng tôi tiếp tục đến phần tiếp theo của chức năng.
a.every(x=>)
Chúng tôi sẽ kiểm tra nếu mọi phần tử x
trong a
lợi nhuận true
khi đi ngang qua một hàm.
y=s<a
Điều này xác định so sánh đầu tiên của chúng tôi sẽ là ( <
hoặc >
) và sau đó chúng tôi sẽ thay thế từ đó. Chúng tôi kiểm tra xem chuỗi s
có nhỏ hơn mảng không a
, có được truyền thành chuỗi trong quy trình hay không, nếu s
ít hơn ký tự đầu tiên trong a
, y
sẽ true
hoặc false
nếu không.
s+"<>"[++y%2]+x
Chúng tôi xây dựng một chuỗi với giá trị hiện s
tại ở đầu và x
cuối. Ở giữa, chúng tôi lập chỉ mục vào chuỗi "<>"
bằng cách tăng y
, chuyển giá trị boolean ban đầu của nó thành một số nguyên và modulo bằng 2, cho chúng ta 0
hoặc 1
.
eval()
Eval chuỗi đó.
s=x
Cuối cùng, chúng ta chuyển một đối số thứ hai eval
, mà nó bỏ qua và sử dụng nó để đặt giá trị của s
giá trị hiện tại x
cho lần lặp tiếp theo.