شما هنوز به سیستم وارد نشده اید.

#1 2018-11-30 13:10:13

ehsan_faal
عضو
از : تهران
ثبت شده: 2015-10-02
ارسال ها: 274

حل مجموعه سوالات سایت پروژه اویلر

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

سعی میکنم تا جایی که برسم رونق بدم به این تاپیک، میدونم آرکوش عزیز تخصصش ریاضیه پس میتونیم کلی هم تریک یاد بگیریم.

به عنوان تست مسئله ۱۲ رو داشتم حل میکردم، دیدم باحاله گفتم اینجا بذارمش.

#!/usr/bin/env python3
import subprocess
import sys
import time

def number_of_diviors(n):
    if isinstance(n, int):
        pf = list(map(int, subprocess.getoutput('/usr/bin/factor {}'.format(n)).split(':')[-1].split()))
        pf_unique = set(pf)
        result = 1
        for prime_factor in pf_unique:
            result *= (pf.count(prime_factor) + 1)
        
        return result
    else:
        sys.exit('{} is not a valid integer.'.format(n))

def triangle_number(order):
    return (order * (order + 1))//2

def elapsed_time(func):
    def run_func(n):
        start = time.time()
        func(n)
        finish = time.time()
        print('Elapsed time: {:.4f} ms'.format((finish - start) * 1000))

    return run_func

@elapsed_time
def main(n):
    number = 1
    while True:
        tri_num = triangle_number(number)
        length = number_of_diviors(tri_num)
        if length > n:
            print(number, tri_num)
            break
        number += 1


if __name__ == '__main__':
    if len(sys.argv) != 2 :
        sys.exit('You should provide an integrer for {}'.format(sys.argv[0].split('/')[-1]))
    else:
        try:
            main(int(sys.argv[1]))
        except ValueError as e:
            sys.exit(e)

و خروجی:

code_python ❯ ./euler12.py 500
12375 76576500
Elapsed time: 44297.0400 ms

آخرین ویرایش توسط ehsan_faal (2018-11-30 13:42:31)


Mahatma Gandhi - The weak can never forgive. Forgiveness is the attribute of the strong

آفلاین

#2 2018-12-01 00:43:51

Misix
عضو
ثبت شده: 2018-11-12
ارسال ها: 17

پاسخ: حل مجموعه سوالات سایت پروژه اویلر

درود
چند مورد رو بگم اگر مشکلی نیست. احتمالا جای مناسبی نیست به عنوان پست دوم همچین چیزی باشه ولی میتونم بعدا ویرایش کنم.
یک/ خیلی بهتر بود که فقط برای پروژه اویلر/اولر نباشه. سایت هایی مثل codeforces و quera (ایرانی) هستند که چالش برنامه نویسی دارند.حل اون سوالات حداقل برای من، به مراتب جذاب تر از اویلر هست.
دو/ این روش شمردن زمان توی خود برنامه کار درستی هست؟ بهتر بود از جایی مثل همون quera زمان و حافظه مصرفی رو ببینیم که دقیق تر و بهتره.(البته منحصر به چالش های خودش میشه اینطوری). در کل روش بهتری برای این موارد باشه.
سوم/ چون موضوع آموزشیه به نظرم الزام کسانی که شرکت میکنند به کامنت نوشتن و خوانا میتونه خوب باشه. البته تا جایی که فدای performance برنامه نشه.
همچنین به طور خلاصه صورت مسئله شرح داده بشه. عموما سوالات به زبان فارسی نیستند و درکشون کمی گیج کننده میشه.اونم مسائلی که بیشتر از برنامه نویسی، جنبه ی تفکر خلاقانه دارند. به این شکل که تاپیکی با کلی کد درهم باشه اونقدر جذاب نیست.
سعیم رو میکنم تا چند روز آینده تعدادی از کدها رو از دیسکم پیدا کنم و قرار بدم.

آفلاین

#3 2018-12-01 01:38:20

Arcush
Moderator
ثبت شده: 2015-09-15
ارسال ها: 1,460

