LoginSignup
0
0

More than 5 years have passed since last update.

第11回オフラインリアルタイムどう書くの参考問題。C99による実装例。

Last updated at Posted at 2013-05-18

オフラインリアルタイムどう書く
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 でなければ先に整数の配列に変換してから作業するんだけど、バッファの確保が面倒だったので毎回変換している。

書いてみてから気づいたんだけど、すごく手続き型脳である。もう少し関数型脳になりたいものであるよ(詠嘆)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0