kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

Rotation of a Pattern(AOJ No.0133), Exit Survey(AOJ No.0134), Clock Short Hand and Long Hand(AOJ No.0135), Frequency Distribution of Height(AOJ No.0136), Middle-Square Method(AOJ No.0137), Track and Field Competition(AOJ No.0138), Snakes(AOJ No.0139), Bu

リポジトリ

Rotation of a Pattern(AOJ No.0133)

8×8のパターンを右回転

コード

import java.util.*;
public class aoj0133 {
	static final Scanner stdin = new Scanner(System.in);
	static final char[][][] pat = new char[4][8][8]; 
	public static void main(String[] args) {
		for(int i = 0; i < 8; i++)
			pat[0][i] = stdin.next().toCharArray();
		for(int k = 1; k < 4; ++k){
			System.out.println(k*90);
			for(int i = 0; i < 8; ++i){
				for(int j = 0; j < 8; ++j) pat[k][i][j] = pat[k-1][8-j-1][i];
				System.out.println(pat[k][i]);
			}
		}
	}
}

Exit Survey(AOJ No.0134)

 x_i ( 1\leq i \leq n)が与えられて、その平均(小数切り捨て)を求める
制約
 n \leq 100,000
 x_i \leq 1,000,000

コード

longでおk

import java.util.*;
public class aoj0134 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) {
		int n = stdin.nextInt();
		long sum = 0L;
		for(int i = 0; i < n; ++i) sum += stdin.nextLong();
		System.out.println(sum/n);
	}
}

Clock Short Hand and Long Hand(AOJ No.0135)

00:00 〜 11:59までの時間が与えられて、時針と分針のなす角 x 0\leq x < 30なら"alert"、 90 \leq x < 180なら"safe"、それ以外は"warning"と出力。

コード

 x \geq 180のとき 360 - xをしなくてWrongAnswerだした。バカすぎる。

import java.util.*;
public class aoj0135 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) {
		int n = stdin .nextInt();
		while(n-- > 0){
			String[] str = stdin.next().split(":");
			int h = Integer.parseInt(str[0]), m = Integer.parseInt(str[1]);
			double a = (30.0 * h) + m / 2.0, b = m * 6.0;
			double x = Math.min(Math.abs(a-b), Math.abs(b-a));
			if(x >= 180) x = 360 - x;
			System.out.println((x < 30) ? "alert" : (x < 90) ? "warning" : "safe");
		}
	}
}

Frequency Distribution of Height(AOJ No.0136)

身長データが与えられて、5cm刻みの階級で集計してヒストグラムを作る。

コード

import java.util.*;
public class aoj0136 {
	static final Scanner stdin = new Scanner(System.in);
	static final int[] freq = new int[7];
	public static void main(String[] args) {
		int n = stdin.nextInt();
		Arrays.fill(freq, 0);
		while(n-- > 0){
			double x = stdin.nextDouble();
			if(x < 165.0) freq[1]++;
			else if(x < 170.0) freq[2]++;
			else if(x < 175.0) freq[3]++;
			else if(x < 180.0) freq[4]++;
			else if(x < 185.0) freq[5]++;
			else freq[6]++;
		}
		for(int i = 1; i <= 6; ++i){
			System.out.print(i+":");
			while(freq[i]-- > 0) System.out.print("*");
			System.out.println();
		}
	}
}

Middle-Square Method(AOJ No.0137)

フォン・ノイマンによる乱数生成法である平方採中法(Middle-Square Method)で乱数を10個生成する。
シード x_0 = sが与えられる。
 x_i^2を8桁整数と見なしたときの中央4桁を x_{i+1}として
 x_1, x_2, \cdots , x_{10}を乱数として出力する。

コード

