Meu colega de trabalho, Jimmy , é meio novo no C / C ++. Ele também é um tipo de aluno lento. Agora, para ser justo, seu código sempre compila, mas ele tem alguns hábitos realmente desleixados. Por exemplo, todo mundo sabe que você pode definir uma matriz como esta:
int spam[] = {4, 8, 15, 16, 23, 42};
Todo mundo que é, exceto Jimmy. Ele está convencido de que a única maneira de criar uma matriz é assim:
int spam[6];
spam[0] = 4;
spam[1] = 8;
spam[2] = 15;
spam[3] = 16;
spam[4] = 23;
spam[5] = 42;
Eu continuo consertando isso para ele na revisão de código, mas ele não aprende. Então, preciso que você escreva uma ferramenta que faça isso automaticamente por ele quando ele cometer¹.
O desafio
Quero que você escreva um programa completo ou uma função que aceite uma seqüência de linhas múltiplas como entrada e produza a versão mais compacta da matriz C. A entrada sempre seguirá este formato, incluindo o espaço em branco:
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;
Em suma, a entrada será sempre válida e bem definida C. Mais detalhadamente:
Todos os identificadores serão compostos apenas de letras e sublinhados. O comprimento sempre será pelo menos um e nunca haverá índices ausentes ou fora dos limites. Você também pode assumir que os índices estão em ordem. Por exemplo:
foo bar[3];
bar[0] = 1
bar[2] = 9;
foo bar[1];
bar[0] = 1;
bar[1] = 3;
e
foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3
são todas entradas inválidas e podem causar um comportamento indefinido no seu envio. Você também pode assumir que todos os números serão números decimais válidos, negativos ou positivos. A entrada não terá espaços estranhos. A saída deve sempre seguir este formato, incluindo o espaço em branco:
identifier_one identifier_two[] = {n1, n2, n3, ...};
Aqui estão alguns dados de amostra:
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};
Você pode levar sua entrada e saída em qualquer formato razoável, como STDIN / STDOUT, argumentos de função e valor de retorno, leitura e gravação de arquivos etc. Lacunas padrão se aplicam. A resposta mais curta em bytes vence!
Isso é agressivo-passivo e uma péssima idéia. Você não recebeu essa ideia de mim.
Respostas:
Vim,
4336 bytesVocê não precisa fornecer um script para Jimmy, apenas ensine-o a usar um editor de texto adequado. (retornos literais para maior clareza)
fonte
<C-a>
é menor quet]
, o que é um pequeno truque divertido. Além disso, acho que você tecnicamente precisa de 2,<cr>
pois pede confirmação.norm df=
é mais curto ques/.*=//g
3wC] = {<esc>
é menor que<C-a>di]$s = {<esc>
.CJam,
4336 bytesExemplo Online
Explicação:
Um grande obrigado a Martin Ender pelas melhorias na minha primeira resposta CJam.
fonte
JavaScript (ES6),
656463 bytesfonte
Retina ,
3028 bytesA contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Explicação
Usaremos a seguinte entrada como exemplo:
Estágio 1
Observe que há um espaço à direita na primeira linha.
Começamos combinando um número seguido de
];
e um avanço de linha e, em seguida, tudo até o último espaço na próxima linha. Esta partida só pode ser encontrada no final da primeira linha (devido à];
). Tudo isso é substituído por] = {
. Ou seja, ele transforma nosso exemplo de entrada em:Etapa 2
Agora combinamos tudo, de um
;
até o=
na próxima linha e substituímos por um,
. Isso transforma a string em:Etapa 3
Tudo o que resta é fixar o final e fazemos isso substituindo o único restante
;
por};
:fonte
Julia,
112108105 BytesExplicação
Bytes salvos substituindo collect (eachmatch ()) por [eachmatch () ...] e por um regex menor
fonte
eachmatch
chamada de função para obter uma saída menos bonita e -1 byte. Eu nunca programei em Julia, mas você pode achar interessante este post: Dicas para jogar golfe em Julia . Mais uma vez bem-vindo e aproveite a sua estadia. :)matchall
provavelmente seria mais curto que o splattingeachmatch
.Lua, 121 bytes.
Explicado
fonte
Lote, 160 bytes
Nota: A linha
set s=,
termina com um espaço. Recebe entrada em STDIN. Essa linha estranha 3 recebe a entrada (por exemplo,int spam[6];
e muda[
para[] = {&rem
resultando naset s=int spam[] = {&rem 6];
qual, em seguida, é interpretada como duas instruçõesset s=int spam[] = {
erem 6];
a última delas é um comentário. Em seguida, para cada linha, excluímos o texto até o primeiro espaço (porque você pode use=
em um padrão e a correspondência não seja gananciosa) e extraia o valor.fonte
C, 121 bytes
fonte
Python
112111Muito direto para mim, por favor, sugira qualquer melhoria que vier à mente.
fonte
[:-1] for
.05AB1E ,
313028 bytesExplicação
Experimente online!
Guardou um byte graças a Adnan
fonte
žuDÀÀ
em vez de„[]„{}
salvar um byte :).Java 7,
159158149154 bytesVários bytes salvos graças a @cliffroot .
Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
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
o parâmetro e substituir o último caractere por"};");
vez de um"")+"};";
.Perl, 42 + 2 (
-0p
) = 44 bytesPrecisa
-p
e-0
sinalizadores para executar. Por exemplo :fonte
Gelatina , 27 bytes
Experimente online!
Explicação
fonte
sed 51
fonte
Java, 106 bytes
A manipulação de strings em Java é um inferno, como sempre.
Esta é uma resposta pura regex. Faça uma única concatenada
String
e executereplaceXxx
até que esteja tudo bem.Testando e não destruído:
fonte
Gelatina , 33 bytes
TryItOnline
Quão?
fonte
Ruby, 64 bytes
fonte
JavaScript, 125 bytes
Eu sei que é mais longo que os outros, mas eu realmente queria usar
eval
. Apenas por diversão.Para executar, cole o seguinte aqui :
fonte
Haxe, 234 bytes
Nomes de funções longos eliminaram isso: D
Experimente as caixas de teste aqui !
fonte
V ,
25, 24 bytesExperimente online! Isso contém um
<esc>
caractere não imprimível , então aqui está um hexdump:Explicação:
fonte