Visión general:
Su trabajo es tomar la entrada CSV en key=value
formato y alinearla de una manera más organizada (ver más abajo).
Entrada:
Siempre a través de stdin . Los registros siempre estarán en la siguiente forma key=value
:
foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
- No habrá una lista de posibles claves por adelantado, debe encontrarlas en el texto de entrada.
- El final de la entrada se indicará mediante
EOF
cualquier implementación queEOF
sea apropiada para su sistema operativo.
Salida:
La primera fila de su salida será una lista de todas las teclas, en orden alfabético (incluso si las teclas son todas números). Después de eso, imprima cada registro en el mismo formato CSV con el encabezado de número apropiado, sin las teclas enumeradas. Entonces, para el ejemplo anterior, la salida correcta sería:
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
PREGUNTAS MÁS FRECUENTES:
- ¿Tengo que preocuparme por una entrada con formato incorrecto?
- No. Su programa puede hacer lo que quiera (lanzar una excepción, ignorar, etc.) si la entrada no está formateada correctamente, por ejemplo, una línea de
foo,bar,baz
- No. Su programa puede hacer lo que quiera (lanzar una excepción, ignorar, etc.) si la entrada no está formateada correctamente, por ejemplo, una línea de
- ¿Cómo manejo los caracteres especiales de escape?
- Puede suponer que no habrá datos adicionales
,
o=
en los datos que no sean parte delkey=value
formato."
no tiene ningún significado especial en este concurso (aunque sí lo tiene en el CSV tradicional).Tampoco es especial de ninguna manera.
- Las líneas deben coincidir con la siguiente expresión regular:
^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
- Por lo tanto, las claves y los valores coincidirán
[^=,]+
- Por lo tanto, las claves y los valores coincidirán
- Puede suponer que no habrá datos adicionales
- ¿Qué hay de
CRLF
frenteLF
?- Puede elegir el delimitador que sea apropiado para su plataforma. La mayoría de los idiomas manejan esto sin un código de delimitación especial.
- ¿Necesito imprimir comas finales si las últimas columnas no existen?
- Si. Mira el ejemplo.
- ¿Están permitidos los analizadores CSV u otras herramientas externas similares?
- No. Debe analizar los datos usted mismo.
Respuestas:
GolfScript, 64 caracteres
El código es una implementación sencilla en GolfScript, puede probar el ejemplo en línea .
Código anotado:
fuente
Perl 6: 119 caracteres, 120 bytes
De-golf:
fuente
perl, 129/121
129 bytes, sin interruptores de línea de comando:
Como @Dennis señala a continuación, puede obtener esto a 120 + 1 = 121 utilizando -n:
Básicamente, para cada línea, nos dividimos por comas para obtener la lista de pares. Para cada par, nos dividimos por el signo igual para obtener la clave y el valor. Establecemos el par clave / valor en% h y un hashref local. El primero se usa para determinar la lista de claves. Este último se usa para recordar los valores de esta línea.
fuente
-n
interruptor en lugar defor(<>){...}
. 2. Dividir en[, ]
lugar de usarchomp
. 3. Omitiendo el punto y coma después de las llaves.while (<>) { ... }
todo el script, por lo que no hay necesidad de un bloque END. Simplemente eliminefor(<>){
al principio y}
al final del guión.}
al final del script, no el que corresponde alfor
bucle. Además, puede guardar un carácter más utilizando una nueva línea real en lugar de\n
.JavaScript ( ES5 )
191183179168 bytesSuponiendo que el código se ejecuta en la línea de comando de spidermonkey:
Resultado:
Esta cuña se puede usar en un navegador para simular spidermonkey
readline
yprint
:Sin golf:
fuente
alert
en lugar deconsole.log
y guardar algunos bytes así.readline
yprint
para stdin / out realBash + coreutils,
188138 bytesSalida:
fuente
Haskell,
357334g
está haciendo el análisis: divide la entrada en líneas y asigna cada línea a una lista de(key,value)
pares.k
, al concatenar todas las claves en una lista y eliminar duplicados, crea una lista con todas las claves únicas que luego puedo usar para ordenar. Hago esto creando un "Conjunto" dentromain
(m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]
) para cada línea, y luego tomando cada(key,value)
par de una línea y colocándolo donde pertenece en la lista (foldl
). La línea 1 del ejemplo produce[("abc",""),("baz","quux"),("foo","bar"),("zxc","")]
, que concateno en una sola Cadena (",quux,bar,"
), concatena con las otras líneas e imprimo.fuente
Python 2.7 - 242 bytes
bleh
Tenga en cuenta que la segunda capa de sangría es un solo carácter de tabulación, no cuatro espacios como SE lo representa.
Sin golf:
fuente
Python 3:
200195192189187fuente
k4 (40? 51? 70? 46?)
la expresión básica es
esto acepta y devuelve una lista de cadenas
para que coincida con la especificación, podríamos hacer interactivamente
que acepta la entrada de stdin e imprime la salida en stdout
para una aplicación independiente que acepte la entrada de una tubería, podríamos hacer esto:
aunque si está dispuesto a considerar mi envoltorio k-como-filtro preexistente, awq.k, como una herramienta aceptable para este tipo de rompecabezas, entonces podemos hacer esto:
que tiene 46 caracteres o 40, dependiendo de cómo cuente las disputas entre comillas
fuente
q
¿mando? ¿Seawq.k
publica en alguna parte?C # - 369
(en LINQPAD)
Sin golf
Prueba de entrada de cadena
Salida
fuente
CRLF
vs.LF
Preguntas frecuentes) Desafortunadamente no tengo una copia de Visual Studio para probar.