Jenis yang bertuah

王林
Lepaskan: 2024-09-03 15:08:15
asal
1120 orang telah melayarinya

The lucky sort

Cabaran Mingguan 284

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

Tugasan 1: Integer Bertuah

Tugasan

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.

penyelesaian saya

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
Salin selepas log masuk

Contoh

$ ./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
Salin selepas log masuk

Tugasan 2: Isih Relatif

Tugasan

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.

penyelesaian saya

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)
Salin selepas log masuk

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;
}
Salin selepas log masuk

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))
Salin selepas log masuk

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 ), ')';
}
Salin selepas log masuk

Untuk input melalui baris arahan, saya mengambil rentetan JSON yang sepatutnya menjadi senarai senarai integer.

Contoh

$ ./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)
Salin selepas log masuk

Atas ialah kandungan terperinci Jenis yang bertuah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!