Entre a pergunta do gatinho e ver essa pergunta na U&L sobre alguma sed
mágica, que tal implementar tac
?
Objetivo
Implemente um programa que reverterá e imprimirá as linhas em um arquivo.
Entrada
Um arquivo, fornecido como um nome ou via entrada padrão
Saída
As linhas, invertidas, são padronizadas.
Pontuação
Bytes do código fonte.
tac
é um pouco estranho quando se trata de rastrear feeds de linha. Ele transformaa\nb\n
(avanço de linha à direita) emb\na\n
ea\nb
(sem avanço de linha à direita) emba\n
. É assim que nosso código deveria se comportar?tac
é apenas uma questão de tempo ...\n
.tac
inverte a ordem dessas linhas. Se um\n
for removido do meio do arquivo, a linha finalizada será associada à próxima linha, mas, no caso da última linha, não haverá próxima linha para a qual ingressar.Respostas:
GS2, 3 bytes
Os três bytes são, em ordem, dividir linhas, reverter e unir linhas.
fonte
Perl, 11 bytes
Comporta-se exatamente como
tac
. Esse código requer a-p
opção, que contei como 1 byte.Execuções de teste
Como funciona
Como explicado aqui , o
-p
switch basicamente envolvewhile (<>) { ... ; print }
o programa, portanto o código fonte é equivalente aPara cada linha de entrada, acrescentamos a linha atual (
$_
) a$\
(inicialmente indefinida), atualizando a última com o resultado.Após o processamento de todas as linhas,
print
imprime o valor da variável local$_
(indefinida neste escopo), seguida pelo separador do registro de saída ($\
).fonte
-p
comutador envolve seu código em um loop que começawhile(<>){
e termina} continue { print }
, o que permite filtrar a entrada apenas modificando$_
.$\=$_.$\
precede cada linha de entrada ao terminador do registro de saída e}{
finaliza owhile
bloco fornecido perl prematuramente, para que ocontinue
bloco não esteja mais anexado a ele. Portanto, todas as linhas de entrada são adicionadas$\
na ordem inversa; no final,continue { print }
eventualmente, é executado, imprimindo "nada" ($_
será indefinido após o final da entrada), mas com um terminador de$\
.Pitão, 4 bytes
.z
é a entrada separada por linhas como uma lista, a_
reverte ej
une-a por um caractere, que por padrão é\n
.fonte
FlogScript , 2 bytes
(Experimente no golfe da anarquia .)
O modo
)
ativado--in-out-line-array
e o restante do programa são"
, invertendo a matriz de linhas.fonte
Retina , 7 bytes
Com um único regex, o Retina é executado no modo de correspondência. Normalmente, isso apenas imprime o número de correspondências, mas, com
!
isso, configuramos para imprimir as correspondências reais (separadas por linhas de alimentação).O regex real é apenas
.*$
..*
corresponde a qualquer linha (potencialmente vazia), porque.
pode corresponder a qualquer caractere, exceto feeds de linha. Eu vou chegar$
em um minuto.Como podemos imprimir as correspondências ao contrário? Utilizando o modo de correspondência da direita para a esquerda do .NET, ativado com o
r
. Isso significa que o mecanismo regex inicia no final da string ao procurar correspondências e funciona ao contrário.Finalmente,
m
faz com que a$
correspondência seja o final de uma linha, em vez do final da sequência. Por que precisamos disso? O problema é que.*
gera correspondências estranhas. Considere a substituição de regexaplicado à entrada
baaababaa
. Você pensaria que isso renderiabaaaxbaxbaax
, mas realmente lhe dábaaaxxbaxxbaaxx
. Por quê? Porque, depois de corresponder,aaa
o cursor do mecanismo fica entre oa
e ob
. Agora não pode mais correspondera
s, masa*
também está satisfeito com uma sequência vazia. Isso significa que, após cada partida, você recebe outra partida vazia.Não queremos isso aqui, porque isso introduziria linhas vazias adicionais; portanto, descartamos essas correspondências estranhas (que estão no início das linhas, devido ao modo da direita para a esquerda), exigindo que as correspondências incluam o final de a linha.
fonte
Haskell, 34 bytes
[editar]
Salvo um byte, substituindo
unlines
porconcat
.fonte
CJam, 7 bytes
Lê stdin, imprime em stdout.
Explicação:
fonte
Pitão, 5 bytes
Isso inverte a ordem das linhas com uma abordagem simples de junção reversa dividida, mas não muito parecida com tac .
Experimente online.
fonte
Befunge-93, 17 bytes
Nada extravagante aqui; basta colocar tudo na pilha e soltar.
fonte
Pure Bash (sem utilitários externos), 56
Esta é uma das poucas respostas para fazer a
tac
emulação exata , conforme perguntado no comentário de Dennis :fonte
Ruby, 16 bytes
fonte
JavaScript (SpiderMonkey Shell), 38 bytes
Bem simples
read()
lê um arquivoreadline()
lê uma string de STDIN[...str]
irá dividir str em uma matriz de caracteresreverse()
irá reverter a matrizjoin``
irá recolher a matriz em uma stringfonte
Python 2, 52 bytes
fonte
import sys;print sys.stdin.read()[::-1]
?C #,
179171 bytesLê linhas, colocando-as em uma pilha e depois as grava para trás. Eu usaria o Mathematica para isso, mas ele não tem senso de EOF.
fonte
sed, 9 bytes
Nenhum voto positivo desejado, este é um famoso sed one-liner.
fonte
Perl, 16 bytes
fonte
Powershell, 41 bytes
Armazena o conteúdo de um arquivo linha por linha
a
, invertea
e finalmente o imprime.fonte
GolfScript, 7 bytes
Teste online aqui .
fonte
Burlesco , 6 bytes
ln
divide linhas,<-
inverte,uN
une linhas e formatos para saída bruta.fonte
Bash,
4843 caracteres(Inspirado por Trauma Digital 's resposta Bash . Upvotes para a idéia deve ir até ele.)
Exemplo de execução:
fonte
mapfile -c1 -Cf
vez demapfile -c1 -Cf a
.-C
primeiro.GNU Awk, 27 caracteres
(Inspirado Ed Morton de resposta GNU Awk . CW como eu não se destinam a sequestrar a sua solução.)
Observe que, ao alterar
RT
→,RS
ele se torna o Awk padrão portátil, mas perde a capacidade de preservar a ausência da nova linha final.Exemplo de execução:
fonte
SNOBOL, 42 bytes
fonte
Gema, 25 caracteres
Exemplo de execução:
fonte
Hássio ,
90 bytes86 bytesVeja expandido aqui
fonte
for
sintaxe. Veja uma amostra aquised, 7 bytes
Isso funciona para mim (e é a solução mais curta em outro lugar), mas eu realmente não quero descobrir o porquê. Eu apenas brinquei com o famoso truque de 9 bytes até encontrar isso. Eu acho que
G
a primeira linha não faz nada?fonte
G
Acrescenta uma nova linha e o conteúdo do espaço de sustentação para o espaço padrão acrescentando Enquanto o conteúdo do espaço vazio é de facto preensão inofensivo, a nova linha ainda é anexado..)JavaScript (Node.js), 91 bytes
fonte
console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))
(92 bytes)? Seu código atual não reverte as linhas.Bash + utilitários comuns, 25
Aqui o
^G
é umBEL
caractere literal . Estou assumindo que a entrada é apenas ascii imprimível.Isso
tr
transforma toda a entrada em uma linha, substituindo novas linhas por BELs, em seguida,rev
altera essa linha e, em seguida,tr
retorna pararev
várias linhas , depois altera cada linha novamente, para obter a saída desejada.fonte
MATLAB, 44
Divide a sequência em novas linhas, vira a matriz resultante e volta a juntar-se a novos caracteres de linha.
fonte
Julia, 65 bytes
Isso pega um arquivo como argumento de linha de comando e imprime suas linhas na ordem inversa. As novas linhas à direita são movidas para a frente, ao contrário do
tac
que é legítimo.Ungolfed:
fonte
Pip , 3 + 2 = 5 bytes
Usa as bandeiras
r
en
; lê de stdin.A
r
bandeira lê stdin e armazena-o como uma lista de linhas emg
(que é normalmente uma lista de-ar da linha de comando g s). Em seguida, invertemos essa lista e ela é impressa automaticamente. On
sinalizador faz com que as listas sejam produzidas com nova linha como separador.fonte