Setiap minggu Mohammad S. Anwar menghantar Cabaran Mingguan, peluang untuk kita semua mencari penyelesaian kepada dua tugas mingguan. Penyelesaian saya ditulis dalam Python terlebih dahulu, dan kemudian ditukar kepada Perl. Ini cara yang bagus untuk kita semua mempraktikkan beberapa pengekodan.
Cabaran, Penyelesaian saya
Anda diberi senarai domino, @domino.
Tulis skrip untuk mengembalikan bilangan domino yang serupa dengan mana-mana domino lain.
$dominos[i] = [a, b] dan $dominos[j] = [c, d] adalah sama jika sama ada (a = c dan b = d) atau (a = d dan b = c).
Saya tidak pasti sama ada ia bahasa Inggeris/AS atau sesuatu yang lain, tetapi saya menggunakan Domino sebagai jamak Domino. Domino apa yang anda dapat apabila anda lapar.
Untuk tugasan ini, saya mengambil integer daripada baris arahan dan menukarnya kepada senarai senarai (tatasusunan tatasusunan dalam Perl). Jika ini projek dunia sebenar, saya mungkin akan menggunakan Kelas Data dan mempunyai pengendali kesamarataan.
Saya mempunyai gelung berganda. Gelung luar - dipanggil i - adalah dari 0 hingga satu kurang daripada bilangan domino. Gelung dalam - dipanggil j - juga sama. Saya melangkau kes apabila i dan j adalah sama. Jika domino pada kedudukan i dan j adalah sama (sama ada nombor yang sama atau nombor bertentangan), saya menambah satu untuk mengira dan keluar dari gelung dalam.
def similar_dominoes(dominoes: list) -> int: count = 0 for i in range(len(dominoes)): for j in range(len(dominoes)): if i == j: continue if (dominoes[i][0] == dominoes[j][0] and dominoes[i][1] == dominoes[j][1]) \ or (dominoes[i][0] == dominoes[j][1] and dominoes[i][1] == dominoes[j][0]): count += 1 break return count
$ ./ch-1.py 1 3 3 1 2 4 6 8 2 $ ./ch-1.py 1 2 2 1 1 1 1 2 2 2 3
Anda diberi tatasusunan mata, (x, y).
Tulis skrip untuk mengetahui sama ada mata yang diberikan adalah bumerang.
Bumerang ialah satu set tiga titik yang semuanya berbeza dan bukan dalam garis lurus.
Seperti tugasan terakhir, saya mengambil integer daripada baris arahan dan menukarnya kepada senarai senarai (tatasusunan tatasusunan dalam Perl).
Saya cukup ingat dari matematik sekolah menengah untuk mengetahui bahawa kita boleh mendapatkan cerun (kecerunan) dua mata dengan formula (x2 - x1) ÷ (y2 - y1). Namun jika y1 dan y2 adalah sama, kita mendapat pembahagian dengan ralat sifar.
Oleh itu saya menggunakan semakan berikut:
def is_boomerang(points: list) -> bool: if all(points[0][1] == points[i][1] for i in range(1, len(points))): return False if any(points[0][1] == points[i][1] for i in range(1, len(points))): return True degrees = set(abs((points[0][0] - points[i][0]) / (points[0][1] - points[i][1])) for i in range(1, len(points))) return False if len(degrees) == 1 else True
$ ./ch-2.py 1 1 2 3 3 2 true $ ./ch-2.py 1 1 2 2 3 3 false $ ./ch-2.py 1 1 1 2 2 3 true $ ./ch-2.py 1 1 1 2 1 3 false $ ./ch-2.py 1 1 2 1 3 1 false $ ./ch-2.py 0 0 2 3 4 5 true
Atas ialah kandungan terperinci Bumerang yang serupa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!