codewars069 饥饿游戏:动物园的灾难!

本文介绍了一个基于动物食物链的模拟程序,通过Java实现了一种算法来模拟动物园内动物之间的捕食行为。该程序使用了HashMap来存储每种动物能够捕食的对象,并通过迭代的方式检查并更新动物间的捕食关系。

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/java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Dinglemouse {
	private static Map<String, String> map = new HashMap<String, String>();
	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<String> list = new ArrayList<String>();
		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};
	}

}

转载于:https://my.oschina.net/u/553266/blog/1358464

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值