64x64
Hakan Shehu
Themelues i Papirusit
6 Nëntor 2020 · 4 min lexim

Gjirafa# - Zgjidhjet e detyrave - 1. New King Order

Gjirafa# - Zgjidhjet e detyrave - 1. New King Order

Gjirafa# ishte një eksperiencë e jashtëzakonshme. Që nga planifikimi i eventit e gjer tek përgatitja e detyrave ka qenë një sfidë interesante për ekipin tonë. Duke marrë parasysh komentet pozitive që i kemi marrë dhe diskutimet e shumta që i kemi bërë rreth detyrave dhe zgjidhjeve të tyre, kemi vendosur që t’i postojmë dhe sqarojmë zgjidhjet e detyrave që kanë qenë pjesë e garës. Zgjidhjet do të postohen si një seri e postimeve, ku për secilën detyrë do të mundohemi të diskutojmë se cilat kanë qenë sfidat kryesore, cilat kanë qenë zgjidhjet më të mira nga pjesëmarrësit dhe cila ka qenë zgjidhja që e kemi bërë ne. Zgjidhjet do të jenë në gjuhën programuese C#, pasi që kjo është gjuha që kryesisht e përdorim në Gjirafë.


Ky është postimi i parë i kësaj serie në të cilin do të diskutojmë detyrën e parë të garës Gjirafa#.


Detyra e parë dhe më e lehtë e garës ishte “New king order”. Nëse nuk e keni parë detyrën ju rekomandojmë të lexoni tekstin origjinal (tekstet e detyrave janë në gjuhën angleze) përmes linkut: https://www.hackerrank.com/contests/gjirafa/challenges/new-king-order. Poashtu për ata që dëshirojnë të provojnë ta zgjidhin detyrën ende keni mundësi ta bëni postimin e zgjidhjes, por kuptohet se nuk do të fitoni pikë për shkak që gara ka mbaruar.


Pra, siq e keni parë detyra thotë se ju do të pranoni N rreshta të ndryshëm. Secili rresht përmban një emër të mbretit të përbërë nga karakteret ‘a’ deri ‘z’ dhe ‘A’ deri ‘Z’, një hapësirë dhe një numër Romak. Detyra juaj është që t’i printoni këto emrat në rradhitjen e duhur. Rradhitja duhet të bëhet në mënyrë leksikografike dhe nëse dy mbretër kanë emër të njëjtë atëherë rradhitja bëhet përmes numrin të tyre respektiv romak. 


Për shembull nëse kemi si input:

Louis IX
Louis VIII

Atëherë zgjidhja duhet të jetë:

Louis VIII
Louis IX

Për shkak se numri romak VIII (8) është më i vogël se IX (9). 


Poashtu nëse kemi input:

Louis IX
Philippe II

Atëherë zgjidhja duhet të jetë:

Louis IX
Philippe II

Për shkak se rradhitja bëhet së pari në bazë të emrit e më pas në bazë të numrit romak.


Zgjidhja e kësaj detyre është e lehtë. Në pika të shkurta cka duhet të bëhet:

  1. Ndajmë stringun në hapësirë (split in space)
  2. Rradhisim leksikografikisht emrin (pjesën e parë pas ndarjes)
  3. Nëse emri i njëjtë përsëritet disa herë, rradhisim në bazë të vlerës së numrit romak.


Për të gjetur vlerën e numrit romak në sistemin decimal, mund të përdorim ndonjë zgjidhje të gatshme nga StackOverflow për të bërë konvertimin. Disa zgjidhje interesante rreth këtij konvertimi mund të përdoren nga ky link: https://stackoverflow.com/questions/14900228/roman-numerals-to-integers


Kjo detyrë ka pasur të gatshme pjesën për leximin e inputit kështu që do të përdorim atë kod edhe në këtë postim. Do të fokusohemi vetëm tek zgjidhja e metodës “SortPrintKingNames”.  


Atëherë kemi zgjidhje përfundimtare:

  public class Result
  {
    private static readonly Dictionary<char, int> RomanMap = new Dictionary<char, int>()
    {
      {'I', 1},
      {'V', 5},
      {'X', 10},
      {'L', 50},
      {'C', 100},
      {'D', 500},
      {'M', 1000}
    };

    /*
     * Complete the 'SortPrintKingsNames' function below.
     *
     * The function accepts STRING_ARRAY kings as parameter.
     */

    public static void SortPrintKingsNames(List<string> kings)
    {
      // Sort and print kings names

      kings.Select(ParseKingName)
          .OrderBy(x => x.Name)
          .ThenBy(x => x.Number)
          .ToList()
          .ForEach(x => Console.WriteLine($"{x.Name} {x.Roman}"));
    }

    private static King ParseKingName(string str)
    {
      var parts = str.Split(' ');

      return new King
      {
        Name = parts[0],
        Roman = parts[1],
        Number = RomanToInteger(parts[1])
      };
    }

    public static int RomanToInteger(string roman)
    {
      int number = 0;
      for (int i = 0; i < roman.Length; i++)
      {
        if (i + 1 < roman.Length && RomanMap[roman[i]] < RomanMap[roman[i + 1]])
        {
          number -= RomanMap[roman[i]];
        }
        else
        {
          number += RomanMap[roman[i]];
        }
      }
      return number;
    }
  }

  public class Solution
  {
    public static void Main(string[] args)
    {
      int kingsNamesCount = Convert.ToInt32(Console.ReadLine().Trim());

      List<string> kingsNames = new List<string>();

      for (int i = 0; i < kingsNamesCount; i++)
      {
        string kingsNamesItem = Console.ReadLine();
        kingsNames.Add(kingsNamesItem);
      }

      Result.SortPrintKingsNames(kingsNames);
    }
  }

  public class King
  {
    public string Name { get; set; }
    public string Roman { get; set; }
    public int Number { get; set; }
  }


Kjo është zgjidhja e detyrës së parë nga gara Gjirafa#. Nëse keni ndonjë koment, sugjerim apo pyetje mos hezitoni të na kontaktoni përmes pjesës së komenteve apo përmes ndonjë rrjeti social.


Së shpejti do të postojmë edhe zgjidhjet e detyrave tjera.




Hakan Shehu
Themelues i Papirusit
64x64
Gjirafa Engineering
Artikujt e ndryshëm nga ekipi i inxhinierisë softuerike në Gjirafa.

Gjithashtu lexoni


0 komente