Visão geral:
Seu trabalho é pegar a entrada CSV no key=value
formato e alinhá-la de uma maneira mais organizada (veja abaixo).
Entrada:
Sempre via stdin . Os registros sempre estarão no seguinte formato key=value
:
foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
- Não haverá lista de chaves possíveis com antecedência, você deve encontrá-las no texto de entrada.
- O fim da entrada será sinalizado por
EOF
qualquer implementaçãoEOF
apropriada para o seu sistema operacional.
Resultado:
A primeira linha da sua saída será uma lista de todas as chaves, em ordem alfabética (mesmo que as chaves sejam todos números). Depois disso, imprima cada registro no mesmo formato CSV no cabeçalho do número apropriado, sem as teclas listadas. Portanto, para o exemplo acima, a saída correta seria:
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
PERGUNTAS FREQUENTES:
- Preciso me preocupar com entradas formatadas incorretamente?
- Não. O seu programa pode fazer o que quiser (lançar uma exceção, ignorar etc.) se a entrada não estiver formatada corretamente, por exemplo, uma linha de
foo,bar,baz
- Não. O seu programa pode fazer o que quiser (lançar uma exceção, ignorar etc.) se a entrada não estiver formatada corretamente, por exemplo, uma linha de
- Como lidar com caracteres especiais de escape?
- Você pode assumir que não haverá dados adicionais
,
ou=
nos dados que não fazem parte dokey=value
formato."
não tem nenhum significado especial neste concurso (mesmo que tenha no CSV tradicional).também não é especial de forma alguma.
- As linhas devem corresponder à seguinte regex:
^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
- Portanto, chaves e valores corresponderão
[^=,]+
- Portanto, chaves e valores corresponderão
- Você pode assumir que não haverá dados adicionais
- E quanto a
CRLF
vs.LF
?- Você pode escolher qualquer delimitador apropriado para sua plataforma. A maioria dos idiomas lida com isso sem código delimitante especial.
- Preciso imprimir vírgulas à direita se as últimas colunas não existirem?
- Sim. Veja o exemplo.
- Analisadores CSV ou outras ferramentas externas semelhantes são permitidos?
- Não. Você deve analisar os dados você mesmo.
Respostas:
GolfScript, 64 caracteres
O código é uma implementação direta no GolfScript, você pode testar o exemplo online .
Código anotado:
fonte
Perl 6: 119 caracteres, 120 bytes
De-golfe:
fonte
perl, 129/121
129 bytes, sem opções de linha de comando:
Como @Dennis aponta abaixo, você pode obter isso para 120 + 1 = 121 usando -n:
Basicamente, para cada linha, dividimos por vírgulas para obter a lista de pares. Para cada par, dividimos pelo sinal de igual para obter a chave e o valor. Definimos o par chave / valor em% h e um hashref local. O primeiro é usado para determinar a lista de chaves. O último é usado para lembrar os valores para esta linha.
fonte
-n
opção em vez defor(<>){...}
. 2. Dividir ao[, ]
invés de usarchomp
. 3. Omitindo o ponto-e-vírgula após os colchetes.while (<>) { ... }
todo o script, então não há necessidade de um bloco END. Basta removerfor(<>){
no início e}
no final do script.}
o final do script, não o correspondente aofor
loop. Além disso, você pode salvar mais um caractere usando uma nova linha real em vez de\n
.JavaScript ( ES5 )
191183179168 bytesSupondo que o código seja executado na linha de comando spidermonkey:
Resultado:
Esse calço pode ser usado em um navegador para simular o spidermonkey
readline
eprint
:Ungolfed:
fonte
alert
no lugar deconsole.log
e salvar alguns bytes assim.readline
eprint
para stdin real / outBash + coreutils,
188138 bytesResultado:
fonte
Haskell,
357334g
está fazendo a análise - divide a entrada em linhas e mapeia cada linha para uma lista de(key,value)
pares.k
, concatenando todas as chaves em uma lista e removendo duplicatas, cria uma lista com todas as chaves exclusivas que posso usar posteriormente para classificar. Eu faço isso criando um "Set" dentromain
(m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]
) para cada linha e, em seguida, pegando cada(key,value)
par de uma linha e colocando-o onde ele pertence na lista (foldl
). A linha 1 do exemplo produz[("abc",""),("baz","quux"),("foo","bar"),("zxc","")]
, concatenada em uma única String (",quux,bar,"
), concatenada com as outras linhas e impressa.fonte
Python 2.7 - 242 bytes
bleh
Observe que a segunda camada de recuo é um caractere de tabulação único, e não quatro espaços como SE o renderiza.
Ungolfed:
fonte
Python 3:
200195192189187fonte
k4 (40? 51? 70? 46?)
a expressão básica é
isso aceita e retorna uma lista de strings
para corresponder às especificações, poderíamos fazer interativamente
que aceita a entrada de stdin e imprime a saída em stdout
para um aplicativo independente que aceita entrada de um canal, poderíamos fazer o seguinte:
embora você queira considerar meu invólucro k-as-filter preexistente, awq.k, como uma ferramenta aceitável para esse tipo de quebra-cabeça, podemos fazer o seguinte:
que tem 46 caracteres ou 40, dependendo de como você conta a disputa entre aspas
fonte
q
comando? Éawq.k
publicado em algum lugar?C # - 369
(em LINQPAD)
Ungolfed
Entrada da cadeia de teste
Resultado
fonte
CRLF
vs.LF
perguntas frequentes) Infelizmente, não tenho uma cópia do Visual Studio para testar.