2011/07/30

Codeforces Unknown Language Round #3 参戦記

この大会は、Codeforcesの特別な大会であり、100大会記念の大会でもあります。100大会おめでとう!

[ルール]
この大会では、運営者側が直前に発表するマイナーな言語一つしか使うことができません。今回はPike7.8という言語でした。この言語、TIOBEの100位にも入っていないマイナー言語です。

[参戦記]
スタートして、まずはコンパイラを導入しました。私はUbuntu11.04を使っていますが、次のコマンドでインストールできます。

sudo apt-get install pike7.8

そして、何はともあれチュートリアルを読みました。(こちらです。(英語)). 
この大会、後ろに用事があって3時間中2時間しか参加できないので、2問解ければいいや、という気持ちで臨みました。

A: read関数とキャストを用います。acceptedは0:43でした。
  • 整数の入力(標準入力からの読み取り)がわからなかったので、readとキャストです。
  • 幸いなことにpikeでは、string型変数をint型変数にキャストすると、Cのatoiと同じ働きをしてくれるようです。

C: 文字列を使います。acceptedは1:54でした。
  • 文字列は、0オフセットで、s[n]のように書けば、第n$文字目を取得できます。ただし、その文字コードを示すintの値になります。
  • したがって、文字コードから'0'を引いてやれば、然るべき値になります。

結果、ペナルティー=177, 順位=155位/805人 でした。 

次のUnknownを楽しみにしています。

次のソースはPike7.8で書いたものです。

コンパイルして試したければ、次のコマンドを実行してみてください。

pike7.8 source.pike


[A]
int main(){
  int n,k,m;
  n=(int)Stdio.stdin->read(2);
  k=(int)Stdio.stdin->read(3);
  m=(int)Stdio.stdin->read(3);
  if(n*n>k*m*m) write("NO\n");
  else{
    if(m==n) write("YES\n");
    else if(k<4) write("NO\n");
    else write("YES\n");
  }   
  return 0;
}

[C]
int main(){
  string A=Stdio.stdin->gets();
  string B=Stdio.stdin->gets();
  string C;
  int alen,blen;
  int i,j,k=0,tmp;
  
  alen=strlen(A);
  blen=strlen(B);
  for(i=alen-1,j=blen-1;i>=0 || j>=0;i--,j--){
    if(i<0){
     tmp=B[j]-'0'+k;
      k=tmp/10;
      tmp%=10;
    }else if(j<0){
      tmp=A[i]-'0'+k;
      k=tmp/10;
      tmp%=10;
    }else{
      tmp=A[i]-'0'+B[j]-'0'+k;
      k=tmp/10;
      tmp%=10;
    }
    if(i==alen-1 && j==blen-1) C=sprintf("%d",tmp);
    else C+=sprintf("%d",tmp);
  }
  if(k==1) C+=sprintf("%d",1);
  for(i=strlen(C)-1;i>=0;i--) write("%c",C[i]);
  write("\n");
  return 0;
}

0 件のコメント:

コメントを投稿