C
どう書く
yhpg
C言語

オフラインリアルタイムどう書くF09の C 言語による実装例

問題: http://nabetani.sakura.ne.jp/hena/ordf09rotbox/
実装例へのリンク集: https://qiita.com/Nabetani/items/61e13fa5cf0abe5979be

私も C言語 で書いてみた。

C
#include <stdio.h>
#include <string.h>

struct ans{ char m[12]; };

void swap( char * p, int a, int b )
{
  int tmp = p[a];
  p[a]=p[b];
  p[b]=tmp;
}

struct ans solve( char const * src )
{
  struct ans ans = { "123/456/789" };
  for( char const * cmd=src ; *cmd ; ++cmd ){
    switch( *cmd ){
    case 'a': swap(ans.m, 0, 1); swap(ans.m, 1, 2); break;
    case 'b': swap(ans.m, 4, 5); swap(ans.m, 5, 6); break;
    case 'c': swap(ans.m, 8, 9); swap(ans.m, 9,10); break;
    case 'd': swap(ans.m, 8, 4); swap(ans.m, 4, 0); break;
    case 'e': swap(ans.m, 9, 5); swap(ans.m, 5, 1); break;
    case 'f': swap(ans.m,10, 6); swap(ans.m, 6, 2); break;
    case 'g': swap(ans.m,10, 9); swap(ans.m, 9, 8); break;
    case 'h': swap(ans.m, 6, 5); swap(ans.m, 5, 4); break;
    case 'i': swap(ans.m, 2, 1); swap(ans.m, 1, 0); break;
    case 'j': swap(ans.m, 2, 6); swap(ans.m, 6,10); break;
    case 'k': swap(ans.m, 1, 5); swap(ans.m, 5, 9); break;
    case 'l': swap(ans.m, 0, 4); swap(ans.m, 4, 8); break;
    }
  }
  return ans;
}

void test( char const * src, char const * expected )
{
  struct ans ans = solve( src );
  _Bool okay = 0==strcmp( ans.m, expected );
  printf( "%s %s->%s / %s\n", (okay ? "ok" : "**NG**"), src, ans.m, expected );
}

int main()
{
  /*0*/ test( "aegj", "286/435/971" );
  /*1*/ test( "a", "231/456/789" );
  /*2*/ test( "e", "183/426/759" );
  /*48*/ test( "baciefjhgkdl", "153/482/796" );
  return 0;
}

丹精込めた、手のぬくもりの感じられる switchcase で解決。

memcpy のたぐいは怖いので使わない方向で。

EVIL_MACRO
#define CASE(n,x,y,z)\
     case n: swap(ans.m, x, y); swap(ans.m, y, z); break

みたいなマクロを使おうかとも思ったけど、手のぬくもりを優先した。