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í.
Respuestas:
Empuje,
4336 bytesNo es necesario que le des un guión a Jimmy, solo enséñale a usar un editor de texto adecuado. (retornos literales para mayor claridad)
fuente
<C-a>
es más corto quet]
, lo cual es un pequeño truco divertido. Además, creo que técnicamente necesita 2,<cr>
ya que pide confirmación.norm df=
es más corto ques/.*=//g
3wC] = {<esc>
es más corto que<C-a>di]$s = {<esc>
.CJam,
4336 bytesEjemplo en línea
Explicación:
Muchas gracias a Martin Ender por las mejoras en mi primera respuesta de CJam.
fuente
JavaScript (ES6),
656463 bytesfuente
Retina ,
3028 bytesEl recuento de bytes supone la codificación ISO 8859-1.
Pruébalo en línea!
Explicación
Utilizaremos la siguiente entrada como ejemplo:
Nivel 1
Tenga en cuenta que hay un espacio final en la primera línea.
Comenzamos haciendo coincidir un número que sigue
];
y un salto de línea, y luego todo hasta el último espacio en la siguiente línea. Esta coincidencia solo se puede encontrar al final de la primera línea (debido a];
). Todo esto se reemplaza con] = {
. Es decir, transforma nuestra entrada de ejemplo a:Etapa 2
Ahora combinamos todo, desde a
;
hasta=
en la línea siguiente, y reemplazamos con a,
. Esto transforma la cadena a:Etapa 3
Todo lo que queda es arreglar el final y lo hacemos reemplazando el único restante
;
con};
:fuente
Julia,
112108105 BytesExplicación
Bytes guardados reemplazando collect (eachmatch ()) con [eachmatch () ...] y con una expresión regular más corta
fuente
eachmatch
llamada de función para una salida menos bonita y -1 byte. Yo mismo nunca programé en Julia, pero puede que le resulte interesante leer esta publicación: Consejos para jugar al golf en Julia . Nuevamente bienvenido, y disfrute su estadía. :)matchall
probablemente sería más corto que las salpicaduraseachmatch
.Lua, 121 bytes.
Explicado
fuente
Lote, 160 bytes
Nota: La línea
set s=,
termina con un espacio. Toma entrada en STDIN. Esa línea extraña 3 toma la entrada (por ejemplo,int spam[6];
y cambia el[
en[] = {&rem
lo que resulta enset s=int spam[] = {&rem 6];
que luego se interpreta como dos declaraciones,set s=int spam[] = {
yrem 6];
, el último de los cuales es un comentario. Luego, para cada línea de borramos el texto hasta el primer espacio (porque se puede No utilice=
en un patrón y la coincidencia no es codicioso) y extraiga el valor.fuente
C, 121 bytes
fuente
Python
112111Muy sencillo para mí, sugiera cualquier mejora que se me ocurra.
fuente
[:-1] for
.05AB1E ,
313028 bytesExplicación
Pruébalo en línea!
Salvó un byte gracias a Adnan
fuente
žuDÀÀ
en lugar de„[]„{}
guardar un byte :).Java 7,
159158149154 bytesMúltiples bytes guardados gracias a @cliffroot .
Ungolfed y código de prueba:
Pruébalo aquí
Salida:
fuente
String c(String[]a){a[0]=a[0].split("\\d")[0]+"]={ \b";for(String i:a)a[0]+=i.split("=[{]*")[1];return a[0].replace(';',',').replaceFirst(".$","};");}
String
en el parámetro y reemplazar el último carácter con en"};");
lugar de un"")+"};";
.Perl, 42 + 2 (
-0p
) = 44 bytesNecesidades
-p
y-0
banderas para correr. Por ejemplo :fuente
Jalea , 27 bytes
Pruébalo en línea!
Explicación
fuente
sed 51
fuente
Java, 106 bytes
La manipulación de cadenas en Java es un infierno, como siempre.
Esta es una respuesta pura regex. Haga un solo concatenado
String
, luego realicereplaceXxx
hasta que esté bien.Pruebas y sin golf:
fuente
Jalea , 33 bytes
TryItOnline
¿Cómo?
fuente
Ruby, 64 bytes
fuente
JavaScript, 125 bytes
Sé que es más largo que otros, pero realmente quería usarlo
eval
. Solo por diversión.Para ejecutar, pegue lo siguiente aquí :
fuente
Haxe, 234 bytes
Los nombres de funciones largos mataron esto: D
¡Prueba las maletas aquí !
fuente
V ,
25, 24 bytesPruébalo en línea! Este contiene un
<esc>
carácter no imprimible , así que aquí hay un hexdump:Explicación:
fuente