Unknown Language Round #2

オブジェクト指向な言語が面白かった。(C++er並の感想)

[-00:10]

なんか10分ずれて、コンパイラとか配布された。

[-00:01]

blogが更新される。smalltalkとかいう単語を見てsmalltalkでググりまくる。

[00:00] とりあえずAを見る。

なるほど、分からん。こういう大会ってよく後ろの方が簡単だったりするし他の見るか。

しかし、この時点でいくらsmalltalkの記法で書いてもHello Wolrdすらできなかった。

→お、C簡単そう。でもその前に言語仕様を理解しないと。

[00:20]

色々サイトを転々として悩みまくった末に、これはsmalltalkではないということに気づく。

実はioとかいう言語でした。

00:25 Cを解こうとする。

ある数が与えられる。奇数の約数と偶数の約数の数が等しければyes、そうでなければnoを出力せよという問題。

ループの仕方をblogにあったguideとかで学んでやってみる。

[00:28] C 1WA

あれ!?なんでWA?

→もしかして小数点以下切捨て前提のキモイソース書いてるのが悪いのかな。割り算できても整数とは限らないだろjk...修正して提出。

[00:30] C Accepted (1WA)

そして問題一覧を見ると何やらGが人気な様子。

n(1~20)が与えられる。フィボナッチ数列のn番目の項を出力するだけの問題。何が初項かは問題に書いてある。

やるだけで、簡単そうなので解く。

[00:32] G Accepted

I何人か提出してるなー。解けそう。

ある数字が与えられる。その数字を"その数字の各桁"で割り切れる数によってハッピー度が違う。

どの一つでも割り切れないならupset,逆に全部で割り切れるならhappier,中途半端ならhappyを出力せよという問題。

しかし、10で割っていくという手法だと小数が生じて上手く桁抽出できないということで悩む。

→そしてひたすら整数型にキャストする方法を探す。が見つからない。

→文字列にして取り出すことも高度そうで出来ない。

→うーん・・・・・、、、あれ?%10した結果引いてから10で割れば小数生じなくね?

→自分の頭の固さを実感しつつも実装。0だけ気をつけた。

[00:51] I Accepted

Hを見る。

なんかよく分からないけど与えられる数をひっくり返せ、ただし後ろと前で連続してる0は除け、あとマイナスはそのまま先頭にくっつけろとか、色々制約あるよという問題。

→いやーioが多倍長でとってくれるか分からない以上、これstringで取るしかないだろ・・。

→どうやって桁抽出するんやろ。。

→listだとat(n)でn番目の値が取り出せるらしいな。stringでも出来るんじゃね。

→できたー!でもasciiコードなのね・・・数字だけだから-'0'すればいいか。バグらないよういろいろしまくる。

→実装できた・・でも0ケースどうしよう。与えられないのかな?いやそんなはずはないし、""でoutputするのはおかしいから0にしよう。

→提出。

[01:05] H Accepted

Eを見る。問題文見ずに解く。

あれ、「これ与えられる文字列がある文字列の繰り返しになるような最小のある文字列求めよ」って問題じゃね。

→atだと数字が出力されるから駄目だなあ、どうしよう。→sliceってのあんじゃん。つかお。

→提出。

[01:27] H 1WA

あれ、なんでだ?問題文を読むとぜんぜん違うことに気づく。繰り返しで一番多いものか・・・。全通りためそ。

repeatって連続してて長いやつ出せばいいんだよね。候補が複数あるなら辞書順最大のものだなよしよし。

→提出

[01:46] H 2WA

あれ、サンプルで落ちてる。そうか辞書順って長さ関係なかったよな。

→だとするとなんでこうなんだろう。あ、問題文にも辞書順の他に一番長い文字列って書いてる。

→しかもlatestって最小じゃね(間違い)

→修正して提出。

[01:55] H 3WA

あ、latestって最大じゃん。修正

[01:56] H 4WA

なんやねん!latestって実は最小なんじゃね!?

[01:57] H 5WA

ちがった。

→とりあえず諦めて他の問題読む。Dとか実は簡単なんじゃね。提出者少ないけど。

→doStringの存在はなぜか知っていたため解けそうな気になるも、どうみても違うフォーマットで与えられていて、失敗しまくったのであきらめる。

→Hの問題文再び読む。repeatだよな・・・繰り返している、要するに連続してるものの最大だよな。

[02:14] H 6WA

精神が残念な状態だったため、何も修正せずにスペースだけ追加して提出するという謎いことをする。

→問題文を落ち着いて読み直す。何か読み間違いはないか・・・。

→わかんね。

