JavaScript, 66 65 62 60 byte
Mengambil input sebagai string, mengembalikan true
untuk nomor undulant, string kosong (falsey) untuk nomor digit tunggal dan false
sebaliknya.
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
Cobalah
Jalankan Cuplikan di bawah untuk menguji 0-9
dan 25 angka acak <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>
Penjelasan
Beberapa trik kecil yang menyenangkan di sini, jadi saya pikir itu memerlukan penjelasan langka untuk solusi JS dari saya.
()=>
Kita mulai, secara sederhana, dengan fungsi anonim yang mengambil string integer sebagai argumen ketika dipanggil.
[s,...a]
Argumen itu segera dirusak menjadi 2 parameter: s
menjadi karakter pertama dalam string dan a
menjadi array yang berisi karakter yang tersisa (misalnya "461902"
menjadi s="4"
dan a=["6","1","9","0","2"]
).
a+a&&
Pertama, kami menggabungkan a
dengan dirinya sendiri, yang melemparkan kedua kejadian ke string. Jika input adalah angka satu digit maka a
akan kosong dan, oleh karena itu, menjadi dan string kosong; string kosong ditambah string kosong masih merupakan string kosong dan, karena itu falsey di JS, kami berhenti memproses pada logika AND dan mengeluarkan string kosong kami. Dalam semua kasus lainnya a+a
akan menjadi kebenaran dan kami melanjutkan ke bagian fungsi selanjutnya.
a.every(x=>)
Kami akan memeriksa apakah setiap elemen x
dalam a
pengembalian true
ketika melewati suatu fungsi.
y=s<a
Ini menentukan apa yang akan menjadi perbandingan pertama kami ( <
atau >
) dan kemudian kami akan berganti dari sana. Kami memeriksa apakah string s
kurang dari array a
, yang akan dilemparkan ke string dalam proses jadi, jika s
kurang dari karakter pertama a
, y
akan menjadi true
atau false
jika tidak.
s+"<>"[++y%2]+x
Kami membangun string dengan nilai saat ini s
di awal dan x
di akhir. Di antaranya, kita mengindeks ke dalam string "<>"
dengan menambahkan y
, melemparkan nilai boolean awal ke integer, dan modulo dengan 2, memberi kita 0
atau 1
.
eval()
Eval string itu.
s=x
Akhirnya, kami memberikan argumen kedua eval
, yang diabaikannya, dan menggunakannya untuk mengatur nilai s
ke nilai saat ini x
untuk iterasi berikutnya.