2010年5月9日日曜日

Google Code Jam 2010 Qualification Round (After)

■問題A
2進カウンタをK回進めたとき,下位Nビットが全て1なら"ON",そうでないなら"OFF"を出力せよ.

□解法B
ビット演算でクールにキメたかったのですが,あまり自信が無かったため,Kを2進文字列に直した後,下位Nビットが全て1であるか調べました.
import java.io.*;
public class A {
public void a() throws Exception{
BufferedReader br=new BufferedReader(new FileReader("C:\\A-large.in"));
BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\A-large.out"));
int T=Integer.parseInt(br.readLine());
for(int i=0;i<T;i++){
String[] s=br.readLine().split(" ");
int N=Integer.parseInt(s[0]);
int K=Integer.parseInt(s[1]);
String t=toBS(K);
boolean f=true;
for(int j=t.length()-N;j<t.length();j++){
if(j<0||t.charAt(j)!='1'){
f=false;
break;
}
}
String ans="Case #"+(i+1)+": "+(f?"ON":"OFF");
bw.write(ans);
bw.newLine();
}
bw.close();
}
String toBS(int n){
if(n==0)
return "0";
String s="";
while(n!=0){
s=n%2+s;
n/=2;
}
return s;
}
}

■問題B
長い文章でしたが,問題自体は↓.
maxy gcd(t1+y, t2+y, …, tN+y)となる最小のyを求めよ.

□解法B
まず,gcd(t1+y, t2+y, …, tN+y)=mとします.
このとき,
m|ti+y (1≦i≦N)
であるため,
m|(ti+y)-(tj+y) (1≦i, j≦N)
よって,
m|ti-tj (1≦i, j≦N)
ここで,
gcd1≦i, j≦N(ti-tj)=n
とすれば,n=m(のはずです…).
あとは,m|t1+yとなるようにyを求めて((m-t1)%mを計算する)終わり.
import java.io.*;
import java.math.*;
import java.util.*;

public class B {
BigInteger calcY(int N,BigInteger[] t){
Arrays.sort(t);

LinkedList<BigInteger> list=new LinkedList<BigInteger>();
for(int j=0;j<N-1;j++)
for(int i=j+1;i<N;i++)
list.add(t[j].subtract(t[i]));
BigInteger gcd=list.get(0);
for(BigInteger bi:list)
gcd=bi.gcd(gcd);
return gcd.subtract(t[0]).mod(gcd);
}

public void b() throws Exception{
BufferedReader br=new BufferedReader(new FileReader("C:\\B-large.in"));
BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\B-large.out"));
int C=Integer.parseInt(br.readLine());
for(int i=0;i<C;i++){
String[] s=br.readLine().split(" ");
int N=Integer.parseInt(s[0]);
BigInteger[] t=new BigInteger[N];
for(int j=0;j<N;j++)
t[j]=new BigInteger(s[j+1]);
BigInteger y=calcY(N,t);
String ans="Case #"+(i+1)+": "+y;
bw.write(ans);
bw.newLine();
}
bw.close();
}
}

■問題C
1人以上の客から構成されるグループがNグループある.1Euro/人とすると,k人乗りのローラーコースターをR回走らせた時,いくら稼げるか.

R=4,k=6,N=4として,グループ毎の人数を[1,4,2,1]と表すと,以下のようになります.

回数乗っているグループ待っているグループ儲け
1[1, 4][2, 1]5
2[2, 1, 1][4]4
3[4, 2][1, 1]6
4[1, 1 ,4][2]6

□解法C
R>Nであれば,必ず,以前走らせた時と同じパターンが出てくるので,それを記憶しておき…としたのですが,コーディングをミスした模様.largeでエラー連発でした.

■結果
ABC
small
large×
point333310

76Point,2318位.

とりあえずは予選通過,ということで.

Google Code Jam 2010 Qualification Round (Before)

ついにやってきました.Google Code Jam 2010.
Google Code Jam

