Tokoh serupa
Dua persegi panjang serupa jika rasio sisi mereka sama.
Pertimbangkan dua persegi panjang ini; persegi panjang 5 garis dan lebar 11 karakter:
===========
===========
===========
===========
===========
dan persegi panjang 10 garis dan 22 karakter lebar:
======================
======================
======================
======================
======================
======================
======================
======================
======================
======================
Bentuk-bentuk ini serupa karena rasio sisi-sisinya sama. Singkatnya (dengan sebagai sisi terpendek dan menjadi sisi terpanjang):
Anda juga dapat melakukan:
Tantangan
Tulis program atau fungsi yang mengambil persegi panjang "utama" dan beberapa persegi panjang dan cetakan "lainnya" yang mana dari "yang lain" mirip dengan "utama".
Input
Bentuk dan daftar bentuk. Setiap bentuk terdiri dari 2 bilangan bulat positif bukan nol, yang menunjukkan lebar dan tinggi persegi panjang. Misalnya, ini:
(4,2), (3,9)
menunjukkan dua persegi panjang, 4x2 dan 3x9. Format input yang tepat mungkin sesuai keinginan Anda.
Hasil
Indeks bentuk "lain" yang mirip dengan "utama". Anda dapat memilih apakah indeksnya berbasis 0 atau 1, serta format dan urutan output yang tepat.
Program sampel
Dengan Python:
main = eval(raw_input()) # The main rectangle.
rects = eval(raw_input()) # The list of rectangles.
similar = set()
for i, rect in enumerate(rects):
if max(main)*min(rect) == min(main)*max(rect): # Cross-multiply
# They are similar.
similar.add(i)
print similar
Input dan output sampel
Memasukkan:
(1, 2)
[(1, 2), (2, 4)]
Keluaran:
set([0, 1])
Memasukkan:
(1, 2)
[(1, 9), (2, 5), (16, 8)]
Keluaran:
set([2])
Kemenangan
Ini adalah kode-golf, sehingga pengiriman terpendek menang.
Catatan
- Ini harus dilakukan tanpa berkata, tetapi celah standar dilarang .
- Tidak ada builtin untuk menemukan angka yang sama dapat digunakan. (Aku bahkan tidak tahu kalau itu ada, tapi aku tidak akan terkejut!)
sumber
[1.0 2.0]
format input yang dapat diterima?[(1,2), (2,4), (1,9), (2,5), (16,8)]
, apakah hanya[0,1,4]
dan[1,2,5]
diizinkan, atau bisakah kita juga menampilkan[1,1,0,0,1]
atau[(1,2), (2,4), (16,8)]
?Jawaban:
Pyth, 15 byte
sumber
Python, 61 byte
Ya, saya menggunakan pengeluaran 9 karakter untuk menulis
enumerate
. Mengambil input seperti1, 2, [(1, 9), (3,6), (2, 5), (16, 8)]
. Untuk Python 2, nilai input harus ditulis sebagai float.Satu char lagi (62) dalam Python 3:
sumber
i
sebagai indeks, dan(x,y)
sebagai titik. Ia kemudian memeriksa apakah nilainyax/y
sama dengan quotient (nomor dua awala/b
) atau kebalikannya (b/a
). Jika sama dengan salah satu dari nilai-nilai itu, nilaii
tersebut ditambahkan ke daftar, jika tidak maka akan dibuang.CJam,
222019 byteDi atas adalah fungsi anonim yang memunculkan array tunggal pasangan titik mengambang (pasangan pertama adalah jarum) dari tumpukan dan mendorong array indeks berbasis 1 sebagai imbalannya.
Cobalah online di Internet juru bahasa CJam .
Bagaimana itu bekerja
sumber
Haskell , 48 byte
Cobalah online!
Sebut seperti ini
(!) 1 2 [(1, 9), (3,6), (2, 5), (16, 8)]
.Dekat-port jawaban Python saya . Ekspresi
zip[0..]l
menyebutkan daftar dengan indeksnya.Ekspresi
x/y+y/x==a/b+b/a
memeriksa apakah rasionyax/y
salaha/b
ataub/a
, karena fungsif(z) = z + 1/z
memilikif(z) = f(1/z)
dan tidak ada tabrakan lainnya.sumber
h
operator mengambil tiga argumen? Itu akan menghemat satu byte, dan saya pikir itu akan tetap dalam aturan.Snowman 1.0.2 , 61 karakter
Omong kosong murni (kecuali jika Anda mengenal Snowman), alias persis sejalan dengan tujuan desain bahasa menjadi membingungkan mungkin.
Format input sama seperti pada postingan, format output juga minus
set(
dan sama)
.Tidak disatukan (atau tidak dijinakkan, sungguh):
Saya cukup bangga dengan beberapa trik yang saya gunakan dalam trik ini:
Saya menggunakan format input yang sama seperti pada posting. Tetapi alih-alih mencoba menguraikannya entah bagaimana, yang akan menjadi benar-benar berantakan, saya hanya menggabungkan dua baris dan kemudian menggunakan regex untuk mengekstraksi semua angka menjadi satu array besar (yang kemudian saya lakukan
2aG
, yaitu mendapatkan setiap kelompok 2).:nD;aF
cukup mewah. Ini hanya membutuhkan array dari dua elemen dan membagi yang pertama dengan yang kedua. Yang tampaknya cukup sederhana, tetapi melakukannya dengan cara intuitif (a[0]/a[1]
) akan jauh, jauh lebih lama di Snowman:0aa`NiN`aA|,nD
(dan itu dengan asumsi kita tidak perlu khawatir tentang mengacaukan dengan variabel lain yang ada). Sebaliknya, saya menggunakan metode "lipat" dengan predikat "divide," yang, untuk array dua elemen, mencapai hal yang sama.0AAgaA
terlihat cukup berbahaya, tetapi apa yang sebenarnya dilakukannya adalah menyimpan a0
ke variabel, kemudian mengambil semua variabel dengan indeks lebih besar dari itu (jadi, semua variabel kecuali yang pertama). Tapi triknya adalah, alih-alihAaG
(yang akan menghilangkan array asli dan0
), saya menggunakanAAg
, yang membuat keduanya. Sekarang saya menggunakanaA
, at-index, menggunakan hal yang sama0
untuk mendapatkan elemen pertama dari array — lebih jauh, ini berada dalam mode konsumsi (aA
bukanaa
), sehingga ia menghilangkan0
array asli dan juga, yang sekarang menjadi sampah untuk kami.Sayangnya,
0AAgaA*|
tidak dasarnya hal yang sama yang GolfScript tidak dalam satu karakter:(
. Namun, saya masih berpikir itu cukup bagus, menurut standar Snowman. :)sumber
Mathematica, 41 byte
Pemakaian:
sumber
Pyth - 14 byte
Memfilter dengan membandingkan quotients, lalu memetakan
indexOf
.Test Suite .
sumber
1,2
dan[(1, 2), (2, 4), (1, 2)]
akan memberi[0, 1, 0]
daripada yang benar[0, 1, 2]
.APL (Dyalog Unicode) ,
1613 byte SBCSCobalah online!
-3 Terima kasih kepada @ngn!
Penjelasan:
Format output adalah vektor biner seperti
1 1 0 0 1
persegi panjang "lainnya" yang mirip.APL (Dyalog Extended) , 11 byte SBCS
Cobalah online!
Penjelasan:
Format output sama dengan jawaban Dyalog utama.
Terima kasih kepada Adám untuk bantuan golf + Diperpanjang.
sumber
(=.×∘⌽∨=.×)⍤1
Julia, 62 byte
The
find
Fungsi menempatkan elemen yang benar dalam vektor boolean..*
melakukan perkalian elemen secara vektor.Tidak Disatukan:
Pemakaian:
sumber
K5, 19 byte
Saya pikir ini akan melakukan trik:
Membawa daftar pasangan di mana yang pertama adalah "utama". Hitung rasio dengan membagi dimensi yang diurutkan dari setiap pasangan. Mengembalikan daftar posisi 0-diindeks dari pasangan yang cocok. (bisa dibilang format input yang saya pilih membuat -1 ini diindeks- jika ini dianggap tidak valid pada
1+
awal dan menambahkan dua karakter ke ukuran program saya.)Contoh penggunaan:
Ini berjalan dalam OK - perhatikan bahwa saya secara implisit tergantung pada divisi selalu menghasilkan hasil floating point. Ini akan bekerja di Kona jika Anda menambahkan titik desimal ke semua angka dalam input dan menambahkan spasi setelah
_
.sumber
Oktaf / Matlab, 44 byte
Menggunakan fungsi anonim:
Hasilnya adalah pengindeksan berbasis 1.
Untuk menggunakannya, tentukan fungsinya
dan menyebutnya dengan format berikut
Anda dapat mencobanya secara online .
Jika hasilnya bisa dalam pengindeksan logis (
0
menunjukkan tidak mirip,1
menunjukkan serupa): 38 byte :Contoh yang sama seperti di atas:
sumber
Brachylog , 14 byte
Cobalah online!
Mengambil input sebagai daftar yang berisi daftar yang berisi persegi panjang utama dan daftar persegi panjang lainnya (jadi test case 1 adalah
[[[1,2]],[[1,2],[2,4]]]
), dan menampilkan daftar indeks berbasis 0 melalui variabel output.Jika pemformatan input yang aneh dan spesifik semacam itu curang, itu sedikit lebih lama ...
Brachylog , 18 byte
Cobalah online!
Mengambil input sebagai daftar yang berisi persegi panjang utama dan daftar persegi panjang lainnya (jadi test case 1 lebih jelas
[[1,2],[[1,2],[2,4]]]
), dan menampilkan daftar indeks berbasis 0 melalui variabel output.Untuk menentukan apakah dua pasangan lebar-tinggi mewakili persegi panjang yang serupa, hanya dibutuhkan empat byte
pᵐ/ᵛ
(yang menghasilkan rasio bersama atau timbal baliknya). Semua sisanya menangani beberapa persegi panjang untuk membandingkan, dan hasilnya berupa indeks.sumber
dzaima / APL , 7 byte
Cobalah online!
8 byte menghasilkan daftar indeks bukan vektor boolean
sumber
[0,1,4]
atau[1,2,5]
(tidak yakin apakah bahasa Anda 0 atau 1 diindeks). Itu akan menjadi tantangan yang lebih baik jika ketiga format output diizinkan: indeks; filter untuk menjaga nilai kebenaran; daftar nilai truey / falsey (seperti yang Anda miliki sekarang), bukan hanya indeks yang diizinkan.[0,1,4]
,[1,2,5]
,4\n0\n1
,5 2 1
, dll dll, karena masih menyatakan indeks . Tetapi saya telah meminta OP untuk mengklarifikasi (jika mereka merespons, karena ini adalah tantangan berusia 4 tahun). Dalam jawaban 05AB1E saya itu berarti 14 byte jika indeks wajib vs 8 byte jika salah satu dari dua opsi lainnya diizinkan. Bagaimanapun, saya meningkatkan jawaban Anda. :)Haskell, 75 byte
sumber
PowerShell , 57 byte
Cobalah online!
Indeks berbasis 1.
sumber
PowerShell ,
5856 byte-2 byte berkat mazzy x2
Cobalah online!
Ini sedikit menyalahgunakan
input may be however you desire
klausa dengan memiliki komponen bentuk pertama datang secara terpisah untuk menghemat 3 byte.PowerShell ,
6159 byteCobalah online!
Menggunakan pengindeksan bersyarat untuk bertukar antara indeks berbasis nol saat ini dan nol berdasarkan pada apakah rasio tersebut sesuai atau tidak. Untungnya dalam hal ini,
$i
peningkatan terlepas dari apakah itu dicetak atau tidak.sumber
-
sebagai gantinya-ne
.Javascript (ES6), 75
Alternatif, juga 75
Input diambil sebagai objek JSON, dan larik objek JSON
sumber
05AB1E ,
1514 byteCobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
The
J
oins ada karena 05AB1E tidak dapat menentukan indeks pada daftar multidimensi AFAIKJika mengeluarkan pasangan lebar / tinggi yang benar, atau mengeluarkan daftar nilai kebenaran / palsu berdasarkan daftar masukan, itu bisa 8 byte sebagai gantinya:
Cobalah secara online atau verifikasi semua kasus uji .
Cobalah online atau verifikasi semua kasus uji .
sumber