الگوریتم کوله‌پشتی، یک الگوریتم از نوع حریصانه هست. در این مطلب در مورد الگوریتم کوله‌پشتی یک و صفر (0/1 knapsack algorithm) می‌نویسم. برای مثال فرض کنید یک کوله پشتی با حجم ۹۰ لیتر دارید؛ و وسایلی که دارید علاوه بر حجم برای شما یک ارزش یا اهمیت دارند و احتمالا همه آن‌ها جا نمی‌شوند. حال به چه صورت وسایل را انتخاب می‌کنید تا بیشترین ارزش را در کوله پشتی خود داشته باشید؟ در الگوریتم کوله‌پشتی یک و صفر یا یک شی انتخاب می‌شود و یا خیر! امکان برش و تکه کردن نیست.

بهنام سیم‌جو28-10-1402 تخصصی

سلام! به مسئله‌ای برخوردم که نیاز داشت یه آرایه با طول نامعلوم رو از کاربر بگیریم. اینطوری که کاربر شروع می‌کنه به وارد کردن ورودی‌ها تا زمانی که کلمه end رو بزنه و تموم کنه. مسئله ساده‌ای هست و در کل زیاد چیز شاخی نیست!!

چالشش اینه که ما تعداد اعضا رو نمی‌دونیم و طول آرایه هم ثابته کنه، پس در حالت عادی مجبوریم ورودی‌ها رو بریزیم تو یه لیست تا آخرش که کار کاربر تموم شد همه رو مثلا منتقل کنیم به یه آرایه با طول لیسته، یعنی داریم دو بار هر عضو رو بررسی می‌کنیم که هزینه زمانی اینجا میشه 2n(معادل O(n)) از طرفی توی زبانی مثل C که اصلا لیست نیست و باید مثلا از SLL(به انگلیسی: Singly Linked List و به فارسی: فهرست پیوندی یک‌طرفه) استفاده کرد.

#include <stdio.h>
#include <stdlib.h>

double* rec(int i) {
    char input[100];  // Adjust the input string size as needed
    fgets(input, sizeof(input), stdin);
    
    if (strcmp(input, "end\n") == 0) {
        double* result = (double*)malloc(i * sizeof(double));
        return result;
    }

    double* arr = rec(i + 1);
    sscanf(input, "%lf", &arr[i]);
    return arr;
}

int main() {
    double* result = rec(0);

    // Printing the result
    for (int i = 0; result[i] != 0.0; ++i) {
        printf("%lf ", result[i]);
    }

    free(result);    // Free the allocated memory

    return 0;
}

مشابه این کد در پایتون به این شکل نوشته می‌شود(برای آرایه از numpy استفاده شده).

from numpy import np


def rec(i=0):
    inp = input()
    if inp == "end":
        return np.zeros(i)
    arr = rec(i + 1)
    arr[i] = int(inp)
    return arr

در واقع این شیوه به شکلی هوشمندانه از پشته(به انگلیسی: stack) خود سیستم برای ذخیره موقتی اعضا و شمارش آن ها استفاده می‌کنه. اما باید دقت کنید که این روش نامحدود هم نیست چون به اندازه پشته محدود میشه.

روبوکد یک بازی برنامه‌نویسی است که در آن با زبان جاوا، اقدام به برنامه‌نویسی کردن روبات‌های کوچکی می‌کنید که با بقیهٔ روبات‌ها باید بجنگند. مبارزه می‌تواند به صورت تک‌به‌تک با یک روبات دیگر یا به صورت گروهی با مثلاً ۹ روبات دیگر باشد. هرچند که باید روبات‌های خود را به زبان جاوا بنویسید، اما دانش عمیقی از این زبان مورد نیاز نیست و در صورتی برنامه‌نویس یکی از زبان‌ها از همین خانواده باشید، می‌توانید به‌راحتی یک روبات بسازید.

فاروق کریمی‌زاده31-06-1402 تخصصی

توضیح خاصی ندارم…

let father: &Individual = loop {
    i = rng.gen_range(0..pop_size);
    if rng.gen_bool(self.population[i].ft() / total_ft) as f64){
        break &self.population[i];
    }
}

فاروق کریمی‌زاده01-02-1402 تخصصی

امروز می‌خوام براتون از رمزنگاری دوسویه یا دو کلیده بگم، این رمزنگاری دنیای اطلاعات رو زیر و رو کرده! تو جهان امروز هر جا رو که نگاه می‌کنی ردپای این رمزنگاری هست! HTTPS ،SSH، ارز های دیجیتال، شبکه‌های مجازی و … همه و همه دارن از این روش برای حفظ امنیت استفاده می‌کنن.

