Tulis kode yang ketika diberi angka positif sebagai input, menghasilkan pembagi positif terbesar kurang dari atau sama dengan akar kuadrat .
Dengan kata lain cari yang terbesar sedemikian rupa
(Ada lebih besar dari atau sama dengan sehingga kali adalah )
Misalnya, jika inputnya adalah pembagi adalah , , , , , dan . , dan semua kalikan dengan angka yang lebih besar untuk mendapatkan , tetapi adalah yang terbesar jadi kami kembalikan .1 2 3 4 6 12 1 2 3 12 3 3
Ini adalah kode-golf sehingga jawaban akan dicetak dalam byte dengan lebih sedikit byte yang dianggap sebagai skor yang lebih baik.
Uji Kasus
(1,1)
(2,1)
(3,1)
(4,2)
(5,1)
(6,2)
(7,1)
(8,2)
(9,3)
(10,2)
(11,1)
(12,3)
(13,1)
(14,2)
(15,3)
(16,4)
(17,1)
(18,3)
(19,1)
(20,4)
(21,3)
(22,2)
(23,1)
(24,4)
(25,5)
(26,2)
(27,3)
(28,4)
(29,1)
(30,5)
(31,1)
(32,4)
(33,3)
(34,2)
(35,5)
(36,6)
(37,1)
(38,2)
(39,3)
(40,5)
(41,1)
(42,6)
(43,1)
(44,4)
(45,5)
(46,2)
(47,1)
(48,6)
(49,7)
(50,5)
Jawaban:
Python3 ,
4947 bytePenjelasan
l=x**.5//1
→ Tetapkanl
integer terbesar kurang dari sama dengan akar kuadrat darix
while x%l:l-=1
→ Meskipunl
tidak terbagi ratax
, penurunanl
.Suntingan
...//1
untuk menyimpan dua byte. (Desimal baik-baik saja! Terima kasih @Rod)sumber
input
/print
sebagai gantinyadef
/return
, Anda juga dapat menggantinyaint(...)
dengan...//1
untuk menyimpan lebih banyak byte seperti yang Anda lihat di siniMATL , 7 byte
Cobalah online!
Untuk penjelasan ini, kita akan menggunakan '12' sebagai input sampel. Penjelasan:
Ini berhasil karena banyak kebetulan yang beruntung.
<n>)
akan mengindekssumber
Z\J2/)
(J2/
atau setara.5j
artinyaend/2
bila digunakan sebagai indeks)C (gcc)
-lm
, 35 byteCobalah online!
sumber
sqrt
sebagai fungsi bawaan. Dengan-fno-builtin-sqrt
, gcc mengasumsikanint sqrt(int)
, dan tidak lulus adouble
. Pada x86-64,double
diteruskan dalam register berbeda dari integer. Pada 32-bit, adouble
akan mengambil 2 slot di tumpukan, jadi Anda juga akan melewati sampah (atau subnormal dengan bilangan bulat sebagai bagian bawah mantissa, jika 32 bit atas adalah nol). Ini juga rusak kecuali jika Anda membuat debug build karena bergantung pada kode-gen default un-dioptimalkan gcc untuk mengevaluasi ekspresi dalam register nilai-kembali.sqrt()
Masalahnya berbeda: Saya ingin tahu bagaimana itu berhasil, karena penelepon entah bagaimana harus mengonversiint
kedouble
. Saya memposting jawaban itu sebagai komentar kalau-kalau ada orang lain yang penasaran. Secara efektif gcc memilikisqrt
(termasuk prototipe) sebagai bawaan, jika tidak, ini akan gagal karena alasan yang kadang-kadang kita lihat dalam SO asm Qsi;f(n){for(i=0;++i<n/i||n%i;);}
adalah 31B, dan bekerja dengangcc -O
pada x86-64 (dengan biaya 2 atau 3 byte lebih untuk opsi baris perintah). Menggunakan||
bukannya|
menyebabkan gcc untuk meninggalkann/i
hasil dariidiv
dalam EAX, register nilai pengembalian ( godbolt.org/g/RJYeui ). Perilaku tidak terdefinisi dari++i
tanpa titik urutan terjadi untuk bekerja. (ASM yang dihasilkan pada dasarnya sama dengan jawaban kode mesin x86 saya .) Dengan-O0
, gcc sepertinya selalu pergii
di EAX, tapi mungkin kita bisa menggunakannya ...05AB1E , 5 byte
Cobalah online! atau sebagai Test suite
Penjelasan
sumber
APL (Dyalog Unicode) ,
161412 byteSaya senang saya bisa menulis jawaban di APL karena saya baru mempelajarinya. Banyak, banyak terima kasih kepada Adám untuk bantuan bermain golf. Saran bermain golf sangat disambut. Cobalah online!
Untuk mempelajari lebih lanjut tentang APL, lihat di The APL Orchard .
EDIT: -2 byte untuk memperbaiki masalah dengan kode saya. Terima kasih kepada H.PWiz untuk menunjukkan masalah itu. -2 byte dari memperpendek segalanya lagi.
Tidak melakukanolf
sumber
Sekam , 4 byte
Cobalah online!
Penjelasan
sumber
R ,
4533 byteCobalah online!
Asli:
Cobalah online!
sumber
x86 32-bit (IA32) kode mesin:
1816 bytechangelog: menangani
n=1
test case dengan benar, menyimpan 2 byte, dan kembali dalam EAX.Hitung sampai
n/i <= i
(yaitu ketika kita mencapai sqrt), dan gunakan pembagi pertama yang tepat setelah itu.Versi 64-bit dari ini dapat dipanggil dari C dengan konvensi pemanggilan Sistem x86-64, as
int squarish_root_countup(int edi)
.nasm -felf32 -l/dev/stdout squarish-root.asm
:Cobalah online! dengan pemanggil asm yang menggunakan byte pertama dari argv [1] sebagai integer secara langsung, dan menggunakan hasilnya sebagai status proses keluar.
sumber
Japt
-h
,86 byteCobalah
2 byte disimpan berkat Oliver
Penjelasan
sumber
Jeli , 5 byte
Cobalah online!
sumber
JavaScript ES7,
3331 byteCobalah online
sumber
Snowman , 38 byte
Cobalah online!
sumber
dc , 24
Cobalah online!
Penjelasan:
sumber
J,
2419 byte-5 byte berkat ide GCD Sherlock
Cobalah online!
jawaban asli
Cobalah online!
diurai
penjelasan
1 + i.@<.@%:
memberi jarak1 .. floor(sqrt)
.(A) B
membentuk kait, dengan kisaran di atas dilewati sebagai arg kanan]
ke A dan angka asli dilewatkan sebagai arg kirinya[
. Jadi...] | [
memberikan sisa-sisa setiap item dalam kisaran dibagi ke dalam arg asli.0 = ] | [
memberi pembagi tanpa sisa.] #~ ...
lalu menyaring rentang, hanya menyisakan itu.{:
memberikan item terakhir dalam daftar, yaitu yang terbesar.sumber
Jelly , 5 byte
Cobalah online!
sumber
Haskell , 36 byte
Cobalah online!
[1..]
[1..y]
sumber
QBasic (4.5), 52 byte
sumber
Keempat (gforth) , 53 byte
Cara terpendek tampaknya menggunakan stack floating point dan
fsqrt
, terpendek yang bisa saya dapatkan tanpa menggunakan 62 byte/mod
dan memeriksa apakah hasil bagi lebih besar dari pembagi.Cobalah online!
Penjelasan
Penjelasan Kode
sumber
F #,
5549 byteCobalah online!
Seq.findBack
: Mengembalikan elemen terakhir yang mengembalikan fungsi yang diberikanTrue
. Fungsi dalam kasus ini memeriksa untuk melihat apakah angka merupakan faktor nilai.sumber
Brain-Flak , 144 byte
Cobalah online!
Saya tidak begitu yakin jawaban ini sangat bagus. Saya merasa mungkin ada cara yang bagus untuk menyelesaikan tugas ini namun saya tidak cukup pintar.
Penjelasan
Saya mencoba melakukan tampilan jawaban yang meledak tetapi ada begitu banyak bagian yang bergerak sehingga tidak terlalu mencerahkan, jadi di sini ada penjelasan tentang apa yang dilakukan kode.
Bit penting pertama adalah ini
Bagian selanjutnya adalah perkalian, diambil dengan modifikasi dari wiki . Penggandaan ini istimewa karena menjaga nilai yang ada tanpa merusaknya. Bunyinya seperti:
Jadi kami mengalikan semua pasangan yang dipesan ini. Untuk setiap hasil, kami memeriksa apakah sama dengan input. Jika demikian, kami mengakhiri dan mengembalikan item yang lebih kecil dalam pasangan.
sumber
Python 2 , 41 byte
Cobalah online!
sumber
Jelly , 6 byte
Cobalah online!
sumber
Perl 5
-p
, 26 byteCobalah online!
sumber
Rust,
7170 byteVersi pra-uglified
Suntingan
> 0
lebih!= 0
. (Terima kasih kepada @CatWizard)sumber
!=
diganti>
?Japt , 8 byte
Cobalah online!
sumber
Segitiga , 49 byte
Cobalah online!
sumber
Pyret , 93 byte
Anda dapat mencoba ini secara online dengan menyalinnya ke dalam editor Pyret online !
Di atas mengevaluasi ke fungsi anonim. Ketika diterapkan ke bilangan bulat, itu mengembalikan hasil sesuai dengan spesifikasi.
sumber
Sebenarnya , 7 byte
Berdasarkan jawaban APL saya di sini . Selamat datang saran bermain golf! Cobalah online!
Tidak melakukanolf
sumber
Port jawaban Mathematica ini .
Jelly , 11 byte
Cobalah online!
Ini (11 byte) juga berfungsi, dan tidak bergantung pada
³
:Sayangnya
½Ḟ÷@Ċ÷@ʋÐL
(10 byte) tidak berfungsi. Dan ternyataƬ
danÐĿ
tidak persis sama (ketika tautannya diad)sumber
Java 8,
6554 bytePort of @hunteke 's Python 3 menjawab .
Cobalah online.
Jawaban 65 byte lama:
Cobalah online.
Penjelasan:
sumber