الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Code Golf

بدأه System Down في 16 أبريل 2011 · 25 رد · 3,055 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لمن لا يعرفها: لعبة Code Golf هي لعبة موجهة للمبرمجين تهدف إلى تشغيل الدماغ وتساعد على فهم خفايا لغات البرمجة. ملخصها هو أن يتم تحديد مشكلة ما ومعطياتها ومخرجاتها بشكل جيد وأي شروط أخرى. يقوم اللاعبين بعمل برنامج يقوم بحل المشكلة بطريقة صحيحة. ثم يتم حساب عدد الحروف المستخدمة في الحل. الفائز هو من يستطيع برمجة حل بأقل عدد ممكن من الحروف. قد يبدو هذا سخيفاً لأول وهلة، ولكنه في الواقع طريقة ممتازة لتعلم الاختصارات البرمجية التي تترجم أحياناً إلى أداء أفضل. دوال البرمجة الـfunctional والـRegeEx وما شابهها يتم استخدامها كثيراً في Code Golf. بما أنني أشعر بالملل في العمل رأيت أنها فكرة ممتازة للتمرن على البايثون التي تناسبها هذه اللعبة تماماً. لذا شرط اللعبة الوحيد هو استخدام البايثون (من يريد استخدام لغة أحرى يمكنه بدأ موضوع منفصل في القسم المخصص لهذه اللغة).

جاهزين؟ نبدأ!!

السؤال:

لغز Euler رقم 6. جد الفرق بين مربع المجموع ومجموع المربعات لمتسلسة أرقام. كمثال نأخذ الأرقام من 1-10.

مجموع المربعات:

12 + 22 + ... + 102 = 385

مربع المجموع:

(1 + 2 + ... + 10)2 = 552 = 3025

يصبح الفرق هو:

3025 − 385 = 2640

التحدي هو: اكتب برنامجاً بالبايثون بأقل عدد ممكن من الحروف يحل نفس المسألة ولكن للأرقام من 1-100.

مثال من عندي (سأضع حلاً حقيقياً فيما بعد):

numbers=list(range(1,101))
sqrsum=sum(numbers)**2
sumsqr=0
for i in numbers:sumsqr+=i**2
print(sqrsum-sumsqr)

عدد الحروف 110

ملاحظات:

* الحل الصحيح الذي يجب على البرنامج إنتاجه هو 25164150

*أداة لعد الحروف: http://allworldphone.com/count-words-characters.htm

4
#2

السلام عليكم

محاولتي الأولى و استخدمت مكتبة خارجية (numpy)

import numpy as n
print sum(range(101))**2-sum(n.arange(101)**2))

python 2.6

65 حرف

تم تعديل هذه المشاركة بواسطة محمد سمير في 16 أبريل 2011 في 18:28

1

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#3

محاولة ثانية

print sum(range(101))**2-sum(x*x for x in range(101))

53 حرف

تم تعديل هذه المشاركة بواسطة محمد سمير في 16 أبريل 2011 في 18:43

2

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#4

محاولة 1:

print sum(range(1,101))**2-sum(map(lambda x:x**2,range(1,101)))

63 حرف

محاولة 2:

a=range(101)
print sum(a)**2-reduce(lambda x,y:x+y*y,a)

55 حرف

1
#5

السلام عليكم

موضوع تثقيفي للغاية وفكرة رائعة

قرأت بعض المشاكل بالرابط

بيشغلوا العقل لمجرد القراءة والتفكير شوي

شكراً

موفقين يارب

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#6

حسناً نعلن محمد سمير فائزاً في هذه الجولة :)

لنرفع درجة الصعوبة قليلاً.

الجولة الثانية!

لغز Euler رقم 21:

نعرف الدالة d بأنها مجموع قواسم العدد. مثلاً العدد 220 قواسمه هي 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 ,110 ومجموعها هو 284. أي:

اقتباس

d(220) = 284

هذا الرقم 220 له خاصية أخرى هي أن:

اقتباس

d(284) = 220

العددين 220 و 284 يسميان amicable numbers.

التحدي هو:

اكتب برنامجاً بالبايثون بأقل عدد ممكن من الحروف ودون استخدام مكتبات خارجية يجد جميع الـamicable numbers الأقل من 10,000.

#7

السلام عليكم

محاولة رقم (1):

for a in range(1,10000):
    b = sum([i for i in range(1,a) if (a%i == 0)])
    c = sum([i for i in range(1,b) if (b%i == 0)])
    if(c == a & c != b): print a

