"فراموشی"
چالش انجام دادن روزی یک سوال از سوال ها یه Euler با پایتون😁 @faramoshi_pc
روز بیستوسوم، سؤال بیستوسوم:
Non-Abundant Sums
A perfect number is a number for which the sum of its proper divisors is exactly equal to the number.
For example, the sum of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number.
A number n is called deficient if the sum of its proper divisors is less than n and it is called abundant if this sum exceeds n.
As 12 is the smallest abundant number (1 + 2 + 3 + 4 + 6 = 16), the smallest number that can be written as the sum of two abundant numbers is 24.
By mathematical analysis, it can be shown that all integers greater than 28123 can be written as the sum of two abundant numbers.
However, this upper limit cannot be reduced any further by analysis even though it is known that the greatest number that cannot be expressed as the sum of two abundant numbers is less than this value.
Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers.
خب سؤال از ما میخواد:
۱) همهٔ عددهای abundant (فراوان) رو تا 28123 پیدا کنیم
۲) هر عددی که میشه با جمع دو abundant ساخته بشه علامت بزنیم
۳) مجموع اون عددهایی که قابلنوشتن نیستند رو حساب کنیم
مقدار نهایی هم میشه:4179871
*بهجای چککردن همهٔ ترکیبها تا بینهایت، بازه رو محدود میکنیم به ۲۸۱۲۳ چون ثابت شده هر عدد بالاتر از اون حتماً قابلنوشتنه.
*لیست abundantها رو یکبار حساب میکنیم و بعد با یک آرایهٔ boolean میفهمیم کدوم عدد میتونه ساخته بشه.
*در آخر فقط عددهایی که علامت نخوردهاند جمع زده میشن.
@faramoshi_pc
Non-Abundant Sums
A perfect number is a number for which the sum of its proper divisors is exactly equal to the number.
For example, the sum of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number.
A number n is called deficient if the sum of its proper divisors is less than n and it is called abundant if this sum exceeds n.
As 12 is the smallest abundant number (1 + 2 + 3 + 4 + 6 = 16), the smallest number that can be written as the sum of two abundant numbers is 24.
By mathematical analysis, it can be shown that all integers greater than 28123 can be written as the sum of two abundant numbers.
However, this upper limit cannot be reduced any further by analysis even though it is known that the greatest number that cannot be expressed as the sum of two abundant numbers is less than this value.
Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers.
خب سؤال از ما میخواد:
۱) همهٔ عددهای abundant (فراوان) رو تا 28123 پیدا کنیم
۲) هر عددی که میشه با جمع دو abundant ساخته بشه علامت بزنیم
۳) مجموع اون عددهایی که قابلنوشتن نیستند رو حساب کنیم
مقدار نهایی هم میشه:4179871
def sum_of_divisors(n):
total = 1
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
total += i
if i * i != n:
total += n // i
return total
abundant = []
for n in range(1, 28124):
if sum_of_divisors(n) > n:
abundant.append(n)
can_be_written = [False] * 28124
for i in range(len(abundant)):
for j in range(i, len(abundant)):
s = abundant[i] + abundant[j]
if s <= 28123:
can_be_written[s] = True
else:
break
total = sum(i for i in range(1, 28124) if not can_be_written[i])
print("مجموع اعداد غیرقابلنوشتن =", total)
*بهجای چککردن همهٔ ترکیبها تا بینهایت، بازه رو محدود میکنیم به ۲۸۱۲۳ چون ثابت شده هر عدد بالاتر از اون حتماً قابلنوشتنه.
*لیست abundantها رو یکبار حساب میکنیم و بعد با یک آرایهٔ boolean میفهمیم کدوم عدد میتونه ساخته بشه.
*در آخر فقط عددهایی که علامت نخوردهاند جمع زده میشن.
@faramoshi_pc
❤2
Forwarded from linuxtnt(linux tips and tricks) (hosein seilany https://seilany.ir/)
⭐️پایان Rust آزمایشی
🔹زبان Rust در هسته لینوکس دیگر آزمایشی نیست. اکنون بخشی اصلی از هسته شده است و برای همیشه خواهد ماند.
۱۰ دسامبر ۲۰۲۵، اجلاس سالانه Maintainers Summit
هسته اصلی: ۶.۱۸
🔹موضوع آزمایش Rust در هسته لینوکس در اجلاس سالانه Maintainers Summit مورد بحث قرار گرفت. اجماع میان توسعهدهندگان حاضر این است که Rust در هسته دیگر یک آزمایش نیست — اکنون بخشی اصلی از هسته شده است و برای همیشه در آن خواهد ماند. بنابراین، برچسب "آزمایشی" از روی آن برداشته خواهد شد.
🔹اجلاس Maintainers Summit یک رویداد سالانه است که معمولاً قبل از LinuxCon یا Linux Kernel Summit برگزار میشود. این رویداد فرصتی است برای توسعهدهندگان و نگهدارندگان پروژههای بزرگ نرمافزاری متنباز (مانند هسته لینوکس) تا برای بحث و تبادلنظر در مورد مشکلات فنی، رویکردهای جدید، و برنامههای آینده در کنار یکدیگر جمع شوند.
🔹زبان Rust در هسته لینوکس دیگر آزمایشی نیست. اکنون بخشی اصلی از هسته شده است و برای همیشه خواهد ماند.
۱۰ دسامبر ۲۰۲۵، اجلاس سالانه Maintainers Summit
هسته اصلی: ۶.۱۸
🔹موضوع آزمایش Rust در هسته لینوکس در اجلاس سالانه Maintainers Summit مورد بحث قرار گرفت. اجماع میان توسعهدهندگان حاضر این است که Rust در هسته دیگر یک آزمایش نیست — اکنون بخشی اصلی از هسته شده است و برای همیشه در آن خواهد ماند. بنابراین، برچسب "آزمایشی" از روی آن برداشته خواهد شد.
🔹اجلاس Maintainers Summit یک رویداد سالانه است که معمولاً قبل از LinuxCon یا Linux Kernel Summit برگزار میشود. این رویداد فرصتی است برای توسعهدهندگان و نگهدارندگان پروژههای بزرگ نرمافزاری متنباز (مانند هسته لینوکس) تا برای بحث و تبادلنظر در مورد مشکلات فنی، رویکردهای جدید، و برنامههای آینده در کنار یکدیگر جمع شوند.
کانال کافه برنامه نویسان رو هم اگه دوست داشته عضو بشید.
مالک و ادمین های عزیزشون بسیار افراد باسوادی هستن و هر روز مطالبی کوتاه و آموزنده اید درباره برنامه نویسی و کامپیوتر قرار میدن و روز های فرد هم قرار شده بنده مطالبی رو براتون آماده کنم و قرار بدم🤗🙃
@Programers_Cafe
مالک و ادمین های عزیزشون بسیار افراد باسوادی هستن و هر روز مطالبی کوتاه و آموزنده اید درباره برنامه نویسی و کامپیوتر قرار میدن و روز های فرد هم قرار شده بنده مطالبی رو براتون آماده کنم و قرار بدم🤗🙃
@Programers_Cafe
❤4👏1
"فراموشی"
چالش روزی یک قدم برای تبدیل شدن به یک Rustacean 🦀😍 روز اول درس اول: مقدمه ای از Rustacean و زبان Rust روز دوم درس دوم: نصب Rust در ویندوز و لینوکس روز سوم درس سوم: آشنایی با Cargo، ساخت و اجرای پروژه روز چهارم درس چهارم:…
روز هشتم از چالش تبدیل شدن به یک Rustacean 🦀
خب ما در جلسه پیش با نحوه ی ایجاد متغیر string خالی ، گرفتن ورودی از کاربر، split کردن رشته بر اساس یک کاراکتر خاص ، آشنا شدیم؛ این جلسه با Boolean Logic ها، If و else ها، If-let آشنا می شویم.
ا If و else ها همون اگر و آنگاه خودمون هستند؛ شما وقتی یک می خواهید شرطی را اجرا کنید از if استفاده می کنید.
به طور مثال شما تو برنامتون یک متغیر boolean دارید که توش مشخص کردید که شخص آیا ادمین هست یا نه و می خواید اگر شخص ادمین بود برنامه بنویسد: " شما ادمین هستید🤩" و در غیر از این صورت بنویسد: "شما ادمین نیستید😔" برای این کار باید از if و else ها استفاده کنید مثل برنامه پایین:
شما برای استفاده از if و else حتما باید جمله ای رو داخل if بزارید که جوابش یا true باشه یا false به طور مثال:
پس شما میتونید از <، >، <=، >= استفاده کنید، همین طور میتونید برای مقایسه این که 2 مقدار آیا باهم مساوی هستن یا نه از == و چک کردن این که آیا مساوی نیستن هم از =! استفاده کنید به این صورت:
در زبان های برنامه نویسی ما میتونیم شرط ها رو در یک خط بنویسیم و جواب بدست آمده بر اساس شرط رو توی یک متغیر دیگه قرار بدید، به طور مثال کد زیر رو در یک خط خلاصه کنیم:
ما در زبان های برنامه نویسی دیگه مثل php، اگه بخواهیم در یک خط خلاصه کنیم کد بالا رو به شکل زیر مینویسیم:
دقیقا به جای if علامت ? و به جای else علامت : استفاده می کنیم ولی در rust برای راحتی و خوانا بودن کد به این صورت می نویسیم:
که در rust بهش میگیم let if😁
@faramoshi_pc
خب ما در جلسه پیش با نحوه ی ایجاد متغیر string خالی ، گرفتن ورودی از کاربر، split کردن رشته بر اساس یک کاراکتر خاص ، آشنا شدیم؛ این جلسه با Boolean Logic ها، If و else ها، If-let آشنا می شویم.
ا If و else چیست !؟
ا If و else ها همون اگر و آنگاه خودمون هستند؛ شما وقتی یک می خواهید شرطی را اجرا کنید از if استفاده می کنید.
به طور مثال شما تو برنامتون یک متغیر boolean دارید که توش مشخص کردید که شخص آیا ادمین هست یا نه و می خواید اگر شخص ادمین بود برنامه بنویسد: " شما ادمین هستید🤩" و در غیر از این صورت بنویسد: "شما ادمین نیستید😔" برای این کار باید از if و else ها استفاده کنید مثل برنامه پایین:
fn main(){
let name = "pouria";
let admin =true;
if admin {
println!("you are admin🤩");
} else {
println!("you are not admin😞")
}
}شما برای استفاده از if و else حتما باید جمله ای رو داخل if بزارید که جوابش یا true باشه یا false به طور مثال:
fn main(){
if 5 > 8 {
println!("5 is bigger than 8🤣");
} else {
println!("8 is bigger than 5😆");
}
}ا Boolean Logic ها:
پس شما میتونید از <، >، <=، >= استفاده کنید، همین طور میتونید برای مقایسه این که 2 مقدار آیا باهم مساوی هستن یا نه از == و چک کردن این که آیا مساوی نیستن هم از =! استفاده کنید به این صورت:
fn main() {
let name = "pouria";
let mut input: String = String::new();
std::io::stdin().read_line(&mut input).expect("error input");
if name == input.trim() {
println!("welcome😊");
} else {
println!("try again🙂↔️");
}
}ا ternary چیست؟
در زبان های برنامه نویسی ما میتونیم شرط ها رو در یک خط بنویسیم و جواب بدست آمده بر اساس شرط رو توی یک متغیر دیگه قرار بدید، به طور مثال کد زیر رو در یک خط خلاصه کنیم:
fn main(){
let score = 15;
let mut status: String = String::new();
if score >= 10 {
status = String::from("passed🤩");
} else {
status = String::from("failed😔");
}
println!("{status}");
}ما در زبان های برنامه نویسی دیگه مثل php، اگه بخواهیم در یک خط خلاصه کنیم کد بالا رو به شکل زیر مینویسیم:
$score = 15;
$status = ($score >= 10) ? "passed🤩" : "failed😔";
echo $status;
دقیقا به جای if علامت ? و به جای else علامت : استفاده می کنیم ولی در rust برای راحتی و خوانا بودن کد به این صورت می نویسیم:
fn main(){
let score = 15;
let status = if score >= 10 {"passed🤩"} else {"failed😔"};
println!("{status}");
}که در rust بهش میگیم let if😁
خب درس امروز هم همینجا تموم شد اگه دوست داشتید لایکش کنید اگه هم نقدی یا مشکلی در اون بود میتونید بهم پیام بدید😉
@faramoshi_pc
❤🔥2
"فراموشی"
چالش انجام دادن روزی یک سوال از سوال ها یه Euler با پایتون😁 @faramoshi_pc
روز بیستوچهارم، سؤال بیستوچهارم:
Lexicographic Permutations
A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
012 021 102 120 201 210
What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
خب سؤال از ما میخواد جایگشتِ یکمیلیونم ارقام ۰ تا ۹ رو وقتی همهٔ جایگشتها به ترتیب لغتنامهای مرتب شدن، پیدا کنیم.
مقدار نهایی هم میشه:4179871
جواب:
@faramoshi_pc
Lexicographic Permutations
A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
012 021 102 120 201 210
What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
خب سؤال از ما میخواد جایگشتِ یکمیلیونم ارقام ۰ تا ۹ رو وقتی همهٔ جایگشتها به ترتیب لغتنامهای مرتب شدن، پیدا کنیم.
مقدار نهایی هم میشه:4179871
جواب:
import math
digits = list(range(10))
n = 1_000_000 - 1
result = ""
for i in range(10, 0, -1):
fact = math.factorial(i - 1)
index = n // fact
result += str(digits[index])
digits.pop(index)
n %= fact
print(result)
@faramoshi_pc
❤1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
مهندس؛ يلدات مبارک❤️😚
@faramoshi_pc
@faramoshi_pc
❤4😁3
Forwarded from Code & Coffee | کد و قهوه
«تنها شکست در سن ۲۰ تا ۳۰ سالگی شما «بی فعالیتی» است .جز این هر چه کنید آزمون و خطاست.»
_
به نظرم جمله خیلی قشنگیه پس هیچوقت دیر نیست.
_
به نظرم جمله خیلی قشنگیه پس هیچوقت دیر نیست.
❤5
Forwarded from linuxtnt(linux tips and tricks) (hosein seilany https://seilany.ir/)
پیرو این پست که گذاشتم، پست ها ونظرات زیادی در لینکدین دارم میبینم راجع به این مسئله اماچیزی که باید بپذیریم:
https://t.me/linuxtnt/4739
در حال حاضر یک تحول پارادایمی در حال وقوع هست:
🔹لینوکس شروع به استفاده از Rust کرده است.
https://t.me/linuxtnt/4668
🔹مایکروسافت در حال تغییر به سمت Rust است.
🔹برخی موتورهای بازیسازی مانند Unreal Engine و Unity هم در مسیر مشابه هستند — شاید نه بازنویسی کامل، اما افزودن کدهای Rust به کدبیس موجود.
🔹تیم اندروید در گوگل نیز در حال آزمایش Rust است.
این نشاندهنده یک گرایش گسترده به سمت Rust در صنعت نرمافزار است، بهخصوص در پروژههای بزرگ و حیاتی.
https://t.me/linuxtnt/4739
در حال حاضر یک تحول پارادایمی در حال وقوع هست:
🔹لینوکس شروع به استفاده از Rust کرده است.
https://t.me/linuxtnt/4668
🔹مایکروسافت در حال تغییر به سمت Rust است.
🔹برخی موتورهای بازیسازی مانند Unreal Engine و Unity هم در مسیر مشابه هستند — شاید نه بازنویسی کامل، اما افزودن کدهای Rust به کدبیس موجود.
🔹تیم اندروید در گوگل نیز در حال آزمایش Rust است.
این نشاندهنده یک گرایش گسترده به سمت Rust در صنعت نرمافزار است، بهخصوص در پروژههای بزرگ و حیاتی.
👍2
"فراموشی"
چالش روزی یک قدم برای تبدیل شدن به یک Rustacean 🦀😍 روز اول درس اول: مقدمه ای از Rustacean و زبان Rust روز دوم درس دوم: نصب Rust در ویندوز و لینوکس روز سوم درس سوم: آشنایی با Cargo، ساخت و اجرای پروژه روز چهارم درس چهارم:…
روز نهم از چالش تبدیل شدن به یک Rustacean 🦀
خب ما در جلسه پیش با شرط ها(if و else ها) Boolean Logicها و let ifها آشنا شدیم، تو این جلسه قرار با حلقه ها در Rust و دستورات break و continue آشنا بشیم.
حلقه loop:
در حلقه loop ما می تونیم دستورات رو تا بینهایت اجرا کنیم، مثال:
حالا چه جوری می تونیم از loop بیایم بیرون🤔
با استفاده از کلمه کلیدی break، مثلا می خواهید حلقه 3 بار تکرار بشه:
حتی شما اگه از چند حلقه تو در تو استفاده می کنید و می خواهید با یک دستور از حلقه اول خارج شوید می توانید به حلقه ها اسم بدهید و از اون برای خارج شدن استفاده کنید، مثال:
یا حتی برای loopتون می تونید داده برگردانید، مثال:
حلقه while هم به همین صورت هست فقط درون خودش شرط داره دقیقا مثل بقیه زبان های برنامه نویسی، مثال:
کلمه کلیدی continue هم مثل break عمل می کند فقط فرقش این هست که کلا از حلقه بیرون نمیاد بلکه بقیه حلقه رو ول می کنه و از اول حلقه شروع میکنه، مثال:
الان کد بالا تمام اعداد فرد رو تا بینهایت چاپ می کنه.
@faramoshi_pc
خب ما در جلسه پیش با شرط ها(if و else ها) Boolean Logicها و let ifها آشنا شدیم، تو این جلسه قرار با حلقه ها در Rust و دستورات break و continue آشنا بشیم.
در Rust ما دو نوع حلقه داریم loop و while.
حلقه loop:
در حلقه loop ما می تونیم دستورات رو تا بینهایت اجرا کنیم، مثال:
fn main(){
loop {
println!("Hi✋");
}
}حالا چه جوری می تونیم از loop بیایم بیرون🤔
با استفاده از کلمه کلیدی break، مثلا می خواهید حلقه 3 بار تکرار بشه:
fn main(){
let mut i = 1;
loop {
if i > 3 {
break;
}
println!("Hi👋");
i += 1;
}
}حتی شما اگه از چند حلقه تو در تو استفاده می کنید و می خواهید با یک دستور از حلقه اول خارج شوید می توانید به حلقه ها اسم بدهید و از اون برای خارج شدن استفاده کنید، مثال:
fn main(){
let mut i = 1;
'loop_first: loop {
println!("first loop🥇");
loop {
println!("loop in loop ♾️");
i += 1;
if i > 3 {
break 'loop_first;
}
}
}
}یا حتی برای loopتون می تونید داده برگردانید، مثال:
fn main(){
let mut i = 1;
let mut even = 0;
let result = loop {
if i > 3 {
break even;
}
even += 2;
i += 1;
};
println!("{}",result);
}حلقه while هم به همین صورت هست فقط درون خودش شرط داره دقیقا مثل بقیه زبان های برنامه نویسی، مثال:
fn main(){
let mut i = 1;
while i <= 3 {
println!("Hi😕");
i += 1;
}
}کلمه کلیدی continue هم مثل break عمل می کند فقط فرقش این هست که کلا از حلقه بیرون نمیاد بلکه بقیه حلقه رو ول می کنه و از اول حلقه شروع میکنه، مثال:
fn main(){
let mut i = 0;
loop {
i += 1;
if i % 2 == 0 {
continue;
}
println!("{i}");
}
}الان کد بالا تمام اعداد فرد رو تا بینهایت چاپ می کنه.
خب درس امروز هم همینجا تموم شد اگه دوست داشتید ریکشن بزارید اگه هم نقدی یا مشکلی در اون بود میتونید بهم پیام بدید😉
@faramoshi_pc
🔥1
"فراموشی"
چالش انجام دادن روزی یک سوال از سوال ها یه Euler با پایتون😁 @faramoshi_pc
روز بیستوپنجم، سؤال بیستوپنجم:
1000-digit Fibonacci Number
The Fibonacci sequence is defined by the recurrence relation:
F ⁿ = F ⁿ ‐ ¹ + F ⁿ ‐ ², where F¹ = 1 and F² = 1.
Hence the first 12 terms will be:
F¹ = 1
F² = 1
F³ = 2
F⁴ = 3
F⁵ = 5
F⁶ = 8
F⁷ = 13
F⁸ = 21
F⁹ = 34
F¹⁰ = 55
F¹¹ = 89
F¹² = 144
The 12th term, F¹², is the first term to contain three digits.
What is the index of the first term in the Fibonacci sequence to contain 1000 digits?
سؤال از ما میخواد اندیس اولین جملهای از دنبالهٔ فیبوناچی رو پیدا کنیم که دقیقاً ۱۰۰۰ رقم داشته باشه.
مقدار نهایی هم میشه: 4782
@faramoshi_pc
1000-digit Fibonacci Number
The Fibonacci sequence is defined by the recurrence relation:
F ⁿ = F ⁿ ‐ ¹ + F ⁿ ‐ ², where F¹ = 1 and F² = 1.
Hence the first 12 terms will be:
F¹ = 1
F² = 1
F³ = 2
F⁴ = 3
F⁵ = 5
F⁶ = 8
F⁷ = 13
F⁸ = 21
F⁹ = 34
F¹⁰ = 55
F¹¹ = 89
F¹² = 144
The 12th term, F¹², is the first term to contain three digits.
What is the index of the first term in the Fibonacci sequence to contain 1000 digits?
سؤال از ما میخواد اندیس اولین جملهای از دنبالهٔ فیبوناچی رو پیدا کنیم که دقیقاً ۱۰۰۰ رقم داشته باشه.
مقدار نهایی هم میشه: 4782
a = 1
b = 1
index = 2
while len(str(b)) < 1000:
a, b = b, a + b
index += 1
print(index)
@faramoshi_pc
🔥3
Forwarded from sohrab::stdout (Sohrab)
خب امروز انگار تولد لینوس بندیکت تروالدز هستش :)
تولدش رو به دوستداران هستهٔ لینوکس ،گیت و کسایی که با سی پلاس پلاس مشکل دارن تبریک عرض میکنم.
@SohrabContents
تولدش رو به دوستداران هستهٔ لینوکس ،گیت و کسایی که با سی پلاس پلاس مشکل دارن تبریک عرض میکنم.
@SohrabContents
🥰2🎉1
Forwarded from linuxtnt(linux tips and tricks) (hosein seilany https://seilany.ir/)
🔰به مناسبت روز پدر و این روز فرخنده
🔹تصمیم دارم کتاب11 ام-راهنمای جامع linux Essentials را در روز پدر رایگان قرار بدهم و همچنین بخاطر شرایط کنونی هم یک تخفیف روی محصولات lpic قرار دادم.
🔻کتاب 11 - inux Essentials
🔻کتاب10-راهنمای جامع LPIC1 با 20 % تخفیف
🔻کتاب14- LPIC2 201,202 با 25 % تخفیف
🔻کتاب13- LPIC3 303 Security با 25 % تخفیف
⭐️این تخفیف فقط 24 ساعت است برای روز شنبه
پس شنبه رو از دست ندید.
📌دریافت کتاب ها از آکادمی کندوی دانش
https://learninghive.ir/linux-books/
🔹تصمیم دارم کتاب11 ام-راهنمای جامع linux Essentials را در روز پدر رایگان قرار بدهم و همچنین بخاطر شرایط کنونی هم یک تخفیف روی محصولات lpic قرار دادم.
🔻کتاب 11 - inux Essentials
🔻کتاب10-راهنمای جامع LPIC1 با 20 % تخفیف
🔻کتاب14- LPIC2 201,202 با 25 % تخفیف
🔻کتاب13- LPIC3 303 Security با 25 % تخفیف
⭐️این تخفیف فقط 24 ساعت است برای روز شنبه
پس شنبه رو از دست ندید.
📌دریافت کتاب ها از آکادمی کندوی دانش
https://learninghive.ir/linux-books/
🔥2