آنچه خواهید خواند!

  • در ابتدا خواهم گفت در صورت نبود رمزنگاری اطلاعات چطور لو می‌روند
  • بعد یه دید کلی از رمزنگاری میدم و میگم چرا نمیشه از روش های رایج استفاده کرد
  • سپس روش رمزنگاری دوسویه رو به زبون ساده توضیح می‌دهم
  • در ادامه از چگونگی استفاده آن در وب می‌گم
  • چند خط کد می‌نویسیم و در پایتون از این روش استفاده می‌کنیم

بهنام سیم‌جو10-12-1401 عمومی

از بزرگ‌تر‌ها می‌شنوم که صفحه‌نمایش‌های قدیمی‌تر اشعه‌هایی از خود ساطع می‌کردند که باعث آسیب زدن به چشم و بروز سرطان می‌شدند. البته منظور از بروز سرطان اینجا به این معنی نیست که هرکس که با آن صفحه‌نمایش‌های غول‌آسا کار می‌کرد سرطان می‌گرفت اما به این معنی است که شانس ابتلا به سرطان در افرادی که بیشتر در معرض صفحه‌نمایش‌های CRT بودند، بیشتر می‌شد. صفحه‌نمایش‌های امروزی بسیاری از مشکلات صفحه‌نمایش‌های قدیمی را ندارند. در عین حال که سبک‌تر و نازک‌تر و کم‌مصرف‌تر هستند به چشم نیز کمتر آسیب می‌زنند. اما هنوز هم خیره‌شدن طولانی مدت به صفحه‌نمایش می‌تواند به چشم‌ما آسیب بزند.

ما اهالی کامپیوتر ساعت‌ها جلو صفحه‌ی کامپوتر هستیم و این مسئله دغدغه خیلی ها از جمله خود من هست؛ برای همین، راهکار ها و مواردی که پیدا کردم را در این مطلب با شما به اشتراک خواهم گذاشت.

فاروق کریمی‌زاده03-12-1401 عمومی

در این مطلب می‌گیم که چطور میشه در پایتون یک پروسه دیگر را اجرا کرد و خروجی استاندارد و ورودی استاندارد رو بگیریم و ازش استفاده بکنیم. خروجی و ورودی استاندارد همون چیزایی هستن که تو محیط متنی چاپ میشن یا کاربر توی ورودی برنامه وارد می‌کنه. در واقع توی این مطلب یاد می‌گیرید که چطور می‌تونید در پایتون با برنامه های کنسولی دیگه تعامل کنید.

پایپ (pipe) چیست؟

به طور پیش‌فرض سیستم‌عامل ورودی‌ها رو از موس و کیبورد می‌گیره و خروجی‌ها رو روی صفحه‌نمایش می‌نویسه. اما در بعضی مواقع نیاز هست که یک برنامه از خروجی‌های یک برنامه (یا دستور) دیگه استفاده کنه یا به ورودی استاندارد یک برنامه داده ارسال کنه. در چنین شرایطی pipe استفاده میشه. pipe یک فضای موقتی در حافظه برای جابه‌جایی اطلاعات بین دو برنامه هست که البته یک طرفه هم هست؛ یعنی مثلا برای گرفتن خروجی باید از یک pipe و برای نوشتن ورودی هم از یک pipe دیگر باید استفاده کرد.

بهنام سیم‌جو21-11-1401 تخصصی

زبان‌ها معمولاً یا تعیین نوع پویا دارند؛ مانند کامن لیسپ، پایتون، جاوا اسکریپت یا دارای تعیین نوع ایستا هستند؛ مانند سی و سی‌پلاس‌پلاس، راست و دوباره کامن لیسپ (معمولاً پیاده‌سازی‌های مدرن کامن لیسپ، مانند SBCL، اجازه می‌دهند بنا به خواست برنامه‌نویس، قسمتی از کد، دارای تعیین نوع ایستا و قسمتی دارای تعیین نوع پویا باشد).

در پایتون، تعیین نوع متغیر‌ها، مقدار یا مقادیر بازگشتی توابع و متد‌ها و آرگومان‌های توابع اجباری نیست. اما می‌توانیم با تعیین نوع و استفاده از یک نرم‌افزار Linter به کاهش خطا‌های خود پیش از اجرا کمک کنیم.

def f(x: int) - > int:
    return x * 2 + 1

با این که تعیین نوع آرگومان یا ورودی تابع f که x باشد و مقدار بازگشت آن یعنی x*2 + 1 در اجرا تأثیری ندارد، اما زمانی که بخواهم مقدار بازگشت تابع f را با یک رشته نویسه (کاراکتر) جمع کنم به من اخطار داده می‌شود:

بدیهی است که اجرای این برنامه به وسیلهٔ پایتون نیز باعث خطا می‌شود. در مقابل زمانی که نوع ورودی و خروجی تابع را مشخص نمی‌کنم اخطاری داده نمی‌شود:

