Na linguagem de programação C, as matrizes são definidas assim:
int foo[] = {4, 8, 15, 16, 23, 42}; //Foo implicitly has a size of 6
O tamanho da matriz é inferido a partir dos elementos de inicialização, que neste caso são 6. Você também pode escrever uma matriz C dessa maneira, dimensionando-a explicitamente e definindo cada elemento na ordem:
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;
O desafio
Você deve escrever um programa ou função que expanda matrizes da primeira maneira para a segunda. Como você está escrevendo um programa para aumentar o código e adora a ironia, deve torná-lo o mais curto possível.
A entrada será uma sequência que representa a matriz original e a saída será a definição de matriz expandida. Você pode assumir com segurança que a entrada sempre será assim:
<type> <array_name>[] = {<int>, <int>, <int> ... };
"Type" e "array_name" serão compostos inteiramente de caracteres do alfabeto e sublinhados _
. Os elementos da lista sempre serão um número no intervalo de -2.147.483.648 a 2.147.483.647. Entradas em qualquer outro formato não precisam ser manipuladas.
O espaço em branco na sua saída deve corresponder exatamente ao espaço em branco na saída de teste, embora uma nova linha à direita seja permitida.
Teste de E / S:
#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;
Envios em qualquer idioma são encorajados, mas pontos de bônus se você puder fazê-lo em C.
Entre os melhores:
Aqui está um cabeçalho mostrando as principais respostas:
foo[0]=1;
aceitável?Respostas:
Pitão, 44 bytes
Suíte de teste
Expressão regular e corte de cordas. Não é particularmente inteligente.
Explicação:
fonte
Vim,
54, 52, 4947 pressionamentos de teclaExplicação:
Agora nosso buffer fica assim:
e nosso cursor está na última linha.
Segundo tempo:
Agora tudo parece bom, basta adicionar a declaração de matriz original. Então fazemos:
fonte
int foo[6] = {
e terminando comint foo[12
(cursor em the "2")df<space>
paradW
salvar um byte, mas esqueci quedf<space>
a macro sairá da linha 6, masdW
não. Vou reverter uma revisão. Obrigado por apontar isso!Retina,
10810410069 bytesA contagem de bytes assume a codificação ISO 8859-1.
Bata isso, PowerShell ...
Explicação do código
Primeira linha:
].+{((\S+ ?)+)
Primeiro, precisamos manter o tipo, o nome do array e o colchete de abertura (ele salva um byte), para não coincidir com eles. Então nós combinamos o colchete de fechamento, qualquer número de caracteres, e uma chave de abertura:
].+{
. Então combinamos a lista de números. Mais curta que eu tenho sido capaz de encontrar até agora é a seguinte:((\S+ ?)+)
. Nós combinar com qualquer número de caracteres não-espaço (isso inclui números, possível sinal negativo, e possível vírgula), seguido por um espaço, que pode ou não estar lá:\S+ ?
. Esse grupo de caracteres é repetido quantas vezes for necessário:(\S+ ?)+
e colocado no grande grupo de captura. Observe que não correspondemos à chave ou ponto e vírgula de fechamento. A explicação da terceira linha diz o porquê.Segunda linha:
$#2];$1
Como apenas correspondemos a uma parte da entrada, as partes não correspondentes ainda estarão lá. Então nós colocamos o comprimento da lista após o colchete de abertura inigualável:
$#2
. O modificador de substituição#
nos ajuda com isso, pois fornece o número de correspondências que um grupo de captura específico fez. Nesse caso, o grupo de captura2
. Em seguida, colocamos um colchete e um ponto e vírgula e, finalmente, toda a lista.Com entrada
short array[] = {4, 3, 2, 1};
, a representação interna após essa substituição é:(observe a chave e o ponto e vírgula de fechamento)
Terceira linha:
+`((\w+[).+;(\S+ )*)(-?\d+).+
Esta é uma seção em loop. Isso significa que ele é executado até que nenhum estágio do loop faça uma alteração na entrada. Em primeiro lugar, coincidir com o nome da matriz, seguida por um sinal de abertura:
(\w+\[)
. Em seguida, um número arbitrário de caracteres e um ponto e vírgula:.+;
. Então nós combinamos a lista novamente, mas desta vez apenas números e a vírgula depois de cada número, que têm um espaço de segui-los:(\S+ )*
. Então nós capturar o último número na lista:(-?\d+)
e quaisquer caracteres restantes por trás dele:.+
.Quarta linha:
$1¶$2$#3] = $4;
Em seguida, substituí-lo com o nome da matriz e lista, seguido por uma nova linha:
$1¶
. Em seguida, vamos colocar o nome da matriz, seguido pelo comprimento da lista previamente combinada, sem o último elemento (essencialmentelist.length - 1
):$2$#3
. Seguido por um operador de colchete e atribuição com espaços, seguido pelo último elemento da nossa lista de números:] = $4;
Após a primeira substituição, a representação interna fica assim:
Observe que a chave de fechamento e o ponto e vírgula desapareceram, graças ao
.+
no final da terceira linha. Após mais três substituições, a representação interna fica assim:Como não há mais nada a combinar com a terceira linha, a quarta não substitui nada e a string é retornada.
TL; DR: Primeiro, alteramos um pouco o formato da lista int. Depois, pegamos o último elemento da lista e o nome e os colocamos após a inicialização do array. Fazemos isso até que a lista int esteja vazia. Em seguida, devolvemos o código alterado.
Experimente online!
fonte
M!`
eG`
são semelhantes, mas não são iguais. Seja cuidadoso.V, 37 bytes
V é uma linguagem de golfe 2D baseada em cordas que eu escrevi, projetada fora do vim. Isso funciona a partir do commit 17 .
Explicação:
Esta é praticamente uma tradução direta da minha resposta vim , embora significativamente menor.
Então nós apenas temos:
Como essa loucura unicode pode ser difícil de entrar, você pode criar o arquivo com este hexdump reversível:
Isso pode ser executado instalando V e digitando:
fonte
Designed off of vim.
2 notas: 1. a maioria das pessoas diz quefrom
nãooff of
, e 2. por que isso não existia? +1C,
215 bytes, 196 bytes19 bytes salvos graças ao @tucuxi!
Golfe:
Ungolfed:
Ligação:
http://ideone.com/h81XbI
Explicação:
Para obter o
<type> <array_name>
, asscanf()
string de formato é esta:Para extrair os valores int da string
int foo[] = {4, 8, 15, 16, 23, 42};
, eu tokenizo essencialmente a string com esta função:Onde:
i
é a sequência de entrada (achar*
)t
é o deslocamento da localização do ponteiro dei
x
é o realint
analisado da sequêncian
é o total de caracteres consumidos, incluindo o dígito encontradoA
sscanf()
cadeia de formato significa isso:Se você visualizar a sequência de entrada como uma matriz de caracteres:
com o local
int
4
no índice 13,8
no índice 16 e assim por diante, é assim que o resultado de cada execução no loop se parece:fonte
o
dentro do sprintf, via%s
. Isso deve raspar cerca de 7 caracteres.C,
195180 bytesOriginal de 195 bytes:
golfed:
ungolfed:
Os dois atalhos estão usando o
m
modificador para fazer com que os scanfs%s
aloquem sua própria memória (salva declarando matrizes de caracteres) e usandostrtok
(que também está disponível por padrão, sem inclusões) para executar a parte de análise de número.Atualização de 180 bytes:
ungolfed:
Usa a idéia de bnf679 de anexar a uma string para evitar ter que contar vírgulas.
fonte
Python 3.6 (pré-lançamento), 133
Faz uso pesado de strings .
Versão não destruída:
fonte
Ruby,
1271101089988 bytesFunção anônima com um único argumento como entrada.Programa completo, lê a entrada do STDIN. (Se você canalizar um arquivo, a nova linha à direita é opcional.)RetornaImprime a sequência de saída.O @TimmyD se gabou de sua solução, superando todos os outros não-esolangs como um desafio e, finalmente, superou a (no momento da redação) da solução Powershell de 114 bytes que eles haviam publicado.
O truque de Cᴏɴᴏʀ O'Bʀɪᴇɴ com divisão]
e emenda do segundo tempo para ajudar os números.Preciso usar mais o operador splat. É tão útil!
Emprestado um truque da resposta JavaScript ES6 do @ Neil para economizar mais bytes pesquisando palavras em vez de usar
gsub
esplit
..fonte
05AB1E ,
525047 bytesCódigo:
Usos a codificação CP-1252 . Experimente online! .
fonte
JavaScript (ES6), 100 bytes
Como apenas as palavras são importantes, isso funciona apenas combinando todas as palavras da sequência original, além de sinais de menos, e criando o resultado. (Eu originalmente pensei que iria usar,
replace
mas isso acabou sendo um arenque vermelho.)fonte
[t,n,...m]
quase uma visão místicaPitão -
5350464544 bytes2 bytes salvos graças a @FryAmTheEggman.
Conjunto de Teste .
fonte
Pip ,
4847 bytesPega a entrada de stdin e imprime em stdout.
Explicação
Tl; dr: faz uma substituição de regex, usando grupos de captura e uma função de retorno de chamada para construir o resultado.
A
q
variável especial lê uma linha de entrada. O regex é(\S+)(. = ).(.+)}
, que corresponde a tudo, exceto o tipo (incluindo o espaço à direita) e o ponto e vírgula final. Usando o primeiro exemplo da questão, os grupos de captura obterfoo[
,] =
e4, 8, 15, 16, 23, 42
.A substituição é o valor de retorno da função sem nome
{[b#Yd^k']';.n.b.,#y.c.y]}
, chamada com toda a correspondência mais os grupos de captura como argumentos. Assim, dentro da função,b
obtém o grupo de captura 1,c
obtém o grupo 2 ed
obtém o grupo 3.Nós construímos uma lista, os três primeiros itens dos quais serão
"foo["
,6
, e"]"
. Para obter6
isso, dividimosd
a variável internak
=", "
,Y
ank a lista resultante de números inteiros nay
variável para uso futuro e pegamos o comprimento (#
).']
é um caractere literal.O que resta é construir uma série de seqüências de caracteres do formulário
";\nfoo[i] = x"
. Para fazê-lo, nós concatenar o seguinte:';
,n
(um built-in de nova linha),b
(1º grupo de captura),,#y
(equivalente a Pythonrange(len(y))
),c
(2º grupo de captura), ey
. A concatenação funciona itemwise em listas e intervalos, portanto, o resultado é uma lista de cadeias. Juntando tudo, o valor de retorno da função será uma lista como esta:Como essa lista está sendo usada em um
R
posicionamento de cadeia , ela é convertida implicitamente em uma cadeia. A conversão padrão de lista em string no Pip está concatenando todos os elementos:Por fim, o resultado (incluindo o tipo e o ponto e vírgula final, que não foram correspondidos pelo regex e, portanto, permanecem inalterados) é impresso automaticamente.
fonte
Perl 5.10,
73726866 + 1 (para a opção -n) = 67 bytesEsse é um bom desafio para o Perl e o menor entre os idiomas de uso geral até agora. Equivalente a
fonte
PowerShell v2 +,
114105 bytesPega a string de entrada
$args
e-replace
coloca o colchete sem nada, depois executa um-split
espaço em branco. Armazenamos o primeiro bit em$a
, o segundo bit em$b
, o=
into$c
e os elementos da matriz em$d
. Para o exemplo abaixo, isso armazenafoo
dentro$a
ebar
dentro de$b
toda a matriz$d
.Em seguida, produzimos nossa primeira linha com
"$a ..."
e no meio a transformação$d
de uma matriz de strings de forma{1,
,2,
...100};
para uma matriz int regular-join
, juntando-a em uma string e executando-aiex
duas vezes (semelhante aeval
). Armazenamos a matriz resultante novamente$d
antes de chamar o.length
método para preencher o número apropriado entre os[]
na linha de saída.Em seguida, enviamos
$d
um loop com|%{...}
. Cada iteração é gerada"$b..."
com uma variável de contador$i
encapsulada entre colchetes e o valor atual$_
. A$i
variável começa não inicializada (equivalente a$null
), mas a++
converterá emint
antes da saída, para que inicie a saída às0
, antes de incrementar$i
para a próxima iteração do loop.Todas as linhas de saída são deixadas no pipeline e a saída para o terminal está implícita na finalização do programa.
Exemplo
fonte
C,
278280 bytesgolfed:
ungolfed:
Enquanto trabalhava nisso, alguém postou uma versão mais curta usando o sscanf para a análise, em vez de usar ponteiros de dados ... uma ótima!
ATUALIZAÇÃO: Espaços ausentes localizados ao redor dos iguais na impressão do elemento, link online do IDE: http://ideone.com/KrgRt0 . Observe que esta implementação suporta números negativos ...
fonte
Awk, 101 bytes
Mais facilmente:
-
. Portanto, os campos seriam o nome do tipo, o nome da variável e os números.};
). Portanto, o tamanho da matriz éNF - 3
.FS
ao invocar o awk (using-F
) ou em umBEGIN
bloco. No interesse da brevidade,….fonte
FS
deve ser atribuído tanto noBEGIN
ou utilizar-F
de outra forma ele não será usado para dividir a primeira linha, e uma vez que há apenas 1 linha 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 é de 102 bytes sem contarawk
. Hummm. Posso excluir as aspas?C+O bytes
ondeC
eO
representa os bytes do código e das opções, respectivamente. É claro que geralmente uso apenas umBEGIN
bloco, então não preciso pensar nisso. : pJavaScript ES6,
134132130129 bytesGuardado 1 byte graças a Neil.
fonte
`[${i}] = `+t+";"
ser`[${i}] = ${t};`
?bash,
133129 bytesPrimeira tentativa, com certeza é possível diminuí-la.
fonte
D,
197, 188 bytesou ungolfed:
fonte
Julia,
154134101 bytesEsta é uma função que aceita uma sequência e retorna uma sequência com uma única nova linha à direita.
Ungolfed:
Definimos
c
como uma matriz de correspondências da entrada na expressão regular-?\w+
. Ele abrange o tipo, nome da matriz e cada valor. Armazenamosn
como o comprimento dec
- 2, que é o número de valores. A saída é construída como o tipo, nome e sequência de comprimento interpolados, combinados com cada linha de definição separada por novas linhas. Por qualquer motivo,c[]
é o mesmo quec[1]
.Economizou 32 bytes com a ajuda de Dennis!
fonte
Python 2, 159 bytes
Experimente online
Obrigado Kevin Lau por algumas sugestões de golfe
fonte
Python 3, 116 bytes
Divide a entrada no tipo, nome e lista de números. Depois de imprimir a declaração da matriz, imprime os elementos enumerando manualmente os números, removendo o excesso de pontuação anexada ao primeiro e ao último.
Uma abordagem diferente no Python 2 chegou a 122 bytes:
A idéia é
eval
listar os números como uma tupla, com uma vírgula no final, para que um único número seja reconhecido como um tipo. A lista enumerada de números fornece tuplas para o formato de sequência.fonte
PHP, 143 bytes
Golfe
Ungolfed
A entrada é obtida através do argumento da linha de comandos. Amostra:
Saída:
fonte
MATL ,
686458 bytesIsso não é C,
mas usa aNah, que estava desperdiçando 4 bytes.sprintf
função semelhante a CExperimente online!
fonte
Clojure, 115 bytes
Eu não era capaz de bem fundir
awful_array_name[5];
eawful_array_name[0] = 7;
peças de modo que eles re-utilização de código: /fonte