文档章节

一道长度转换的题

小紅
 小紅
发布于 2013/08/05 20:20
字数 1397
阅读 32
收藏 0

前些日子报了某比赛,有个简单的测试。

length
题目介绍

您要做的是一个长度单位转化和计算工具,能够把不同的长度单位转换为标准长度(米),并且可以在不同单位之间进行加减运算。

输入文件

输入文件input.txt的内容可分为两部分:

不同单位和标准长度米的转换规则, 比如
1 mile = 1609.344 meters, 代表1英里等于1609.344米;

转换前或者计算前的单位,比如 1.2 miles // 一个长度 1.2 miles + 1 fath - 0.2 meters // 单位可能不同的长度之间的加减运算
您要做的

我们期望您编写一个应用程序,可以读取输入文件,了解不同单位与米之间的转换规则后,把以不同单位表示的长度都转换为标准单位米;同时计算不同单位长度的加减表达式,得到以米为单位的结果。

做题要求:

请一定Fork本仓库再做题目

使用的编程语言不限

输出结果为文件"output.txt",其格式见下面说明

源代码和结果文件"output.txt"上传到您的GitHub代码库中

结果文件“output.txt”一定要放到代码库的根目录下

输出文件格式

该文件的格式共有12行,并严格遵守以下规则:

第1行是您的邮箱,比如 myName@gmail.com  第2行是空行

第3行至第12行,每行显示1个计算结果,比如1931.21 m

计算结果要求精确到小数点后两位

计算结果均以字母m结尾,请注意数字和字母m之间有一个空格。

input.txt

1 mile = 1609.344 m
1 yard = 0.9144 m
1 inch = 0.00254 m
1 foot = 0.03048 m
1 fath = 1.8288 m
1 furlong = 201.17 m

1.2 miles
0.15 yard
32.7 inches
127.93 feet
22 faths
0.032 furlong
1 furlong + 2.5 feet
0.9 miles - 18 inches
1 fath - 1 foot + 12.5 inches
3.02 miles + 17.5 yards - 0 fath

 

 

 

题目非常简单,只是看到大家的方式,还是眼前一亮。

先说我自己做的:

package com.github.alaahong;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.github.alaahong.FormatSeparator.FormatException;

public class Format {