پاسخ: حل مجموعه سوالات سایت پروژه اویلر

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

من دقیقن یادم نیست چقدر ولی کمتر از ۲۰۰ تا از سؤالهای اویلر را حل کردم. مسالهٔ ۵۷۹ اویلر دشوارترین مساله ای بوده که تا بحال حلش کردم. به مدت یک ماه روش فکر کردم و این یک ماه همهٔ عید همین امسال من را در بر گرفت. با خودم عهد کردم که پس از حل اون مساله دیگه با سایت اویلر سر و کار نداشته باشم، چون معلوم نیست به چه مساله ای بر بخورم و چقدر زمان بهش اختصاص بدم (درواقع باید کلاه را به نشانهٔ احترام به ساز و کار و سطح دشواریِ برخی از سؤال های سایت اویلر از سر برداشت). بیشتر مساله های اویلر (مطمئن ام "بیش" از ۹۰ درسد) مربوط به نظریه اعداد و ترکیبیات هستند. باقیماندهٔ اونها هم به دانشی حداکثر به اندازهٔ تعریف حد و مشتق نیاز دارند. در اینجا باید به یک نکتهٔ بسیار مهم اشاره کنم: سایت اویلر نیاز به ریاضیِ زیادی نداره ولی ریاضیِ زیاد میتونه در حل مساله خیلی کمک کنه. بویژه در بارهٔ عددهای اول که داشتن دانش دربارهٔ اونها (از نظریهٔ اعداد) میتونه باعث بشه کد الفِ آمیخته با قضیه های نظریهٔ اعداد هزاران برابر پرفرمنس بهتری نسبت به کد ب ای داشته باشه که تنها با استفاده از حلقه ها و ساختارهای کنترلی سعی در شمارش داشته. همچنین در بارهٔ خود شمارش، درست شمردن یک بحث هست و سریع تر شمردن یک بحث دیگه. ریاضیات گسسته به بهترین شکل میتونه ذهن برنامه نویس را زیر و رو کنه و به کار بستن تکنیک هاش باعث بشه کُدْ دست کم از نظر حجم بسیار کاهش پیدا کنه. من با سایت هایی که Misix گرامی بهشون اشاره کرد آشنایی ندارم. ولی دربارهٔ سایت اویلر ممکنه یک انتقاد سطحی بهش وارد بشه و اون انتقاد این هست: گسترهٔ سؤالات بیشتر در نظریهٔ اعداده. ولی از یک دیدگاه برنامه نویسی چیزی بیشتر از درک ژرفای روابط بین اعداد نیست و کامپیوتر بعنوان یک شمارش گر قوی مثل برده در اختیار انسان اندیشمنده. پس به طور عمیق میشه گفت: حل مساله های سایت اویلر هتا برای افرادی که اپلیکشن وب می نویسند هم به شدت توصیه میشه (چون باعث پیرایش و آرایش ساختار ذهنیِ برنامه نویس خواهد شد). افرادی که با عددها  و iteration روی اونها بیشتر سر و کار دارند، ارزش کد سریع را بهتر از هر شخص دیگری درک خواهند کرد. فکر نمی کنم چیزی بتونه جایگاهی بالاتر از "سریع ترین کُد" در آماج یک برنامه نویس را اشغال کنه.

من هم در تاپیک مشارکت میکنم چراکه می دونم باعث پیشرفتم در تفکر صحیح خواهد شد. البته یک پیشنهاد هم دارم: در کنار کد، الگوریتم و یا pseudo-code هم قرار داده بشه تا سریعتر بشه فهمید نویسندهٔ کد چه طوری فکر کرده.

آفلاین

#4 2018-12-01 19:41:23

ehsan_faal
عضو
از : تهران
ثبت شده: 2015-10-02
ارسال ها: 274

پاسخ: حل مجموعه سوالات سایت پروژه اویلر

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


Mahatma Gandhi - The weak can never forgive. Forgiveness is the attribute of the strong

آفلاین

پانوشت انجمن

پشتیبانی توسط تیم آرچ لینوکس ایران و نیرو گرفته با FluxBB