import java.util.*;
public class aoj0137 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) {
		int n = stdin.nextInt();
		for(int i = 1; i <= n; ++i){
			System.out.println("Case " + i + ":");
			int s = stdin.nextInt();
			for(int j = 0; j < 10; ++j){
				s = Integer.parseInt(String.format("%08d", s*s).substring(2, 6));
				System.out.println(s);
			}
		}
	}
}

Track and Field Competition(AOJ No.0138)

1〜3組の選手番号とタイムが与えられる(1組は8人構成)。
各組の上位2人のレコードと、各組3位以下のうち上位2組のレコードを出力。
同じタイムの選手はいない。

コード

import java.util.*;
public class aoj0138 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) {
		@SuppressWarnings("unchecked")
		TreeMap<Double, Integer>[] in = new TreeMap[4];
		for(int i = 0; i < 4; ++i) in[i] = new TreeMap<Double, Integer>();
		
		for(int i = 0; i < 24; ++i){
			int no = stdin.nextInt();
			in[i/8].put(stdin.nextDouble(), no);
		}
		for(int i = 0; i < 3; ++i){
			int j = 1;
			for(double t: in[i].keySet()){
				if(j <= 2) System.out.printf("%d %.2f\n", in[i].get(t), t);
				else in[3].put(t, in[i].get(t));
				j++;
			}
		}
		int j = 1;
		for(double t: in[3].keySet()){
			if(j > 2) break;
			System.out.printf("%d %.2f\n", in[3].get(t), t);
			j++;
		}
	}
}

Snakes(AOJ No.0139)

">'"の後に"="が1個以上並んだ後、"#"が来て、さらに前と同じ個数の"="が来た後、"~"で終わる -> "A"
">^"の後に "Q="が1個以上並んだ後、"~~"で終わる -> B
それ以外 -> "NA"
と答える。

コード

正規表現が使える言語なら簡単

import java.util.*;
import java.util.regex.*;
public class aoj0139 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) {
		Pattern A = Pattern.compile(">\'(=+)#\\1~");
		Pattern B = Pattern.compile(">\\^(Q=)+~~");
		int n = stdin.nextInt();
		while(n-- > 0){
			String s = stdin.next();
			Matcher AM = A.matcher(s), BM = B.matcher(s);
			System.out.println(
					AM.find() && AM.group().equals(s) ? "A" : 
					BM.find() && BM.group().equals(s) ? "B" : "NA");
		}
	}
}

Bus Line(AOJ No.0140)

0から9までのバス停があり、
...→0→1→2→3→4→5→6→7→8→9→5→4→3→2→1→...
の順で巡回する。
スタートとゴールのバス停番号が与えられて、スタートからゴールまでの最短経路(バス停番号系列)を求める。

コード

1,2,3,4,5がスタートのとき気をつける。
コード汚い...

import java.util.*;
public class aoj0140 {
	static final Scanner stdin = new Scanner(System.in);
	static final char[] pat = "012345678954321".toCharArray();
	static void print(ArrayList<Integer> l){
		for(int i = 0; i < l.size(); ++i){
			System.out.print(l.get(i));
			System.out.print(i < l.size()-1 ? " " : "\n");
		}
	}
	public static void main(String[] args) {
		int n = stdin.nextInt();
		while(n-- > 0){
			int start = stdin.nextInt(), goal = stdin.nextInt();
			int cur = start;
			ArrayList<Integer> r = new ArrayList<Integer>(), l = new ArrayList<Integer>();
			while(Integer.parseInt(""+pat[cur]) != goal){
				r.add(Integer.parseInt(""+pat[cur]));
				cur = (cur + 1) % pat.length;
			}
			r.add(goal);
			if(start <= 5 && start != 0){
				cur = 15-start;
				while(Integer.parseInt(""+pat[cur]) != goal){
					l.add(Integer.parseInt(""+pat[cur]));
					cur = (cur + 1) % pat.length;
				}
				l.add(goal);
				print(r.size() < l.size() ? r : l);
			}else{
				print(r);
			}
		}
	}
}