gabi11

Functional Programming - 12. Inferno III

Jun 1st, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.00 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6.  
  7.  
  8. namespace CSharpAdvanced
  9. {
  10.  
  11.     class Program
  12.     {
  13.         static void Main(string[] args)
  14.         {
  15.             var gems = Console.ReadLine()
  16.                 .Split()
  17.                 .Select(int.Parse)
  18.                 .ToList();
  19.  
  20.             var filters = new Dictionary<string, Func<List<int>, List<int>>>();
  21.  
  22.             string input;
  23.             while ((input = Console.ReadLine()) != "Forge")
  24.             {
  25.                 var line = input.Split(";");
  26.                 var command = line[0];
  27.                 var filterType = line[1];
  28.                 var parameter = int.Parse(line[2]);
  29.  
  30.                 string dictKey = $"{filterType} {parameter}";
  31.  
  32.                 if (command == "Exclude")
  33.                 {
  34.                     filters[dictKey] = CreateFunction(filterType, parameter);
  35.                 }
  36.  
  37.                 else if (command == "Reverse")
  38.                 {
  39.                     filters.Remove(dictKey);
  40.                 }
  41.             }
  42.  
  43.             List<int> filtered = GetFiltered(gems, filters);
  44.  
  45.             gems = gems.Where(gem => !filtered.Contains(gem)).ToList();
  46.  
  47.             Console.WriteLine(string.Join(" ", gems));
  48.         }
  49.  
  50.         private static List<int> GetFiltered(List<int> gems, Dictionary<string, Func<List<int>, List<int>>> filters)
  51.         {
  52.             var filtered = new List<int>();
  53.  
  54.             foreach (var filter in filters)
  55.             {
  56.                 filtered.AddRange(filter.Value(gems));
  57.             }
  58.  
  59.             return filtered;
  60.         }
  61.  
  62.         private static Func<List<int>, List<int>> CreateFunction(string filterType, int parameter)
  63.         {
  64.             switch (filterType)
  65.             {
  66.                 case "Sum Left":
  67.                     return gems => gems.Where(gem =>
  68.                     {
  69.                         int index = gems.IndexOf(gem);
  70.                         int leftGem = index > 0 ? gems[index - 1] : 0;
  71.                         return gem + leftGem == parameter;
  72.                     }).ToList();
  73.  
  74.                 case "Sum Right":
  75.                     return gems => gems.Where(gem =>
  76.                     {
  77.                         int index = gems.IndexOf(gem);
  78.                         int rightGem = index < gems.Count - 1 ? gems[index + 1] : 0 ;
  79.                         return gem + rightGem == parameter;
  80.                     }).ToList();
  81.  
  82.                 case "Sum Left Right":
  83.                     return gems => gems.Where(gem =>
  84.                     {
  85.                         int index = gems.IndexOf(gem);
  86.                         int leftGem = index > 0 ? gems[index - 1] : 0;
  87.                         int rightGem = index < gems.Count - 1 ? gems[index + 1] : 0;
  88.                         return gem + leftGem + rightGem == parameter;
  89.                     }).ToList();
  90.  
  91.                 default:
  92.                     throw new ArgumentException();
  93.             }
  94.         }
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment