Chiharu の日記

絵描き C/C++ プログラマーの日記です。

ショート コーディング for ARM Bin. 〜課外活動

仲間内の勉強会で、C コンパイラのビルド結果として ARM バイナリをできるかぎり短く実装しようというショート コーディングっぽいことをやってみました。

お題

テスト コードで“succeeded.”が表示されるよう下記の関数を実装してください。

const char* q_string_selector_select(int index)
{
  /* TODO */
}

テスト コードは下記のとおりです。

#include "q_string_selector.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  /* for NULL */

int main()
{
  const char* str;
  int index;
  
  index = -1;
  str = q_string_selector_select(index);
  if (str == NULL) {
    /* Ok */
  } else {
    goto error_;
  }
  
  index = 0;
  str = q_string_selector_select(index);
  if ((str != NULL) && (strcmp(str, "doc") == 0)) {
    /* Ok */
  } else {
    goto error_;
  }
  
  index = 1;
  str = q_string_selector_select(index);
  if ((str != NULL) && (strcmp(str, "xls") == 0)) {
    /* Ok */
  } else {
    goto error_;
  }
  
  index = 2;
  str = q_string_selector_select(index);
  if ((str != NULL) && (strcmp(str, "ppt") == 0)) {
    /* Ok */
  } else {
    goto error_;
  }
  
  index = 3;
  str = q_string_selector_select(index);
  if ((str != NULL) && (strcmp(str, "vsd") == 0)) {
    /* Ok */
  } else {
    goto error_;
  }
  
  index = 4;
  str = q_string_selector_select(index);
  if ((str != NULL) && (strcmp(str, "css") == 0)) {
    /* Ok */
  } else {
    goto error_;
  }
  
  index = 5;
  str = q_string_selector_select(index);
  if ((str != NULL) && (strcmp(str, "htm") == 0)) {
    /* Ok */
  } else {
    goto error_;
  }
  
  index = 6;
  str = q_string_selector_select(index);
  if (str == NULL) {
    /* Ok */
  } else {
    goto error_;
  }
  
  puts("succeeded.");
  return 0;
  
error_:
  printf("failed. (%d)\n", index);
  return 0;
}

実装が完了したらデグレードに気をつけながらコンパイル結果が短くなるようチューニングしてください。

解答

私が用意した解答は下記のとおりです。

const char* q_string_selector_select(int index)
{
  unsigned index_u = (unsigned) index;
  
  if (index_u < 6) {
    return "doc\0xls\0ppt\0vsd\0css\0htm" + index_u * 4;
  } else {
    return NULL;
  }
}

問題を作ったときは 5 分もあれば“succeeded.”が出力できて、10 分もあれば最適化が完了すると思っていました。が、今回は若手が多かったせいか実際には 10 分経って“succeeded.”表示に成功する人が 1 人現れるくらいのスピード感でした。スキルは人それぞれなんだと感じ、ちょっと新鮮な気持ちになりました。