برنامه نویسی

به حداکثر رساندن 1 بیت – انجمن DEV

چالش هفتگی 271

محمد اس. انور هر هفته چالش هفتگی را ارسال می کند، فرصتی برای همه ما تا راه حل هایی برای دو کار هفتگی پیدا کنیم. راه حل های من ابتدا در پایتون نوشته می شوند و سپس به پرل تبدیل می شوند. این یک راه عالی برای همه ما برای تمرین مقداری کد نویسی است.

چالش، راه حل های من

وظیفه 1: حداکثر تعداد

وظیفه

به شما یک m x n ماتریس باینری

یک اسکریپت بنویسید تا تعداد ردیف حاوی حداکثر یک ها را برگرداند، در صورت وجود بیش از یک ردیف، سپس کوچکترین شماره ردیف را برگردانید.

راه حل من

برای این کار، من از دو مقدار استفاده می کنم که هر دو با مقداردهی اولیه شده اند 0. را max_count متغیر تعداد یک ها را در ردیف منطبق ذخیره می کند، در حالی که max_row متغیر شماره ردیف (بر اساس 0) را ذخیره می کند.

سپس روی هر ردیف در ماتریس تکرار می کنم. اگر تعداد یکها (محاسبه شده با جمع سطر) بیشتر از max_count، سپس من به روز رسانی max_count و max_row ارزش های.

در نهایت، شماره ردیف (بر اساس 1) را با اضافه کردن یک به آن برمی گردم max_row.

def maximum_ones(matrix: list) -> int:
    rows = len(matrix)
    max_row = 0
    max_count = 0

    for row in range(rows):
        if sum(matrix[row]) > max_count:
            max_row = row
            max_count = sum(matrix[row])

    return max_row + 1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال ها

$ ./ch-1.py "[[0, 1],[1, 0]]"
1

$ ./ch-1.py "[[0, 0, 0],[1, 0, 1]]"
2

$ ./ch-1.py "[[0, 0],[1, 1],[0, 0]]"
2
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وظیفه 2: مرتب سازی بر اساس 1 بیت

وظیفه

شما آرایه ای از اعداد صحیح می دهید، @ints.

یک اسکریپت بنویسید تا اعداد صحیح را به ترتیب صعودی بر اساس تعداد 1 بیت در نمایش باینری آنها مرتب کند. در صورتی که بیش از یک عدد صحیح تعداد یک بیت یکسان داشته باشند، آنها را به ترتیب صعودی مرتب کنید.

سلام خلبان

کمی مماس در تفسیر من از این کار. من همیشه دیر به سراغ فناوری جدید رفته ام، و بیشتر به این فکر می کنم که “اگر خراب نیست، آن را تعمیر نکن”. من هنوز هم مثل دهه 90 املای “اینترنت” و “ایمیل” را می نویسم.

تا سه سال پیش، vim ویرایشگر کد اصلی من بود و من هنوز یک حساب ChatGPT ندارم. من ترجیح می‌دهم پاسخ‌هایم از وب‌سایت‌هایی که می‌دانم اطلاعات درستی دارند، مانند python.org، stack overflow و چند مورد دیگر را دریافت کنم.

با این حال، کار روزانه من این است که همه ما به Github Copilot دسترسی داشته باشیم، و من خوکچه هندی تیممان هستم. بنابراین من افزونه را در VS Code نصب کردم و بلافاصله منفجر شدم. «CREATE TABLE foo_bar (» را تایپ کرد و به طور خودکار می‌دانست چه کاری باید انجام دهد (سه ستون: id، foo_id و bar_id، کلیدهای خارجی، و غیره). من یک شبه تبدیل شدم.

با این حال، من فقط از Copilot برای نوشتن چیزهایی استفاده می کنم که از قبل می دانم چه می خواهم. این فقط باعث صرفه جویی در تعداد زیادی فشار کلید در انجام آن می شود. و احتمالاً احتمال خطا را کاهش می دهد.

پس به این کار برگردید. من قبلاً می دانستم که راه حل پایتون چگونه است. طبق معمول، من تعریف تابع “def sort_by_1_bits(ints: list) -> list:” را دارم و شروع به تایپ “sorted_ints =” کردم. پایین و ببین Copilot قبلاً بقیه را برای من نوشته است.

سپس نوبت به نوشتن رشته doc رسید. تا به حال، من از پسوند autoDocString برای نوشتن رشته سند صفحه دیگ بخار استفاده می کردم و جاهای خالی را پر می کردم. این هفته Copilot تمام کار را انجام داد، تنها با چند تغییر توسط من.

Copilot راه حل Perl را به تنهایی انجام نداد. قطعاً چند کار انجام داد، اما همچنان به تغییرات دستی نیاز داشت. Guess Copilot به خوبی Perl نیست که در پایتون است. 🙂

برداشت من از اولین هفته استفاده از Copilot این است که عالی است، اما شما هنوز باید به جای اینکه کورکورانه به خروجی آن اعتماد کنید، باید بدانید چه کاری انجام می دهد.

راه حل من

این یک خط در پایتون است:

sorted_ints = sorted(ints, key=lambda x: (bin(x).count('1'), x))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را bin تابع یک عدد صحیح را به رشته ای تبدیل می کند 0b به دنبال آن نمایش دودویی. را count تابع (همانطور که از نامش پیداست) وقوع آن مقدار را در یک شیء تکرارپذیر شمارش می کند. در پایتون، str نوع قابل تکرار است و هر تکرار یک کاراکتر از رشته است.

Perl تابع مشابهی ندارد¹، بنابراین من تابعی به نام one_bits ایجاد می کنم که تعداد 1 بیت را برای یک عدد صحیح معین می شمارد.

sub one_bits($int) {
    my $bin = sprintf( "%b", $int );
    return ($bin =~ tr/1/1/);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس از تابع مرتب سازی استفاده می کنم همانطور که در نسخه دهه 90 من از کتاب Programming Perl مستند شده است.

my @sorted = sort { one_bits($a) <=> one_bits($b) || $a <=> $b } @ints;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

¹ بهترین کاری که می توانستم انجام دهم این بود scalar(grep { $_ } split //, sprintf("%b", 63)، اما خواندن یا درک آن آسان نیست.

مثال ها

$ ./ch-2.py 0 1 2 3 4 5 6 7 8
(0, 1, 2, 4, 8, 3, 5, 6, 7)

$ ./ch-2.py 1024 512 256 128 64
(64, 128, 256, 512, 1024)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا