Düzensiz sayılar


16

Bir düzensiz sayı, rakamlarının arasında değiştiği bir sayıdır aşağıdaki sayı gibi yukarı ve aşağı değiştiği bir sayıdır: 461902 veya 708143, hatta 1010101, ancak 123 değil, çünkü 2 <3.

Bir program ya da fonksiyonu bir sayı ise bir truthy değerini verir Yazın dalgalı , ve aksi takdirde falsy değer. En kısa kod kazanır.

Not : Tek haneli sayılar geçerli bir girdidir, ancak udulant olarak kabul edilmez , bu nedenle isUndulantn <10 için false değerini döndürür.


Dize, tamsayı, float ... olarak sayı girişi?
counterclockwis çevirmek için durdu

1
Buradaki amaç nedir? Kod golf (en kısa fonksiyon)?
Alexandru

1
@JBernardo: Özyineleme için daha iyi bir temel durum olacağı için Doğru ya da tanımsız davranışlar düşünürdüm.
Joey Adams

4
Düzgün sayı tanımınız standart tanımla uyumlu değil: mathworld.wolfram.com/UndulatingNumber.html . Bu kasıtlı mı?
mellamokb

9
Temel durum doğru olsaydı (IMHO gibi) çözümüm% 16 daha küçük olabilir.
eternalmatt

Yanıtlar:


6

J, 45

*./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=.

Örnek kullanım:

   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 461902
1
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 708143
1
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 1010101
1
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 123
0
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 5
0

Eminim /, bir seferde daha fazla iş yapmak için Insert'u çevirmenin daha iyi bir yolu var , ama aylardır J-less oldum, geri dönmem gerekiyor.


Bu problemde J'yi yenmek zor olacak. güzel bir çözüm!
leonardo

@ leoneon teşekkürler!
JB

6

Ruby, 72 70 karakter

Q=10;k=->n,v{(n%Q-n/Q%Q)*v<0?k[n/Q,-v]:n<Q};u=->n{n>9&&k[n,-1]|k[n,1]}

Kullanım ve testcases:

p u[10101]   # <= true
p u[708143]  # <= true
p u[2421]    # <= false
p u[1231]    # <= false
p u[873]     # <= false

Tek hane yanlış verir :

p u[5]       # <= false

Ardışık özdeş rakamlar da yanlış döndürür :

p u[66]      # <= false
p u[1221]    # <= false

6

J, 30 bayt