الناتج:

220
284
1184
1210
2620
2924
5020
5564
6232
6368

عدد الحروف: 159

1

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#8

ما كنت أريده هو مجموع هذه الأرقام أي 31626 أو :

s=0
for a in range(1,10000):
    b = sum([i for i in range(1,a) if (a%i == 0)])
    c = sum([i for i in range(1,b) if (b%i == 0)])
    if(c == a and c != b): s=+a
print(s)

(أنا أعمل على بايثون 3 وليس لدي & :lol: )

طريقة إيجاد القواسم جداً رائعة ولن أحاول مضاهاتها! مبروك :)

#9

تسلم يا أخي ... يا رافع معنوياتي :lol:

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#10

هناك فقط ملاحظة واحدة بخصوص & : لسبب ما يجب أن يكون الترتيب كالتالي

if(a == c & c != b): print a

لنحصل على الناتج بالأعلى.

أما عند كتابة السطر كالتالي (وهو ما وضعته أنا خطأً):

if(c == a & c != b): print a

فسنحصل على ناتج مغاير لما نريد

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#11
محمد سمير كتب:

هناك فقط ملاحظة واحدة بخصوص & : لسبب ما يجب أن يكون الترتيب كالتالي

if(a == c & c != b): print a

لنحصل على الناتج بالأعلى.

أما عند كتابة السطر كالتالي (وهو ما وضعته أنا خطأً):

if(c == a & c != b): print a

فسنحصل على ناتج مغاير لما نريد

أنت محق. إنها تعمل الآن عندي. ليس لدي فكرة عن السبب أيضاً ولكن يبدو أن & هي bitwise AND وربما تختلف عن AND؟

#12

حسناً لنبتعد عن الرياضيات قليلاً.

الجولة الثالثة!

اكتب برنامجاً بالبايثون بأقل عدد ممكن من الحروف ودون استخدام مكتبات خارجية يقوم باستقبال رقم صحيح من المستخدم ثم يرسم دائرة من الـ* قطرها (بحساب عدد الـ*) هو الرقم المدخل.

ملاحظة: إذا كان هناك شخص آخر يود طرح تحدي للجولة الرابعة فليتفضل مشكوراً :)

#13

ليست واضحة يا أخي ... لو وضحتها برسم :)

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#14

لو أدخلنا الرقم 15 مثلاً سينتج:

           * * * * *          
       * * * * * * * * *      
     * * * * * * * * * * *    
   * * * * * * * * * * * * *  
   * * * * * * * * * * * * *  
 * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * *
   * * * * * * * * * * * * *  
   * * * * * * * * * * * * *  
     * * * * * * * * * * *    
       * * * * * * * * *      
           * * * * *

هذه النتيجة التي تخرج من برنامجي حالياً. ليس من اللازم أن تكون مشابهة تماماً أو دائرة مثالية. أن يكون شكلها مقبولاً كفاية :)

#15
r=int(input())
print(reduce(lambda a,b:''.join(a)+'\n'+''.join(b),[[' *' if x*x+y*y-r*r<1 else '  ' for x in range(-r,r+1)] for y in range(-r,r+1)]))

149 حرف

1
#16

إستسلمت .. حتى الآن لم أفهم الخوارزمية وراء شيفرتك :) .

بالمناسبة ما رأيك في http://www.pythonchallenge.com للسؤال القادم, أنا لم أتجاوز المرحلة الثالثة بعد.

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#17

السلام عليكم

اخواني الكرام

آسفة للمقاطعة

حاولوا ارفاق الأكواد بملفات ايضاً

الموضوع لليوم وبكرة إثراء للقسم يعني

اي تحديثات بتصير للمنتدى ربما تتشوه تنسيقات الأكواد

افكار واكواد حرام بيضيعوا ببساطة

شكراً

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#18

System Down

حتى كود بايثون ممكن يصبح معقد !

يا ليت تسهل الكود على شان نقدر نفهمه :blink:

-----

محمد سمير

انا تعديت المرحلة الأولى فقط :wacko:

#19
sada_rohak كتب:

System Down

حتى كود بايثون ممكن يصبح معقد !

يا ليت تسهل الكود على شان نقدر نفهمه :blink:

أكواد الـCode Golf ليست مصممة لتكون سهلة القراءة :lol:

حسناً سأفك الكود قليلاً:

