Advertisement
Guest User

04.Legendary Farming

a guest
Oct 26th, 2015
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.51 KB | None | 0 0
  1. import java.util.AbstractList;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.Iterator;
  8. import java.util.LinkedHashMap;
  9. import java.util.LinkedList;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.Scanner;
  13.  
  14. public class _04LegendaryFarming {
  15.  
  16.     public static class Material{
  17.         String name;
  18.         int quantity;
  19.        
  20.         public Material(String name, int quantity){
  21.             this.name = name;
  22.             this.quantity = quantity;
  23.         }
  24.     }
  25.    
  26.     public static void main(String[] args) {
  27.         Scanner scanner = new Scanner(System.in);
  28.        
  29.         HashMap<String, Integer> materials = new HashMap<>();
  30.         String obtainedMaterial;
  31.        
  32.         HashMap<String, String> items = new HashMap<>();
  33.         items.put("shards", "Shadowmourne");
  34.         items.put("fragments", "Valanyr");
  35.         items.put("motes", "Dragonwrath");
  36.        
  37.         while(true){
  38.             int quantity = scanner.nextInt();
  39.             String material = scanner.next().toLowerCase();
  40.            
  41.             if(!materials.containsKey(material)){
  42.                 materials.put(material, 0);
  43.             }
  44.             materials.put(material, materials.get(material) + quantity);
  45.            
  46.             if(items.keySet().contains(material) && materials.get(material) >= 250){
  47.                 obtainedMaterial = material;
  48.                 break;
  49.             }
  50.            
  51.         }
  52.        
  53.         System.out.println(items.get(obtainedMaterial) + " obtained!");
  54.         materials.put(obtainedMaterial, materials.get(obtainedMaterial)-250);
  55.         ArrayList<Material> keys = new ArrayList<>();
  56.        
  57.         for(String s : items.keySet()){
  58.             int left = 0;
  59.             if(materials.containsKey(s)){
  60.                 left = materials.get(s);
  61.             }
  62.            
  63.             keys.add(new Material(s, left));
  64.             materials.remove(s);
  65.         }
  66.        
  67.         (new Linq<Material>(keys))
  68.             .OrderByDescending(k -> k, (a,b) -> {
  69.                 int res = ((Integer)a.quantity).compareTo(b.quantity);
  70.                 if(res == 0) return b.name.compareTo(a.name);
  71.                 return res;
  72.             })
  73.             .ForEach((m)->System.out.println(m.name + ": " + m.quantity));
  74.        
  75.         ArrayList<Material> junk = new ArrayList<>();
  76.        
  77.         for(String s : materials.keySet()){
  78.             int left = 0;
  79.             if(materials.containsKey(s)){
  80.                 left = materials.get(s);
  81.             }
  82.            
  83.             junk.add(new Material(s, left));
  84.         }
  85.        
  86.         (new Linq<Material>(junk))
  87.         .OrderBy((j)->j, (a,b)->a.name.compareTo(b.name))
  88.         .ForEach((m)->System.out.println(m.name + ": " + m.quantity));
  89.        
  90.         scanner.close();
  91.     }
  92.    
  93.     public static String capitalize(String str){
  94.         return String.valueOf(Character.toUpperCase(str.charAt(0)))+str.substring(1);
  95.     }
  96.  
  97.     public interface IFunc <TParam, TResult> {
  98.         public TResult callAction(TParam parameter);
  99.     }
  100.    
  101.     public interface IFunc2Params<TParam1, TParam2, TResult> {
  102.         public TResult callAction(TParam1 parameter1, TParam2 parameter2);
  103.     }
  104.    
  105.     public interface IAction<TParam1> {
  106.         public void callAction(TParam1 parameter1);
  107.     }
  108.    
  109.    
  110.     public static class Linq<TInitial> {
  111.        
  112.         private boolean extendsAbstractList = false;
  113.         private Iterable<TInitial> _iterable;
  114.        
  115.         public <TIterable extends Iterable<TInitial>> Linq(TIterable iterable){
  116.             _iterable = iterable;
  117.         }
  118.        
  119.         public <TIterable extends AbstractList<TInitial>> Linq(TIterable iterable){
  120.             _iterable = iterable;
  121.             extendsAbstractList = true;
  122.         }
  123.        
  124.         public Iterable<TInitial> GetIterable(){
  125.             return _iterable;
  126.         }
  127.        
  128.         public Linq<TInitial> Where(IFunc2Params<TInitial, Integer, Boolean> action){
  129.             ArrayList<TInitial> result = new ArrayList<TInitial>();
  130.             int i = 0;
  131.            
  132.             for(TInitial a : _iterable){
  133.                 if(action.callAction(a, i)){
  134.                     result.add(a);
  135.                 };
  136.                 i++;
  137.             }
  138.            
  139.             return new Linq<TInitial>(result);
  140.         }
  141.        
  142.         public Linq<TInitial> Where(IFunc<TInitial, Boolean> action){
  143.             ArrayList<TInitial> result = new ArrayList<TInitial>();
  144.            
  145.             for(TInitial a : _iterable){
  146.                 if(action.callAction(a)){
  147.                     result.add(a);
  148.                 };
  149.             }
  150.            
  151.             return new Linq<TInitial>(result);
  152.         }
  153.        
  154.         public <B> Linq<B> Select(IFunc<TInitial,B> action){
  155.             ArrayList<B> result = new ArrayList<B>();
  156.            
  157.             for(TInitial a : _iterable){
  158.                 result.add(action.callAction(a));
  159.             }
  160.             return new Linq<B>(result);
  161.         }
  162.        
  163.         public <B> Linq<B> Select(IFunc2Params<TInitial, Integer, B> action){
  164.             ArrayList<B> result = new ArrayList<B>();
  165.             int i = 0;
  166.            
  167.             for(TInitial a : _iterable){
  168.                 result.add(action.callAction(a, i));
  169.                 i++;
  170.             }
  171.             return new Linq<B>(result);
  172.         }
  173.        
  174.         public <B, C extends Iterable<B>> Linq<B> SelectMany(IFunc<TInitial, C> action){
  175.             ArrayList<B> result = new ArrayList<B>();
  176.            
  177.             for(TInitial a : _iterable){
  178.                 for(B b : action.callAction(a)){
  179.                     result.add(b);
  180.                 }
  181.             }
  182.            
  183.             return new Linq<B>(result);
  184.         }
  185.        
  186.         public TInitial First(){
  187.             Iterator<TInitial> iterator = _iterable.iterator();
  188.            
  189.             if(iterator.hasNext()){
  190.                 return iterator.next();
  191.             }
  192.             return null;
  193.         }
  194.        
  195.         private TInitial LastList(){
  196.             return ((AbstractList<TInitial>)_iterable).get(
  197.                     ((AbstractList<TInitial>)_iterable).size()-1);
  198.         }
  199.        
  200.         public TInitial Last(){
  201.             if(extendsAbstractList){
  202.                 return LastList();
  203.             }
  204.            
  205.             TInitial result = null;
  206.            
  207.             for(TInitial a : _iterable){
  208.                 result = a;
  209.             }
  210.             return result;
  211.         }
  212.        
  213.         private int CountList(){
  214.             return ((AbstractList<TInitial>)_iterable).size();
  215.         }
  216.        
  217.         public int Count(){
  218.             if(extendsAbstractList){
  219.                 return CountList();
  220.             }
  221.            
  222.             int count = 0;
  223.            
  224.             for (Iterator<TInitial> iterator = _iterable.iterator(); iterator.hasNext(); iterator.next()) {
  225.                 count++;
  226.             }
  227.            
  228.             return count;
  229.         }
  230.        
  231.         public int Count(IFunc<TInitial, Boolean> action){
  232.             return Where(action).CountList();
  233.         }
  234.        
  235.         public Linq<TInitial> Distinct(){
  236.             ArrayList<TInitial> result = new ArrayList<TInitial>();
  237.             HashSet<TInitial> hashSet = new HashSet<TInitial>();
  238.            
  239.             for(TInitial a : _iterable){
  240.                 if(!hashSet.contains(a)){
  241.                     hashSet.add(a);
  242.                     result.add(a);
  243.                 }
  244.             }
  245.              
  246.             return new Linq<TInitial>(result);
  247.         }
  248.        
  249.         public <B extends Comparable<B>> Linq<B> OrderBy(IFunc<TInitial, B> action){
  250.             return OrderBy(action, (a,b) -> a.compareTo(b));
  251.         }
  252.        
  253.         public <B> Linq<B> OrderBy(IFunc<TInitial, B> action, Comparator<B> comparator){
  254.             List<B> result = new ArrayList<B>();
  255.            
  256.             for(TInitial a : _iterable){
  257.                 B toAddItem = action.callAction(a);
  258.                 result.add(toAddItem);
  259.             }
  260.             Collections.sort(result, comparator);
  261.            
  262.             return new Linq<B>(result);
  263.         }
  264.        
  265.         public <B extends Comparable<B>> Linq<B> OrderByDescending(IFunc<TInitial, B> action){
  266.             return OrderBy(action, (t1, t2) -> t2.compareTo(t1));
  267.         }
  268.        
  269.         public <B> Linq<B> OrderByDescending(IFunc<TInitial, B> action, Comparator<B> comparator){
  270.             return OrderBy(action, (t1, t2) -> comparator.compare(t2, t1));
  271.         }
  272.        
  273.         public <B> HashMap<B, ArrayList<TInitial>> GroupBy(IFunc<TInitial, B> action){
  274.             LinkedHashMap<B, ArrayList<TInitial>> map = new LinkedHashMap<>();
  275.            
  276.             for(TInitial item : _iterable){
  277.                 B key = action.callAction(item);
  278.                 if(!map.containsKey(key)){
  279.                     map.put(key, new ArrayList<TInitial>());
  280.                 }
  281.                 map.get(key).add(item);
  282.             }
  283.            
  284.             return map;
  285.         }
  286.        
  287.         public Linq<TInitial> Reverse(){
  288.             if(extendsAbstractList){
  289.                 return ReverseList();
  290.             }
  291.            
  292.             LinkedList<TInitial> list = new LinkedList<TInitial>();
  293.            
  294.             for(TInitial a : _iterable){
  295.                 list.addFirst(a);
  296.             }
  297.            
  298.             return new Linq<TInitial>(list);
  299.         }
  300.        
  301.         private Linq<TInitial> ReverseList(){
  302.             AbstractList<TInitial> abstractList = (AbstractList<TInitial>)_iterable;
  303.             return new Linq<TInitial>(new Iterable<TInitial>() {
  304.  
  305.                 @Override
  306.                 public Iterator<TInitial> iterator() {
  307.                     return new Iterator<TInitial>() {
  308.  
  309.                         int i = abstractList.size();
  310.                        
  311.                         @Override
  312.                         public boolean hasNext() {
  313.                             return i > 0;
  314.                         }
  315.  
  316.                         @Override
  317.                         public TInitial next() {
  318.                             i--;
  319.                             return abstractList.get(i);
  320.                         }
  321.  
  322.                         @Override
  323.                         public void remove() {
  324.                             if(i < 0 || i >= abstractList.size()){
  325.                                 return;
  326.                             }
  327.                             abstractList.remove(i);
  328.                         }
  329.  
  330.                     };
  331.                 }
  332.             });
  333.         }
  334.        
  335.         public void ForEach(IAction<TInitial> action){
  336.             for(TInitial a : _iterable){
  337.                 action.callAction(a);
  338.             }
  339.         }
  340.  
  341.         public Linq<TInitial> Take(int toTakeCount){
  342.             return new Linq<TInitial>(new Iterable<TInitial>() {
  343.                
  344.                 @Override
  345.                 public Iterator<TInitial> iterator() {
  346.                     return new Iterator<TInitial>() {
  347.  
  348.                         Iterator<TInitial> iterator = _iterable.iterator();
  349.                         int i = -1;
  350.                        
  351.                         @Override
  352.                         public boolean hasNext() {
  353.                             return iterator.hasNext() && i < toTakeCount-1;
  354.                         }
  355.  
  356.                         @Override
  357.                         public TInitial next() {
  358.                             i++;
  359.                             return iterator.next();
  360.                         }
  361.                     };
  362.                 }
  363.             });
  364.         }
  365.        
  366.         public Linq<TInitial> Skip(int toSkipCount){
  367.             Iterator<TInitial> iterator = _iterable.iterator();
  368.             for(; toSkipCount > 0; toSkipCount--){
  369.                 if(iterator.hasNext()){
  370.                     iterator.next();
  371.                 }
  372.             }
  373.            
  374.             return new Linq<TInitial>(new Iterable<TInitial>() {
  375.                
  376.                 @Override
  377.                 public Iterator<TInitial> iterator() {
  378.                     return iterator;
  379.                 }
  380.             });
  381.         }
  382.     }
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement