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 isUndulant
mengembalikan false untuk n <10.
code-golf
decision-problem
number-theory
Leonardo
sumber
sumber
Jawaban:
J, 45
Penggunaan sampel:
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.sumber
Ruby,
7270 karakterPenggunaan dan testcases:
Digit tunggal menghasilkan false :
Digit identik berurutan juga menghasilkan false :
sumber
J, 30 byte
Pendekatan yang berbeda dari jawaban J lainnya.
Akan lebih pendek 3 karakter jika 5 dianggap undulant.
sumber
(pdf) eTeX, 129 karakter
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.sumber
Haskell,
88777365 karakterHal ini memerlukan pragma bahasa yang umum digunakan (atau
-X
flag):NoMonomorphismRestriction
. Jika Anda tidak mengakuinya, kami harus menambahkan 4 karakter dan mendefinisikannya sebagaiz
berikut:sumber
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
Agak elegan.zipWith
sekali dengancompare
seperti yang Anda lakukan, sekalizipWith
lagi dengan(==)
dancycle[GT,LT]
ataucycle[LT,GT]
sebagai argumen kedua.tail>>=zipWith compare
yang akan mempersingkat beberapa byte.q
q[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
q s=and$all(/=EQ)s:zipWith(/=)s(tail s)
Sage,
8376 byteMendapat ide untuk menggunakan cmp (* [..]) dari JBernardo. Dalam Sage,
uniq(...)
adalah alias untuklist(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!sumber
sum(uniq(...))^2
, karenasum([1,-1]) = 0
, dan jumlah lajang [1] dan [-1] kuadrat ke 1. Sayangnya, gagal pada angka yang diulang tiga kali; 1011101.L
jika angkanya lebih besar dari 2 ** 32 dalam Python dan mempengaruhi hasilnya. Apakah itu terjadi pada Sage?L
karena Sage adalah python yang sudah disiapkan; 1234 -> Integer ('1234'). Anda dapat langsung menggunakan Sage di sini: sagenb.orgPython:
101100 karakterSebelum minifikasi:
Setelah minifikasi:
sumber
Python,
134129 karakterTidak Terkumpul:
sumber
JavaScript, 88 karakter
Intinya, ubah angka menjadi string dan bandingkan karakter yang berdekatan, membalikkan harapan masing-masing.
sumber
K, 41 byte
Misalnya
sumber
CoffeeScript,
986753 byteTes:
Terkompresi:
sumber
J,
44393631 bytePenggunaan seperti sebelumnya.
Saya tidak memperhatikan bahwa suntingan terakhir saya membuat ketidaksamaan dengan 0 cek sama sekali tidak perlu. :-)
Jawaban sebelumnya (+ penjelasan):
Pemakaian:
Jawabannya memiliki empat bagian:
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<:/\
Ini beroperasi pada nilai yang disimpan di u. Dibutuhkan setiap pasangan karakter dan memeriksa apakah yang kiri kurang dari atau sama dengan yang benar2<:/\
sehingga 4 6 1 9 0 2 menjadi 1 0 1 0 1. Kemudian mengambil hasil ini dan memeriksa setiap pasangan angka untuk ketidaksetaraan2~:/\
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 ...(1<#u)
Ini memeriksa apakah jumlah item yang disimpan di u#u
lebih besar dari 1 dan mengembalikan false jika itu hanya satu digit angka.(0=+/2=/\u)
Ini mengambil setiap pasangan nomor yang disimpan di u dan memeriksa kesetaraan2=/\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.
sumber
a.i.":
untuk mencukur beberapa karakter lagi.)Haskell, 82 byte
Cobalah online!
sumber
readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
c=cycle[(<),(>)]
dapat disingkat menjadic=(<):(>):c
.zipWith3($)l(show n)$tail$show n
bisazipWith3($)l=<<tail$show n
dan((>):c)
bisatail c
. Secara keseluruhan 70 byte: Cobalah secara online!Python,
119108 bytesumber
... for a,b in zip(t,t[1:])
rather than using ranges. Also, you don't need the brackets inall([...])
-- Python makes a generator when it finds(... for ...)
, even if the parentheses are for a function call.x>9 and all(i^j for i,j in zip(l,l[1:]))
and removeif l else False
.cmp(i,j)
and insteadi^j
seti*j<0
, and testingand l[0]!=0
. Few more characters :-/print
saves one character overreturn
, but is it legitimate? The spec does ask for a function that "returns".Python, 155 chars
sumber
C++, 94 chars
same method as my Erlang awnser with a for loop rather than recursion.
sumber
Python
105101100 charsRecursive solution.
c(r,t)
checks if first char ofr
is less(t==-1)
or greater(t==1)
of second char, and call opposite check on shortened string.sumber
0
, dan Anda dapat menyimpan tiga karakter di baris kedua dengan menulisu=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)
x>9and
.Perl / re, 139 byte
Melakukan segala sesuatu di regex adalah ide yang buruk.
Saya menggunakan Perl 5.12 tapi saya pikir ini akan bekerja pada Perl 5.10. Cukup yakin 5.8 sudah keluar.
sumber
GolfScript, 48 byte
Berharap bisa mengalahkan J, pertama kali saya menggunakan GolfScript. Tidak cukup berhasil.
sumber
JavaScript,
66656260 byteMengambil input sebagai string, mengembalikan
true
untuk nomor undulant, string kosong (falsey) untuk nomor digit tunggal danfalse
sebaliknya.Cobalah
Jalankan Cuplikan di bawah untuk menguji
0-9
dan 25 angka acak<10,000,000
.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.
Argumen itu segera dirusak menjadi 2 parameter:
s
menjadi karakter pertama dalam string dana
menjadi array yang berisi karakter yang tersisa (misalnya"461902"
menjadis="4"
dana=["6","1","9","0","2"]
).Pertama, kami menggabungkan
a
dengan dirinya sendiri, yang melemparkan kedua kejadian ke string. Jika input adalah angka satu digit makaa
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 lainnyaa+a
akan menjadi kebenaran dan kami melanjutkan ke bagian fungsi selanjutnya.Kami akan memeriksa apakah setiap elemen
x
dalama
pengembaliantrue
ketika melewati suatu fungsi.Ini menentukan apa yang akan menjadi perbandingan pertama kami (
<
atau>
) dan kemudian kami akan berganti dari sana. Kami memeriksa apakah strings
kurang dari arraya
, yang akan dilemparkan ke string dalam proses jadi, jikas
kurang dari karakter pertamaa
,y
akan menjaditrue
ataufalse
jika tidak.Kami membangun string dengan nilai saat ini
s
di awal danx
di akhir. Di antaranya, kita mengindeks ke dalam string"<>"
dengan menambahkany
, melemparkan nilai boolean awal ke integer, dan modulo dengan 2, memberi kita0
atau1
.Eval string itu.
Akhirnya, kami memberikan argumen kedua
eval
, yang diabaikannya, dan menggunakannya untuk mengatur nilais
ke nilai saat inix
untuk iterasi berikutnya.sumber
PowerShell, 88
Naif dan sepele. Saya akan bermain golf nanti.
Kasing uji saya .
sumber
JavaScript, 112
Anda hanya perlu memberikan satu argumen. Saya mungkin bisa bermain golf ini lebih jauh dengan for loop.
sumber
d>=l
->d>0
) dan (d<=l
->d<2
) mungkin? Saya tidak melihat dengan seksama, karena mungkind
mengandung bagian-bagian kecil yang mungkin membuatnya miring.L
, bukan a1
. Terimakasih Meskipun!Erlang,
137123118 karaktersumber
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).
Uji di sini.
Bagaimana itu bekerja
Pertama, saya sedang melakukan manipulasi string (diikuti oleh eval) untuk menghemat 5 byte pada kode duplikat:
Jadi sebenarnya kode saya adalah
Pertama, di sini adalah bagaimana saya menangani kasus khusus aneh satu digit. Saya menyalin angka di indeks
1
dan menambahkannya ke nomor. Kita perlu membedakan 3 kasus:12...
, lalu kita dapatkan212...
, sehingga permulaannya undulant, dan tidak akan memengaruhi apakah seluruh angka itu undulant.11...
, lalu kita dapatkan111...
. Sekarang awalnya bukan undulant, tetapi angkanya juga tidak undulant, jadi ini tidak akan mempengaruhi hasilnya juga.1
akan 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:
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.
sumber
Prolog 87 byte
Untuk menjalankannya, cukup simpan sebagai golf.pl, buka interpreter prolog (misalnya gprolog) di direktori yang sama kemudian lakukan:
Ini akan memberi
true
jika nomornya undulant, kalau tidak hanya tidak.sumber
Mathematica, 46 byte
Contoh (spasi tidak diperlukan):
sumber
Scala,
141 133 12997 byteDengan a = n% 10, b = (n / 10)% 10, c = (n / 100)% 10
Maka
a-b * b-c
adalah salah satux*-y
atau-x*y
denganx
dany
sebagai angka positif, dan produk dalam kedua kasus negatif, tetapi untuk-x*-y
ataux*y
(a <b <c atau a> b> c) produk selalu positif.Sisa kode menangani kasus khusus: satu digit, dua digit, dua digit identik.
sumber
Perl, 78 byte
sumber
Q, 71 byte
Penggunaan sampel:
sumber
{(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}
memberikan 62($)
sintaksisstring
sebelumnya dan logikanya adalah sentuhan yang bagus.Julia 0,6 , 62 byte
Mengambil dalam angka, pengembalian
true
untuk Undulant, danfalse
untuk tidak. Misalf(163)
mengembalikantrue
.Cobalah online!
sumber