some image

Codes and Tags

Solucionando Problem 22 – Project Euler

Etiquetas: , Blog, Challenges No comments

Este es uno de los problemas donde debemos manejar la lectura de un archivo, tratamiento de cadenas, ordenamiento de arreglos y jugar un poquito con caracteres ASCII para hacer más entretenido el problema.  Básicamente lo que se pide es leer un archivo que nos proporcionan (names.txt), donde existe una lista muy grande de nombres separados por “NOMBRE”,”NOMBRE2″,… se debe ordenar la lista y una vez ordenada para cada nombre se debe sumar la equivalencia de sus caracteres, teniendo en cuenta que cada letra corresponde a un numero en el alfabeto comenzando por A = 1…

El objetivo de ordenar la lista de nombres, es que cada nombre tiene una posición en el arreglo comenzando por la posición 1. Una vez obtenida la equivalencia del nombre y su posición podemos obtener el score. Cada score debe ser sumado para obtener la suma de todos los scores.

Problema

Using names.txt (right click and ‘Save Link/Target As…’), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.

For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 x 53 = 49714.

What is the total of all the name scores in the file?

Solución

package org.codesandtags.projecteuler;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;

/**
 * 
 * Using names.txt (right click and 'Save Link/Target As...'), a 46K text file
 * containing over five-thousand first names, begin by sorting it into
 * alphabetical order. Then working out the alphabetical value for each name,
 * multiply this value by its alphabetical position in the list to obtain a name
 * score.
 * 
 * For example, when the list is sorted into alphabetical order, COLIN, which is
 * worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN
 * would obtain a score of 938 x 53 = 49714.
 * 
 * What is the total of all the name scores in the file?
 * 
 * @author codesandtags
 * 
 */

public class Problem22 {

	private File file;

	public static void main(String[] args) {
		Problem22 solve = new Problem22();
		long start = System.currentTimeMillis();
		
		solve.setFile(new File("resources/names.txt"));
		System.out.println("The total scores in the file is : "	+ solve.getTotalScores());
		
		long end = System.currentTimeMillis();

		System.out.println("Total " + (end - start) + " ms.");

	}

	/**
	 * Define el archivo
	 * 
	 * @param file
	 */
	public void setFile(File file) {
		this.file = file;
	}

	/***
	 * Obtiene el total
	 * 
	 * @return
	 */
	public long getTotalScores() {
		long scores = 0;

		try {

			// Variables de trabajo
			BufferedReader br = new BufferedReader(new FileReader(file));
			String linea = "";
			String datos = "";

			while ((linea = br.readLine()) != null) {
				datos += linea;
			}

			// Obtengo los datos, ajusto su estructura y los meto en un arreglo
			datos = datos.replace("\"", "");
			String[] names = datos.split(",");

			// Ordeno el arreglo de nombres
			Arrays.sort(names);

			// Aqui esta la magia
			for (int i = 0; i < names.length; i++) {
				long score = 0;
				// Para cada nombre en el arreglo obtengo de cada caracter y
				// resto 64, ya que las letras mayusculas comienzan en el
				// caracter 65
				for (int x = 0; x < names[i].length(); x++) {
					score += (names[i].charAt(x) - 64);
				}

				// Opero segun la formula y sumo el score al total
				score *= (i + 1);
				scores += score;

			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return scores;
	}
}

About Edwin Torres

Related Posts

  • Logo Java
  • Logo Java
  • Logo Java
  • Project Euler Logo

Add your comment