	/**
	 * @author Ian Zhang
	 * @param args
	 * @throws FormatException
	 * @throws NumberFormatException
	 *             please use JDK1.7+
	 */
	public static void main(String[] args) throws NumberFormatException,
			FormatException {
		try {
			// read file content from file
			List<String[]> tempList = new ArrayList<String[]>();
			List<Double> doubleList = new ArrayList<Double>();
			Map<String, Double> tempMap = new HashMap<String, Double>();
			FileReader reader = new FileReader(System.getProperty("user.dir")
					+ File.separator + "input.txt");
			BufferedReader br = new BufferedReader(reader);
			String str = null;
			int counter = 0;
			while ((str = br.readLine()) != null) {
				tempList.add(str.split(" "));
			}
			FormatSeparator fs = new FormatSeparator();
			for (String[] s : tempList) {
				if (counter < 6) {
					tempMap.put(s[1], Double.parseDouble(s[3]));
					counter++;
				} else if (counter++ > 6 && counter < 18) {
					Double tempDouble = 0d;
					for (int i = 0; i < s.length; i++) {
						if (i == 0) {
	tempDouble += Double.parseDouble(s[i])* tempMap.get(fs.formatSeparator(s[i + 1]));
						} else if (((i - 2) % 3) == 0) {
							if (s[i].equals("+")) {
	tempDouble += Double.parseDouble(s[i + 1])* tempMap.get(fs.formatSeparator(s[i + 2]));
							} else if (s[i].equals("-")) {
	tempDouble -= Double.parseDouble(s[i + 1])* tempMap.get(fs.formatSeparator(s[i + 2]));
							}
						}
					}
					doubleList.add(tempDouble);
				}
			}
			br.close();
			reader.close();

			// write string to file
			FileWriter writer = new FileWriter(System.getProperty("user.dir")
					+ File.separator + "output.txt");
			BufferedWriter bw = new BufferedWriter(writer);
			DecimalFormat df = new DecimalFormat("0.00");
			String crlf = System.getProperty("line.separator");
			bw.write("e-mail address");
			bw.write(crlf + "");
			for (Double d : doubleList) {
				bw.write(crlf + df.format(d) + " m");
			}
			bw.close();
			writer.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package com.github.alaahong;

public class FormatSeparator {
	public String formatSeparator(String measure) throws FormatException {
		switch (measure) {
		case "mile":
			measure = "mile";
			break;
		case "miles":
			measure = "mile";
			break;
		case "yard":
			measure = "yard";
			break;
		case "yards":
			measure = "yard";
			break;
		case "inch":
			measure = "inch";
			break;
		case "inches":
			measure = "inch";
			break;
		case "foot":
			measure = "foot";
			break;
		case "feet":
			measure = "foot";
			break;
		case "fath":
			measure = "fath";
			break;
		case "faths":
			measure = "fath";
			break;
		case "furlong":
			measure = "furlong";
			break;
		case "furlongs":
			measure = "furlong";
			break;
		case "m":
			measure = "m";
			break;
		case "meters":
			measure = "m";
			break;
		default:
			throw new FormatException(measure);
		}
		return measure;

	}

	public class FormatException extends Exception {
		/**
		 * define my exception
		 */
		private static final long serialVersionUID = 1L;

		public FormatException() {
			super();
			System.out.println("Formating Error!");
		}

		public FormatException(String msg) {
			super(msg);
			System.out.println("Formating Error!");
		}
	}
}

 

钱总最近写脚本比较多,他用的ruby

class Length
  def initialize
    @map = Hash.new
    @result = Array.new(10,0)
    @count = 0
  end
  
  def map
    @map
  end
  
  def setFile(fn = "input.txt")
      @file = fn
  end
  
  def readFile()
      File.open(@file,"r") do |file|
          while line=file.gets
              if match = /\s*\d+\s*(\w+)\s*=\s*(\d+.\d*)\s*m\s*/.match(line)       
                  @map[match[1]] = match[2].to_f
              elsif line.lstrip!=""
                calculate(toSingle(line),@count)
                @count += 1 
              end
          end
      end
  end
  
  #把复数变成单数
  def toSingle(str)
    str = str.gsub(/miles/,"mile")    
    str = str.gsub(/inches/,"inch") 
    str = str.gsub(/feet/,"foot") 
    str = str.gsub(/yards/,"yard")
    str = str.gsub(/faths/,"fath")
  end
  
  #转化成米为单位
  def transfer(str)
    if  match = /\s*(\d+(.\d+){0,1})\s*(\w+)/.match(str)
      return match[1].to_f * @map[match[3]]
    end
  end
  
  #计算表达式
  def calculate(str,n)
    if  match = /(\s*\d+(.\d+){0,1}\s*\w+)((\s*([+-])\s*\d+(.\d+){0,1}\s*\w+)*)/.match(str)
      @result[n] += transfer(match[1])
    end
    if match[3].to_s.lstrip != ""
      substr = match[3]
      while subMatch = /(([+-])\s*\d+(.\d+){0,1}\s*\w+)(\s*[+-][\d\w\s.]+)*/.match(substr)
        if subMatch[2] == "+"
          @result[n] += transfer(subMatch[1])
        elsif subMatch[2] == "-"
          @result[n] -= transfer(subMatch[1])
        end
        if subMatch[4].to_s.lstrip != ""
            substr = subMatch[4]
        else
            break
        end
      end
      
    end
  end
  
  #保留两位小数
  def doFormat
    10.times do |i|
      @result[i] = format("%.2f",@result[i])
    end
  end
  
  #写入文件
  def appendFile
    f = File.new("output.txt","w") #覆盖---w 追加---a
      f.puts("e-mail address")
      f.puts
      10.times do |i|
          f.puts(@result[i].to_s + " m" )
      end
    f.close
  end
  
end


f = Length.new
f.setFile
f.readFile
f.doFormat
f.appendFile

 

本来以为鑫磊会按比赛的习惯去写C++的,没想到用php了

<?php
   $file = file_get_contents('input.txt');
   $out = explode("\n", $file);
   $out_val = array();
   $file = fopen("output.txt","a");
   fwrite($file,"e-mail address\r\n");
   fwrite($file,"\r\n");
   
   foreach($out as $key => $value)
   {
		$val = explode(' ', $value);
		if(count($val) == 1) continue;

		if(in_array('=', $val))
		{
			if($val[1] == 'mile') 
			{
			   $out_val['miles'] = $val[3];
			   $out_val['mile'] = $val[3];
			}
			else if($val[1] == 'yard')
			{
			   $out_val['yard'] = $val[3];
			   $out_val['yards'] = $val[3];
			}
		    else if($val[1] == 'inch')
			{
		       $out_val['inch'] = $val[3];
		       $out_val['inches'] = $val[3];
			}
			else if($val[1] == 'foot')
			{
			   $out_val['foot'] = $val[3];
			   $out_val['feet'] = $val[3];
			}
			else if($val[1] == 'fath')
			{
			    $out_val['fath'] = $val[3];
			    $out_val['faths'] = $val[3];
			}
			else if($val[1] == 'furlong')
			{
				$out_val['furlong'] = $val[3];
			}
		}
		else if(in_array('+', $val) || in_array('-', $val))
		{
			$j = trim($val[1]);
			$sum = $out_val[$j]*$val[0];		
			for($i = 1; $i <= (count($val)-2)/3; $i++)
			{
			    $j = $val[$i*3+1];
				$j = trim($j);
				$ret = $out_val[$j]*$val[$i*3];
				if($val[$i*3-1] == '+') 
				{
				   $sum = $sum+$ret;
				}
				else 
				{
				   $sum = $sum-$ret;
				}
			}
			$sum = sprintf("%.2f",$sum);
			fwrite($file,"$sum m\r\n");

		}
		else 
		{
			$j = trim($val[1]);
		    $sum = $out_val[$j]*$val[0];
			$sum = sprintf("%.2f",$sum);

			fwrite($file,"$sum m\r\n");	
		}
	}
	fclose($file);

?>

 

几个人不见,大家风格变化不少... 

 

 

 

© 著作权归作者所有

小紅

小紅

粉丝 12
博文 43
码字总数 30598
作品 0
塘沽
程序员
私信 提问
一道关于PHP类型转换的面试题

原文发表于我的博客 http://starlight36.com/post/php-type-convert 最近在为公司面试新人,经常会问到的一道题目就是PHP类型转换的值,例如: var_dump((int)true);var_dump((string)true)...

烫烫烫烫烫烫
2015/04/22
150
0
考研复试系列——第九节 数论基础

考研复试系列——第九节 数论基础 引言 该部分内容来源于 《王道论坛》 。 写个算法,对 2 个小于 1000000000 的输入,求结果。 特殊乘法举例:123 45 = 14 +15 +24 +25 +34+3*5 样例输入: ...

cassiepython
2017/03/09
0
0
【Leetcode】413. Arithmetic Slices

Description A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same. For examp......

xiagnming
2018/07/31
0
0
微软SDE面经(电面+onsite)

本人工作1年多了,正在准备跳槽中。刚刚参加完微软西雅图的面试,来分享一下自己的面试过程。一共7轮面试,其中1轮电面,6轮Onsite。 第一轮 电面1 第一轮是电面,先是让自我介绍,然后根据简...

abcdd1234567890
2017/06/14
0
0
Leetcode【526、667、932】

题目描述:【DFS】526. Beautiful Arrangement 解题思路: 这道题是一道构造题,即构造一个长度为 N 的自然序列,满足整除关系: 或 (i 为第 i 个位置)。由于看到数据范围 N <= 15,因此很...

牛奶芝麻
06/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
12
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
4
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.3K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部