Nomor undulant


16

Sebuah undulant nomor adalah nomor di mana digit bergantian antara up dan turun seperti nomor berikut: 461.902 atau 708.143, atau bahkan 1.010.101, tapi tidak 123, karena 2 <3.

Tulis sebuah program atau fungsi yang mengembalikan nilai kebenaran jika suatu angka tidak berlaku , dan nilai yang salah sebaliknya. Kode terpendek menang.

Catatan : Angka satu digit adalah input yang valid tetapi tidak dianggap sebagai penipuan , dengan demikian isUndulantmengembalikan false untuk n <10.


Input angka sebagai string, integer, float ...?
Berhenti menghidupkan counterclock dengan

1
Apa tujuannya di sini? Kode-golf (fungsi terpendek)?
Alexandru

1
@JBernardo: Saya akan berpikir perilaku yang Benar atau tidak terdefinisi, karena itu akan menjadi dasar kasus yang lebih baik untuk rekursi.
Joey Adams

4
Definisi Anda dari nomor undulant tidak sesuai dengan definisi standar: mathworld.wolfram.com/UndulatingNumber.html . Apakah ini disengaja?
mellamokb

9
Solusi saya bisa 16% lebih kecil jika kasus dasar benar (seperti yang masuk akal IMHO).
eternalmatt

Jawaban:


6

J, 45

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

Penggunaan sampel:

   *./(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

Saya cukup yakin ada cara yang lebih baik dari memutar Insert /untuk melakukan lebih banyak pekerjaan dalam perjalanan, tapi saya sudah J-kurang selama berbulan-bulan, saya harus kembali ke sana.


Akan sulit untuk mengalahkan J dalam masalah ini. solusi bagus!
leonardo

@leonardo terima kasih!
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]}

Penggunaan dan testcases:

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

Digit tunggal menghasilkan false :

p u[5]       # <= false

Digit identik berurutan juga menghasilkan false :

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

6

J, 30 byte

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

Pendekatan yang berbeda dari jawaban J lainnya.

   * / 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

Akan lebih pendek 3 karakter jika 5 dianggap undulant.


Yah, setidaknya saya bisa menghibur diri dengan pikiran bahwa saya sudah memimpin selama satu jam. :-)
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

Kompilasi dengan pdfetex filename.tex 1324?memberikan output pdf. TeX pada dasarnya adalah bahasa penyusunan huruf, dan sebagai gantinya keluaran ke stdout akan membutuhkan sekitar 20 karakter lagi. Juga persyaratan aneh untuk nomor satu digit (salah daripada benar) membuat saya 26 karakter.


5

Haskell, 88 77 73 65 karakter

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

Hal ini memerlukan pragma bahasa yang umum digunakan (atau -Xflag): NoMonomorphismRestriction. Jika Anda tidak mengakuinya, kami harus menambahkan 4 karakter dan mendefinisikannya sebagai zberikut:

z s=zipWith compare s$tail s

Saya sangat marah karena Anda mengalahkan solusi char saya. 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.cycleAgak elegan. zipWithsekali dengan compareseperti yang Anda lakukan, sekali zipWithlagi dengan (==)dan cycle[GT,LT]atau cycle[LT,GT]sebagai argumen kedua.
eternalmatt

Anda bisa sebaris dengan w tail>>=zipWith compareyang akan mempersingkat beberapa byte.
haskeller bangga

juga, saya qq[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
bermain golf

sebenarnya, ini versi yang lebih singkat: q s=and$all(/=EQ)s:zipWith(/=)s(tail s)
bangga haskeller

@proudhaskeller - versi tidak lulus semua tes. Keduanya gagal pada 3 (harus False), dan yang pertama gagal banyak yang lain, seperti 32 dan 101010101.
MtnViewMark

4

Sage, 83 76 byte

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

Mendapat ide untuk menggunakan cmp (* [..]) dari JBernardo. Dalam Sage, uniq(...)adalah alias untuk list(set(...)).

Sunting: cukup perhatikan bahwa untuk x <10 uniq(cmp(...)) == [],, yang tidak menyala [[1],[-1]]. Jika x dimasukkan sebagai string, alih-alih bilangan bulat, saya bisa mengeluarkan 4 karakter lagi!


Saya punya ide untuk menggunakan sum(uniq(...))^2, karena sum([1,-1]) = 0, dan jumlah lajang [1] dan [-1] kuadrat ke 1. Sayangnya, gagal pada angka yang diulang tiga kali; 1011101.
stan

Bagus. Saya harus belajar bijak. BTW, saya baru menyadari bahwa backticks akan menambahkan Ljika angkanya lebih besar dari 2 ** 32 dalam Python dan mempengaruhi hasilnya. Apakah itu terjadi pada Sage?
JBernardo

Ya, Sage membuat beberapa hal bagus untuk bermain golf ... misalnya, waktu startup yang konyol dihabiskan dengan mengimpor banyak modul. Kelas Sage Integer tidak repot dengan Lkarena Sage adalah python yang sudah disiapkan; 1234 -> Integer ('1234'). Anda dapat langsung menggunakan Sage di sini: sagenb.org
boothby

4

Python: 101 100 karakter

Sebelum minifikasi:

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:])))))

