Formasi tentara Romawi kuno sangat terkenal di seluruh dunia. Dalam formasi-formasi ini legiun Romawi dikelompokkan dalam bentuk geometris (biasanya persegi panjang) melindungi sayap dan bagian superiornya menggunakan perisai mereka. Legionary di posisi interior menutupi bagian superior yang menempatkan perisai mereka di atas kepala mereka, legionary di sisi membawa 2 perisai: satu untuk melindungi bagian superior, dan satu atau lebih perisai untuk melindungi sisi (jika seseorang berada di sudut) dia punya 3 perisai, jika seseorang sendirian dalam formasi dia punya 5 perisai Ya, saya tahu tidak mungkin bagi manusia untuk membawa 5 perisai, tetapi entah bagaimana mereka melakukannya ). Dengan menggunakan formasi ini, semua legiun romawi melindungi diri mereka sendiri dan merupakan lawan tersulit pada saat itu.
Sejarah mengatakan ada seorang jenderal Romawi yang menyatakan bahwa bentuk formasi terbaik adalah kuadrat (jumlah legiun yang sama dalam baris dan kolom). Masalahnya adalah mencari tahu berapa banyak formasi (dan ukuran) yang harus dia pisahkan pasukannya untuk:
- Jangan tinggalkan legiun dari formasi (meskipun ia mengakui formasi legiun tunggal)
- Kurangi jumlah perisai yang diperlukan
Jenderal, setelah melakukan beberapa perhitungan dan matematika, ia menemukan bahwa cara terbaik untuk mencapai 2 kondisi ini adalah mulai dengan kotak terbesar yang mungkin, dan kemudian ulangi sampai tidak ada legiun yang tersisa .
Contoh:
Jika 35 legiun di pasukannya, formasi terdiri
- Kotak 5x5 legiun (Ini adalah kotak terbesar yang mungkin).
Dengan legiun yang tersisa (10)
- Kotak 3x3
Dengan legiun yang tersisa (1)
- Persegi 1x1.
Pada akhirnya akan terlihat seperti ini:
5x5
* * * * * 3x3
* * * * * * * * 1x1
* * * * * * * * *
* * * * * * * *
* * * * *
Para legiun di posisi interior menutupi bagian superior yang menempatkan perisai mereka di atas kepala mereka . Mereka hanya membutuhkan 1 perisai.
* * * * *
* 1 1 1 * * * *
* 1 1 1 * * 1 * *
* 1 1 1 * * * *
* * * * *
Legionaris di sayap membawa 2
* 2 2 2 *
2 1 1 1 2 * 2 *
2 1 1 1 2 2 1 2 *
2 1 1 1 2 * 2 *
* 2 2 2 *
Jika seseorang berada di sudut dia punya 3 perisai
3 2 2 2 3
2 1 1 1 2 3 2 3
2 1 1 1 2 2 1 2 *
2 1 1 1 2 3 2 3
3 2 2 2 3
Jika seseorang sendirian dalam formasi dia memiliki 5 perisai
3 2 2 2 3
2 1 1 1 2 3 2 3
2 1 1 1 2 2 1 2 5
2 1 1 1 2 3 2 3
3 2 2 2 3
Formasi ini membutuhkan total 71 perisai.
Tantangan
- Hitung jumlah perisai yang dibutuhkan untuk jumlah legiun X
Memasukkan
- Jumlah legiun di tentara
Keluaran
- Jumlah perisai yang dibutuhkan.
Uji Kasus
35 => 71
20 => 44
10 => 26
32 => 72
- Aturan standar kode-golf berlaku
Amazon.com : Best-selling Nipple Shield Carrying Case, Perfect...
jadi saya kira saya tidak akan pernah benar-benar tahu. Apakah mereka benar-benar membawa 5 perisai - atau apakah ini membuat pertanyaan berhasil: P?Jawaban:
Python 2 ,
605048 byteCobalah online!
Baru mengenal kode golf, tetapi memberikan ayunan terbaik saya!
Metode:
Jumlah di
n^2 + 4n
manan
masing-masing angka kuadrat terbesar yang dijumlahkan ke input.Edit 1
Dikurangi menjadi 50 byte berkat @Jonathan Frech!
Edit 2
Beralih
int(s**.5)
kes**.5//1
untuk menyimpan 2 byte berkat @ovssumber
n*n
lebih pendek daripadan**2
menghemat dua byte; lebih dari itu saya tidak bisa mengatakan karena saya tidak menulis python ...int(s**.5)
dapat disingkat menjadis**.5//1
.//
adalah pembagian lantai di kedua Python 2 dan 3.3**.5//1
dievaluasi1.0
dalam kedua versi.R ,
5150 byteCobalah online!
Kuadrat dengan panjang sisi harus memiliki pelindung y 2 + 4 y . Kami mengurangi dengan kuadrat terbesar kurang dari atau sama dengan x sampai x adalah nol, mengumpulkan jumlah perisai saat kita pergi.y y2+4y x x
Bukti:
Dengan kuadrat sempurna dengan panjang sisi , kita perlu tepat 1 tameng untuk setiap anggota kuadrat. Selanjutnya, untuk setiap anggota di tepian, kita membutuhkan tameng tambahan. Ada ( y - 2 ) 2 anggota yang tidak ada di tepinya, jadi ada y 2 - ( y - 2 ) 2 anggota di tepinya. Akhirnya, untuk setiap sudut, kita membutuhkan perisai tambahan. Terlepas dari kasus di mana y = 1 , kita dapat menambahkan 4. Ini menyederhanakan ke y 2 + 4 y yang untungnya juga menghasilkan nilai yang benar dariy (y−2)2 y2−(y−2)2 y=1 y2+4y ketika y = 1 , memungkinkan kita untuk menggunakannya untuk semua y .5 y=1 y
sumber
JavaScript (ES7), 34 byte
Cobalah online!
Bagaimana?
Pada setiap iterasi, kami menghitung lebar dari kotak terbesar yang mungkin. Jumlah perisaiswuntuk kotak ini diberikan oleh:w=⌊n−−√⌋ sw
Misalnya, untuk :w=3
sumber
Jelly , 13 byte
Cobalah online!
-1 terima kasih kepada Jonathan Allan .
sumber
Julia 0,6 , 36 byte
Cobalah online!
Tidak Disatukan:
(Ini juga dapat dilakukan dalam 35 byte dengan
n>0?(s=isqrt(n))*s+4s+f(n-s*s):0
, tapi saya menulis ini untuk Julia 0.7 ingin menghindari peringatan penghinaan yang baru (membutuhkan ruang?
dan:
).)sumber
Stax , 15 byte
Jalankan dan debug itu
sumber
Brachylog , 26 byte
Cobalah online!
sumber
Retina 0.8.2 , 28 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Konversikan ke desimal.
Cocokkan angka ganjil. Lulus pertama melalui grup,
\1
belum ada, jadi hanya\G1
bisa cocok, yang cocok 1. Pertandingan berikutnya tidak dapat cocok\G1
karena\G
hanya cocok di awal pertandingan, jadi alih-alih kami harus mencocokkan11\1
yang 2 lebih dari pertandingan sebelumnya. Kami mencocokkan angka ganjil sebanyak yang kami bisa, dan karenanya total pertandingan adalah angka kuadrat, sedangkan tangkapan terakhir adalah satu kurang dari dua kali lipat sisinya.Tambahkan perisai samping untuk setiap pertandingan.n2 dan 2 n - 1 selagi kita membutuhkan n2+ 4 n = n2+ 2 + 2 ( 2 n - 1 ) .
$&
aku s$1
adalahJumlahkan dan konversikan ke desimal.
sumber
05AB1E , 17 byte
Cobalah secara online atau verifikasi semua kasus uji .
Berfungsi karena
ΔDtïÐns4*+Šn-}O
( 15 byte ) sepertinya tidak berfungsi .. Coba online dalam mode debug untuk melihat apa yang saya maksud. Saya akan mengharapkan untuk pergi dari[45,'35',25]
ke[45,10]
setelah-
dan iterasi berikutnyaΔ
, tapi rupanya itu membersihkan tumpukan kecuali untuk nilai terakhir dan menjadi[10]
, yang mengakibatkan 0 di akhir .. Tidak yakin apakah ini adalah perilaku atau bug yang dimaksudkan .. (EDIT: Ini dimaksudkan, lihat bagian bawah.)Penjelasan:
Juga menggunakanw2+ 4 w dimana w adalah lebar dalam satu lingkaran seperti kebanyakan jawaban lainnya.
EDIT: Rupanya perilaku yang saya jelaskan di atas
Δ
dimaksudkan. Berikut dua alternatif 17-byte yang disediakan oleh @ Mr.Xcoder yang digunakanΔ
dengan meletakkan nilai di global_array (with^
) dan mengambilnya kembali setelahnya (with¯
):Cobalah secara online atau verifikasi semua kasus uji .
Cobalah secara online atau verifikasi semua kasus uji .
sumber
dc , 25 byte
Cobalah online!
Hitung perisai sebagai
sum(n^2)
(nomor asli) ditambah4*sum(n)
dengan mendorong salinan setiap panjang sisi persegi ke dalam register tumpukana
saat berjalan, kemudian menambahkan semua nilai dari registera
sebagai rekursi "membuka gulungan".sumber
Sekam , 17 byte
Cobalah online!
Alternatif
Cobalah online!
sumber
APL (Dyalog Unicode) ,
3130 byteCobalah online!
-1 byte terima kasih kepada @jslip
sumber
Ruby , 45 byte
Cobalah online!
sumber
PHP , 67 byte
Untuk menjalankannya:
Contoh:
Atau Coba online!
Menggunakan
-R
opsi, versi ini adalah 60 byte :Contoh:
(di Linux, ganti
"
dengan'
)Catatan: Ini menggunakan jawaban hebat rumus Arnauld , saya tidak dapat menemukan yang lebih pendek dari itu.
sumber
Pyth , 19 byte
Fungsi rekursif, yang harus disebut menggunakan
y
(lihat tautan).Coba di sini!
Pyth , 21 byte
Riwayat revisi cukup lucu, tetapi pastikan untuk mengunjunginya jika Anda ingin versi yang jauh lebih cepat :)
Coba di sini!
Penjelasan
sumber
Swift 4 ,
111 99 8478 byteCobalah online!
Itu terasa ketika menerapkan integer square root secara manual jauh lebih pendek daripada built-in ...
Tidak Dijelaskan dan Dijelaskan
sumber