نکاتی درباره مسابقه جیکل۲: هنر برنامهنویسی فیبوناچی

در این بخش، جزئیات بیشتری از برنامههایی که توسط شرکتکندگان برای مسابقه دوم جیکل ارسال شده است را مرور میکنیم. همانطور که در مطلب قبلی گفته شد، نکات آموزشی جالبی در برنامههای رسیده دیده میشود که مرور آنها، حتی برای برنامهنویسان حرفهای خالی از لطف نیست. بنابراین، بار دیگر از همه عزیزانی که در این مسابقه شرکت کردند، صمیمانه تشکر میکنیم.
۱- همه برنامههای ارسال شده.
همه برنامههایی که ما دریافت کردیم از اینجا قابل دریافت است.
۲-چرا برنامه کوتاهتر بهتر است؟!
همانطور که قبلاً گفته شد، لزوماً «کوتاه بودن» دلیلی بر خوب بودن برنامهها نیست. در همین مسابقه، از روشهایی برای کوتاه کردن برنامه استفاده شده است، که در عمل کارهای خوبی نیستند! مثلاً عدم ذکر بخش جنریک در نام کلاسها، هرچند باعث کوتاه شدن برنامه میشود ولی یک Warning در پی دارد و الگوی مناسبی برای برنامهنویسی نیست. در هر حال، این مسابقه، این یک چالش کوچک برنامهنویسی بود و احتمالاً کسانی در این آزمون برنامههای کوتاهتری نوشتهاند که ساختارهای مختلف زبان را به خوبی میشناسند و میدانند در هر بخش چه گزینههایی برای کوتاه کردن برنامه وجود دارد.
۳- برخی از برنامهها.
در این بخش، برخی از برنامههای جالبی که دریافت کردیم را به عنوان نمونه نشان میدهیم.
– کوتاهترین برنامه که به طول ۱۸۲ کاراکتر نوشته شده بود:
package ir.javacup.jcal.jcal2;
import java.util.*;
class FibonacciImpl implements Fibonacci {
public List sequnce(int n) {
List l = new Vector(n);
long a = 1, b = 0;
while (n– > 0) {
l.add(b += a);
a = b – a;
}
return l;
}
}
– یک برنامه جالب دیگر به طول ۱۸۴ کاراکتر:
package ir.javacup.jcal.jcal2;
import java.util.*;
class FibonacciImpl implements Fibonacci {
public List sequnce(int n){
List l = new Stack();
for(long b=n<0?0:1,a=0/b;n–>0;b+=a)
l.add(a=b-a);
return l;
}
}
– یک برنامه خیلی جالب که از جاوا ۸ و امکانات برنامهنویسی تابعی استفاده کرده است. طول این برنامه ۲۲۴ کاراکتر است (که البته با کمی دستکاری، میتواند کمتر هم بشود):
package ir.javacup.jcal.jcal2;
import java.util.stream.*;
public class FibonacciImpl implements Fibonacci {
long a=1;
public java.util.List<Long> sequnce(int n) {
return Stream.iterate(1l, x->(a=x-a)+x).limit(n).collect(Collectors.toList());
}
}
۴- جدول ردهبندی
در جدول زیر، مجموعه همه برنامههایی که دریافت کردیم نمایش داده شده است. ستون «وضعیت تستها» نشان میدهد که آیا هر برنامه test-case ها را پاس کرده است یا خیر. ستون «ترتیب دریافت برنامهها» هم نشان میدهد شرکتکنندگان با چه ترتیبی برنامهها را ارسال کردهاند (به ترتیب چه برنامههایی به دست ما رسیده است).
تلفن | وضعیت تستها | طول برنامه | ترتیب دریافت برنامهها |
۰۹۱۳XXXXX04 | PASS | ۲۳۱ | ۱۷ |
۰۹۱۳XXXXX04 | PASS | ۲۲۹ | ۱۸ |
۰۹۳۷XXXXX59 | FAIL | ۲۳۲ | ۲ |
۰۹۳XXXXX59 | FAIL | ۲۲۶ | ۶ |
۰۹۱۷XXXXX65 | PASS | ۱۹۱ | ۱۶ |
۰۹۱۷XXXXX5 | PASS | ۱۸۴ | ۲۰ |
۰۰۱۸XXXXX67 | PASS | ۱۹۰ | ۱۲ |
۰۰۱۸XXXXX67 | PASS | ۱۸۴ | ۱۳ |
۰۰۱۸XXXXX67 | PASS | ۱۸۲ | ۱۹ |
۰۹۱۲XXXXX80 | PASS | ۲۶۰ | ۵ |
۰۹۱۲XXXXX80 | PASS | ۲۴۰ | ۹ |
۰۹۱۲XXXXX80 | PASS | ۲۱۰ | ۲۱ |
۰۹۳۵XXXXX78 | PASS | ۲۵۹ | ۳ |
۰۹۳۵XXXXX78 | PASS | ۲۲۴ | ۱۰ |
۰۹۱۲XXXXX64 | PASS | ۲۰۸ | ۷ |
۰۹۱۲XXXXX64 | PASS | ۲۰۷ | ۱۱ |
۰۹۱۲XXXXX48 | FAIL | ۳۱۱ | ۱ |
۰۹۳۷XXXXX74 | PASS | ۲۳۳ | ۱۴ |
۰۹۱۳XXXXX20 | PASS | ۲۵۷ | ۴ |
۰۹۳۳XXXXX31 | PASS | ۳۰۱ | ۸ |
۰۹۱۰XXXXX15 | PASS | ۳۲۸ | ۱۵ |
تشکر فراوان از مسابقه جالبی که برگزار کردید. یک پیشنهاد کوچولو داشتم: خیلی بهتر میشه اگر بتونید کدهای داخل صفحات سایت رو رنگی و با فونت مناسب کد نشون بدید که خواناتر بشه.
خیلی ممنون از پیشنهاد خوب شما. حق با شماست. انشاءالله به زودی اصلاح میشود.
ضمن سلام و تشکر از مسابقه خوبتون. عرض کنم خدمتتون که این برنامه رو میشه فقط با ۱۷۷ کارکتر هم نوشت! 😉
package ir.javacup.jcal.jcal2;
import java.util.*;
class FibonacciImpl implements Fibonacci {
long a,b=1;
public List sequnce(int n){
List l = new Vector(n);
for(;n–>0;b+=a) l.add(a=b-a);
return l;
}
}
کاملاً درسته.
🙂