Unknown Language Contest#3
参加してきた。
言語はPike。Cライクなスクリプト言語←
・・・なんだこの変わった奴はw
A
カーペットを何枚か与えられ、それで部屋を埋め尽くすことができるか?
入力方法を探すのに時間がかかった。
もっと単純にできたかもだけどちょっとひねくれたやり方してみた。
#! /usr/bin/env pike int main() { int n, k, n1, i = 0; string in = Stdio.stdin.gets(); sscanf(in, "%d%d%d",n,k,n1); while (n1 * i < n) i++; if (i * i <= k) write("YES\n"); else write("NO\n"); }
B
負数と正数で桁数が大幅に違うというのが意外なコーナーケース。
見事に引っかかっておわった。
プラクティスで通したコード↓
#! /usr/bin/env pike int main() { string num = Stdio.stdin.gets(); string in = Stdio.stdin.gets(); int n; sscanf(num,"%d",n); array(string) ary = in / ","; int flag = 0; for (int i = 0; i < n; i++) { int a, b; sscanf(ary[i],"%d",a); for (int j = 0; j < i; j++) { sscanf(ary[j], "%d",b); if (b % a != 0&&a%b!=0) { flag = 1; } } } if (flag == 0) { write("FRIENDS\n"); } else { write("NOT FRIENDS\n"); } }
C
最初桁数の多い方の数の事後処理忘れてて落ちてたがAC。
多倍長計算れす。
#! /usr/bin/env pike int main() { string a = Stdio.stdin.gets(); string b = Stdio.stdin.gets(); a = reverse(a, 0, sizeof(a)-1); b = reverse(b, 0, sizeof(b)-1); int len,long,flag; if (sizeof(a) < sizeof(b)) { len = sizeof(a); long = sizeof(b); flag=0; } else { len = sizeof(b); long = sizeof(a); flag=1; } string res = ""; int amari = 0; for (int i = 0; i < len; i++) { int temp = amari + (a[i]-'0') + (b[i]-'0'); if (temp >= 10) { amari = 1; temp -= 10; } else { amari = 0; } res += temp; } if (flag==0) { for (int i=len; i<long; i++) { int temp = amari+(b[i]-'0'); if (temp>=10) { amari=1; temp-=10; } else { amari=0; } res+=temp; } } else { for (int i=len; i<long; i++) { int temp = amari+(a[i]-'0'); if (temp>=10) { amari=1; temp-=10; } else { amari=0; } res+=temp; } } if (amari != 0) res += amari; res = reverse(res, 0, sizeof(res)-1); write(res + "\n"); }
D
できる処理は後ろから一文字取るか付けるかだったのを、前から一文字取れるだと間違えていたという致命的なミス。
プラクティスで書きなおしたコードをなぜかはじかれた。下は1位の方のソース。
#!/usr/bin/env pike int main() { int n; string num,init,fin; num = Stdio.stdin.gets(); init = Stdio.stdin.gets(); fin = Stdio.stdin.gets(); sscanf(num,"%d",n); if(init[strlen(init)-1]=='/r') { init=init[0..strlen(init)-2]; } if (fin[strlen(fin)-1]=='/r') { fin=fin[0..strlen(fin)-2]; } int initlen=strlen(init), finlen=strlen(fin); int i; for (i=0; i<initlen&&i<finlen; i++) if (a[i]!=b[i]) break; int q = initlen+finlen-i-i; if (q<=n) { write("Yes"); } else { write("No"); } } /////////////////////////////////////////////////////// int main(){ int n; sscanf(Stdio.stdin->gets(),"%d",n); string a; a=Stdio.stdin->gets(); if(a[strlen(a)-1]=='\r'){ a=a[0..strlen(a)-2]; } string b; b=Stdio.stdin->gets(); if(b[strlen(b)-1]=='\r'){ b=b[0..strlen(b)-2]; } int as=strlen(a),bs=strlen(b); int i; for(i=0;i<as&&i<bs;i++)if(a[i]!=b[i])break; int q=as+bs-i-i; if(n<q)write("No"); else write("Yes"); }
E
よくわからないがおそらくコンパイルエラー的なのでオチ
未修正なう
#! /usr/bin/env pike int main() { int n, k; string words, nums, ns, ks; ns = Stdio.stdin.gets(); words = Stdio.stdin.gets(); ks = Stdio.stdin.gets(); nums = Stdio.stdin.gets(); sscanf(ns,"%d",n); sscanf(ks,"%d",ks); array(string) word = words/" "; array(string) num = nums/" "; for (int i=0; i<k; i++) { int temp; sscanf(num[i],"%d",temp); for (int j=temp-1; j<n; j+=temp) { if (word[j]=="off") word[j]="on"; else word[j]="off"; } } for (int i = 0; i < n; i++) { if (i != 0) write(" "); write(word[i]); } write("\n"); }
I
幾何問題。
弧度法と度数法の変換方法を忘れていたという衝撃の事実発覚。
萎えた・・・
未修正なう
#! /usr/bin/env pike int main() { float k, x, y; string kin, xyin; kin = Stdio.stdin.gets(); xyin = Stdio.stdin.gets(); sscanf(kin,"%f",k); sscanf(xyin, "%f%f", x, y); float resx, resy; resx = x + cos(-k/180)*x; resy = y + sin(-k/180)*y; write("%.8f %.8f\n",resx,resy); }
総評
明日からNYに出発という慌ただしい状況で参加しましたが、新しい言語にふれるということはやっぱり良かった。
というかその影響で問題も全体的にC++とかだったら余裕みたいなものが多かったはずなのに結果が残念・・・
数学もちょっと勉強しなおさなきゃいけないですね。今後のプログラミングコンテストと学校の実力テストに不安を残すコンテストでしたw
result:164/347