Mi compañero de trabajo, Jimmy es un poco nuevo en C / C ++. También es un poco lento para aprender. Ahora, para ser justos, su código siempre se compila, pero tiene algunos hábitos realmente descuidados. Por ejemplo, todo el mundo sabe que puede definir una matriz como esta:
int spam[] = {4, 8, 15, 16, 23, 42};
Todos los que están, excepto Jimmy. Está convencido de que la única forma de hacer una matriz es así:
int spam[6];
spam[0] = 4;
spam[1] = 8;
spam[2] = 15;
spam[3] = 16;
spam[4] = 23;
spam[5] = 42;
Sigo arreglando esto para él en la revisión de código, pero no aprenderá. Así que necesito que escribas una herramienta que automáticamente haga esto por él cuando se compromete¹.
El reto
Quiero que escriba un programa completo o una función que tome una cadena multilínea como entrada y genere la versión más compacta de la matriz C. La entrada siempre seguirá este formato, incluido el espacio en blanco:
identifier_one identifier_two[some_length];
identifier_two[0] = some_number;
identifier_two[1] = some_number;
identifier_two[2] = some_number;
...
identifier_two[some_length - 1] = some_number;
En resumen, la entrada siempre será válida y bien definida C. Con más detalle:
Todos los identificadores estarán compuestos solo por letras y guiones bajos. La longitud siempre será al menos uno, y nunca habrá ningún índice faltante o fuera de límites. También puede suponer que los índices están en orden. Por ejemplo:
foo bar[3];
bar[0] = 1
bar[2] = 9;
foo bar[1];
bar[0] = 1;
bar[1] = 3;
y
foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3
son entradas no válidas y pueden causar un comportamiento indefinido en su envío. También puede suponer que todos los números serán números decimales válidos, negativos o positivos. La entrada no tendrá espacios extraños. La salida siempre debe seguir este formato, incluido el espacio en blanco:
identifier_one identifier_two[] = {n1, n2, n3, ...};
Aquí hay algunos datos de muestra:
Input:
spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;
Output:
spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};
Input:
char ans[2];
ans[0] = 52;
ans[1] = 50;
Output:
char ans[] = {52, 50};
Input:
blah_blah quux[1];
quux[0] = 105;
Output:
blah_blah quux[] = {105};
Puede tomar su entrada y salida en cualquier formato razonable, como STDIN / STDOUT, argumentos de función y valor de retorno, lectura y escritura de archivos, etc. Se aplican lagunas estándar. ¡La respuesta más corta en bytes gana!
¹ Esto es pasivo-agresivo y una idea terrible. ¿Te ha no consigue esta idea de mí.