En el lenguaje de programación C, las matrices se definen así:
int foo[] = {4, 8, 15, 16, 23, 42}; //Foo implicitly has a size of 6
El tamaño de la matriz se infiere de los elementos de inicialización, que en este caso es 6. También puede escribir una matriz C de esta manera, dimensionándola explícitamente y luego definiendo cada elemento en orden:
int foo[6]; //Give the array an explicit size of 6
foo[0] = 4;
foo[1] = 8;
foo[2] = 15;
foo[3] = 16;
foo[4] = 23;
foo[5] = 42;
El reto
Debe escribir un programa o función que expanda las matrices de la primera a la segunda. Como está escribiendo un programa para alargar el código y le encanta la ironía, debe hacer que su código sea lo más breve posible.
La entrada será una cadena que representa la matriz original, y la salida será la definición de matriz expandida. Puede asumir con seguridad que la entrada siempre se verá así:
<type> <array_name>[] = {<int>, <int>, <int> ... };
"Type" y "array_name" estarán compuestos completamente por caracteres alfabéticos y guiones bajos _
. Los elementos de la lista siempre serán un número en el rango de -2,147,483,648 a 2,147,483,647. Las entradas en cualquier otro formato no necesitan ser manejadas.
El espacio en blanco en su salida debe coincidir exactamente con el espacio en blanco en la salida de prueba, aunque se permite una nueva línea final.
Prueba IO:
#in
short array[] = {4, 3, 2, 1};
#out
short array[4];
array[0] = 4;
array[1] = 3;
array[2] = 2;
array[3] = 1;
#in
spam EGGS[] = {42};
#out
spam EGGS[1];
EGGS[0] = 42;
#in
terrible_long_type_name awful_array_name[] = {7, -8, 1337, 0, 13};
#out
terrible_long_type_name awful_array_name[5];
awful_array_name[0] = 7;
awful_array_name[1] = -8;
awful_array_name[2] = 1337;
awful_array_name[3] = 0;
awful_array_name[4] = 13;
Se alientan las presentaciones en cualquier idioma, pero puntos de bonificación si puede hacerlo en C.
Tabla de clasificación:
Aquí hay una tabla de clasificación que muestra las principales respuestas:
foo[0]=1;
sería aceptable?Respuestas:
Pyth, 44 bytes
Banco de pruebas
Expresión regular y corte de cuerdas. No particularmente inteligente.
Explicación:
fuente
Vim,
54, 52, 4947 pulsaciones de teclasExplicación:
Ahora nuestro buffer se ve así:
y nuestro cursor está en la última línea.
Segunda mitad:
Ahora todo se ve bien, solo necesitamos agregar la declaración de matriz original. Entonces hacemos:
fuente
int foo[6] = {
y terminando conint foo[12
(cursor en el "2")df<space>
adW
para guardar un byte, pero olvidé quedf<space>
saldrá de la macro en la línea 6, perodW
no lo hace. Revertiré una revisión. ¡Gracias por señalar eso!Retina,
10810410069 bytesEl recuento de bytes asume la codificación ISO 8859-1.
Batir esto, PowerShell ...
Explicación del código
Primera linea:
].+{((\S+ ?)+)
Primero, debemos mantener el tipo, el nombre de la matriz y el corchete de apertura (guarda un byte), para que no coincidamos. Así que coincidir con el corchete de cierre, cualquier número de caracteres, y una llave de apertura:
].+{
. Luego hacemos coincidir la lista de números. Más corto que he podido encontrar hasta ahora es la siguiente:((\S+ ?)+)
. Hemos partido de cualquier número de caracteres no espaciales (esto incluye números, es posible signo negativo, y es posible coma), seguido de un espacio, que puede o no estar allí:\S+ ?
. Este grupo de caracteres se repite tantas veces como sea necesario:(\S+ ?)+
y se coloca en el gran grupo de captura. Tenga en cuenta que no coincidimos con la llave de cierre o el punto y coma. La explicación de la tercera línea dice por qué.Segunda linea:
$#2];$1
Como solo coincidimos con una parte de la entrada, las partes no coincidentes seguirán allí. Por eso, pusimos la longitud de la lista después del paréntesis de apertura sin igual:
$#2
. El modificador de reemplazo#
nos ayuda con eso, ya que nos da la cantidad de coincidencias que hizo un grupo de captura en particular. En este caso grupo de captura2
. Luego colocamos un corchete de cierre y un punto y coma, y finalmente nuestra lista completa.Con entrada
short array[] = {4, 3, 2, 1};
, la representación interna después de esta sustitución es:(tenga en cuenta la llave de cierre y el punto y coma)
Tercera línea:
+`((\w+[).+;(\S+ )*)(-?\d+).+
Esta es una sección en bucle. Eso significa que se ejecuta hasta que ninguna etapa del bucle realice un cambio en la entrada. En primer lugar tenemos que coincida con el nombre de la matriz, seguido de un paréntesis de apertura:
(\w+\[)
. A continuación, un número arbitrario de caracteres y un punto y coma:.+;
. Luego coincide con la lista de nuevo, pero esta vez sólo números y la coma después de cada número, que tienen un espacio después de ellos:(\S+ )*
. Luego capturamos el último número de la lista:(-?\d+)
y los caracteres restantes detrás de él:.+
.Cuarta línea:
$1¶$2$#3] = $4;
A continuación, sustituirlo por el nombre de la matriz y la lista seguido por un salto de línea:
$1¶
. A continuación, se puso el nombre de la matriz, seguido por la longitud de lista previamente adaptados, sin el último elemento (esencialmentelist.length - 1
):$2$#3
. Seguido por un operador de cierre y asignación de espacios con espacios, y esto seguido por el último elemento de nuestra lista de números:] = $4;
Después de la primera sustitución, la representación interna se ve así:
Tenga en cuenta que la llave de cierre y el punto y coma desaparecieron, gracias al
.+
final de la tercera línea. Después de tres reemplazos más, la representación interna se ve así:Como no hay nada más que hacer coincidir con la tercera línea, la cuarta no reemplaza nada y se devuelve la cadena.
TL; DR: Primero cambiamos un poco el formato de la lista int. Luego tomamos el último elemento de la lista y el nombre, y los colocamos después de la inicialización de la matriz. Hacemos esto hasta que la lista int esté vacía. Luego devolvemos el código modificado.
Pruébalo en línea!
fuente
M!`
yG`
son similares, pero no exactamente lo mismo. Ten cuidado.V, 37 bytes
V es un lenguaje de golf 2D basado en cadenas que escribí, diseñado fuera de vim. Esto funciona a partir de commit 17 .
Explicación:
Esta es una traducción directa de mi respuesta vim , aunque significativamente más corta.
Entonces solo tenemos:
Dado que esta locura unicode puede ser difícil de ingresar, puede crear el archivo con este hexdump reversible:
Esto se puede ejecutar instalando V y escribiendo:
fuente
Designed off of vim.
2 notas: 1. la mayoría de la gente dice quefrom
nooff of
, y 2. por qué esto no existe +1C,
215 bytes, 196 bytes¡19 bytes guardados gracias a @tucuxi!
Golfizado:
Sin golf:
Enlazar:
http://ideone.com/h81XbI
Explicación:
Para obtener el
<type> <array_name>
, lasscanf()
cadena de formato es esta:Para extraer los valores int de la cadena
int foo[] = {4, 8, 15, 16, 23, 42};
, esencialmente tokenizo la cadena con esta función:dónde:
i
es la cadena de entrada (achar*
)t
es el desplazamiento de la ubicación del puntero dei
x
es elint
análisis real de la cadenan
es el total de caracteres consumidos, incluido el dígito encontradoLa
sscanf()
cadena de formato significa esto:Si visualiza la cadena de entrada como una matriz de caracteres:
con el
int
4
ser ubicado en el índice 13,8
en el índice 16, etc., así es como se ve el resultado de cada ejecución en el ciclo:fuente
o
dentro de sprintf, via%s
. Esto debería afeitarse alrededor de 7 caracteres.C,
195180 bytesOriginal de 195 bytes:
golfizado:
sin golf:
Los dos accesos directos están usando el
m
modificador para obtener scanf%s
para asignar su propia memoria (guarda declarando matrices de caracteres), y están usandostrtok
(que también está disponible por defecto, sin incluir) para hacer la parte de análisis de números.Actualización de 180 bytes:
sin golf:
Utiliza la idea de bnf679 de agregar una cadena para evitar tener que contar comas.
fuente
Python 3.6 (prelanzamiento), 133
Hace un uso intensivo de las cuerdas f .
Versión sin golf:
fuente
Rubí,
1271101089988 bytesFunción anónima con un solo argumento como entrada.Programa completo, lee la entrada de STDIN. (Si canaliza un archivo, la nueva línea final es opcional).DevuelveImprime la cadena de salida.Tomó a @TimmyD alardear de que su solución venció a todos los demás que no eran esolangs como un desafío, y finalmente superó la solución Powershell de 114 bytes (en el momento de la escritura) que habían publicado.
El truco de Cᴏɴᴏʀ O'Bʀɪᴇɴ con dividir]
y empalmar la segunda mitad para obtener los números ayudó.Necesito usar más el operador splat. ¡Es muy útil!
Tomó prestado un truco de la respuesta JavaScript ES6 de @ Neil para guardar más bytes al buscar palabras en lugar de usar
gsub
ysplit
...fuente
05AB1E ,
525047 bytesCódigo:
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
JavaScript (ES6), 100 bytes
Dado que solo las palabras son importantes, esto funciona simplemente haciendo coincidir todas las palabras en la cadena original, más los signos menos a la izquierda, y luego construyendo el resultado. (Originalmente pensé que iba a usar,
replace
pero resultó ser un arenque rojo).fuente
[t,n,...m]
casi una visión místicaPyth -
5350464544 bytes2 bytes guardados gracias a @FryAmTheEggman.
Test Suite .
fuente
Pip ,
4847 bytesToma datos de stdin e imprime en stdout.
Explicación
Tl; dr: un reemplazo de expresiones regulares, utilizando grupos de captura y una función de devolución de llamada para construir el resultado.
La
q
variable especial lee una línea de entrada. La expresión regular es(\S+)(. = ).(.+)}
, que coincide con todo excepto el tipo (incluido el espacio final) y el punto y coma final. Usando el primer ejemplo de la pregunta, los grupos de captura obtienenfoo[
,] =
y4, 8, 15, 16, 23, 42
.El reemplazo es el valor de retorno de la función sin nombre
{[b#Yd^k']';.n.b.,#y.c.y]}
, que se llama con toda la coincidencia más los grupos de captura como argumentos. Por lo tanto, dentro de la función,b
obtiene el grupo de captura 1,c
obtiene el grupo 2 yd
obtiene el grupo 3.Construimos una lista, los tres primeros artículos de los cuales serán
"foo["
,6
y"]"
. Para obtener el6
, dividimosd
en la variable incorporadak
=", "
,Y
ank la lista resultante de enteros en lay
variable para uso futuro, y tomamos la longitud (#
).']
Es un carácter literal.Lo que queda es construir una serie de cadenas de la forma
";\nfoo[i] = x"
. Para ello, se concatena la siguiente:';
,n
(un built-in de nueva línea),b
(1er grupo de captura),,#y
(equivalente a Pythonrange(len(y))
),c
(segundo grupo de captura), yy
. La concatenación funciona por elementos en listas y rangos, por lo que el resultado es una lista de cadenas. En conjunto, el valor de retorno de la función será una lista como esta:Dado que esta lista se está utilizando en una
R
ubicación de cadena , se convierte implícitamente en una cadena. La conversión predeterminada de lista a cadena en Pip está concatenando todos los elementos:Finalmente, el resultado (incluido el tipo y el punto y coma final, que no coincidieron con la expresión regular y, por lo tanto, no se modificaron) se imprime automáticamente.
fuente
Perl 5.10,
73726866 + 1 (para el interruptor -n) = 67 bytesEste es un buen desafío para Perl y el más corto entre los lenguajes de uso general hasta ahora. Equivalente a
fuente
PowerShell v2 +,
114105bytesToma la cadena de entrada
$args
y-replace
escribe el corchete sin nada, luego realiza un-split
espacio en blanco. Almacenamos el primer bit en$a
, el segundo bit en$b
, el=
into$c
y los elementos de la matriz en$d
. Para el siguiente ejemplo, esto se almacenafoo
en$a
ybar
dentro$b
, y toda la matriz en$d
.A continuación, salida de la primera línea con
"$a ..."
y en el medio de transformar$d
de una matriz de cadenas de forma{1,
,2,
...100};
a una matriz int regular-join
ing juntos en una sola cadena, a continuación, ejecutar a través deiex
dos veces (similar aeval
). Almacenamos esa matriz resultante nuevamente$d
antes de llamar al.length
método para completar el número apropiado entre[]
línea de salida.Luego enviamos a
$d
través de un bucle con|%{...}
. Cada iteración se genera"$b..."
con una variable de contador$i
encapsulada entre paréntesis y el valor actual$_
. La$i
variable comienza sin inicializar (equivalente a$null
) pero la++
convertirá en unint
antes de la salida, por lo que comenzará la salida en0
, todo antes de incrementar$i
para la siguiente iteración del bucle.Todas las líneas de salida se dejan en la tubería, y la salida al terminal está implícita en la terminación del programa.
Ejemplo
fuente
C,
278280 bytesgolfizado:
sin golf:
Mientras trabajaba en esto, alguien publicó una versión más corta usando sscanf para el análisis en lugar de usar punteros de datos ... ¡genial!
ACTUALIZACIÓN: Espacios faltantes detectados alrededor de los iguales en la impresión del elemento, enlace en línea IDE: http://ideone.com/KrgRt0 . Tenga en cuenta que esta implementación admite números negativos ...
fuente
Awk, 101 bytes
Más legible:
-
. Entonces, los campos serían el nombre del tipo, el nombre de la variable y los números.};
). Entonces, el tamaño de la matriz esNF - 3
.FS
ya sea cuando se invoca awk (usando-F
) o en unBEGIN
bloque. En aras de la brevedad, ...fuente
FS
debe asignarse enBEGIN
o usando, de lo-F
contrario no se usará para dividir la primera línea, y dado que solo hay 1 línea de entrada ...awk '-F[^[:alnum:]_-]+' '{printf"%s %s[%d];\n",$1,$2,NF-3;for(i=3;i<NF;i++)printf$2"[%d] = %d;\n",i-3,$i}'
, que es 102 bytes sin contarawk
. Hmmm ¿Puedo excluir las comillas?C+O bytes
dóndeC
yO
representa los bytes del código y las opciones, respectivamente. Por supuesto, generalmente solo uso unBEGIN
bloque, por lo que no tengo que pensarlo. : pJavaScript ES6,
134132130129 bytesGuardado 1 byte gracias a Neil.
fuente
`[${i}] = `+t+";"
ser`[${i}] = ${t};`
?bash,
133129 bytesPrimer intento, seguro que es posible acortarlo.
fuente
D,
197, 188 byteso sin golf:
fuente
Julia,
154134101 bytesEsta es una función que acepta una cadena y devuelve una cadena con una nueva línea final.
Sin golf:
Definimos
c
ser una matriz de coincidencias de la entrada en la expresión regular-?\w+
. Incluye el tipo, el nombre de la matriz y luego cada valor. Almacenamosn
como la longitud dec
- 2, que es el número de valores. La salida se construye como el tipo, el nombre y la longitud de la cadena interpolada, combinada con cada línea de definición separada por líneas nuevas. Por alguna razón,c[]
es lo mismo quec[1]
.¡Ahorré 32 bytes con la ayuda de Dennis!
fuente
Python 2, 159 bytes
Pruébalo en línea
Gracias Kevin Lau por algunas sugerencias de golf.
fuente
Python 3, 116 bytes
Divide la entrada en el tipo, el nombre y la lista de números. Después de imprimir la declaración de la matriz, imprime los elementos enumerando manualmente a través de los números, eliminando el exceso de puntuación que se adjunta al primero y al último.
Un enfoque diferente en Python 2 salió a 122 bytes:
La idea es
eval
la lista de números como una tupla, con una coma al final para que un solo número sea reconocido como un tipo. La lista enumerada de números proporciona tuplas para formatear en cadena.fuente
PHP, 143 bytes
Golfed
Sin golf
La entrada se toma a través del argumento de la línea de comando. Muestra:
Salida:
fuente
MATL ,
686458 bytesEsto no es C,
pero usa laNah, que estaba desperdiciando 4 bytes.sprintf
función tipo CPruébalo en línea!
fuente
Clojure, 115 bytes
No pude fusionar
awful_array_name[5];
yawful_array_name[0] = 7;
partes para que reutilizaran el código: /fuente