در ادامه با تعیین نوع ورودی‌ها و خروجی توابع و متد‌ها و ویژگی‌های یک کلاس آشنا می‌شویم.

فاروق کریمی‌زاده30-08-1401 تخصصی

زمانی که از یک برنامه‌نویس پایتونی بخواهید یک تابع ساده بنویسد تا ارقام یک عدد را جمع کند و برگرداند، احتمالاً ابتدا عدد را به یک رشته تبدیل می‌کند و سپس رشته را به لیست (فهرست) و نهایتاً تک‌تک اعضای لیست را که ارقام عدد به صورت رشته‌های تک‌نویسه‌ای هستند به عدد تبدیل می‌کند و سپس آن‌ها را با هم جمع می‌کند. ولی الزاماً اولین روشی که برای حل مسئله به ذهن‌مان می‌رسد، بهترین روش نیست. در این مطلب دو الگوریتم برای جمع ارقام یک عدد صحیح به صورت بازگشتی و تکرارشونده به همراه کد های پایتون آن ها ارائه می‌دهم.

فاروق کریمی‌زاده16-08-1401 تخصصی

صدای بوق ممتد از لحاظ فنی همان موج سینوسی با فرکانسی (بسامد) ثابت است. در این مطلب یک کد ساده و کوتاه پایتون ارائه می‌دهم که بدون استفاده از کتاب‌خانه‌های اضافی، می‌تواند یک بوق را با هر فرکانسی تولید کند و در یک فایل صوتی wave ذخیره کند.

فاروق کریمی‌زاده07-08-1401 تخصصی

مسئلهٔ ۸ وزیر یک تمرین معروف در علوم کامپیوتر و ریاضیات می‌باشد. این مسئله در مورد یک صفحهٔ شطرنج رایج و مهرهٔ وزیر در این بازی فکری می‌باشد. در ریاضیات ثابت می‌شود که می‌توان ۸ وزیر را در یک صفحهٔ شطرنج چنان قرار داد که هیچ‌کدام از وزیر‌ها، دیگری را تهدید نکنند. با تعمیم این مسئله در ریاضیات، ثابت می‌شود که در یک صفحهٔ شطرنج به ضلع n، می‌توان تعداد n وزیر قرار داد؛ چنانچه هیچ‌کدام دیگری را تهدید نکنند. در علوم کامپیوتر می‌توان با روش‌های مختلفی این مسئله را حل کرد و به یک چینش از مهره‌های وزیر رسید که هیچ‌کدام دیگری را تهدید نکنند. یکی از این روش‌ها «الگوریتم ژنتیک» است.

تصویر از Encik Tekateki

خیلی ها میگن پایتون زبان ساده‌ای هست، میشه اون رو زود یاد گرفت، بخاطر تعیین نوع پویا(dynamic typing) دیگه نیازی نیست که برنامه‌نویس با type ها درگیر باشه و …

ولی آیا واقعا همین‌طوره؟! توی این مطلب قصد دارم کمی زبان پایتون رو به عنوان یه برنامه‌نویس پایتون بررسی کنم.

۱. پایتون زبان ساده‌ای هست

منظور از سادگی زبان می‌تونه خوانا بودن اون و نزدیکی اون به زبان انگلیسی (زبان انسان) باشه. برای مثال دو تکه کد زیر رو ببینید:

زبان پایتون:

if not 2 in lst:
  for x in lst:
    print(x);

زبان سی‌شارپ:

if ( ! lst.contains(2) )
  foreach ( int x in lst )
    Console.WriteLine(x);

بهنام سیم‌جو27-07-1401 تخصصی

تصویر تحت CC0

فاروق کریمی‌زاده17-07-1401 تخصصی

طی دهه‌های گذشته بحث‌های زیادی راجع به این‌که مشخصات زبان‌های برنامه‌نویسی، به عنوان مثال تعیین نوعشان و مثلا ایستا(static) یا پویا(dynamic) بودن چه تاثیری روی روند توسعه نرم‌افزار‌ها دارد. یک مقاله علمی(paper) با مطالعه ۶۰۰ پروژه در گیت‌هاب شامل تقریبا ۷۰ میلیون خط کد و ۳ میلیون کامیت به نتایجی در این مورد رسیده‌است.

اینکه برای یادگیری برنامه‌نویسی دانستن زبان انگلیسی لازم هست یا نه، پرسش بسیاری از کسانی هست که می‌خواهند برنامه‌نویسی را شروع به یادگیری کنند. در این پست بنده با توجه به تجربه‌ی خودم سعی می‌کنم به این پرسش جواب دهم. اگر نمی‌خواهید کل مطلب را بخوانید، جواب کوتاه این پرسش در یک جمله این است که «بله، برای یادگیری برنامه‌نویسی باید حتما انگلیسی هم یاد بگیرید»