Софтуерно Инженерство
Loading...
+ Нов въпрос
geiff avatar geiff 71 Точки

[Homework] Advanced C# - 01.Arrays, Lists, Stacks, Queues

Здравейте, колеги

Прилагам своите решения на домашното от лекцията: Arrays, Lists, Stacks, Queues: http://github.com/geiff/Advanced-CSharp-Homework-01.Arrays-Lists-Stacks-Queues

Всякакви предложения за корекции и съвети са добре дошли :)

 

 

Тагове:
3
C# Advanced 10/02/2016 05:16:03
butanfire avatar butanfire 31 Точки

Lego-тата направих с Dictionary<int,List<int>> , малко по-лесно за разбиране и една идея по-бързо трябва да е. :)

 

Относно Pythagorean Numbers и Stuck Numbers :

Единствената забележка/потенциален проблем с тези въртежи на цикли, е че за да избегнеш масивно писане, трябва да се напише с рекурсия, в случаите за N на брой въртене.

Примерно за N такива числа a*b*c*d*e*f*g*h*j....*n, трябва да се изпишат N for-loops.

Въпреки че съм съгласен, че се приема подхода спрямо всяка задача! :)


За Pythagorean Numbers (както и за StuckNumbers) , може да си изнесеш числата arrayOfNumbers[indexA] в int променлива numberA - за четимост, за да излежда така :

if (numberA <= numberB && Math.Pow(numberA,2) + Math.Pow(numberB,2) == Math.Pow(numberC,2))

вместо така :

if (arrayOfNumbers[indexA] <= arrayOfNumbers[indexB] &&
                            arrayOfNumbers[indexA] * arrayOfNumbers[indexA] +
                                arrayOfNumbers[indexB] * arrayOfNumbers[indexB] ==
                                arrayOfNumbers[indexSum] * arrayOfNumbers[indexSum])

П.С Сега ме мързи да upload-на кода за Lego-тата, но тия дни ще го кача! :))

 

Поздрави,

Владо

1
geiff avatar geiff 71 Точки

За Pythagorean Numbers и Stuck Numbers и аз си мислех за рекурсия, но така и не я измислих. Съгласна съм че ще е подобре да изнеса в променливи числата arrayOfNumbers[indexA] .Ще се радвам когато имаш възможност да качиш кода за Lego-тата. Благодаря за коментарите и лека вечер :)

0
butanfire avatar butanfire 31 Точки

Понеже имам проблем със SSL тунела с GitHub от работа, реших направо да го paste-na :

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace LegoBlocks
{
    public class LegoBlocks
    {
        public static void Main(string[] args)
        {
            int numOfRows = int.Parse(Console.ReadLine());
            Dictionary<int, List<int>> matrix = new Dictionary<int, List<int>>();
            
            for (int i = 0; i < 2 * numOfRows; i++)
            {
                var input = Console.ReadLine()
                    .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(int.Parse)
                    .ToList();

                matrix.Add(i, input); //we use the iterator as a key, and the 2nd array is  numOfRows + i
            }

            List<int> matrixRowLength = new List<int>(); //list will check the length of the resulting matrix
            
            for (int i = 0; i < numOfRows; i++)
            {
                int sum = matrix[i].Count + matrix[i + numOfRows].Count; //calculate the number of elements from both arrays for each line
                matrixRowLength.Add(sum);
            }

            bool canArraysFit = true;
            for (int i = 0; i < matrixRowLength.Count - 1; i++)
            {
                canArraysFit = matrixRowLength[i] == matrixRowLength[i + 1]; //if there is a row in the sequence, which is not equal to the others, then the arrays cannot fit
            }

            if (!canArraysFit)
            {
                Console.WriteLine("The total number of cells is: {0}", matrixRowLength.Sum());
            }
            else
            {
                Dictionary<int, List<int>> resultMatrix = new Dictionary<int, List<int>>(); //result matrix will be used for the output
                for (int i = 0; i < numOfRows; i++)
                {
                    matrix[i + numOfRows].Reverse(); //reverse the line from the 2nd array
                    resultMatrix.Add(i, matrix[i]); //add the first line from the 1st array
                    resultMatrix[i].AddRange(matrix[i + numOfRows]); //add the reversed line

                    Console.WriteLine(string.Format("[{0}]", string.Join(", ", matrix[i]))); //output the result
                }
            }
        }
    }
}

 

1
butanfire avatar butanfire 31 Точки

Също не успях със рекурсията, най-много да изкарам всичко комбинации/вариации на двойките числа от редицата. (с повторения обаче).

Това усложнява нататъка проверката, но би трябвало да е постижимо в крайна сметка, нямам време да му заделя :(

 

Но в крайна сметка едва ли може да стане всичко в една функция, трябва поотделно да се разцепят нещата, защото имаме :

1) Изваждане на двойките числа (както ред 21 и 27 от кода ти)

2) Проверка за уникалност на числата + проверка на двойките

3) Отпечатване на числата във формата.

 

Може би най-доброто решение е наистина влагането на циклите, пример :

https://judge.softuni.bg/Contests/4/CSharp-Basics-Exam-11-April-2014-Morning

8 вложени цикъла - авторско решение.

 

Така че, много добра работа! :)

 

Поздрави,

Владо

 

1