Setelah minifikasi:

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])

Tidak Terkumpul:

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}

Intinya, ubah angka menjadi string dan bandingkan karakter yang berdekatan, membalikkan harapan masing-masing.


2
Dalam JavaScript, suatu fungsi tidak memerlukan nama dan pertanyaannya menanyakan fungsi secara eksplisit, sehingga Anda dapat menyimpan dua karakter.
Ry-

3

K, 41 byte

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

Misalnya

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

3

CoffeeScript, 98 67 53 byte

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

Tes:

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

Terkompresi:

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 byte

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

Penggunaan seperti sebelumnya.

Saya tidak memperhatikan bahwa suntingan terakhir saya membuat ketidaksamaan dengan 0 cek sama sekali tidak perlu. :-)

Jawaban sebelumnya (+ penjelasan):

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

Pemakaian:

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

Jawabannya memiliki empat bagian:

  1. u=.".;' ',.": Ini membaca angka sebagai string ":, membaginya menjadi daftar karakter yang didahului oleh spasi ' ',., menjahitnya kembali ;, mengubahnya kembali menjadi angka ".dan kemudian menyimpan hasilnya. u=.Pada dasarnya ini mengubah 461902 menjadi 4 6 1 9 0 2 yang menurut saya lebih mudah untuk memproses dalam J.

  2. */2~:/\2<:/\ Ini beroperasi pada nilai yang disimpan di u. Dibutuhkan setiap pasangan karakter dan memeriksa apakah yang kiri kurang dari atau sama dengan yang benar 2<:/\sehingga 4 6 1 9 0 2 menjadi 1 0 1 0 1. Kemudian mengambil hasil ini dan memeriksa setiap pasangan angka untuk ketidaksetaraan 2~:/\jadi 1 0 1 0 1 menjadi 1 1 1 1. Akhirnya itu mengalikan mereka semua untuk mendapatkan 0 atau 1. */Pada titik ini kita bisa mengembalikan jawabannya jika bukan karena 2 hal: satu digit mengembalikan 1 ketika pertanyaan membutuhkan 0; dan angka yang sama diperlakukan sama dengan 'kurang dari' jadi 461900 mengembalikan 1 bukan 0. Nyebelin. Kita pergi ...

  3. (1<#u) Ini memeriksa apakah jumlah item yang disimpan di u #ulebih besar dari 1 dan mengembalikan false jika itu hanya satu digit angka.

  4. (0=+/2=/\u) Ini mengambil setiap pasangan nomor yang disimpan di u dan memeriksa kesetaraan 2=/\u. Ini kemudian menjumlahkan jawaban dan memeriksa apakah memiliki 0.

Hasil bagian 2, 3 dan 4 kemudian dikalikan bersama untuk (mudah-mudahan) menghasilkan 1 ketika nomor tersebut memenuhi persyaratan yang ditentukan dalam pertanyaan.


Kerja bagus memimpin kembali, tapi saya baru saja meminjam trik dari Anda!
ephemient

(Yang sedang berkata, saya pikir Anda bisa mengambil saya a.i.":untuk mencukur beberapa karakter lagi.)
ephemient

Sayangnya, saya mungkin harus memasukkan kembali ketimpangan itu - jawaban saya gagal sekarang untuk 11, 22, 33, 44 dll.
Gareth

3

Haskell, 82 byte

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

Cobalah online!


Saya menghitung hanya 83 karakter dalam solusi ini. (Apakah Anda menggunakan Windows, mungkin? Tulis file dengan akhiran baris unix, yang merupakan legal Haskell.)
MtnViewMark

Terima kasih, saya menggunakan 'wc' untuk menghitung karakter saya di Cygwin. Saya menghitung 82 karakter. Saya menggunakan kode berikut, karena wc tampaknya mengeluarkan karakter tambahan. (Vim tidak menunjukkan baris baru, tetapi notepad tidak ...) readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
Thomas Eding

c=cycle[(<),(>)]dapat disingkat menjadi c=(<):(>):c.
Laikoni

1
zipWith3($)l(show n)$tail$show nbisa zipWith3($)l=<<tail$show ndan ((>):c)bisa tail c. Secara keseluruhan 70 byte: Cobalah secara online!
Laikoni

3

Python, 119 108 byte

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
Nice use of xor. You can cut quite a few characters out with ... for a,b in zip(t,t[1:]) rather than using ranges. Also, you don't need the brackets in all([...]) -- Python makes a generator when it finds (... for ...), even if the parentheses are for a function call.
boothby

Thank you very much for your advice! They have been very valuable! -20 chars
Kirill

Very nice solution. Few more characters x>9 and all(i^j for i,j in zip(l,l[1:])) and remove if l else False.
Ante

1
It is not working in all cases. Two cases are problematic: only 2 digits (e.g. 11), and last 2 digits are same and larger than one before (e.g. 12155). First problem is since there is no testing if x<100. Second is because 'one way comparison'. It can be fix with cmp(i,j) and instead i^j set i*j<0, and testing and l[0]!=0. Few more characters :-/
Ante

1
Hmmm... print saves one character over return, but is it legitimate? The spec does ask for a function that "returns".

2

Python, 155 chars

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 chars

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;}

same method as my Erlang awnser with a for loop rather than recursion.


2

Python 105 101 100 chars

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)

