仲間内の勉強会で、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 人現れるくらいのスピード感でした。スキルは人それぞれなんだと感じ、ちょっと新鮮な気持ちになりました。