Inverta o método Format.
O Format
método da classe String (ou equivalente, como sprintf
) está disponível na maioria dos idiomas. Basicamente, é necessária uma string "Format" que pode conter espaços reservados com alguma formatação extra e zero ou mais valores a serem inseridos em vez desses espaços reservados.
Sua tarefa é implementar a função inversa no idioma de sua escolha.
API
O nome do método deve ser format1
ou deformat
.
Entrada : o 1º parâmetro será a string "Format", assim como no método de formato original. O segundo parâmetro será a string analisada (veja os exemplos abaixo). Nenhum outro parâmetro é necessário nem permitido.
Saída : uma matriz (ou o equivalente do idioma da sua escolha) de valores que foram extraídos correspondentemente com os espaços reservados no formato.
Os marcadores são {0}
, {1}
, {2}
, etc.
Em caso de formato incorreto, você pode gerar um erro ou retornar o que quiser.
Em caso de entrada inválida, você pode gerar um erro ou retornar o que quiser. Dados de entrada é de tal forma que não pode ser gerado por String utilizando a mesma cadeia de formato, por exemplo: '{0}{0}', 'AAB'
.
Exemplos
deformat('{0} {1}', 'hello world') => ['hello', 'world']
deformat('http{0}://', 'https://') => ['s']
deformat('http{0}://', 'http://') => [''] // array of one item which is an empty string
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
Ambiguidade
Em caso de ambiguidade, você pode retornar qualquer resposta adequada. Por exemplo:
deformat('{0} {1}', 'Edsger W. Dijkstra')
// both ['Edsger', 'W. Dijkstra'] and ['Edsger W.', 'Dijkstra'] are applicable.
Mais algumas regras
- Para facilitar, não há necessidade de oferecer suporte à formatação. Você pode esquecer tudo sobre zeros à esquerda, ponto decimal ou questões de arredondamento. Apenas gere os valores como strings.
- Para torná-lo não trivial, expressões regulares não são permitidas .
- Você não precisa cuidar de chaves na entrada (ou seja, 2 parâmetro de entrada não conterá quaisquer
{
s ou}
s).
Ganhando
Isso é código-golfe ! (deve ser lido como "This is Sparta!"): a função correta com o menor comprimento vence. As brechas padrão são proibidas.
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
, e se tivéssemos recebidodeformat('{0}{1}{0}', 'AAAA')
?['', 'AAAA']
,['A', 'AA']
,['AA', '']
deformat('{0}{1}{0}', 'ABBA') => ['', 'ABBA']
? Nesse caso, existe uma solução barata, a menos que cada string apareça pelo menos duas vezes.deformat('{0}_{1}_{0}', 'A_BB_A')
?Respostas:
Haskell, 220 caracteres
Quebras se você usar várias representações para o mesmo padrão (
{1}
vs{01}
) - não impõe sua igualdade, descartando correspondências para todas, exceto uma representação.Podem ser salvos 19 caracteres omitindo
mapKeys((0+).read)$
se a ordenação adequada de correspondências acima de 10 padrões não importa, ou se for necessário o preenchimento com o mesmo comprimento, ou se a ordenação de sequência de padrões é aceitável. De qualquer forma, se um padrão for omitido no primeiro argumento, ele também será omitido no resultado.Remover
!!0
do finalformat1
devolve a lista de todas as soluções, e não apenas a primeira.antes de jogar golfe:
fonte
read
deixa você com um tipo ambíguo. Haskell não sabe que tipo ordenável deve ler as chaves.+0
força um número, do qual Haskell já é capaz de fazer uma escolha arbitrária e usa números inteiros.Ruby, 312 caracteres
É possível salvar cinco caracteres preferindo correspondências de comprimento zero, criando a
ABBA
solução['', 'ABBA']
, em vez da solução preferida da pergunta. Eu escolhi interpretar os exemplos como uma parte implícita da especificação.fonte
Python, 208 caracteres, embora incompleto.
A função varre as duas seqüências simultaneamente, até encontrar uma chave de abertura na sequência de entrada, significando um espaço reservado.
Em seguida, ele assume que o espaço reservado já foi expandido e tenta avançar o índice da sequência de saída além dele, procurando na lista de valores encontrados até agora.
Se não tiver sido expandido, ele adiciona uma nova entrada à lista de valores e começa a adicionar caracteres da sequência de saída até atingir o caractere após o espaço reservado na sequência de entrada.
Quando chega ao final da string de entrada, ele retorna os valores encontrados até o momento.
Funciona bem para entradas simples, mas possui vários problemas:
Ele requer um delimitador conhecido após cada espaço reservado na entrada, para que não funcione com espaços reservados próximos um do outro, por exemplo, "{0} {1}". É por isso que eu precisei acrescentar um caractere de espaço às duas strings.
Ele assume que as primeiras instâncias de cada espaço reservado estão em ordem, por exemplo, "{ 0 } { 1 } {1} {0} { 2 }".
Ele funciona apenas para os 10 primeiros marcadores de posição, pois pressupõe que todos os três caracteres sejam longos.
Ele não lida com casos ambíguos :(
fonte
Código C ++ 11, 386 caracteres
A função format1 possui 2 strings como entrada (const char *) e retorna um hashmap com as teclas número inteiro (o padrão) e value é a string identificada. Se nada for encontrado ou algum erro, um hashmap vazio será retornado.
Uso:
Resultado:
Exemplo 2:
Resultado:
Os padrões estão em representação decimal, entradas maiores do que
MAXINT
excederão, mas ainda funcionam.Embora existam soluções menores em outras linguagens de programação, este é o menor C ++ - ainda! :)
Este é o código antes de jogar golfe:
fonte