Recursive solution. c(r,t) checks if first char of r is less (t==-1) or greater (t==1) of second char, and call opposite check on shortened string.


Bagus. Anda dapat menyimpan karakter di baris pertama dengan menghapus 0, dan Anda dapat menyimpan tiga karakter di baris kedua dengan menulisu=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)

Tnx. Saya tidak suka () dari awal :-)
Ante

Anda dapat menyimpan satu lagi dengan menulis x>9and.

2

Perl / re, 139 byte

Melakukan segala sesuatu di regex adalah ide yang buruk.

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

Saya menggunakan Perl 5.12 tapi saya pikir ini akan bekerja pada Perl 5.10. Cukup yakin 5.8 sudah keluar.

untuk (qw (461902 708143 1010101 123 5)) {
    cetak "$ _ is". (/ Regex gila ada di sini/ ? '' : 'not ') . "undulant\n";
}

461902 tidak undulant
708143 tidak undulant
1010101 tidak sah
123 tidak undulant
5 tidak undulant

2

GolfScript, 48 byte

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

Berharap bisa mengalahkan J, pertama kali saya menggunakan GolfScript. Tidak cukup berhasil.


2

JavaScript, 66 65 62 60 byte

Mengambil input sebagai string, mengembalikan trueuntuk nomor undulant, string kosong (falsey) untuk nomor digit tunggal dan falsesebaliknya.

([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-9dan 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: smenjadi karakter pertama dalam string dan amenjadi array yang berisi karakter yang tersisa (misalnya "461902"menjadi s="4"dan a=["6","1","9","0","2"]).

a+a&&

Pertama, kami menggabungkan adengan dirinya sendiri, yang melemparkan kedua kejadian ke string. Jika input adalah angka satu digit maka aakan 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+aakan menjadi kebenaran dan kami melanjutkan ke bagian fungsi selanjutnya.

a.every(x=>)

Kami akan memeriksa apakah setiap elemen xdalam apengembalian trueketika 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 skurang dari array a, yang akan dilemparkan ke string dalam proses jadi, jika skurang dari karakter pertama a, yakan menjadi trueatau falsejika tidak.

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

Kami membangun string dengan nilai saat ini sdi awal dan xdi akhir. Di antaranya, kita mengindeks ke dalam string "<>"dengan menambahkan y, melemparkan nilai boolean awal ke integer, dan modulo dengan 2, memberi kita 0atau 1.

eval()

Eval string itu.

s=x

Akhirnya, kami memberikan argumen kedua eval, yang diabaikannya, dan menggunakannya untuk mengatur nilai ske nilai saat ini xuntuk iterasi berikutnya.


1

PowerShell, 88

Naif dan sepele. Saya akan bermain golf nanti.

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

Kasing uji saya .


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}

Anda hanya perlu memberikan satu argumen. Saya mungkin bisa bermain golf ini lebih jauh dengan for loop.


( d>=l-> d>0) dan ( d<=l-> d<2) mungkin? Saya tidak melihat dengan seksama, karena mungkin dmengandung bagian-bagian kecil yang mungkin membuatnya miring.
Thomas Eding

@trinithis: Itu huruf kecil L, bukan a 1. Terimakasih Meskipun!
Ry-

Di mana DejaVu Sans Mono atau Bitstream Vera Sans Mono saat Anda membutuhkannya? Mungkin saya perlu menyesuaikan stackoverflow dengan beberapa custom css atau skrip pengguna ...
Thomas Eding

@trinithis: Saya setuju, pilihan fontnya tidak terlalu bagus. Bolding tidak cukup menonjol ...
Ry-

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)).