→repeatってもしかして連続しているじゃなくて、ただ出現していることだったりしないのかな?

→いいやどうせWA増えても通せないなら変わらん。

→修正して提出。

[02:22] H Accepted (6WA)

・・・は?(憤慨)心が少し折れそうになる。

→Dは無理っぽそうなので、Bを読む。

→Bはよく分からなかったので提出者が多いAを読む。

→うーん、普通に難しい気がする。探索すると計算量おかしい。

→1使えるんだったら大きいものから貪欲にやって解けるんじゃね?(変な予想)

→30くらいの値まで頭の中でその予想に基づいてやってみて、上手くいってそうだったので実装。

→解が無かった場合の扱いが適当すぎることからも、この解法であってることに変な自信を持って提出。

ちなみにAは、なんか数nが与えられるので、

相異なる素数(と1が使える[重要])の和=nになるような組み合わせかつ、辞書順で最大のものを求めよという問題。

普通のCodeForcesならDiv2のCくらいの難易度。

[02:45] A Accepted

通っちゃった。証明はできませんが、チェビシェフの定理とかから導けたりしないのかなとか思ったり。よく分からないけど。

→F読む。

→なるほど、分からん。

→今までのコーディングの時間的に読解含め15分以内にはできないし、もう疲れたし、やめよう。

[03:00] こんてすと いず おーばー

最後の5分くらいでid:rofiさんに48位になられて、抜かされたりする悔しい!!!

結果

結局6完/9問で、49位/189位くらいでした。(ちなみに6回WAのせいで6完者の中では余裕の最下位でしたw)

それにしても、Unknown Language Roundは普通に面白い。

言語仕様を知れる良問多いし、こういうので他の言語学べるならそれはいいことだと思いました。

主催大変だろうけど、これからも、1ヶ月に一回くらい是非やって欲しいです。

それとid:JAPLJさんがダントツの一位でした。おめでとうございます。

彼は前回も1位を取っていて本当におかしい。最近TCの方でも赤い人になったし。

あと他にも結構20位以内に日本人が多かった印象。特にid:k_operafanさんは5位。みんなすごい。

提出したソース(勝手にpascalシンタックスハイライト)

汚いの多いです。特に最初の方は改行禁止だと思っていたので。

A

n := File standardInput readLine asNumber
lst := list clone;
tmp := n
i:=n;
while(i != 0 , 
    j:=2;
    f:=1;
    while(j*j <= i , 
        if(i%j == 0 , f=0;break,j:=j+1)
    );
    if(f==1,
        lst append(i);
        n := n-i;
        i := n;
        ,
        i := i-1;
    )
);
for(i,0,lst size-2,write(lst at(i));write("+"))
write(lst at(lst size-1))
write("=");
write(tmp)

B

未提出

C

実は4で割って2余るものとかで数学的解法出来るらしい。

a := File standardInput readLine asNumber
b := 0
c := 0
for(i, 1, a , b := b + if(a%i==0,if(i%2==0,1,0),0))
for(i, 1, a , c := c + if(a%i==0,if(i%2==1,1,0),0))
if(b == c, write("yes"), write("no"))

D

未提出

E

n := File standardInput readLine asString
a := n size
ans := "";
max := -1;
for(i, 1, a , 
    for(j,0,a-i ,
        get := n slice(j,j+i);
        c := 0;
        x := 0
        while(x < a-i+1 ,
            if(n slice(x,x+i) == get,c:=c+1)
            x := x+1;
        );
        if(max <= c ,
            if(max == c , 
                ans = if(ans size > get size , ans , if(get size == ans size , if(ans < get,get,ans), get))
                ,
                ans = get;
                max = c;
            );
        );
    );
);
write(ans);

F

未提出

G

a := File standardInput readLine asNumber
t := 0
x := 0
y := 1
for(i, 1, a , t:=y ; y:=x+y ; x:=t)  
y print

H

n := File standardInput readLine asString
a := n size
f := 0
end := if(n at(0) == 45,1,0)
if(n at(0) == 45,write("-"))
while(end < n , if(end == a,break) ; if(n at(end) == 48 , end := end+1 , break))
if(end==a ,write(0), for(i, a-1, end, -1, if(f==0,if(n at(i)==48,write(""),write(n at(i)-48);f:=1),write(n at(i)-48))))

I

a := File standardInput readLine asNumber
x := a
b := 0
f := 0
c := 0
while(x != 0, b:=x%10 ; c:=c+1 ;x:=(x-b)/10 ; if(b==0,continue) ; if(a%b==0,f:=f+1,f:=f) );

if(c==f,write("happier"),if(f==0,write("upset"),write("happy")))