楽天の社長が書いたプログラムコードを改修してみよう
どうやら楽天ではプログラミングスキルが必要になるらしい。
当然ながら英語は必須っぽい。
言語能力で足切りラインを作ってしまうところがなんとも香ばしいのに今回はそれに加えてプログラミングを要求するらしい。
どうやら楽天の社長は過去にプログラムを書いたことがあるそうだ。
もちろん書かれているとおりにコンパイルしても動かない。
楽天 三木谷会長が書いたソースコード(1997年) | TechWave(テックウェーブ)
創業20周年を迎えた楽天。本社のある東京・世田谷区の楽天クリムゾンハウスの入り口に、これまでの成長の歴史を伝え …
ならば修正してあげよう。
#include <stdio.h>
char* comma(int yen) {
int is_minus = 0;
char *yen_str, *result;
size_t length, count;
if (yen < 0) {
is_minus = 1;
yen = yen * -1;
}
length = snprintf(NULL, 0, "%d", yen);
yen_str = malloc(length);
sprintf(yen_str, "%d", yen);
count = strlen(yen_str) / 3;
if (strlen(yen_str) % 3 == 0) {
count--;
}
result = malloc(count + length);
for (int i = strlen(yen_str) - 1; i >= 0; i--) {
result[i + count] = yen_str[i];
if ((strlen(yen_str) - i) % 3 == 0 && count > 0) {
count--;
result[i + count] = ',';
}
}
if (is_minus) {
yen_str = result;
result = malloc(strlen(result) + 1);
sprintf(result, "-%s", yen_str);
}
return result;
}
int main(void) {
int yen;
scanf("%d", ¥);
printf("%s\n", comma(yen));
return 0;
}
できた。
マイナスにも対応しといた。
でも長過ぎる…。
そうだ locale.h
を使おう。
#include <stdio.h>
#include <locale.h>
int main(void){
setlocale(LC_ALL,"");
setlocale(LC_NUMERIC,"JPN");
printf("%'d\n",1000000000);
return 0;
}
綺麗に8行で書けた。
小数点は多めに見てほしい。 🍤
まとめ
初心者が一生懸命書くより、玄人がたった8行で書いてしまうコードのほうがミスもなければ時間もかからない。
プログラミングに関しては初心者が関わると損失を生んでしまう可能性が高い。
楽天は英語でもコミュニケーションの齟齬が発生したりしていないのだろうか?
人との対話であればそのミスを感覚で修正することはできるだろうが、プログラミングは感覚で書くものではないことを理解してほしい。