Tidakkah ini akan kembali Benar selama setidaknya ada satu transisi naik dan turun di mana saja? Tidakkah akan kembali Benar untuk, katakanlah 1234321?
MtnViewMark

@ MtnViewMark, ya itu terima kasih, saya salah paham pertanyaannya diperbaiki sekarang semoga.
Scott Logan

1

CJam, 30 byte

CJam lebih baru dari tantangan ini, jadi ini tidak bersaing untuk tanda centang hijau, tapi toh itu bukan pemenang (walaupun saya yakin ini sebenarnya bisa golf sedikit).

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

Uji di sini.

Bagaimana itu bekerja

Pertama, saya sedang melakukan manipulasi string (diikuti oleh eval) untuk menghemat 5 byte pada kode duplikat:

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

Jadi sebenarnya kode saya adalah

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

Pertama, di sini adalah bagaimana saya menangani kasus khusus aneh satu digit. Saya menyalin angka di indeks 1dan menambahkannya ke nomor. Kita perlu membedakan 3 kasus:

  • Dua digit pertama berbeda, seperti 12..., lalu kita dapatkan212... , sehingga permulaannya undulant, dan tidak akan memengaruhi apakah seluruh angka itu undulant.
  • Dua digit pertama sama, seperti 11..., lalu kita dapatkan 111.... Sekarang awalnya bukan undulant, tetapi angkanya juga tidak undulant, jadi ini tidak akan mempengaruhi hasilnya juga.
  • Jika nomor hanya memiliki satu digit, digit pada indeks 1akan menjadi digit pertama (karena pengindeksan array CJam di sekitar akhir), jadi ini menghasilkan dua digit yang identik, dan jumlahnya tidak undulant.

Sekarang melihat kode secara detail:

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.";

Saya yakin ada cara yang lebih pendek untuk benar-benar memeriksa angka (panjangnya lebih besar 1) apakah mereka undulant (khususnya, tanpa menggunakan dua lipatan), tetapi saya belum dapat menemukannya.


1

Prolog 87 byte

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]).

Untuk menjalankannya, cukup simpan sebagai golf.pl, buka interpreter prolog (misalnya gprolog) di direktori yang sama kemudian lakukan:

consult(golf).
u(101010).

Ini akan memberi truejika nomornya undulant, kalau tidak hanya tidak.


1

Mathematica, 46 byte

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

Contoh (spasi tidak diperlukan):

# != 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, 141 133 129 97 byte

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)}

Dengan a = n% 10, b = (n / 10)% 10, c = (n / 100)% 10

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

Maka a-b * b-cadalah salah satu x*-yatau -x*ydengan xdan ysebagai angka positif, dan produk dalam kedua kasus negatif, tetapi untuk -x*-yatau x*y(a <b <c atau a> b> c) produk selalu positif.

Sisa kode menangani kasus khusus: satu digit, dua digit, dua digit identik.


1

Perl, 78 byte

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

1

Q, 71 byte

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

Penggunaan sampel:

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

Anda dapat logika jika {(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}memberikan 62
skeevey

Belum pernah melihat ($)sintaksis stringsebelumnya dan logikanya adalah sentuhan yang bagus.
tmartin

1

Julia 0,6 , 62 byte

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

Mengambil dalam angka, pengembalian trueuntuk Undulant, dan falseuntuk tidak. Misal f(163)mengembalikan 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

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.