r=int(input())
listOfStars = [[' *' if x*x+y*y-r*r<1 else '  ' for x in range(-r,r+1)] for y in range(-r,r+1)]
text = reduce(lambda a,b:''.join(a)+'\n'+''.join(b), listOfStars)
print(text)

--------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- ---------------

r=int(input())

هذه واضحة. نأخذ قيمة نصف القطر.

listOfStars = [[' *' if x*x+y*y-r*r<1 else '  ' for x in range(-r,r+1)] for y in range(-r,r+1)]

كود بايثوني بحت عبارة عن استخدام للـList Comprehension لعمل حلقتين متداخلتين x و y. سيقوم بعمل List كل عنصر فيه عبارة عن سطر واحد يبدأ من -r إلى r. في حالة كانت الإحداثيات توفي بالمعادلة- r2 x2 + y2 < 1 (معادلة مبسطة للدائرة) نضع نجمة، غير ذلك نضع فراغ.

يمكننا استبداله بهذا الكود:

listOfStars = []
for y in range(-r,r+1):
    line = ""
    for x in range(-r,r+1):
        if x*x+y*y-r*r<1:
            line += ' *'
        else:
            line += '  '

    listOfStars.append(line)

text = reduce(lambda a,b:''.join(a)+'\n'+''.join(b), listOfStars)

نمر على الـList السابقة ونضم جميع السطور ونضع بينها سطر جديد.

print(text)

1
#20

فكر عالي برتغالي :)

هات ما يلي يا أخي

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#21

حسناً أنا اليوم أحس بخليط من السادية والماسوشية وسيكون هذا جلياً في التحدي الذي اخترته!

لعبة Tic Tac Toe أو X O. لعبة بسيطة القوانين وسهلة على الحاسب ومثبت رياضياً أن اللاعب الأول من المؤكد فوزه إذا اختار حركاته بعناية.

http://en.wikipedia.org/wiki/Tic_tac_toe

التحدي:

في أقل عدد ممكن من الحروف قم بكتابة برنامج Tic Tac Toe يفوز فيه الحاسب أو يتعادل في كل مرة. الشروط والمعطيات:

1. الحاسب يلعب X أي أنه دائماً الأول.

2. بعد كل حركة يطبع البرنامج رقعة اللعب بهذا الشكل:

 | |
-:-:-
 |X|
-:-:-
O| |

3. البرنامج بستقبل من اللاعب الفراغ الذي يريد اللعب فيه عن طريق رقم هذا الفراغ حسب الشكل التالي:

1|2|3
-:-:-
4|5|6
-:-:-
7|8|9

4. في حالة الإدخال الخاطئ يعيد البرنامج رسم الرقعة ويعيد طلب الإدخال. لا حاجة لوجود رسالة خطأ.

5. في حالة فوز أحد الطرفين نكتفي برسالة "game end" والخروج من البرنامج.

6. ممنوع استخدام المكتبات الخارجية.

7. مدة هذا التحدي أسبوع من الآن.

ملاحظات:

* نرجو من الجميع المشاركة. أي برنامج يقوم بالمطلوب حتى لو لم يكن قصيراً مرحب به. يمكننا تقصيره لاحقاً.

* بالنسبة لخوارزمية الذكاء الاصطناعي: هناك الكثير منها على النت، لا داعي لإعادة اختراع العجلة. رابط الويكيبيدا الذي وضعته بالأعلى بداية جيدة.

* إذا احتجتم إلى وقت أطول فلا مانع لدي من تمديد الفترة.

Good Luck

تم تعديل هذه المشاركة بواسطة System Down في 27 أبريل 2011 في 20:14

1
#22

موضوع مثمر و مفيد لكني كنت أفضل المسائل السريعة one-liners , لقد نقلتنا بهذه المسألة من الجولف إلى الشطرنج و من مسائل المئة حرف إلى مسائل المئة سطر :)

1

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#23
محمد سمير كتب:

موضوع مثمر و مفيد لكني كنت أفضل المسائل السريعة one-liners , لقد نقلتنا بهذه المسألة من الجولف إلى الشطرنج و من مسائل المئة حرف إلى مسائل المئة سطر :)

نغير شوية :)

#24

مش شوية دي كتيره أوي علينا :happy:

#25

يا عم حرك عضلات مخك شوية هي كلها X O :lol:

ماشي نمددها اسبوع كمان لو عايزين

مواضيع مشابهة