EDITAR Modifiqué la redacción de las reglas para hacer que algunas cosas implícitas fueran más explícitas. También agregué énfasis para aclarar algunos puntos de aparente confusión, y definí explícitamente la opción de hacer un programa independiente en lugar de una función.
El objetivo aquí es hacer una función que tome un archivo de texto (o cadena) y lo transponga para que las líneas se conviertan en columnas y viceversa.
Ejemplo:
Soy un texto Transpórtame ¿Puedes hacerlo?
Resultados en:
ITC real academia de bellas artes aan Minnesota sy apo UNED ts eed xo tm .ei .t ?
Las normas:
- Se le permite asumir que los únicos espacios en blanco son utilizados
" "
y"\n"
y que no hay espacios en blanco finales en cualquier línea. - Puede suponer que el archivo es ASCII. El marcador de línea final que desea utilizar depende de usted (CRLF o LF). Debe funcionar correctamente en el ejemplo, pero también debe funcionar en cualquier entrada que satisfaga los supuestos anteriores.
- Puede que tenga que insertar espacios (como en el ejemplo) donde no había ninguno para mantener las columnas en línea.
- Su resultado no debe tener espacios en blanco al final de ninguna línea .
- El carácter de nueva línea final (para la última línea) es opcional.
- Debe ser una función o un programa completo. Si su función acepta una cadena, debería devolver los resultados como una cadena. Si acepta un nombre de archivo, devuelve el nombre del archivo donde guardó el resultado. Además, puede escribir un programa completo que acepte la entrada de STDIN y envíe el resultado correcto a STDOUT; si lo hace, debe no producir una salida a stderr.
- El procedimiento más corto gana, pero votaré cualquier respuesta que me guste.
Según las reglas, la salida en el ejemplo tiene 53 o 52 bytes de longitud (para las nuevas líneas LF) dependiendo de si la nueva línea final está incluida o no.
Nota: No es un requisito específico, pero si su función, cuando se ejecuta dos veces sucesivamente, no es idéntica a la original (la nueva línea final puede ser diferente y se eliminarán las líneas vacías al final del archivo) probablemente rompiendo una de las reglas.
Respuestas:
Japt , 6 bytes
Pruébelo
Ejecútelo dos veces : devuelve la cadena original
Explicación
Transponer la entrada
Mapa sobre cada línea
Recortar a la derecha
fuente
J (
3140)Esta es una función que toma una cadena y devuelve una cadena (es decir, un vector de caracteres con saltos de línea insertados en los lugares correctos, y no una matriz).
Editar: sin espacios en blanco finales en ninguna línea.
Prueba:
fuente
?\n
.cut
odlb
de forma predeterminada, y escribirlos yo mismo toma muchos caracteres incluso en APL.Ruby 111
Golfizado:
Sin golf:
Ruby tiene una función de transposición de matriz, por lo que esto simplemente rellena las líneas, las convierte en una matriz de caracteres, usa la función de transposición Ruby Array #, luego convierte la matriz de caracteres nuevamente en líneas.
Jugar al golf fue simplemente usar identificadores de un solo carácter, eliminar espacios, usar un temporario para text.lines y poner el cálculo para max_length en línea (no hay puntos para la eficiencia).
fuente
"\n"
con?\n
..to_a
es superfluo. Puedes ganar otros 5 personajes allí.R, 171
Ejemplo de uso:
Se elimina el espacio en blanco al final.
fuente
Python 2.7 (
97799490)EDITAR: se perdió el requisito de función;
Estoy bastante seguro de que esto mejorará ya que soy una especie de principiante aquí, pero para empezar;
El código utiliza un simple
split
para dividir la cadena en un vector de filas. Luego se usamap
con un valor de función comoNone
(la función de unidad) y el operador splat para transponer y rellenar el vector (funcionalidad similar azip_longest
Python3)El resto del código solo se asigna
None
al espacio, recorta y vuelve a ensamblar la matriz en una sola cadena.fuente
map
. Sigo buscando un lugar para usar eso ... y simplemente me ganaste. ;)Bash + coreutils + sed, 83
fold
ypaste
hacer el trabajo importante. El resto es solo formatear.Acepta entradas de stdin y salidas a stdout:
fuente
C (278 bytes)
Editar: esto realmente rompe las reglas, ya que toma un nombre de archivo como argumento pero escribe en stdout. Lo editaré más tarde para escribir en un archivo y luego imprimiré el nombre del archivo en stdout.
Este es mi primer código de golf, así que ten piedad. Algunos viejos y simples C. ¡Coloca la entrada
test.txt
y déjala correr!clang transpose.c -o transpose && ./transpose test.txt
Mediante el uso de nombres de variables cortos, eliminando el formato gratuito y permitiendo que se filtren los identificadores de archivos, y deshabilitando todas las advertencias, esto se reduce a 278 bytes. (Dado que esto utiliza importaciones implícitas, es posible que no se vincule correctamente en todos los sistemas. ¡Funciona en mi máquina!)
fuente
int
para acortar algunas de sus declaraciones, ¿o es ilegal ahora?A,B,D,I,J,*F
como variables globales, para evitarint
palabras clave. Del mismo modo, puede eliminarint
de lamain
declaración y elC
argumento. EnC
,int
es opcional en muchos lugares.AutoHotkey 210
Prueba
fuente
Ruby: 88 caracteres
(Publicado porque es más corto que las otras soluciones de Ruby. No se verificó si mi código introduce algo nuevo en comparación con esos. Si ya publicó una solución de Ruby y siente que es principalmente una copia suya, por favor comente y retiraré mi respuesta. )
Ejecución de muestra:
fuente
Bash, 124 bytes
Lee la entrada estándar y escribe la salida estándar. Intentalo:
Cómo funciona:
split
entrada en líneas individuales (archivos en directorio temporal$D
)grep
(archivos * +)paste
(columnas separadas por TAB)sed
Editar:
;rm -r $D
(gracias Tim)+
lugar de_
como sufijo y acortar${F}_
a$F+
L
de los archivos de resultados divididosfuente
rm
bit de tu cuenta de personaje.Ruby - 144 caracteres
Aquí está mi primer intento, golfizado:
Para la salida, ejecute
puts f text
dondetext
está cualquier cadena de varias líneas que cumpla con las reglas anteriores. La versión sin golf es la siguiente:Para obtener una solución similar, pero en última instancia mejor en Ruby, consulte el código de Wayne Conrad anterior.
fuente
transpose
de su respuesta antes de escribir la mía. No me parece bastante kosher haber reescrito esencialmente su respuesta, solo un poco mejor. :(transpose
, es posible que una mejor solución de Ruby no hubiera aparecido. Una de las cosas que más me gusta de la programación es la voluntad de colaborar y polinizar ideas. Hasta que nos volvamos a ver, amable señor. ¡Aclamaciones!PHP 194
No golfizado:
Este es mi primer intento de golf, ¡así que por favor sea amable! Además, los consejos / sugerencias serán muy apreciados.
fuente
"
s alrededor"trim"
. php dará una advertencia, pero funciona bien.@
para suprimir advertencias.MATHEMATICA 117 caracteres
fuente
f
! .. tksPerl (92 + 1)
lee stdin y escribe en stdout. sumando 1 al puntaje por
say
fuente
CJam,
3225 bytesCJam es más nuevo que este desafío, por lo que esta respuesta no es elegible para ser aceptada.
Reducido considerablemente por el usuario 23013.
Pruébalo aquí.
fuente
Javascript, 103
Menos golf
Prueba
fuente
Retina , 40 bytes
Pruébalo en línea!
Basado en este programa que creé para transponer cualquier tamaño de rectángulo, que utiliza la sugerencia de Leo para transponer un rectángulo de un tamaño conocido.
Editar: Golf más y ya no tiene espacios finales en las líneas.
fuente
Perl 5 , 25 bytes
Tenga en cuenta que esto usa secuencias de escape ANSI y, como tal, no funciona en TIO, sin embargo, puede verlo en acción aquí .
Explicación
Este código primero cambia el valor del separador de lista (
$"
) para que sea una pestaña vertical, seguido de la secuencia de escape ANSI para 'ir hacia atrás 1 columna' (\x1b[1D
), luego configuramos la variable impresa implícitamente$_
como una cadena que comienza con la secuencia de escape ANSI para 'comenzar a imprimir en la columna de la línea 1$.
(donde$.
está la línea de texto actual)' (\x1b1;$.H
) e interpola la lista@F
(que es una lista de todos los caracteres en esa línea, poblada por autosplit (-a
) con un patrón de división vacío (-F
)) que coloca el contenido de$"
entre cada elemento, moviendo el cursor verticalmente hacia abajo en lugar de continuar la salida después del carácter anterior.Pruébalo en línea!
fuente
C ++ (243 caracteres)
Aquí hay una función que toma y devuelve una cadena.
Podría haber afeitado un par de docenas de caracteres, pero decidí mantenerlo como código no estúpido (funciona rápido, se lee bien). Tal vez solo decidí hacer eso porque este es mi primer código de golf ... Todavía no soy lo suficientemente duro :)
Con formateo:
fuente
using namespace std;
.using namespace std;
debería agregarse al recuento de caracteres.Python 2.7 - 115 caracteres :
un trazador de líneas:
y en una impresión más limpia:
en 115 caracteres:
fuente
\n
se consideralen
un solo personaje, pero son dos :)\n
es uno. Entonces digo que uno está bien.len("\n")
mostrará 1, aunque ciertamente son 2 caracteres separados en el código fuente. Guardar la fuente en un archivo hará quels
aparezca 116. Solo decir que esalen
no es la mejor manera de medir el tamaño del código debido a que los caracteres de escape se procesan antes de medir :)GolfScript, 51 caracteres
Este es un primer intento; Sospecho que se puede mejorar. La mayor parte del código es para cumplir con los requisitos de eliminación de espacio libre y relleno; sin ellos,
n%zip n*
sería suficiente.PD. La siguiente versión de 46 caracteres hará el trabajo para la entrada de muestra dada, pero se bloqueará si alguna columna de entrada consta completamente de espacios:
Supongo que es suficiente para descalificarlo, incluso si el desafío no lo dice explícitamente.
fuente
Esquema / Raqueta 113
El texto:
Sin nuevas líneas y espacios en blanco adicionales:
La versión fácil de usar.
fuente
Haskell
Fue tan corto que necesitaba agregar espacios en blanco ...
fuente
I am a text..?
Transpose met
Can you do i
.Python
89103 caracteresMe siento sucio
90104 caracteres para la versión industrial de la fuerza. : ^)fuente
Mathematica, 95 caracteres
fuente
K, 56
Esto debería cumplir con las especificaciones ahora.
Acepta una cadena, devuelve una cadena.
.
fuente
{`/:x@'/:!max@#:'x:`\:x}
para el 26.Groovy, 98 caracteres
en línea
sin golf:
fuente
Pyth , 11 bytes
Pruébalo en línea!
Toma la entrada como una cadena, genera una lista de listas
Pyth , 25 bytes
Toma la entrada como una cadena, emite una cadena.
Pruébalo en línea!
fuente
J,
2826 bytesGuardado 2 bytes gracias a frownyfrog
Toma una cadena, devuelve una cadena. No estoy seguro de si podría usar una versión más corta del verbo de
función'cutopen' .También está el más corto
Pero no estoy seguro de que esté dentro de las pautas del OP, ya que devuelve una serie de caracteres.
Cómo funciona:
La otra versión funciona igual, pero no convierte la matriz transpuesta en una cadena con el formato adecuado.
Ejemplos:
fuente
cutLF
.0|:>@cutLF
Lua ,
203189 bytesPruébalo en línea!
Vi otra solución Lua aquí, pero no creo que haya un problema al publicar 2 soluciones en el mismo idioma. Si hay, dime :)
fuente