Instructions 说明
Story.
A freak power outage at the zoo has caused all of the electric cage doors to malfunction and swing open... All the animals are out and some of them are eating each other! It's a Zoo Disaster! Here is a list of zoo animals, and what they can eat
- antelope eats grass
- big-fish eats little-fish
- bug eats leaves
- bear eats big-fish
- bear eats bug
- bear eats chicken
- bear eats cow
- bear eats leaves
- bear eats sheep
- chicken eats bug
- cow eats grass
- fox eats chicken
- fox eats sheep
- giraffe eats leaves
- lion eats antelope
- lion eats cow
- panda eats leaves
- sheep eats grass
Sample Tests 测试样例:
import org.junit.Test;import static org.junit.Assert.assertArrayEquals;public class ExampleTest { @Test public void example() { final String input = "fox,bug,chicken,grass,sheep"; final String[] expected = { "fox,bug,chicken,grass,sheep", "chicken eats bug", "fox eats chicken", "sheep eats grass", "fox eats sheep", "fox"}; assertArrayEquals(expected, Dinglemouse.whoEatsWho(input)); }@Test public void example2() { final String input = "bear,banana,banana,grass,busker,panda,antelope,giraffe,cow,big-fish,banana,sheep,grass,lion"; final String[] expected = { "bear,banana,banana,grass,busker,panda,antelope,giraffe,cow,big-fish,banana,sheep,grass,lion", "sheep eats grass", "bear,banana,banana,grass,busker,panda,antelope,giraffe,cow,big-fish,banana,sheep,lion"}; assertArrayEquals(expected, Dinglemouse.whoEatsWho(input)); }}
Solution 解决方案:
//https://www.codewars.com/kata/5902bc7aba39542b4a00003d/train/javaimport java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class Dinglemouse { private static Mapmap = new HashMap (); static { map.put("antelope", "grass"); map.put("big-fish", "little-fish"); map.put("bug", "leaves"); map.put("bear", "big-fish,bug,chicken,cow,leaves,sheep"); map.put("chicken", "bug"); map.put("cow", "grass"); map.put("fox", "chicken,sheep"); map.put("giraffe", "leaves"); map.put("lion", "antelope,cow"); map.put("panda", "leaves"); map.put("sheep", "grass"); } private static String canEatLeftOrRight(String subject, String left, String right) { String result = canEat(subject, left); if (result.equals("")) { return canEat(subject, right); } return result; } private static String canEat(String subject, String object) { if (!map.containsKey(subject) || "".equals(object)) { return ""; } if (map.get(subject).indexOf(object) != -1) { return String.format("%s eats %s", subject, object); } return ""; } private static StringBuffer reduce(String[] arr, int subject, String left, String right, String rule) { String target = rule.split(" ")[2]; int purge = -1; if (target.equals(left)) { purge = subject - 1; } if (target.equals(right)) { purge = subject + 1; } StringBuffer sb = new StringBuffer(); for (int i = 0; i < arr.length; i++) { if (i != purge) { sb.append(arr[i]).append(","); } } int len = sb.length(); if (sb.charAt(len - 1) == ',') { sb.deleteCharAt(len - 1); } return sb; } public static String[] whoEatsWho(final String zoo) { List list = new ArrayList (); list.add(zoo); StringBuffer sb = new StringBuffer(zoo); boolean reduceable = true; Label: while (reduceable) { String[] arr = sb.toString().split(","); if (arr.length < 2) { break; } for (int i = 0; i < arr.length; i++) { String subject = arr[i]; String left = i > 0 ? arr[i - 1] : ""; String right = i < arr.length - 1 ? arr[i + 1] : ""; String check = canEatLeftOrRight(subject, left, right); if (!check.equals("")) { list.add(check); sb = reduce(arr, i, left, right, check); break; } if (i == arr.length - 1) { reduceable = false; break Label; } } } list.add(sb.toString()); return list.toArray(new String[0]); // return new String[]{zoo, zoo}; }}