Google Code Jamとは,Google主催のプログラミングコンテストで,2003年から年1回開催されます.
実は,前回も挑戦したのですが,全く歯が立ちませんでした.というわけで,今回は予選通過を目標にしました.

予選のQualification Roundは,日本時間で5/8AM8:00より24時間でしたので解いてきました.
とりあえず,A,Bに関してsmall,large共に提出できました(Cではlarge失敗).今回は,A,B,Cの内small,large共に正答しているものが一つでもあれば予選通過になります.

結果が出次第,詳細を追って報告します.

セルオートマトン #26 ルール24

ルール24
クラス2

時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態



Fig.1 rule24

2010年5月4日火曜日

TopCoder 練習

TheMoviesLevelOneDivOne(SRM469 DIV1 Easy)

import java.util.*;
import java.lang.*;
import java.math.*;
public class TheMoviesLevelOneDivOne {
public long find(int n, int m, int[] row, int[] seat) {
long ret=(long)(m-1)*n;
int len=row.length;
for(int j=0;j<len;j++){
if(seat[j]>1)
ret--;
if(seat[j]<m)
ret--;
for(int i=0;i<len;i++)
if((i!=j) && (row[i]==row[j]) && (seat[i]==seat[j]+1))
ret++;
}
return ret;
}
}

TopCoder SRM 469

SRM469(5/4 20:00~22:00)
スーパーボッコボコタイム.

・TheMoviesLevelOneDivOne(DIV1 Easy)
大体の解法は少し考えれば分かりました.
提出したソースがこちら.

import java.util.*;
import java.lang.*;
import java.math.*;
public class TheMoviesLevelOneDivOne {
public long find(int n, int m, int[] row, int[] seat) {
int len=seat.length;
for (int i = 0; i < len - 1; i++) {
for (int j = len - 1; j < i; j--) {
if(row[j-1]>row[j]||(row[j-1]==row[i]&&seat[j-1]>seat[j])){
int t=row[j-1];
row[j-1]=row[j];
row[j]=t;
t=seat[j-1];
seat[j-1]=seat[j];
seat[j]=t;
}
}
}
long ret=(long)(m-1)*n;
for(int j=0;j<len;){
int i;
for(i=0;j+i<len&&row[j+i]==row[j]&&seat[j+i]==seat[j]+i;i++)
;
ret-=i+1;
if(seat[j]==1)
ret++;
if(seat[j+i-1]==m)
ret++;
j+=i;
}
return ret;

}
}


// Powered by FileEdit
// Powered by TZTester 1.01 [25-Feb-2003]
// Powered by CodeProcessor


// Powered by FileEdit
// Powered by TZTester 1.01 [25-Feb-2003]
// Powered by CodeProcessor

全体的に汚いです.そして9行目のrow[i]はrow[j]でした.焦っていたため,訂正し忘れました.
このミスによってFailed System Test.

Result:Failed System Test(0p)

・TheMoviesLevelTwoDivOne(DIV1 Normal)
\(^o^)/
Result:Opend(0p)

・TheMoviesLevelThreeDivOne(DIV1 Hard)
\(^o^)/
Result:Opened(0p)

・Challenges
0p

・Rating
1292->1226
次落ちたらDiv2降格は免れません.

2010年5月2日日曜日

J #1 始めたよ

Jは,APLの提案者であるケネス・アイバーソンによりAPLの後継として提案されたそうです.

処理系は↓から.
Jsoftware

↓からある程度の知識が身に付けられます.
プログラミング言語/J - プログラミングスレまとめ in VIP

こんな感じに実行されます.

実行結果

例1 1~10の平均を求める
(+/%#)1+i.10
5.5

例2 1000未満の数のうち,3か5の倍数になっているものの合計を求める
t=.i.1000
+/~.((0=3|t)#t),(0=5|t)#t
233168

Project Euler

problem 58
problem 67
problem 69

セルオートマトン #25 ルール23

ルール23
クラス2

時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態



Fig.1 rule23