最近のあなごる

最近公開されたものなど。

619. Alphabet texture

一回ならともかく、二回もabs()と書くのは残念だなぁと思って、他の道を探ったのが功を奏して単独トップ。abs解で26周期にするのが思いつかず、自分のabsコードが長かったのもよかった。

文字コードの増減に着目すると、最初は13減、12増を繰り返して、真ん中で13減、13増となり、あとは12減、13増となる。これは、12.52周期だと思うとぴったりはまる。

// 88B
i=639;c=90;main(d){for(;i>14;i%25-14||puts(""))d=--i/12.52,d&1?c++:c--,printf(" %c",c);}

// 87B
i=625;c=90;main(d){for(;i--;i%25||puts(""))d=(i+14)/12.52,d&1?c++:c--,printf(" %c",c);}

// 84B
i=13;c=90;main(d){for(;i-638;)d=i/12.52,printf(i++%25-12?" %c":" %c\n",c-=d%2*2-1);}

doubleのままだと扱いにくいので分数に変えて整数演算に落とす。

// 80B
i=13;c=90;main(){for(;i-638;)printf(i++%25-12?" %c":" %c\n",c-=i*25/313%2*2-1);}

// 76B
i=13;c;main(){for(;c-=i*25/313%2*2-1;)printf(++i%25-13?" %c":" %c\n",c+90);}

// AC 74B
c;main(i){for(;c-=(i+12)*25/313%2*2-1;)printf(i++%25?"%2c":"%2c\n",c+90);}

// 79B
c='\nZ ';main(i){for(;c-=(i+12)*25/313%2*512-256,c%37;)write(1,&c,i++%25?2:3);}

// 78B
c;main(i){for(;c-=(i+12)*25/313%2*2-1;)printf("%2c%.*s",c+90,!(i++%25),"\n");}

// 74B
i=326;c;main(){for(;c+=i*25/313%2*2-1;)printf(i++%25?"%2c":"%2c\n",c+90);}

// 74B
i=326;c;main(){for(;~c;c-=i*50/313&2)printf(i++%25?"%2c":"%2c\n",90-++c);}

// AC 72B
i=326;main(c){for(;c++;c-=i*50/313&2)printf(i++%25?"%2c":"%2c\n",91-c);}

// AC 71B
i=326;main(c){while(c-=i*50/313&2)printf(i++%25?"%2c":"%2c\n",91-++c);}

途中、改行を出す部分が長く見えたので、writeや精度指定を使ってみたが逆に長くなってしまった。74Bのsubmit時に、スペースの数を悟られないように%2cにする小細工をしている。whileを使っているのはalnumを多くするため。

25周期でなく26周期でこの方針が使えると、文字列部分は3B短くなる。でも、改行を出すときは文字コードをいじらないとか入れると、結局長くなるか。

622. group elements

Cで馬鹿正直に書いてもLanguage Rankingの下のほうに沈むのが目に見えていたのでスルーしていたのだけど、公開まで24時間を切ってからnnさんが突撃していたので便乗してみた。いつも後出しじゃんけんですみません。

方針としては、単純に、前の数字を覚えておいて比較する形。改行文字も覚えておけば行頭の処理もできる。空白文字を覚えないように気をつける必要がある。

入力の最後に改行がついていない。改行契機に閉じ括弧を出すためには、この前のSimilarity Expansion同様、ループの中でgetchar()すればよい。

// AC 88B
p=10;main(c){while(~c)p=printf(c>32?p-c?"] [%c"+20/p:" %c":"]\n"+c/16,c=getchar())?c:p;}

// AC 87B
p=7;main(c){while(~c)p=printf(c>32?p-c?"] [%c"+20/p:" %c":"]\n"+c/16,c=getchar())?c:p;}

// AC 85B
main(p,c){while(~c)p=printf(c>10?p-c?"] [%c"+c/24-p/24:" %c":"]\n",c=getchar())?c:p;}

// AC 84B
c;main(p){~c&&main(printf(c>10?p-c?"] [%c"+c/24-p/24:" %c":"]\n",c=getchar())?c:p);}

// AC 84B
c;main(p){~c&&main(printf(c/22?c-p?"] [%c"+c/22-p/22:"%2c":"]\n",c=getchar())?c:p);}

スペースの処理や行頭の開き括弧は、フォーマット文字列でなんとかする方針。一番下は無駄に2を使ってみたもの。submit前に一呼吸おいてこういう遊びが入れられるようになりたい。

この問題は、最後に改行がある場合でもreadを使うようになるだけでバイト数が変わらないはず。

618. Bitwise Counting

55Bまでは来たけれどushたんの53B@binary1Bが相変わらず謎。今の自分のコードからはbinaryのにおいがしないので、方針から違うのではないか疑惑。追いつくのは大変だ。

没コード。きっとこの方針ではない。

// AC another 75B
main(i,s){while(--i>-3e6)write(strspn(s,"01")/8,s,sprintf(s,"%08o\n",-i));}

// AC another 61B (rand)
main(i,p){for(;~i--;p%9?main(1,p+1):puts(p-7))*(int*)p=48-i;}