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

در این بخش، جزئيات بیشتری از برنامههایی که توسط شرکتکندگان برای مسابقه دوم جیکل ارسال شده است را مرور میکنیم. همانطور که در مطلب قبلی گفته شد، نکات آموزشی جالبی در برنامههای رسیده دیده میشود که مرور آنها، حتی برای برنامهنویسان حرفهای خالی از لطف نیست. بنابراین، بار دیگر از همه عزيزانی که در این مسابقه شرکت کردند، صمیمانه تشکر میکنیم.
1- همه برنامههای ارسال شده.
همه برنامههایی که ما دریافت کردیم از اینجا قابل دریافت است.
2-چرا برنامه کوتاهتر بهتر است؟!
همانطور که قبلاً گفته شد، لزوماً «کوتاه بودن» دلیلی بر خوب بودن برنامهها نیست. در همین مسابقه، از روشهایی برای کوتاه کردن برنامه استفاده شده است، که در عمل کارهای خوبی نیستند! مثلاً عدم ذکر بخش جنریک در نام کلاسها، هرچند باعث کوتاه شدن برنامه میشود ولی یک Warning در پی دارد و الگوی مناسبی برای برنامهنویسی نیست. در هر حال، این مسابقه، این یک چالش کوچک برنامهنویسی بود و احتمالاً کسانی در این آزمون برنامههای کوتاهتری نوشتهاند که ساختارهای مختلف زبان را به خوبی میشناسند و میدانند در هر بخش چه گزينههایی برای کوتاه کردن برنامه وجود دارد.
3- برخی از برنامهها.
در این بخش، برخی از برنامههای جالبی که دریافت کردیم را به عنوان نمونه نشان میدهیم.
– کوتاهترین برنامه که به طول 182 کاراکتر نوشته شده بود:
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;
}
}
– یک برنامه جالب دیگر به طول 184 کاراکتر:
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;
}
}
– یک برنامه خیلی جالب که از جاوا 8 و امکانات برنامهنویسی تابعی استفاده کرده است. طول این برنامه 224 کاراکتر است (که البته با کمی دستکاری، میتواند کمتر هم بشود):
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());
}
}
4- جدول ردهبندی
در جدول زیر، مجموعه همه برنامههایی که دریافت کردیم نمایش داده شده است. ستون «وضعیت تستها» نشان میدهد که آیا هر برنامه test-case ها را پاس کرده است یا خیر. ستون «ترتیب دریافت برنامهها» هم نشان میدهد شرکتکنندگان با چه ترتیبی برنامهها را ارسال کردهاند (به ترتیب چه برنامههایی به دست ما رسیده است).
تلفن | وضعیت تستها | طول برنامه | ترتیب دریافت برنامهها |
0913XXXXX04 | PASS | 231 | 17 |
0913XXXXX04 | PASS | 229 | 18 |
0937XXXXX59 | FAIL | 232 | 2 |
093XXXXX59 | FAIL | 226 | 6 |
0917XXXXX65 | PASS | 191 | 16 |
0917XXXXX5 | PASS | 184 | 20 |
0018XXXXX67 | PASS | 190 | 12 |
0018XXXXX67 | PASS | 184 | 13 |
0018XXXXX67 | PASS | 182 | 19 |
0912XXXXX80 | PASS | 260 | 5 |
0912XXXXX80 | PASS | 240 | 9 |
0912XXXXX80 | PASS | 210 | 21 |
0935XXXXX78 | PASS | 259 | 3 |
0935XXXXX78 | PASS | 224 | 10 |
0912XXXXX64 | PASS | 208 | 7 |
0912XXXXX64 | PASS | 207 | 11 |
0912XXXXX48 | FAIL | 311 | 1 |
0937XXXXX74 | PASS | 233 | 14 |
0913XXXXX20 | PASS | 257 | 4 |
0933XXXXX31 | PASS | 301 | 8 |
0910XXXXX15 | PASS | 328 | 15 |
تشکر فراوان از مسابقه جالبی که برگزار کردید. یک پیشنهاد کوچولو داشتم: خیلی بهتر میشه اگر بتونید کدهای داخل صفحات سایت رو رنگی و با فونت مناسب کد نشون بدید که خواناتر بشه.
خیلی ممنون از پیشنهاد خوب شما. حق با شماست. انشاءالله به زودی اصلاح میشود.
ضمن سلام و تشکر از مسابقه خوبتون. عرض کنم خدمتتون که این برنامه رو میشه فقط با 177 کارکتر هم نوشت! 😉
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;
}
}
کاملاً درسته.
🙂