Tantangan Anda adalah menemukan angka paling halus pada rentang tertentu. Dengan kata lain, cari nomor yang faktor prima terbesarnya paling kecil.
Angka yang lancar adalah faktor yang faktor prima terbesarnya kecil. Bilangan jenis ini berguna untuk algoritma transformasi Fourier cepat, pembacaan sandi, dan aplikasi lainnya.
Misalnya, pada rentang 5, 6, 7, 8, 9, 10
, 8 adalah angka paling halus, karena faktor prima 8 terbesar adalah 2, sedangkan semua angka lainnya memiliki faktor prima 3 atau lebih besar.
Input: Input akan berupa dua bilangan bulat positif, yang menentukan rentang. Bilangan bulat minimum yang diperbolehkan dalam rentang adalah 2. Anda dapat memilih apakah rentang inklusif, eksklusif, semi-eksklusif, dll, selama rentang arbitrer dapat ditentukan dalam batas-batas bahasa Anda. Anda dapat mengambil angka-angka melalui input fungsi, stdin, argumen baris perintah, atau metode apa pun yang setara untuk bahasa Anda. Tidak ada penyandian informasi tambahan dalam input.
Output: Mengembalikan, mencetak, atau menyamakan satu atau lebih bilangan bulat dalam kisaran input yang maksimal mulus (faktor terbesar minimal). Mengembalikan banyak hasil adalah opsional, tetapi jika Anda memilih untuk melakukannya, hasilnya harus dibatasi dengan jelas. Format output asli baik untuk beberapa hasil.
Silakan sebutkan jawaban Anda bagaimana Anda mengambil input dan memberikan output.
Penilaian: Golf kode. Hitung berdasarkan karakter jika ditulis dalam ASCII, atau 8 * byte / 7 jika tidak dalam ASCII.
Kasus uji:
Catatan: Ini adalah rentang gaya Python, termasuk ujung rendah tetapi bukan ujung tinggi. Ubah seperlunya untuk program Anda. Hanya satu hasil yang diperlukan.
smooth_range(5,11)
8
smooth_range(9,16)
9, 12
smooth_range(9,17)
16
smooth_range(157, 249)
162, 192, 216, 243
smooth_range(2001, 2014)
2002
sumber
Jawaban:
CJam - 13
Cobalah di http://cjam.aditsu.net/
Input contoh:
2001 2014
Contoh output:
2002
Penjelasan:
q~
membaca dan mengevaluasi input, mendorong 2 angka pada stack (mis. min dan maks),
membuat array [0 1 ... maks-1]>
mengiris array mulai dari min, menghasilkan [min ... maks-1]{…}$
mengurutkan array menggunakan blok untuk menghitung kunci pengurutanmf
mendapatkan array dengan semua faktor prima dari suatu bilangan, untukW=
mendapatkan elemen terakhir dari array (W = -1), sehingga memperoleh faktor prima terbesar untuk digunakan sebagai kunci pengurutan0=
mendapatkan elemen pertama dari array (diurutkan)sumber
mfW
seseorang memecahkannya dalam 13 karakter.Regex (
.NETPCRE flavor),183129 byteJangan coba ini di rumah!
Ini sebenarnya bukan pesaing untuk menang. Tetapi Eric Tressler menyarankan untuk menyelesaikan masalah ini hanya dengan regex, dan saya tidak tahan untuk tidak mencobanya. Ini
mungkin juga dapatdilakukan di PCRE (dan bahkan lebih pendek, lihat di bawah), tetapi saya memilih .NET karena solusi saya memerlukan tampilan yang sewenang-wenang. Kita mulai:Input dikodekan sebagai rentang dipisahkan koma inklusif, di mana kedua angka diberikan dalam notasi notaris menggunakan
1
s. Pertandingan akan menjadiS
1 yang tertinggal di manaS
adalah angka paling halus dalam kisaran. Ikatan rusak demi jumlah terkecil.Jadi contoh kedua dari pertanyaan adalah string berikut (pertandingan digarisbawahi)
Ini didasarkan pada regex pengecekan prima (yang sekarang sudah terkenal) , variasi yang tertanam di sana 6 kali.
Ini adalah versi yang menggunakan spasi bebas dan komentar untuk mereka yang ingin tahu apa yang terjadi.
Anda dapat mengujinya secara online di sini . Jangan mencoba input terlalu besar, saya tidak membuat jaminan tentang kinerja monster ini.
Sunting:
Saya akhirnya porting ini ke PCRE (yang hanya membutuhkan dua langkah), dan memperpendek regex hampir sepertiga. Ini versi baru:
Ini pada dasarnya sama, dengan dua perubahan:
MIN
ke grup1
). Namun,PCRE
apakah dukungan\K
yang me-reset awal pertandingan ke posisi kursor saat ini. Karenanya(?<=^(1+),.*)
menjadi^(1+),.*?\K
, yang sudah menyimpan dua byte.(?n)
untuk mencocokkan grupn
lagi, mirip dengan panggilan subrutin. Karena regex asli berisi kode untuk menemukan faktor prima terbesar nomor dua kali, saya bisa mengganti seluruh sebagian besar yang kedua dengan sederhana(?2)
.sumber
3
atau7
) sebenarnya prima. Ini mensyaratkan bahwa ada salinan faktor lain setelah pertama kali menangkapnya, yang tidak akan berlaku untuk bilangan prima. Sementara saya mengatasinya di .NET dengan meletakkan tampilan di belakang sana sehingga saya bisa mundur sedikit untuk memeriksa, ini tidak akan mungkin dalam versi PCRE yang lebih pendek karena kurangnya tampilan panjang variabel. Mungkin ini mungkin untuk mempersingkat sedikit itu, tapi saya tidak berpikir hanya mengubah+
ke*
karya.(.*),.*?\K(?=(..+)((?=((?(R)\6|\2))*$).*(?=\4$)(?!(..+)\5+$)))(?!.+(?=\1)(?=(..+)(?3)).*(?!\2)\6).+
99 byte di PCRE. Juga, saya telah menemukan banyak pekerjaan Anda di situs ini dan saya penggemar: D Menantikan pertarungan regex di masa depan!\4$
mengeluarkan lookahead dan menempelkannya setelah lookahead negatif, tetapi ini sangat memengaruhi kinerja (setiap subkelompok angka <= \ 4 diperiksa untuk komposit daripada hanya \ 4 itu sendiri) dan gagal pada input yang lebih lama.Regex (rasa PCRE), 66 (65🐌) byte
Terinspirasi dengan melihat bahwa baik Martin Ender dan jaytea , dua jenius regex, menulis solusi regex untuk golf kode ini, saya menulis sendiri dari awal. Regex pengecekan prime yang terkenal tidak muncul di solusi saya.
Jangan membaca ini jika Anda tidak ingin beberapa sihir regex unary dimanjakan untuk Anda. Jika Anda ingin mencoba mencari tahu sendiri keajaiban ini, saya sangat menyarankan memulai dengan menyelesaikan beberapa masalah di ECMAScript regex:
(Mesin regex yang saya tulis mungkin bisa membantu, karena sangat cepat di regex matematika unary dan termasuk mode numerik unary yang dapat menguji rentang bilangan alami (tetapi juga memiliki mode string yang dapat mengevaluasi regex non-unary, atau unary dengan pembatas). Secara default ECMAScript kompatibel, tetapi memiliki ekstensi opsional (yang secara selektif dapat menambahkan subset PCRE, atau bahkan pencarian molekuler, sesuatu yang tidak dimiliki oleh mesin regex lain).)
Kalau tidak, baca terus, dan baca juga GitHub Gist ini (peringatan, banyak spoiler) yang menceritakan perjalanan mendorong regex ECMAScript untuk menangani fungsi bilangan alami dari meningkatnya kesulitan (dimulai dengan serangkaian puzzle teukon, tidak semuanya matematika, yang memicu ini perjalanan).
Seperti halnya solusi regex lain untuk masalah ini, input diberikan sebagai dua angka dalam bijective unary, dipisahkan oleh koma, mewakili rentang inklusif. Hanya satu nomor yang dikembalikan. Regex dapat dimodifikasi untuk mengembalikan semua angka yang memiliki faktor prima terkecil terbesar yang sama, sebagai kecocokan terpisah, tetapi itu akan membutuhkan
\K
tampilan panjang variabel di belakang dan baik menempatkan lookahead atau mengembalikan hasilnya sebagai tangkapan alih-alih pertandingan.Teknik yang digunakan di sini dari pembagian implisit berulang dengan faktor prima terkecil identik dengan yang digunakan dalam string Match yang panjangnya adalah jawaban kekuatan keempat yang saya posting beberapa waktu lalu.
Tanpa basa-basi lagi:
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
Anda dapat mencobanya di sini.
Dan versi jarak bebas, dengan komentar:
Algoritme dapat dengan mudah dipindahkan ke ECMAScript dengan mengganti panggilan subrutin dengan salinan subrutin, dan mengembalikan pertandingan sebagai grup tangkap alih-alih menggunakan \ K. Hasilnya panjangnya 80 byte:
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
Cobalah online!
Catatan yang
((.+).*)
dapat diubah menjadi((.+)+)
, menjatuhkan ukuran dengan 1 byte (dari 66 ke 65 byte ) tanpa kehilangan fungsionalitas yang benar - tetapi regex secara eksponensial meledak dalam kelambatan.Cobalah online! (79 byte ECMAScript versi eksponensial-perlambatan)
sumber
Python 2, 95
Menemukan kelancaran angka dengan pembagian percobaan sampai jumlahnya 1.
i
menyimpan kelancaran terkecil sejauh ini,j
menyimpan angka yang memberikan kelancaran itu.Terima kasih kepada @xnor untuk golfnya.
sumber
if/else
harus disingkat. Pikiran pertama saya adalahb=a%p<1;p+=1-b;a/=p**b
. Atau eksekutif yang menjalankan salah satu dari keduanya dalam string yang disisipkan. Juga, mungkinwhile~-a
berhasil.s,p=a,2
,i,j=p,s
, @ ide xnor ini, menghapus lekukan berlebihan dan menempatkan blok sementara ke dalam satu baris menghasilkan 95 karakter. Tidak yakin bagaimana Anda menghasilkan 98 ...J,
22 2019 karakterMisalnya
(Fungsi mengambil dua argumen adalah infix dalam J.)
sumber
(#~ (= <./)@:(i:"1&1)@:*@:(_&q:))@:([ + i.@-~)
{:
sama dengan>./
dan menghemat 1 byte.Haskell,
9694938680 karakterpenggunaan melalui GHCi (cangkang Haskell):
EDIT: sekarang algoritma yang jauh lebih sederhana.
solusi ini mencakup kedua angka dalam kisaran (jadi
8 # 9
dan7 # 8
keduanya 8)penjelasan:
fungsi (%) membutuhkan dua parameter, x dan y. ketika y adalah 2, fungsi mengembalikan kelancaran x.
algoritma dari sini sederhana - dapatkan daftar gabungan semua kelancaran angka dalam input dengan masing-masing kelancaran menyimpan referensi ke nomor aslinya, urutkan kemudian untuk mendapatkan yang terkecil, dan kembalikan nomor yang dirujuk itu.
di sini adalah versi javascript yang tidak dikenali dengan algoritma yang sama:
sumber
m l=minimum l
Mathematica,
614539 karakterImplementasi spesifikasi yang sangat mudah sebagai fungsi yang tidak disebutkan namanya.
sumber
Lua - 166 karakter
Saya
tidaktidak memiliki (belum!) Reputasi yang cukup untuk mengomentari solusi AndoDaan ini , tapi di sini ada beberapa perbaikan pada kode-nyaPerubahan:
n%d==0
olehn%d<1
yang setara dalam hal initable.insert(f,d)
olehf[#f+1]=d
(#f
adalah jumlah elemen dari f)sumber
Bash + coreutils, 56 byte
Input berasal dari tepat dua argumen baris perintah (Terima kasih @ nyuszika7h !!!). Output adalah hasil tunggal yang dicetak ke STDOUT.
seq
menyediakan kisaran angka, satu per baris, dari argumen baris perintah.factor
membaca angka-angka itu dan mengeluarkan setiap angka diikuti dengan tanda titik dua dan daftar faktor prima dari angka itu. Jadi faktor prima terbesar adalah pada akhir setiap baris.sed
menghilangkan titik dua dan semua kecuali faktor prima terakhir / terbesar, sehingga meninggalkan daftar setiap angka (kolom 1) dan faktor prima terbesarnya (kolom 2).sort
secara numerik dalam urutan meningkat dengan kolom 2.sed
cocok dengan baris 1 (angka yang faktor prima terbesarnya adalah yang terkecil dalam daftar), menghapus semuanya termasuk dan setelah spasi pertama, lalu berhenti.sed
secara otomatis mencetak hasil substitusi ini sebelum berhenti.Keluaran:
Rentang catatan dalam konteks ini termasuk kedua titik akhir.
sumber
seq $@
lebih pendek 3 byte, jika Anda dapat berasumsi bahwa hanya ada dua argumen.Python 2, 67
Memikirkan golf lain memberi saya ide untuk algoritma baru untuk memeriksa kelancaran, maka jawabannya terlambat.
Faktorisasi utama faktorial
i!
meliputi persisnya bilangan prima paling banyaki
. Jadi, jikan
merupakan produk dari bilangan prima yang berbeda, kehalusannya (faktor prima terbesar) adalah yang terkecili
yangn
merupakan pembagii!
. Untuk memperhitungkan faktor prima yang berulangn
, kita dapat menggunakan daya yang cukup tinggii!
. Secara khusus,(i!)**n
sudah cukup.Kode mencoba meningkatkan faktorial
F=i!
, diperbarui secara rekursif. Kami memfilter untuk pembagiF
dalam rentang input, dan mengeluarkannya jika ada, dan sebaliknya beralih ke(i+1)!
.Kasus cobaan:
sumber
C,
14995Jawaban yang diedit:
Saya tidak dapat mengklaim kredit untuk solusi ini. Jawaban yang diperbarui ini meminjam metode indah yang digunakan oleh isaacg dalam solusi Python-nya. Saya ingin melihat apakah mungkin untuk menulisnya dalam C sebagai bersarang
for
/while
loop tanpa kurung kurawal, dan itu!Penjelasan:
R(a,b,n,q,p,m)
memindai rentanga
keb-1
dan mengembalikan nomor paling halus pertama yang ditemukan. Doa membutuhkan kepatuhan terhadap formulir berikut:R(a,b,a,b,2,0)
sehingga variabel di dalam fungsi secara efektif diinisialisasi sebagai berikut:n=a;q=b;p=2;m=0;
.Jawaban asli :
Ini adalah jawaban asli saya ...
Penjelasan:
P(n,f,p)
Nilai tes fungsin
untuk primality dan mengembalikan true (bukan nol) jikan
prime atau false (nol) jikan
non-prime.f
danp
keduanya harus disahkan sebagai 1.G(n,f)
mengembalikan faktor prima terbesarn
.f
harus dilewati sebagain
.R(a,b,p,n)
memindai rentanga
keb-1
dan mengembalikan nomor paling halus pertama yang ditemukan.p
harus dilewati sebagai 1.n
dapat berupa nilai apa pun.Tes driver:
Keluaran:
sumber
Haskell - 120
Contoh penggunaan:
sumber
<1
bukan==0
?Q, 91 karakterK, 78 karakterk mungkin akan mencukur selusin karakter
sunting: memang, memperlakukan batas atas sebagai tidak inklusif saat ini
sumber
Catatan: Jawaban ini tidak diizinkan.
Jawaban ini menggunakan beberapa fitur Pyth yang ditambahkan setelah tantangan diajukan.
Saya menambahkan fitur baru lainnya, memanggil jangkauan unary pada tuple 2 elemen, yang mempersingkat solusi oleh dua karakter, untuk ini:
Pyth , 7
Input sekarang diambil dengan dipisahkan koma. Sisanya sama.
Jawaban ini menggunakan fitur Pyth yang ditambahkan setelah pertanyaan ini ditanyakan, khususnya setelah melihat solusi CJam @ aditsu yang luar biasa. Yang sedang berkata, saya ingin menunjukkan apa yang menambahkan fitur yang dimungkinkan. Fiturnya adalah
P
, yang merupakan fungsi arity-1 yang pada input integer mengembalikan daftar semua faktor utama input, diurutkan terkecil hingga terbesar.Pyth , 9
Menggunakan rentang gaya Python, baris baru dipisahkan pada STDIN. Menghasilkan solusi terkecil untuk STDOUT.
Penjelasan:
Tes:
sumber
Lua - 176 karakter
Saya benar-benar harus berhenti bermain golf di Lua. Tidak ada gunanya.
sumber
Clojure -
173170 karakterSaya seorang pemula Clojure. Golf:
Sampel berjalan:
Kisaran termasuk low-end, tidak termasuk high-end: [a, b) Hanya mencetak salah satu angka yang paling halus, jika banyak terjadi.
hasil:
Tidak Disatukan:
sumber
Ruby,
6562Dengan permintaan maaf ke https://codegolf.stackexchange.com/a/36484/6828 , ini adalah versi golf (dan sedikit disederhanakan) dari itu. Menggunakan rentang inklusif karena karakternya lebih pendek.
Dan terima kasih kepada YenTheFirst karena telah menyelamatkan tiga karakter.
sumber
C # LINQ:
317303289262Tidak Disatukan:
Dibutuhkan pada awal dan panjang dari baris perintah dan akan mengembalikan nomor halus terbesar.
Saya menggunakan jawaban dari sini dan sini untuk membuat jawaban saya.
Terima kasih kepada VisualMelon untuk mengubahnya dan mencukur 12 byte! Saya juga menyingkirkan kawat gigi di if menghemat 2 byte, dan CodeInChaos menunjukkan beberapa hal yang jelas saya lewatkan (terima kasih lagi).
sumber
F
dengan mendefinisikan diint b
sebelah m. Di beberapa tempat Anda melakukan perbandingana%b==0
, dana
danb
selalu positif Anda dapat memotong satu byte untuk masing-masing dengan memeriksa apakah kurang dari 1a%b<1
. Anda juga dapat menyimpan byte dengan menambahkanb
dalam kondisi ifa%++b<0
daripada dalam untuk dengan menginisialisasi ke 1. Saya juga berpikir dalam hal ini lebih murah untuk hanya memenuhi syarat sepenuhnyaSystem.Console.WriteLine
dan menghindarinamespace
klausa.m=...:m;
berada di luar loop sementara. Karena itu, Anda dapat menjatuhkanm=0,
dan menggantireturn m;
denganreturn m=b>m?b:m;
. Kemudian, Anda bisa menjatuhkanm=...:m;
seluruhnya.Aggregate
kerjanya, saya hanya mencobanya setelah melihatnya di jawaban lain untuk sampai ke objek baru saya, bukan hanya satu bidang di dalamnya, dan kebetulan bekerja dengan sempurna :)R, 83
di mana bagian bawah rentang input ditetapkan
a
dan bagian atas (inklusif) ditugaskanb
.gmp
adalah paket yang tersedia di CRAN. Rasanya kotor sampai saya melihatmf
fungsi absurd di CJam. Instal dengan mengetikinstall.packages("gmp")
di konsol.sumber
lapply
3 kali Anda mungkin ingin alias itu (yaitul=lapply
dan kemudian gunakanl(...
). Demikian pula karenafactorize
hanya fungsi yang Anda gunakan dari paketgmp
yang dapat Anda gunakangmp::factorize
alih-alih memuat pustaka dan kemudian menggunakanfactorize
. Kode Anda akan menjadil=lapply;n=a:b;n[which.min(l(l(l(n,gmp::factorize),max),as.numeric))]
69 byte.PowerShell - 85
Ini akan mengurutkan rentang angka (inklusif) berdasarkan faktor prima maks masing-masing angka. Ini mengembalikan elemen diurutkan terendah.
sumber
J - 16 char
Menggunakan gaya rentang ( mulai , panjang ), sebagaimana diizinkan oleh komentar.
Untuk digunakan sebagai kata kerja diad: argumen kiri adalah awal , kanan adalah panjang .
Solusi ( mulai , akhir ) adalah +2 karakter, dan tidak termasuk akhirnya; termasuk akhirnya +2 lagi. Tapi sisi baiknya, ini terlihat bagus karena kami cocok dengan semua {kurung kurawal}.
sumber
Serius, 8 * 14/7 = 16 (tidak kompetitif)
Serius dibuat setelah tantangan ini, tetapi saya ingin memposting jawaban ini karena itu mencontohkan jenis tantangan yang Serius pandai lakukan.
Cobalah online!
Penjelasan:
sumber
Pyth , 7 byte
Coba di sini!
}
r
sumber
Cobra - 150
Bahkan tidak yakin mengapa saya repot, ular kobra tidak bisa bersaing di sini.
sumber
Ruby - 113 karakter
Menggunakan stdlib. Mengembalikan satu hasil. Diuji pada ruby 2.1.2.
sumber
Perl (5.10+), 83
(linebreak dapat dihapus). Mengambil dua titik akhir dari rentang inklusif pada dua baris stdin (karena
<>
lebih murah daripada mengaksesARGV
) dan mengeluarkan yang paling halus ke stdout. Jika ada dasi untuk yang paling halus, cetaklah yang terkecil. Bisa mencetak yang terbesar dengan biaya satu karakter.Algoritme pada dasarnya adalah cara isaacg untuk menemukan faktor prima terhebat, meskipun kami mengatasinya secara mandiri. Bagian golf turun indah untuk satu pernyataan di perl, sisanya memiliki lebih banyak overhead daripada yang saya inginkan sekalipun.
Harus dijalankan di bawah
perl -E
atau denganuse 5.012
pembukaan. Jika Anda tidak dapat melakukannya, gantisay$r
denganprint$r,$/
.sumber
Python 2 (84)
Solusi @ isaacg , tetapi dengan
min
tombol fungsi menggantikan penemuan-min yang eksplisit, dan fungsi rekursif memainkan peran iterasi.Jalankan di Stackless Python untuk menghindari batas rekursi.
Tampaknya boros untuk menggunakan kondisi yang diparantisasi
(n%p<1)
, kemudian ulangi negasinya juga dalam paranthes(n%p>0)
, tapi itu yang terbaik yang saya dapatkan. Saya mencoba banyak hal, tetapi ternyata lebih buruk.Saya menyambut setiap perbaikan yang dapat Anda pikirkan.
sumber
Java 8 - 422
454karakterSaya sedang belajar Java 8, dan ingin memberikan suntikan ini relatif terhadap Java (atau bahkan Java 8 stream).
Dibandingkan dengan bahasa lain, ini brutal tetapi latihan yang menarik.
Golf:
Tidak Disatukan:
contoh jalankan menggunakan:
sumber
MATL ( non-kompetitif ), 20 byte
Bahasa ini dirancang setelah tantangan
Kisaran inklusif di kedua ujungnya. Angka diambil sebagai dua input terpisah.
Cobalah online!
Penjelasan
sumber
&:[]y"@YfX>h]&X<)
atau mungkin 16:[]y"@YfX>h]&X<)
. Itu&
benar - benar ide yang hebat (dan saya kiray
tidak tersedia saat itu?).Yf
dengan awalan 1 akan berguna di sini juga, tapi itu mungkin tidak cukup untuk memutuskan itu ide yang baik secara umum. :)y
atau&
. Kredit untuk Suever untuk semantik yang sangat berguna dari yang terakhir (ide awal saya membuatnya berarti "satu input lebih dari standar"). Jika kita melihat lebih banyak contoh di manaYf
dengan menambahkan yang akan berguna, mungkin benar-benar layak menambahkan fitur itu. Masalahnya adalah, ada sekitar 34 jawaban yang digunakanYf
(sesuai dengan skrip ini ), jadi sulit untuk mengatakannyaJelly , 7 byte, skor = 7 ÷ 7 × 8 = 8, tantangan tanggal bahasa
Cobalah online!
Mengambil titik akhir rentang bawah dan atas sebagai dua argumen terpisah. Menghasilkan daftar semua angka paling halus dalam kisaran. (Ini dapat dilihat sebagai fungsi, dalam hal ini outputnya adalah daftar Jelly, atau sebagai program lengkap, dalam hal ini output terjadi menggunakan representasi daftar yang sama seperti yang dilakukan JSON.)
Penjelasan
Saat-saat ketika program Jelly Anda hanyalah terjemahan harfiah dari spesifikasi ...
sumber