JavaScript, 66 65 62 60 bayt
Girdi bir dize olarak alır, true
düzensiz sayılar için döner , tek haneli sayılar için boş bir dize (falsey) ve false
aksi halde.
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
Dene
Test etmek için 0-9
25 Snippet'i ve 25 rasgele sayıyı çalıştırı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>
açıklama
Birkaç eğlenceli küçük hileler bu yüzden benden bir JS çözümü için nadir bir açıklama garanti düşünüyorum.
()=>
Basitçe, tamsayı dizesini çağrıldığında argüman olarak alan anonim bir işlevle başlarız.
[s,...a]
Bu argüman hemen 2 parametrelere Bozunmamış edilir: s
dizesindeki ilk karakter olmak ve a
kalan karakterler içeren bir dizidir olma (örneğin "461902"
olur s="4"
ve a=["6","1","9","0","2"]
).
a+a&&
İlk olarak, a
her iki olayı da dizgilere çeviren kendisiyle birleştiririz . Giriş tek basamaklı bir sayı a
ise boş olur ve bu nedenle dize olur ve boş olur; boş bir dize ve boş bir dize hala boş bir dizedir ve bu JS'de falsey olduğundan, mantıksal AND'de işlemeyi durdurur ve boş dizemizi çıkarırız. Diğer tüm durumlarda a+a
doğruluk olacaktır ve bu nedenle işlevin bir sonraki bölümüne devam ediyoruz.
a.every(x=>)
Her eleman olmadığı kontrol olacağım x
içinde a
dönüşleri true
bir fonksiyonu geçerken.
y=s<a
Bu, ilk karşılaştırmamızın ( <
veya >
) ne olacağını belirler ve sonra oradan değişeceğiz . Dize edip etmediğini kontrol s
az dizinin daha a
eğer, bu nedenle sürecinde bir dizeye döküm alır, s
daha az ilk karakterin daha a
, y
olacak true
ya false
da değilse.
s+"<>"[++y%2]+x
s
Başlangıçta ve x
sonunda geçerli değeri olan bir dize oluştururuz . Arasında, dizeye dizine "<>"
artırarak y
bize veren 2 oranında bir tamsayı ve modulo için başlangıç boolean değerini döküm, 0
ya 1
.
eval()
Bu dizeyi değerlendirin.
s=x
Son olarak, eval
görmezden geldiği ikinci bir argüman iletiriz ve bunu bir sonraki yinelemenin s
geçerli değerine ayarlamak için kullanırız x
.