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 integer positif, @ints.
Tulis skrip untuk menyusun semua elemen dalam senarai yang diberikan supaya ia membentuk nombor terbesar dan mengembalikannya.
Mungkin saya terlalu memikirkannya, tetapi ini tidak semudah yang disangkakan.
Satu pilihan ialah mengira semua pilih atur, dan melihat nombor mana yang terbesar. Walau bagaimanapun, ini menjadi intensif sumber apabila kami menambah lebih banyak integer. Jika saya mempunyai tiga belas integer, terdapat lebih 6 bilion pilih atur. Jadi saya menolak ini sebagai penyelesaian yang mungkin.
Jadi perkara yang jelas perlu dilakukan ialah mengisih integer, menggabungkannya dan mengeluarkan hasilnya. Memandangkan Python melayan rentetan dan integer secara berbeza, saya perlu menukar senarai yang diisih kepada rentetan, sertai mereka dan menukarnya kembali kepada integer.
def largest_number(ints: list) -> int: sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True) return int(''.join(map(str, sorted_ints)))
Apabila ia datang untuk menyusun, ini agak rumit. Dalam contoh kedua yang dibekalkan, kita dapat melihat bahawa 3, 30, dan 34 semuanya diberi integer. Untuk ini, saya tahu nombor terbesar diperoleh dengan memesan item (tertinggi hingga terendah) 34, 3 dan 30.
Untuk fungsi nombor_isih saya, saya menukar integer kepada rentetan, s1 dan s2. Saya kemudian mempunyai integer c1 iaitu gabungan s1 dan s2, manakala c2 ialah gabungan s2 dan s1.
Jika c1 kurang daripada c2, saya kembalikan -1. Jika ia lebih besar, saya kembalikan 1. Jika ia sama, saya kembalikan 0. Fungsi yang diisih menggunakan maklumat ini untuk mengisih senarai mengikut keperluan.
def number_sort(i1: int, i2: int) -> int: s1 = str(i1) s2 = str(i2) c1 = int(s1 + s2) c2 = int(s2 + s1) if c1 < c2: return -1 if c1 > c2: return 1 return 0
Kod Perl adalah lebih mudah :)
sub number_sort() { return "$a$b" <=> "$b$a"; }
$ ./ch-1.py 20 3 320 $ ./ch-1.py 3 30 34 5 9 9534330
Anda diberi tatasusunan integer, @ints.
Tulis skrip untuk mengembalikan jumlah jarak Hamming antara semua pasangan integer dalam tatasusunan integer yang diberikan.
Jarak Hamming antara dua integer ialah bilangan tempat di mana perwakilan binarinya berbeza.
Dalam tugasan sebelumnya, saya telah menyatakan bagaimana Python melayan integer dan rentetan sebagai jenis yang berbeza. Salah satu kelebihan Perl ialah kita diberitahu bahawa untuk semua maksud dan tujuan, kita tidak perlu risau tentang menaip pembolehubah. Walaupun secara dalaman mereka disimpan secara berbeza, Perl tahu apa yang perlu dilakukan.
Dalam Perl 5.10 dan Perl 5.16 (di mana saya melakukan kebanyakan pembangunan Perl saya), terdapat dua pengecualian yang ketara. Satu ialah modul JSON, yang akan mengeluarkan "10" untuk rentetan dan 10 untuk integer.
Yang lain ialah operasi bitwise. Daripada halaman perlop, 105 | 150 (dua integer) ialah 255, manakala "105" | "150" (dua rentetan) ialah 155.
Jadi, saya terkejut apabila saya membaca halaman perlop sekali lagi untuk melihat bahawa perkara ini telah diselesaikan dalam versi Perl yang kemudian. Ia kini mempunyai ciri bitwise yang merupakan percubaan dalam Perl 5.22, dan tersedia dalam Perl 5.28. Ini memastikan bahawa pengendali bitwise sentiasa menganggap nilai sebagai integer dan bitwise berasaskan rentetan mempunyai pengendali baharu.
Apa pun, kembali kepada tugasan di tangan. Untuk ini saya mengira semua gabungan dua integer. Untuk setiap gabungan, saya melakukan XOR (eksklusif atau) daripada dua nilai, menukarkannya kepada perduaan dan mengira nombor 1 dalam perwakilan binari.
def largest_number(ints: list) -> int: sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True) return int(''.join(map(str, sorted_ints)))
def number_sort(i1: int, i2: int) -> int: s1 = str(i1) s2 = str(i2) c1 = int(s1 + s2) c2 = int(s2 + s1) if c1 < c2: return -1 if c1 > c2: return 1 return 0
Atas ialah kandungan terperinci Memalu senarai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!