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 tatasusunan integer, @ints.
Tulis skrip untuk mencari integer bertuah jika ditemui sebaliknya kembalikan -1. Jika terdapat lebih daripada satu maka pulangkan yang terbesar.
Integer bertuah ialah integer yang mempunyai kekerapan dalam tatasusunan yang sama dengan nilainya.
Tugas ini agak lurus ke hadapan, jadi tidak memerlukan banyak penjelasan. Saya mencipta dict (cincang dalam Perl) kekerapan setiap integer, dipanggil freq. Saya kemudian beralih melalui kekunci freq (nilai tertinggi dahulu). Jika kekerapan integer adalah sama dengan nilai, saya mengembalikan nombor itu. Jika iterator habis, saya kembalikan -1.
def lucky_integer(ints: list) -> str: freq = Counter(ints) for i in sorted(freq, reverse=True): if i == freq[i]: return i return -1
$ ./ch-1.py 2 2 3 4 2 $ ./ch-1.py 1 2 2 3 3 3 3 $ ./ch-1.py 1 1 1 3 -1
Anda diberi dua senarai integer, @list1 dan @list2. Elemen dalam @list2 adalah berbeza dan juga dalam @list1.
Tulis skrip untuk mengisih elemen dalam @list1 supaya susunan relatif item dalam @list1 adalah sama seperti dalam @list2. Elemen yang tiada dalam @list2 hendaklah diletakkan di hujung @list1 dalam tertib menaik.
Walaupun Python mempunyai fungsi indeks untuk senarai, ia akan menimbulkan pengecualian ValueError jika item itu tiada dalam senarai. Oleh itu saya telah mencipta fungsi yang dipanggil find_index yang akan mengembalikan kedudukan val dalam lst jika dijumpai, atau mengembalikan panjang senarai jika tidak.
def find_index(lst: list, val: int): return lst.index(val) if val in lst else len(lst)
Penyelesaian Perl juga mempunyai fungsi yang sama, dan menggunakan List::MoreUtil's first_index untuk mencari kedudukan.
sub find_index( $lst, $val ) { my $idx = first_index { $_ == $val } @$lst; return $idx == -1 ? scalar(@$lst) : $idx; }
Saya menggunakan fungsi diisih untuk mengisih senarai pertama. Setiap item diisih mengikut tuple kedudukan indeks dan integer. Ini memastikan bahawa bahagian pertama senarai yang terhasil diisih mengikut kedudukan dalam senarai kedua, manakala nilai selebihnya diisih mengikut berangka.
def relative_sort(list1: list, list2: list) -> list: return sorted(list1, key=lambda i: (find_index(list2, i), i))
Penyelesaian Perl menggunakan logik yang sama, tetapi sintaks yang sama sekali berbeza.
sub main ($lists) { my $list1 = $lists->[0]; my $list2 = $lists->[1]; my @solution = sort { find_index( $list2, $a ) <=> find_index( $list2, $b ) or $a <=> $b } @$list1; say '(', join( ', ', @solution ), ')'; }
Untuk input melalui baris arahan, saya mengambil rentetan JSON yang sepatutnya menjadi senarai senarai integer.
$ ./ch-2.py "[[2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5],[2, 1, 4, 3, 5, 6]]" (2, 2, 1, 4, 3, 3, 5, 6, 7, 8, 9) $ ./ch-2.py "[[3, 3, 4, 6, 2, 4, 2, 1, 3],[1, 3, 2]]" (1, 3, 3, 3, 2, 2, 4, 4, 6) $ ./ch-2.py "[[3, 0, 5, 0, 2, 1, 4, 1, 1],[1, 0, 3, 2]]" (1, 1, 1, 0, 0, 3, 2, 4, 5)
Atas ialah kandungan terperinci Jenis yang bertuah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!