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:
- Cocokkan bilangan prima (jika Anda belum terbiasa melakukan ini di regex)
- Cocokkan kekuatan 2 (jika Anda belum melakukannya). Atau lakukan perjalanan Anda melalui Regex Golf , yang meliputi Prime dan Powers. Pastikan untuk melakukan set masalah Classic dan Teukon.
Temukan cara terpendek untuk mencocokkan kekuatan N di mana N adalah beberapa konstanta (yaitu ditentukan dalam regex, bukan input) yang dapat menjadi komposit (tetapi tidak harus). Misalnya, mencocokkan kekuatan 6.
Temukan cara untuk mencocokkan kekuatan Nth, di mana N adalah beberapa konstanta> = 2. Misalnya, cocokkan kuadrat sempurna. (Untuk pemanasan, cocokkan kekuatan utama .)
Cocokkan pernyataan perkalian yang benar. Cocokkan angka segitiga.
Cocokkan angka Fibonacci (jika Anda gila seperti saya), atau jika Anda ingin tetap pada sesuatu yang lebih pendek, cocokkan pernyataan eksponensial yang benar (untuk pemanasan, kembalikan sebagai pencocokan logaritma di dasar 2 dari kekuatan 2 - bonus, lakukan hal yang sama untuk nomor apa pun, membulatkannya sesuka Anda), atau nomor faktorial (untuk pemanasan, cocokkan nomor primorial ).
Cocokkan angka melimpah (jika Anda gila seperti saya)
Hitung bilangan irasional dengan presisi yang diminta (mis. Bagi input dengan akar kuadrat dari 2, kembalikan hasil yang dibulatkan sebagai kecocokan)
(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:
# No ^ anchor needed, because this algorithm always returns a
# match for valid input (in which the first number is less than
# or equal to the second number), and even in /g mode only one
# match can be returned. You can add an anchor to make it reject
# invalid ranges.
((.+).*), # \1 = low end of range; \2 = conjectured number that is the
# smallest number in the set of the largest prime factor of each
# number in the range; note, it is only in subsequent tests that
# this is implicitly confined to being prime.
# We shall do the rest of our work inside the "high end of range"
# number.
(?! # Assert that there is no number in the range whose largest prime
# factor is smaller than \2.
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
( # Subroutine (?3):
# Find the largest prime factor of tail, and leave it in tail.
# It will both be evaluated here as-is, and later as an atomic
# subroutine call. As used here, it is not wrapped in an atomic
# group. Thus after the return from group 3, backtracking back
# into it can increase the value of tail – but this won't mess
# with the final result, because only making tail smaller could
# change a non-match into a match.
( # Repeatedly divide tail by its smallest prime factor, leaving
# only the largest prime factor at the end.
(?=(..+)(\5+$)) # \6 = tool to make tail = \5 = largest nontrivial factor of
# current tail, which is implicitly the result of dividing it
# by its smallest prime factor.
\6 # tail = \5
)*
)
(?!\2) # matches iff tail < \ 2
)
# now, pick a number in the range whose largest prime factor is \2
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
\K # Set us up to return tail as the match.
(?3) # tail = largest prime factor of tail
\2$ # Match iff tail == \2, then return the number whose largest
# prime factor is \2 as the match.
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)