kanetaiの二次記憶装置

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

Caesar Cipher(AOJ No.0017), Sorting Five Numbers(AOJ No.0018), Factorial(AOJ No.0019), Capitalize(AOJ No.0020), Parallelism(AOJ No.0021)

リポジトリ

Caesar Cipher(AOJ No.0017)

80文字以下のCaesar Cipherで暗号化された文が与えられる。
Caesar Cipherは、アルファベットを辞書順にn文字シフトする暗号化法である('z'の次は'a'に巡回する)。
暗号文に含まれるのは、アルファベットの小文字、ピリオド、空白、改行のみ。
暗号文を解読して、平文に戻す。ただし、平文は、the, this, that という単語のいずれかを含む英語の文章である。

アルゴリズム

(alphabet - 'a' + n ) % A + 'a'
でシフトできる。 ※Aはアルファベット数26

コード

アルファベットかどうかは、Character.isLetter()で判定。
C/C++ならctype.hのisalpha()を使う。
なんか汚いwwwっうぇwwwwwっうぇww。

import java.util.*;
public class aoj0017 {
	static final Scanner stdin = new Scanner(System.in);
	static int A = 26;
	public static void main(String[] args) {
		while(stdin.hasNext()) solve(stdin.nextLine());
	}
	static boolean check(int bias, String s, String pat){
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<s.length(); ++i){
			if( Character.isLetter(s.charAt(i)) )
				sb.append( (char)((s.charAt(i) - 'a' + bias)%A + 'a') );
		}
		return sb.toString().compareTo(pat) == 0;
	}
	static void solve(String s){
		String str[] = s.split(" ");	
		for(int b=0; b<A; ++b){
			for(String i: str){
				if( check(b, i, "the" ) || check(b,i,"this") || check(b,i, "that" ) ){
					for(int j=0; j<str.length; ++j){
						for(int k=0; k<str[j].length(); ++k){
							char target = str[j].charAt(k);
							if(Character.isLetter(target)) System.out.print( (char)(((target-'a') + b) % A +'a') );
							else System.out.print(target);
						}
						if( j == str.length-1 ) System.out.println("");
						else System.out.print(' ');
					}
					return;
				}
			}
		}
	}
}

Sorting Five Numbers(AOJ No.0018)

タイトルどおり

import java.util.*;
import java.util.*;
public class aoj0018 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) {
		Integer[] a = new Integer[5];
		for(int i=0;i<5;++i) a[i] = stdin.nextInt();
		Arrays.sort(a, new Comparator<Integer>(){
			@Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); }
		});
		System.out.println( a[0]+" "+a[1]+" "+a[2]+" "+a[3]+" "+a[4] );
	}
}

Factorial

n!を求める( n \leq 20)

import java.util.*;
public class aoj0019 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) { System.out.println(factorial(stdin.nextInt())); }
	static long factorial(int n){ return n > 1 ? n * factorial(n-1) : 1; }
}

Capitalize(AOJ No.0020)

import java.util.*;
public class aoj0020 {
	static final Scanner stdin = new Scanner(System.in);
	public static void main(String[] args) {
		String line = stdin.nextLine();
		for(int i=0; i<line.length(); ++i) System.out.print( Character.toUpperCase( line.charAt(i) ) );
		System.out.println("");
	}
}

Parallelism(AOJ No.0021)

 A(x_1 , y_1 ), B(x_2 , y_2 ), C(x_3 , y_3 ), D(x_4 , y_4 )が与えられて、
 \vec{AB} \vec{CD}が平行かどうかを判定する。
制約
 -100 \leq x_1 , y_1 , x_2 , y_2 , x_3 , y_3 , x_4 , y_4 \leq 100

アルゴリズム

外積(のz成分)が |\vec{AB}||\vec{CD}|\sin \theta = AB_x CD_y - AB_y CD_x = 0 \vec{AB}//\vec{CD}
を使って判定。

コード

import java.awt.geom.Point2D;
import java.util.*;

public class aoj0021 {
	static final Scanner stdin = new Scanner(System.in);
	static final int A = 0, B = 1, C = 2, D = 3, N = 4;
	static final double EPS = 1e-10;
	public static void main(String[] args) {
		int n = stdin.nextInt();
		Point[] p = new Point[N];
		while( n-- > 0 ){
			for(int i = 0; i < N; ++i ) p[i] = new Point(stdin.nextDouble(), stdin.nextDouble());
			System.out.println( solve(p) ? "YES" : "NO" );
		}
	}
	static boolean solve(Point[] p){ return equal(p[B].sub(p[A]).cross(p[D].sub(p[C])), 0); }
	static boolean equal(double a, double b){ return Math.abs(a-b) < EPS; }
	static double Heron(Point p1, Point p2, Point p3){
		double a = p1.distance(p2), b = p2.distance(p3), c = p3.distance(p1);
		double s = (a+b+c)/2;
		return Math.sqrt( s*(s-a)*(s-b)*(s-c) );
	}
	@SuppressWarnings("serial")
	public static class Point extends Point2D.Double {
			public Point(double x, double y){ super(x,y); }
			public final Point sub(Point p){ return new Point( x - p.x, y - p.y ); }
			public final double cross(Point p){ return x * p.y - y * p.x; }
	}
}