Tölvunarfræði 2 - Vor 2012


Aukaverkefni 2


Lausnum skal skilað til viðkomandi dæmakennara (sjá lista yfir dæmatíma).

Reynið að skrifa stutt, skýr og hnitmiðuð forrit. Notið réttan inndrátt og gætið þess að forritin ykkar séu læsileg.

Skiladagur: þriðjudaginn 27. mars fyrir kl 16:00


Aukaverkefni (10 stig) - Scrabble svindlari


Skrifið forrit í C eða Java sem les orð af aðalinntaki sem inniheldur stafina sem þið hafið til umráða og prentar út öll lögleg Scrabble orð sem er hægt að mynda með þeim stöfum.

Orð er löglegt Scrabble orð ef það er í Official Scrabble Player's Dictionary (ospd.txt)

Notið rautt-svart tré fyrir uppflettingar.

Þið megið nota java.util.TreeSet tilvik sem gildi í trénu.


Lausn - Anagrams.java


import java.util.Arrays;
import java.util.Scanner;
import java.util.HashMap;
import java.util.LinkedList;
import java.io.File;

public class Anagrams
{
	private HashMap<String, LinkedList<String>> words;

	public Anagrams()
	{
		words = new HashMap<String, LinkedList<String>>();
	}

	private String sort(String s)
	{
		char[] chars = s.toCharArray();
		Arrays.sort(chars);
		return new String(chars);
	}

	public void add(String word)
	{
		String key = sort(word);

		LinkedList<String> wlist = words.get(key);

		if (wlist == null)
		{
			wlist = new LinkedList<String>();
			words.put(key, wlist);
		}

		wlist.add(word);
	}

	public Iterable<String> get(String word)
	{
		String key = sort(word);
		return words.get(key);
	}

	public static void populate(Anagrams m, String path)
	{
		Scanner scan = null;

		try
		{
			scan = new Scanner(new File(path));

			while (scan.hasNextLine())
			{
				String word = scan.nextLine();
				m.add(word);
			}
		}
		catch (java.io.FileNotFoundException e)
		{
			System.err.printf("Error: populate: %s\n", e.getMessage());
			return;
		}
		finally
		{
			if (scan != null)
				scan.close();
		}
	}

	public static void main(String[] args)
	{
		Anagrams m = new Anagrams();

		for (int i = 0; i < args.length; i++)
			populate(m, args[i]);

		Scanner scan = new Scanner(System.in);

		while (scan.hasNext())
		{
			String word = scan.next();

			for (String s : m.get(word))
				System.out.println(s);
		}
	}
}