*/0<(#,]*{.*1 _1$~#)2-/\a.i.":

Diğer J cevaplarından farklı bir yaklaşım.

   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 461902
1
   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 708143
1
   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 1010101
1
   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 123
0
   * / 0 <(#,] * {. * 1 _1 $ ~ #) (} .-} :) ai ": 5
0

5 inatçı kabul edilirse 3 karakter daha kısa olurdu.


En azından kendimi bir saat boyunca liderlik ettiğim düşüncesiyle birleştirebilirim. :-)
Gareth

5

(pdf) eTeX, 129 karakter

\def\a#1#2{\if#2?\ifx\r\s\def\s{1}\else
True\end\fi\fi\edef\t{\pdfstrcmp{#2}{#1}}\ifx\s\t
False\end\fi\let\s\t\a#2}\expandafter\a

İle derleme pdfetex filename.tex 1324?bir pdf çıktı verir. TeX öncelikle dizgi yapan bir dildir ve stdout yerine çıktı almak yaklaşık 20 karakter daha sürecektir. Ayrıca tek basamaklı sayılar için garip gereksinim (doğru yerine yanlış) bana 26 karakter getiriyor.


5

Haskell, 88 77 73 65 karakterler

z=tail>>=zipWith compare
q[]=0>1
q s=all(/=EQ)$s++z s
u=q.z.show

Bu yaygın olarak kullanılan dil pragma (ya gerektirir -Xbayrağı): NoMonomorphismRestriction. Bunu kabul etmiyorsanız, 4 karakter eklememiz ve bunu tanımlamamız gerekir z:

z s=zipWith compare s$tail s

O kadar öfkeliyim ki, 104 karakterlik çözümümü yendin. u n=length s>1&&(a[GT,LT]||a[LT,GT])where s=show n;z=q compare s$tail s;w=q(==)z;q=zipWith;a=and.w.cycleÇok zarif. zipWithbir kez compareyaptığınız gibi, sonra zipWithtekrar (==)ve cycle[GT,LT]ya cycle[LT,GT]da ikinci arg olarak.
eternalmatt

w tail>>=zipWith comparedeğerini birkaç bayt kısaltır.
proud haskeller

Ayrıca, daha kısa bir sürümünü golf q:q[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
proud haskeller

aslında, işte daha da kısa bir versiyon: q s=and$all(/=EQ)s:zipWith(/=)s(tail s)
gururlu haskeller

@proudhaskeller - her iki sürüm de tüm testleri geçemez. Her ikisi de 3'te başarısız olur (Yanlış olmalıdır) ve birincisi 32 ve 101010101 gibi diğer birçok başarısız olur
MtnViewMark

4

Adaçayı, 83 76 bayt

f=lambda x:uniq(cmp(*`x`[i-2:i][::(-1)^i])for i in[2..len(`x`)])in[[1],[-1]]

JBernardo'dan cmp (* [..]) kullanma fikrim var. Sage, uniq(...)için bir takma addır list(set(...)).

Düzenleme: sadece uniq(cmp(...)) == []açık olmayan x <10 için fark ettim [[1],[-1]]. Eğer x tamsayı yerine dize olarak girilseydi, 4 karakter daha alabilirim!


O sum(uniq(...))^2zamandan beri kullanmak için bir fikrim vardı sum([1,-1]) = 0ve [1] ve [-1] karelerinin toplamları 1'e kareler. Ne yazık ki, üç kez tekrarlanan bir basamakta başarısız oluyor; 1011101.
boothby

Güzel. Adaçayı öğrenmeliyim. BTW, LPython'daki sayı 2 ** 32'den büyükse ve sonucu etkiliyorsa backticks'in ekleneceğini fark ettim . Sage'de bu olur mu?
JBernardo

Evet, Sage golf oynamak için birkaç şey yapar ... örneğin, saçma başlangıç ​​zamanı büyük bir modül ağacı ithal etmek için harcanır. Sage Integer sınıfı ile Luğraşmaz çünkü Sage python hazırlanır; 1234 -> Tamsayı ('1234'). Burada Sage'i
boothby

4

Python: 101100 karakter

Küçültmeden önce:

undulate = (lambda n: n > 9
            and all(cmp(*digits) == (i % 2) * 2 - 1
                    for i, digits
                    in enumerate(zip(min(`n`,`n`[1:]), 
                                     max(`n`,`n`[1:])))))

Küçültmeden sonra:

a=lambda b:b>9and all(cmp(*c)==d%2*2-1 for d,c in enumerate(zip(min(`b`,`b`[1:]),max(`b`,`b`[1:]))))

3

Python, 134 129 karakter

def f(x):d=[cmp(*i)for i in zip(`x`,`x`[1:])]if x>9 else[0];n=d[0]>0;return all(i<0 for i in d[n::2])&all(i>0 for i in d[n<1::2])

Ungolfed:

def f(x):
    if x>9:
        d = [cmp(*i)for i in zip(`x`,`x`[1:])] #difference of x[i] and x[i+1]
    else:
        d = [0]       #trick to return False if x<10 using less chars
    n = d[0]>0        #First digit is -1 or 1?
    neg = d[n::2]     #negative numbers if x is Undulant
    pos = d[not n::2] #positive numbers if x is Undulant

    #check if all negs are -1 and all pos are 1 and return value
    return all(i<0 for i in neg) and all(i>0 for i in pos)

3

JavaScript, 88 karakter

function _(i){i+='';c=i[0];f=i[a=x=1];for(g=f<c;d=i[x++];c=d)g^=a&=g?d<c:d>c;return!f^a}

Özünde, sayıyı bir dizeye dönüştürün ve bitişik karakterleri karşılaştırın, her biri için beklentiyi ters çevirin.


2
JavaScript'te, bir işlevin bir adı olması gerekmez ve soru açıkça bir işlev ister, böylece iki karakteri kaydedebilirsiniz.
Ry-

3

K, 41 bayt

{(x>9)&~max(=). 1_'-':'1_'(<':;>':)@\:$x}

Örneğin

{(x>9)&~max(=). 1_'-':'1_'(<':;>':)@\:$x}1212130659
1b

3

CoffeeScript, 98 67 53 bayt

(n)->0!in((n[i]>=c^(n[0]<n[1])+i)%2for c,i in n[1..])

Testler:

[
    '01010101' # true
    '12345'    # false
    '1010101'  # true
    '887685'   # false
    '9120734'  # true
    '090909'   # true
]

sıkıştırılmamış:

undulant = (n) ->
    direction = n[0] < n[1]
    return n.split('').every (cur, i) ->
        prev = arr[i-1] or 10 * direction
        +(prev >= cur) is (direction+i)%2

3

J, 44 39 36 31 bayt

*/2(0<#@],0>*/\)*2-/\".;' ',.":

Daha önce olduğu gibi kullanın.

Son düzenlememin 0 çek ile eşitsizliği tamamen gereksiz hale getirdiğini fark etmemiştim. :-)

Önceki cevap (+ açıklama):

(0=+/2=/\u)*(1<#u)**/2~:/\2<:/\u=.".;' ',.":

Kullanımı:

    (0=+/2=/\u)*(1<#u)**/2~:/\2<:/\u=.".;' ',.":461902
1

Cevap dört bölümden oluşmaktadır:

  1. u=.".;' ',.": Bu sayıyı bir dize olarak okur, ":boşluklardan önce gelen karakterler listesine böler ' ',., tekrar birleştirir ;, tekrar sayılara dönüştürür ".ve sonra sonucu saklar. u=.Bu temelde 461902'yi daha kolay bulduğum 4 6 1 9 0 2'ye dönüştürür J.'de işlemek

  2. */2~:/\2<:/\ Bu, u içinde saklanan değer üzerinde çalışır. Her karakter çiftini alır ve sol karakterin sağdan küçük veya eşit olup olmadığını kontrol eder, 2<:/\böylece 4 6 1 9 0 2 1 0 1 0 1 olur ve ardından her bir sayı çiftini eşitsizlik açısından kontrol eder. 2~:/\böylece 1 0 1 0 1 1 1 1 1 olur. Son olarak, 0 veya 1 elde etmek için hepsini çoğaltır */. Bu noktada, 2 şey olmasaydı cevabı döndürebiliriz: soru 0 gerektirir; ve eşit sayılar 'küçükten küçük' ile aynı şekilde ele alınır, böylece 461900 0 yerine 1 döndürür. Bummer. Başlıyoruz ...

  3. (1<#u) Bu, u'da saklanan öğe sayısının #u1'den büyük olup olmadığını kontrol eder ve yalnızca tek haneli bir sayı ise false değerini döndürür.

  4. (0=+/2=/\u) Bu, u içinde saklanan her sayı çiftini alır ve eşitliği kontrol eder 2=/\u. Daha sonra cevapları toplar ve 0 olup olmadığını kontrol eder.

Daha sonra bölüm 2, 3 ve 4'ün sonuçları, sayı soruda belirtilen gereksinimleri karşıladığında (umarım) 1 üretmek için birlikte çoğaltılır.


Jobyi iţi yeniden iţe aldýk, ama ben senden bir numara aldým!
ephemient

(Bu söyleniyor, sanırım a.i.":birkaç karakter daha tıraş etmek için benim alabilirsin .)
ephemient

Ne yazık ki, muhtemelen bu eşitsizliği tekrar kontrol etmek zorunda kalacağım - cevabım şimdi 11, 22, 33, 44 vb. İçin başarısız oluyor.
Gareth

3

Haskell, 82 bayt

c=cycle[(<),(>)]
l!n=n>9&&and(zipWith3($)l(show n)$tail$show n)
u n=c!n||((>):c)!n

Çevrimiçi deneyin!


Bu çözümde sadece 83 karakter sayıyorum. (Belki Windows'da mısınız?? Dosyayı yasal Haskell olan unix satır sonlarıyla yazın.)
MtnViewMark

Teşekkürler, Cygwin'deki karakterleri saymak için 'wc' kullanıyordum. 82 karakter sayıyorum. Wc ekstra bir karakter çıktı gibi görünüyor, aşağıdaki kodu kullandım. (Vim sondaki yeni satırı göstermez, ancak not defteri gösterir ...) readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
Thomas Eding

c=cycle[(<),(>)]kısaltılabilir c=(<):(>):c.
Laikoni

1
zipWith3($)l(show n)$tail$show nolabilir zipWith3($)l=<<tail$show nve ((>):c)olabilir tail c. Hep birlikte 70 bayt: Çevrimiçi deneyin!
Laikoni

3

Python, 119108 bayt

def u(x):l=[cmp(i,j)for i,j in zip(`x`,`x`[1:])];print x>9and all([i*j<0 for i,j in zip(l,l[1:])])and l!=[0]

2
Xor güzel kullanımı. ... for a,b in zip(t,t[1:])Aralık kullanmak yerine birkaç karakteri kesebilirsiniz . Ayrıca, parantezlere ihtiyacınız yoktur all([...])- (... for ...)Parantez bir işlev çağrısı için olsa bile, Python bulduğu zaman bir jeneratör yapar .
boothby

Tavsiyen için teşekkür ederim! Çok değerli oldular! -20 karakter
Kirill

Çok güzel bir çözüm. Birkaç karakter daha x>9 and all(i^j for i,j in zip(l,l[1:]))kaldırabilir ve kaldırabilirsiniz if l else False.
Ante

1
Her durumda çalışmaz. İki durum sorunlu: sadece 2 basamaklı (örneğin 11) ve son 2 basamaklı öncekiyle aynı ve daha büyük (ör. 12155). İlk sorun, x <100 ise test yapılmamasıdır. İkincisi, 'tek yönlü karşılaştırma'. Düzeltilebilir cmp(i,j)ve bunun yerine i^jayarlanıp i*j<0test edilebilir and l[0]!=0. Birkaç karakter daha: - /
Ante

1
Hmmm ... printbir karakteri kurtarıyor return, ama meşru mu? Spesifikasyon "geri dönen" bir işlev ister.

2

Python, 155 karakter

g=lambda a,b:all(x>y for x,y in zip(a,b))
u=lambda D:g(D[::2],D[1::2])&g(D[2::2],D[1::2])
def U(n):D=map(int,str(n));return(n>9)&(u(D)|u([-d for d in D]))

2

C ++, 94 karakter

bool u(int N){int K,P,Q,U=1,D=1;while(N>9)P=N%10,Q=(N/=10)%10,K=D,D=U&Q<P,U=K&Q>P;return U^D;}

benim Erlang wnser ile aynı yöntem özyineleme yerine bir for döngüsü.


2

Python 105 101 100 karakter

c=lambda r,t:len(r)<2 or(cmp(*r[:2])==t and c(r[1:],-t))
u=lambda x:x>9and c(`x`,cmp(*`x`[:2])or 1)

Özyinelemeli çözüm. c(r,t)ilk karakterin ikinci karakterden daha raz (t==-1)veya daha büyük (t==1)olup olmadığını kontrol eder ve kısaltılmış dize üzerinde ters kontrol çağırır.


Güzel. Bir karakteri kaldırarak ilk satıra 0kaydedebilir ve ikinci satıra üç karakter yazarak kaydedebilirsinizu=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)

Tnx. Başından beri hiç () beğenmedim :-)
Ante

Yazarak bir tane daha kaydedebilirsiniz x>9and.

2

Perl / re, 139 bayt

Normalde her şeyi yapmak kötü bir fikirdir.

/^(?:(.)(?{local$a=$1}))?(?:(?>((.)(?(?{$a lt$3})(?{local$a=$3})|(?!)))((.)(?(?{$a gt$5})(?{local$a=$5})|(?!))))*(?2)?)(?(?{pos>1})|(?!))$/

Perl 5.12 kullanıyorum ama bunun Perl 5.10 üzerinde çalışacağını düşünüyorum. Oldukça emin 5.8 olsa dışarı.

için (qw (461902 708143 1010101 123 5)) {
    "$ _ is" yazdırın. (/ çılgın regex buraya gidiyor /? '': 'not'). "inip \ n";
}

461902 zayıflatıcıdır
708143 zayıflatıcıdır
1010101 sönük
123 insansız değil
5 insansız değil

2

GolfScript, 48 bayt

[`..,(<\1>]zip{..$=\-1%.$=-}%(\{.@*0<*}/abs

GolfScript kullanarak ilk kez J'yi yenmeyi umuyorum. Başarılı olamadı.


2

JavaScript, 66 65 62 60 bayt

Girdi bir dize olarak alır, truedüzensiz sayılar için döner , tek haneli sayılar için boş bir dize (falsey) ve falseaksi halde.

([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)

Dene

Test etmek için 0-925 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: sdizesindeki ilk karakter olmak ve akalan karakterler içeren bir dizidir olma (örneğin "461902"olur s="4"ve a=["6","1","9","0","2"]).

a+a&&

İlk olarak, aher iki olayı da dizgilere çeviren kendisiyle birleştiririz . Giriş tek basamaklı bir sayı aise 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+adoğ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 xiçinde adönüşleri truebir 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 saz dizinin daha aeğer, bu nedenle sürecinde bir dizeye döküm alır, sdaha az ilk karakterin daha a, yolacak trueya falseda değilse.

s+"<>"[++y%2]+x

sBaşlangıçta ve xsonunda geçerli değeri olan bir dize oluştururuz . Arasında, dizeye dizine "<>"artırarak ybize veren 2 oranında bir tamsayı ve modulo için başlangıç boolean değerini döküm, 0ya 1.

eval()

Bu dizeyi değerlendirin.

s=x

Son olarak, evalgörmezden geldiği ikinci bir argüman iletiriz ve bunu bir sonraki yinelemenin sgeçerli değerine ayarlamak için kullanırız x.


1

PowerShell, 88

Saf ve önemsiz. Daha sonra golf oynayacağım.

filter u{-join([char[]]"$_"|%{if($n){[Math]::Sign($n-$_)+1}$n=$_})-notmatch'1|22|00|^$'}

Test senaryolarım .


1

JavaScript, 112

function(n,d,l,c,f){while(l=n%10,n=n/10|0)d=n%10,c?c>0?d>=l?(f=0):(c=-c):d<=l?(f=0):(c=-c):(c=d-l,f=1);return f}

Sadece bir argüman iletmeniz gerekiyor. Muhtemelen bu bir for döngüsü ile daha da golf olabilir.


( d>=l-> d>0) ve ( d<=l-> d<2) belki? Yakından bakmıyorum, belki de değriltebilecek kesirli parçalar içerebilir.
Thomas Eding

@trinithis: Bu küçük bir harf L, a değil 1. Yine de teşekkürler!
Ry-

İhtiyacınız olduğunda DejaVu Sans Mono veya Bitstream Vera Sans Mono nerede? Belki de bazı özel css veya bir kullanıcı komut dosyası ile stackoverflow özelleştirmek gerekir ...
Thomas Eding

@trinithis: Kabul ediyorum, yazı tipi seçimi o kadar da iyi değil. Bolding yeterince göze
çarpmıyor

1

Erlang, 137 123 118 karakter

u(N)->Q=N div 10,u(Q,N rem 10,Q>0,Q>0). u(0,_,D,U)->D or U;u(N,P,D,U)->Q=N rem 10,u(N div 10,Q,U and(Q<P),D and(Q>P)).

Bu, herhangi bir yerde en az bir yukarı ve bir aşağı geçiş olduğu sürece True döndürmez mi? 1234321 diyelim ki True döndürmeyecek mi?
MtnViewMark

@ MtnViewMark, evet teşekkürler, şimdi umarım giderilen soruyu yanlış anladım.
Scott Logan

1

CJam, 30 bayt

CJam bu meydan okuma daha yeni, bu yüzden bu yeşil onay işareti için rekabet değil, ama yine de bir kazanan değil (her ne kadar bu aslında biraz golf olabilir eminim).

l"_1=\+{_@-\}*;]"_8'*t+~{W>},!

Burada test edin.

Nasıl çalışır

İlk olarak, yinelenen kod 5 bayt kaydetmek için bazı dize manipülasyon (eval sonra takip) yapıyorum:

"..."_8'*t+~
"..."        "Push this string.":
     _       "Duplicate.";
      8'*t   "Replace the 8th character (the -) with *.";
          +~ "Concatenate the strings and evaluate.";

Yani aslında kodum

l_1=\+{_@-\}*;]_1=\+{_@*\}*;]{W>},!

İlk olarak, tek bir rakamın tuhaf özel durumu ile nasıl başa çıkacağım. 1Basamağı dizine kopyalayıp numaraya ekliyorum. 3 vakayı ayırt etmeliyiz:

  • İlk iki rakam gibi farklı 12..., o zaman olsun212... , böylece başlangıç ​​zayıftır ve tüm sayının zayıf olup olmadığını etkilemez.
  • İlk iki basamak aynıdır, sanki 11...alırız 111.... Şimdi başlangıç ​​düzensiz değil, ama sayı yine de düzensiz değildi, bu da sonucu etkilemeyecek.
  • Sayının yalnızca bir rakamı varsa, dizindeki 1basamak ilk basamak olacaktır (CJam'ın dizi indeksleme bitiş etrafında döngülediğinden), bu iki özdeş basamağa neden olur ve sayı belirsiz değildir .

Şimdi koda ayrıntılı olarak bakıyoruz:

l_1=\+{_@-\}*;]_1=\+{_@*\}*;]{W>},!
l                                   "Read input.";
 _1=\+                              "Prepend second digit.";
      {_@-\}*                       "This fold gets the differences of consecutive elments.";
             ;]                     "Drop the final element and collect in an aray.";
               _1=\+                "Prepend second element.";
                    {_@*\}*         "This fold gets the products of consecutive elments.";
                           ;]       "Drop the final element and collect in an aray.";
                             {W>},  "Filter out non-negative numbers.";
                                  ! "Logical not.";

Eminim onlar (eğer iki kat kullanmadan) inatçı olup olmadıklarını (özellikle 1 kat daha büyük) rakamları kontrol etmek için daha kısa bir yol var, ama henüz bulamadım.


1

Prolog 87 bayt

u(X) :- number_codes(X,C),f(C).
f([_,_]).
f([A,B,C|L]) :- (A<B,B>C;A>B,B<C),f([B,C|L]).

Çalıştırmak için golf.pl olarak kaydedin, aynı dizinde bir prolog yorumlayıcısı (örn. Gprolog) açın ve şunları yapın:

consult(golf).
u(101010).

trueSayının düzensiz olup olmadığını verecektir , aksi takdirde hayır.


1

Mathematica, 46 bayt

#!=Sort@#&&#!=Reverse@Sort@#&[IntegerDigits@n]

Örnekler (boşluk gerekli değildir):

# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@5]
# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@123]
# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@132]
# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@321]

(*  out *)
False  False  True  False

1

Scala, 141133129 97 bayt

def u(n:Int):Boolean=n>9&&{
val a=n%10
val b=(n/10)%10
a!=b&&n<99||(a-b*b-(n/100)%10)<0&&u(n/10)}

A = n% 10 ile b = (n / 10)% 10, c = (n / 100)% 10

if a > b and b < c or 
   a < b and b > c

Daha sonra a-b * b-c, ya bir x*-yya da -x*ybirlikte xve ypozitif sayı olarak ve ürün her iki durumda da negatif olmakla için -x*-yya da x*y(<b <c ve a> b> c) Ürün, her zaman pozitiftir.

Kodun geri kalanı özel durumları ele alır: bir basamak, iki basamak, iki özdeş basamak.


1

Perl, 78 bayt

sub u{@_=split//,$_=shift;s/.(?=.)/($&cmp$_[$+[0]])+1/ge;chop;$#_&&!/00|1|22/}

1

Q, 71 bayt

{$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]}

Örnek kullanım:

q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 5
0b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 10101
1b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 01010
1b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 134679
0b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 123456
0b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 132436
1b

Eğer {(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}62 verirse mantıklı olabilir
skeevey

Daha önce hiç ($)sözdizimi görmedim stringve mantık hoş bir dokunuş.
tmartin

1

Julia 0.6 , 62 bayt

f(x,a=sign.(diff(digits(x))))=x>9&&-a*a[1]==(-1).^(1:endof(a))

Bir sayı alır, trueUndulant için geri döner ve falsedeğil. Örneğin f(163)geri döner true.

f(x,a=sign.(diff(digits(x))))=x>9&&-a*a[1]==(-1).^(1:endof(a))
f(x,                        )                                   # function definition
    a=sign.(diff(digits(x)))                                    # default 2nd argument is array of differences of signs of digits
                              x>9&&                             # short circuiting and to catch cases under 10
                                   -a*a[1]                      # make the first element of a always -1
                                          ==(-1).^(1:endof(a))  # check that a is an array of alternating -1 and 1 of correct length

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.