Coding session එකේදී දුන්නේ star pattern එකක් print කරන්න. ASE and SE level එකේ
- තව first class holder කෙනෙක් තනි loop එකක් ගෙන විනාඩි 30 ක් විතර මොංගල් කෙලියා.
තනි ලූප් එකෙන් කරන්න ක්රම තියෙනවා හැබැයි ඒ කොහොම හැදුවත් Scalable Solution එකක Time Complexity එක වෙන්නේ O(n ^ 2).
1 වෙනි ක්රමය:: වර්තමාන පේළියේ (row) සහ තීරයේ (column) අගය වේරියබල් දෙකක තියාගෙන අවසාන පේළියත් ප්රින්ට් වෙලා ඉවර වෙනකන් තනි ලූප් එකක් රන් කරන එක. හැම පේළියේම හැම තිරුවකටම තරුවක් ප්රින්ට් කරනවා. හැම පේළියේම අන්තිමට Line Break එකක් ප්රින්ට් කරලා පේලියේ අගය 1 කින් වැඩි කරලා තීරයේ අගය 0 කරනවා. Scalable Solution එකක් වෙන්න 5 කියන නියත අගය වෙනුවට size වේරියබල් එක පාවිච්චි කරනවා.
C#:
int size = 5;
int row = 0, column = 0;
while (row < size)
{
Console.Write('*');
column++;
if (column == size)
{
Console.WriteLine();
row++;
column = 0;
}
}
2 වෙනි ක්රමය: මේ පැටර්න් එකේ පේළියක තියෙන තරු ගානයි තීරයක තියෙන තරු ගානයි සමානයි. ඒ කියන්නේ පේලියක/තීරුවක තරු ගාන size නම් පැටර්න් එකේ තියෙන මුලු තරු ගාන size * size වෙනවා. ඒක නිසා තනි ලූප් එකක් ඇතුලේ 1 සිට size * size දක්වා සෑම අගයකටම තරුවක් ප්රින්ට් කරනවා. කිසියම් අගයක් size වලින් ඉතුරු නැතුව බෙදෙනවානම් තරුවට අමතරව Line Break එකක් ප්රින්ට් කරනවා.
C#:
int size = 5;
for (int i = 1; i <= size * size; i++)
{
Console.Write('*');
if (i % size == 0)
Console.WriteLine();
}
3 වෙනි ක්රමය: ලූප් නැතුව Recursive Function එකක් පාවිච්චි කරන එක. මෙතනදි කරන්නෙත් 2 වෙනි ක්රමයේදී කරන දේමයි. වෙනසකට තියෙන්නේ Looping වෙනුවට Recursion පාවිච්චි කරන එක. 5 x 5 පැටර්න් එක ප්රින්ට් කරන්න arguments වලට 1 සහ 5 දීලා කෝල් කරන්න තියෙන්නේ. PrintPattern(1, 5);
C#:
static void PrintPattern(int i, int size)
{
Console.Write('*');
if (i % size == 0)
Console.WriteLine();
if (i < size * size)
PrintPattern(i + 1, size);
}
හැබැයි ඔය මොන විදියට කලත් performance or readability improvement එකක් නැහැ. ඒක නිසා හොඳම දේ තමයි ඔයා බලාපොරොත්තු වෙච්ච ක්රමයට (using nested for loops) කරන එක.