Entre la pregunta del gatito y ver esta pregunta en U&L sobre algo de sed
magia, ¿qué hay de implementar tac
?
Objetivo
Implemente un programa que invierta e imprima las líneas en un archivo.
Entrada
Un archivo, proporcionado como nombre o mediante entrada estándar
Salida
Las líneas, invertidas, a estándar.
Tanteo
Bytes de código fuente.
tac
es un poco extraño cuando se trata de avances de línea finales. Se transformaa\nb\n
(avance de línea final) enb\na\n
ya\nb
(sin avance de línea final) enba\n
. ¿Es así como se supone que debe comportarse nuestro código?tac
es solo cuestión de tiempo ...\n
.tac
invierte el orden de estas filas. Si\n
se elimina una del medio del archivo, la fila que terminó se une a la siguiente fila, pero en el caso de la última línea, no hay una fila siguiente a la que unirse.Respuestas:
GS2, 3 bytes
Los tres bytes son, en orden, líneas divididas, líneas inversas y unidas.
fuente
Perl, 11 bytes
Se comporta exactamente igual
tac
. Este código requiere el-p
interruptor, que he contado como 1 byte.Pruebas de funcionamiento
Cómo funciona
Como se explica aquí , el
-p
conmutador básicamente envuelvewhile (<>) { ... ; print }
el programa, por lo que el código fuente es equivalente aPara cada línea de entrada, anteponemos la línea actual (
$_
) a$\
(inicialmente indefinida), actualizando esta última con el resultado.Después de que se hayan procesado todas las líneas,
print
imprime el valor de la variable local$_
(indefinido en este ámbito), seguido del separador de registro de salida ($\
).fuente
-p
interruptor envuelve su código en un bucle que comienzawhile(<>){
y termina} continue { print }
, lo que permite filtrar la entrada simplemente modificando$_
.$\=$_.$\
antepone cada línea de entrada al terminador de registro de salida y}{
finaliza elwhile
bloque suministrado por Perl prematuramente, por lo que elcontinue
bloque ya no está conectado a él. Por lo tanto, todas las líneas de entrada se agregan$\
en orden inverso, luego al finalcontinue { print }
se ejecuta, imprimiendo "nada" ($_
será indefinido después del final de la entrada), pero con un terminador de$\
.Pyth, 4 bytes
.z
es la entrada separada por líneas como una lista, la_
invierte yj
une por un carácter, que por defecto es\n
.fuente
FlogScript , 2 bytes
(Pruébelo en el golf de anarquía ).
El modo
)
habilita--in-out-line-array
, y el resto del programa es"
, invirtiendo la matriz de líneas.fuente
Retina , 7 bytes
Con una sola expresión regular, Retina se ejecuta en modo Match. Esto normalmente solo imprime el número de coincidencias, pero con
!
esto lo configuramos para imprimir las coincidencias reales en su lugar (separadas por avances de línea).La expresión regular real es meramente
.*$
..*
coincide con cualquier línea (potencialmente vacía), porque.
puede coincidir con cualquier carácter, excepto los avances de línea. Llegaré al$
en un minuto.¿Cómo hacemos que imprima los partidos al revés? Al hacer uso del modo de coincidencia de derecha a izquierda de .NET, activado con
r
. Esto significa que el motor regex comienza al final de la cadena cuando busca coincidencias y funciona al revés.Finalmente,
m
hace que la$
coincidencia sea el final de una línea en lugar del final de la cadena. ¿Por qué necesitamos eso? El problema es que.*
genera coincidencias extrañas. Considere la sustitución de expresiones regularesaplicado a la entrada
baaababaa
. Pensarías que esto cederíabaaaxbaxbaax
, pero en realidad te dabaaaxxbaxxbaaxx
. ¿Por qué? Porque después de hacer coincidiraaa
el cursor del motor está entre ela
y elb
. Ahora ya no puede coincidir cona
s, peroa*
también está satisfecho con una cadena vacía. Esto significa que, después de cada partido, obtienes otro partido vacío.No queremos eso aquí, porque introduciría líneas vacías adicionales, por lo que descartamos esas coincidencias extrañas (que se encuentran al comienzo de las líneas, debido al modo de derecha a izquierda) al requerir que las coincidencias incluyan el final de la línea.
fuente
Haskell, 34 bytes
[editar]
Se guardó un byte reemplazándolo
unlines
conconcat
.fuente
CJam, 7 bytes
Lee stdin, imprime en stdout.
Explicación:
fuente
Pyth, 5 bytes
Esto invierte el orden de las líneas con un enfoque simple de división-unión inversa, pero no del todo similar a tac .
Pruébalo en línea.
fuente
Befunge-93, 17 bytes
Nada lujoso aquí; simplemente pon todo en la pila, luego sácalo.
fuente
Pure Bash (sin utilidades externas), 56
Esta es una de las pocas respuestas para hacer una
tac
emulación exacta , como se le preguntó en el comentario de Dennis :fuente
Ruby, 16 bytes
fuente
JavaScript (SpiderMonkey Shell), 38 bytes
Bastante simple
read()
lee un archivoreadline()
lee una cadena de STDIN[...str]
dividirá str en una serie de caracteresreverse()
revertirá la matrizjoin``
juntará la matriz en una cadenafuente
Python 2, 52 bytes
fuente
import sys;print sys.stdin.read()[::-1]
?C #,
179171 bytesLee líneas, colocándolas en una pila y luego las escribe al revés. Usaría Mathematica para esto, pero no tiene sentido de EOF.
fuente
sed, 9 bytes
No se necesita voto positivo, este es un famoso sed one-liner.
fuente
Perl, 16 bytes
fuente
Powershell, 41 bytes
Almacena el contenido de un archivo línea por línea
a
, lo inviertea
y finalmente lo imprime.fuente
GolfScript, 7 bytes
Prueba en línea aquí .
fuente
Burlesque , 6 bytes
ln
divide líneas,<-
invierte,uN
une líneas y formatos para salida sin formato.fuente
Bash,
4843 caracteres(Inspirado por Digital Trauma 's Bash respuesta . Upvotes de la idea debe ir a él.)
Ejecución de muestra:
fuente
mapfile -c1 -Cf
lugar demapfile -c1 -Cf a
.-C
primero.GNU Awk, 27 caracteres
(Inspirado por Ed Morton 's GNU Awk respuesta . CW que no tenía la intención de secuestrar a su solución.)
Tenga en cuenta que al cambiar
RT
→RS
esto se convierte en Awk estándar portátil pero pierde la capacidad de preservar la ausencia de la nueva línea final.Ejecución de muestra:
fuente
SNOBOL, 42 bytes
fuente
Gema, 25 personajes
Ejecución de muestra:
fuente
Hasio ,
90 bytes86 bytesVer expandido aquí
fuente
for
sintaxis. Vea una muestra aquísed, 7 bytes
Esto funciona para mí (y es la solución más corta en otros lugares), pero realmente no quiero saber por qué. Acabo de perder el tiempo con el famoso truco de 9 bytes hasta que encontré esto. ¿Supongo que
G
la primera línea no hace nada?fuente
G
Anexa un salto de línea y el contenido del espacio de bodega al espacio de patrones Si bien añadiendo el contenido del espacio de bodega vacío es de hecho inofensivo, el salto de línea todavía se anexa..)JavaScript (Node.js), 91 bytes
fuente
console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))
(92 bytes)? Su código actual no invierte las líneas.Bash + utilidades comunes, 25
Aquí el
^G
es unBEL
personaje literal . Supongo que la entrada es solo ascii imprimible.Esto
tr
responde la entrada completa a una línea reemplazando las nuevas líneas con BEL, luegorev
borra esa línea, luegotr
regresa arev
varias líneas , luego borra cada línea nuevamente, para obtener la salida deseada.fuente
MATLAB, 44
Divide la cadena en nuevas líneas, voltea la matriz resultante y luego se une con nuevos caracteres de línea.
fuente
Julia, 65 bytes
Esto toma un archivo como argumento de línea de comando e imprime sus líneas en orden inverso. Las nuevas líneas finales se mueven al frente, a diferencia de lo
tac
que es legítimo.Sin golf:
fuente
Pip , 3 + 2 = 5 bytes
Utiliza las banderas
r
yn
; lee de stdin.La
r
bandera lee la entrada estándar y lo almacena como una lista de líneas eng
(que normalmente es una lista de comando de la línea ar g s). Luego revertimos esa lista, y se imprime automáticamente. Eln
indicador hace que se generen listas con nueva línea como separador.fuente