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)
- Caesar Cipher シーザー暗号、カエサル暗号、シフト暗号
- cipher
- cryptography
- encryption
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!を求める()
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(""); } }
コード
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; } } }