pengantar
Dalam tantangan ini, kita akan berhadapan dengan pemesanan tertentu dari bilangan bulat positif. Pemesanannya seperti ini:
3, 5, 7, 9, 11, ...
2*3, 2*5, 2*7, 2*9, 2*11, ...
4*3, 4*5, 4*7, 4*9, 4*11, ...
8*3, 8*5, 8*7, 8*9, 8*11, ...
16*3, 16*5, 16*7, 16*9, 16*11, ...
...
... 64, 32, 16, 8, 4, 2, 1
Kami pertama-tama mendaftar semua bilangan bulat ganjil yang lebih besar dari 1 dalam urutan naik. Kemudian kami mendaftar dua kali bilangan bulat ganjil lebih besar dari 1, kemudian 4 kali, kemudian 8 kali, dan seterusnya: untuk semua k , kami mencantumkan 2 k kali bilangan bulat ganjil lebih besar dari 1 dalam urutan naik. Akhirnya, kami daftar kekuatan dua dalam urutan menurun , berakhir pada 1. Setiap bilangan bulat positif terjadi dalam "daftar" ini tepat sekali.
Lebih eksplisit, pertimbangkan dua bilangan bulat positif A = n · 2 p dan B = m · 2 q , di mana n, m ≥ 1 ganjil, dan p, q ≥ 0 . Kemudian A muncul sebelum B dalam pemesanan, jika salah satu dari kondisi berikut berlaku:
- n> 1 , m> 1 dan p <q
- 1 <n <m dan p = q
- n> m = 1
- n = m = 1 dan p> q
Urutan ini muncul dalam hasil matematika mengejutkan yang dikenal sebagai teorema Sharkovskii , yang menyangkut poin periodik sistem dinamik. Saya tidak akan membahas detailnya di sini.
Tugas
Tugas Anda dalam tantangan ini adalah untuk menghitung pemesanan di atas. Input Anda adalah dua bilangan bulat positif A dan B , yang mungkin sama. Output Anda adalah nilai kebenaran jika A datang sebelum B dalam pemesanan, dan nilai palsu sebaliknya. Jika A = B , output Anda harus benar. Anda dapat mengambil A dan B dalam urutan mana pun, selama Anda konsisten.
Anda tidak perlu khawatir tentang integer overflow, tetapi algoritme Anda secara teoritis harus bekerja untuk input besar yang sewenang-wenang.
Uji kasus
Contoh yang benar
3 11
9 6
48 112
49 112
158 158
36 24
14 28
144 32
32 32
32 8
3 1
1 1
Contoh palsu
1 2
1 5
11 5
20 25
2 8
256 255
256 257
72 52
2176 1216
2176 2496
a&1|~b&1&f(a/2,b/2)
bekerjab<2
pada akhirnya akan benar. Sekarang, masalah lain adalah Anda akan memproses lebih banyak iterasi daripada yang dibutuhkan dan mendapatkan nilai floating point. Tetapi saya tidak dapat menemukan contoh tandingan yang tidak akan berfungsi seperti yang diharapkan.b<2
awalnya, tapi saya kira itu akan berfungsi sekarang.f(a/2,b/2)
hanya kembali0
,1
,false
atautrue
, aku bahkan tidak perlu&1
.Python 2,
8771 byteIni mungkin tidak akan memenangkan penghargaan ukuran apa pun, tetapi jawaban ini berfungsi dengan membuat 3-tupel menggunakan 3 ekspresi dari integer yang bila dipesan secara leksikografis akan menghasilkan urutan yang benar.
Dalam istilah yang dapat dibaca, tupel untuk A = n · 2 p :
sumber
Python 2, 50 byte
Setiap nomor dipetakan ke triple yang urutannya diurutkan adalah urutan yang diinginkan.
[-n][n&n-1:]
, yang menangani kekuatan 2 pada akhirnya. Bitwise "dan"n&n-1
adalah nol kapan tepatnyan
kekuatan dari2
. Jika demikian, kami mendapatkan daftar[-n]
, dan sebaliknya daftar kosong[]
. Ini menempatkan semua kekuatan 2 di akhir perintah, dalam urutan menurun.n&-n
mengekstrak faktor kekuatan-of-2 darin
.n
tiebreak sama dengan kekuatan 2 yang mendukung jumlah yang lebih besar.Tupel masing-masing dilewatkan
cmp
untuk melihat apakah perbandingan itu<=0
. Python 3 akan menyimpan byte dengan divisi float(n&n-1<1)/n
untuk nilai pertama dalam triple, tetapi tidak memilikicmp
.sumber
cmp(...)<=0
setara dengancmp(...)<1
?~
bukan<1
JavaScript (ES6),
7064 byteMungkin bisa bermain golf lagi, tetapi sebagai upaya pertama:
Mengambil input dengan sintaks currying
(x)(y)
. Pengembalian0
/1
.Uji kasus
Tampilkan cuplikan kode
sumber
b>a||(b==a&&y>=x)
, tidak akan membuat perbedaan untuk eksekusi.[1, 5]
itu akan salah diidentifikasi sebagai kebenaran.Perl 6 ,
8984 byte( Cobalah online. )
Tidak terlalu pendek, tapi saya pikir akan menarik untuk menulis solusi yang benar-benar menghasilkan urutan pemesanan (hingga batas atas yang aman untuk setiap sub-urutan), dan kemudian memeriksa input mana yang muncul terlebih dahulu.
Sebagai contoh:
Untuk input
... dan kemudian mengamati yang2, 3
yang dihasilkannya:3
muncul sebelumnya2
.Untuk input
... dan kemudian mengamati yang9, 6
yang dihasilkannya:9
muncul sebelumnya6
.Itu bisa lebih pintar dan menghasilkan urutan yang lebih sedikit, tetapi itu akan membutuhkan lebih banyak byte kode.
sumber
Python 2, 54 byte
Solusi rekursif mirip dengan Neil.
sumber
f(158,158)
Salah danf(2,8)
Benar.f(1,5)
salah.f(1,5)
harus Salah, tetapi kode memberikan Benar.Mathematica, 65 byte
Fungsi yang tidak disebutkan namanya mengambil daftar bilangan bulat positif dan kembali
True
jika daftar membentuk urutan naik dalam urutan Sharkovskii,False
jika tidak. (Khususnya, daftar input tidak harus hanya memiliki dua elemen — kami mendapatkan fungsionalitas tambahan secara gratis.)Inti dari algoritma adalah fungsi
{1,#}&/@#//.{a_,b_/;EvenQ@b}->{2a,b/2}
, yang secara berulang-ulang menggerakkan faktor 2 untuk mengkonversi bilangan bulat dari bentukm*2^k
, denganm
ganjil, ke pasangan terurut{2^k,m}
(dan melakukannya untuk setiap elemen dari daftar input).OrderedQ
kemudian memutuskan apakah daftar pasangan yang dihasilkan sudah diurutkan; secara default, itu berarti meningkatkan urutan elemen pertama, kemudian meningkatkan urutan elemen kedua.Itulah tepatnya yang kita inginkan, kecuali angka yang merupakan kekuatan 2 mengikuti aturan yang berbeda. Jadi sebelum memeriksa
OrderingQ
, kami menerapkan satu aturan terakhir/.{a_,1}->{∞,-a}
, yang mengubah (misalnya){64,1}
menjadi{∞,-64}
; yang menempatkan kekuatan 2 di tempat yang benar dalam pemesanan.sumber
Haskell,
143138 bytePada dasarnya implementasi kriteria yang relatif mudah:
Cobalah online!
sumber
Python,
159158153144142141 byteDisimpan
sebuah2 byte berkat Kritixi Lithos!Ini terutama hanya untuk berlatih bermain golf Python saya!
Menggunakan formula yang diberikan oleh OP daripada cara semua jawaban yang lebih pintar
sumber
(a, b)
pada baris kedua di mana Anda dapat menghapus ruang antara koma danb
.APL (Dyalog Extended) , 27 byte
Cobalah online!
Fungsi diad diam-diam yang argumen kirinya adalah
a
dan kanan adalahb
.Pendekatan ini hampir identik dengan solusi Python 2 dari xnor , di mana kami mengonversi setiap angka menjadi array bersarang dan melakukan perbandingan leksikografis di antara mereka.
Bagian 1: Konversi angka menjadi array bersarang
Bagian 2: Bandingkan dua array bersarang
Sintaks DFF memang mendukung pernyataan bersyarat misalnya
{a:x ⋄ b:y ⋄ z}
maknaif a then x else if b then y else z
, tetapi terlalu verbose untuk digunakan dalam kasus ini.sumber
05AB1E , 14 byte
Cobalah online! atau memvalidasi semua kasus uji .
sumber