オフラインリアルタイムどう書く
http://atnd.org/events/38770
の参考問題
http://nabetani.sakura.ne.jp/hena/ord11arithseq/
の実装例を C99 で用意しました。
他の言語などの解答例は
http://qiita.com/items/c206fbc645c255cb7de6
から辿れます。
で。
solver.c
// compiled with "clang -std=c99 -Wall solver.c"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int char_to_num( char c )
{
char s[] = { c, 0 };
return strtol( s, NULL, 36 );
}
void solve( char const * src, char * r )
{
int k[36*36]={0}; // Hash looks better unless C
int m=0;
for( char const * a = src ; a[0] && a[1] ; ++a ){
for( char const * b = a+1 ; b[0] ; ++b ){
int nb=char_to_num(*b);
int na=char_to_num(*a );
int d = (nb-na)*36;
int newval = k[nb+d]=k[na+d]+1;
if ( m<newval ){
m=newval;
}
}
}
sprintf( r, "%d", m+1 );
}
void test( char const * src, char const * expected )
{
char actual[10]={0};
solve( src, actual );
_Bool ok = 0==strcmp( actual, expected );
printf( "%s %s -> %s ( %s )\n",
ok ? "ok" : "***NG***",
src, actual, expected );
}
int main()
{
/*0*/ test( "12345abcz", "5" );
/*1*/ test( "012abku", "4" );
return 0;
}
出題した時点で書いていたものは三重ループだったんだけど、二重ループで書けることに気がついたので、それを C99 で書いてみた。
C でなければ先に整数の配列に変換してから作業するんだけど、バッファの確保が面倒だったので毎回変換している。
書いてみてから気づいたんだけど、すごく手続き型脳である。もう少し関数型脳になりたいものであるよ(詠嘆)。