最近のあなごる
最近公開されたものなど。
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;}