Hatena::Grouptopcoder

敗戦記

2011-03-21

Unknown Language Round #2

| 11:21

前回のunkは参加出来なかったので初参加。

今回は「Io」なる言語でした。

7zの導入から始めるとか、なかなか大変でしたね。

あと、ひたすらに公式のリファレンスをさまよいまくってました。

せっかくなので、今回は書いたコードを貼り付けてみようかと思います。

A

  • 開く。読む。
  • 初めて使う言語で書くにしてはむずすぎだろうと思い、しばらくしてstandingを見て変更。

G

  • 開く。読む。
  • 割と苦戦しながら、なんとか書く。
  • カスタムテストで実行していたのですが、途中で面倒になってcmd起動してサクラエディタでやってました。Meadowbashからでもioの実行は出来たようなのでそちらを使えばよかったです。
  • 以下のようになりました。
n := File standardInput readLine asNumber
k :=1
j :=1
l :=k+j
while(n>0,
  n=n-1
  l=j
  j=j+k
  k=l
)
k println

29分

C

  • Gの次に正解者が多かったので、開く。
  • Gが書ければ、そんなに苦労せずに書ける。
  • 以下のようになりました。
x := File standardInput readLine asNumber
odd:=0
even:=0

i:=0
while(i<x,
  i=i+1
  if(x%i>0,continue)
  if(i%2==1,odd=odd+1)
  if(i%2==0,even=even+1)
)
if(odd==even,"yes" println)
if(odd!=even,"no" println)

35分

ここからが泥沼に。

I

  • 取り敢えず、次に正解者が多いこの問題へ。
  • 割り算が勝手に浮動小数になるので、Cの感覚でやれずにかなり苦戦してました。
  • 面倒くさくなってきたのでもう寝ようかとも思いましたが、リファレンスをさまよっているうちに、文字列から桁を抜き出すことにしました。
  • こんなん書いたら通りました。
x := File standardInput readLine asNumber

ok:=0
keta:=0
pos:=0
dig:=x

while(pos< ((dig asString) size),
  k:= ((dig asString) at(pos))-48
  pos=pos+1
  keta=keta+1
  if(x%k==0,ok=ok+1)
)

if(ok==keta)then("happier" println) elseif(ok>0)then("happy" println) else("upset" println)

2時間15分

H

  • これも文字列で処理することに。
  • 0だけのパターンではまって、それを修正してAccepted
x := File standardInput readLine asString

pos:=0
ok:=0
xs:=x size
if(x at(0)==45,"-" print)
l:=0

while(x at(l)==48 or x at(l)==45,l=l+1)
out:=0

while(pos< xs,
  if(l+pos>=xs,break)
  if((x at(xs-pos-1))!=48,ok=1)
  if(ok==1 and (x at(xs-pos-1))>45,(((x at(xs-pos-1))-48) print))
  if(ok==1 and (x at(xs-pos-1))>45,(out=1))
  pos=pos+1
)
if(out==0,0 print)

2時間35分

E

  • 開く。読む。なんとかリピート回数を数えようとしたけれど、試行錯誤しているあいだに終わりました。

結果的に4問解いて、91位でした。

wrongさんが2回連続で優勝していたようで、とてもすごかったです。ってか日本人がかなり強いように感じました。

そんなわけでなかなか大変な思いをして、苦楽入り交じったコンテストでしたが、結構楽しめました。そろそろ春休みも終りに近付いているので、出れなくなっていきそうな気がするのが残念です。ついでに次回出そうな言語を予想したいと思います。

適当にPL/Iで。