Entre la question du chaton et voir cette question à U&L sur la sed
magie, que diriez-vous de l'implémentation tac
?
Objectif
Implémentez un programme qui inversera et imprimera les lignes dans un fichier.
Contribution
Un fichier, fourni sous forme de nom ou via une entrée standard
Sortie
Les lignes, inversées, à la sortie standard.
Notation
Octets de code source.
tac
est un peu étrange en ce qui concerne les sauts de ligne de fin. Il transformea\nb\n
(saut de ligne arrière) enb\na\n
eta\nb
(pas de saut de ligne arrière) enba\n
. Est-ce ainsi que notre code devrait se comporter?tac
n'est qu'une question de temps ...\n
.tac
inverse l'ordre de ces lignes. Si an\n
est supprimé du milieu du fichier, la ligne qu'il a terminée est jointe à la ligne suivante, mais dans le cas de la dernière ligne, il n'y a pas de ligne suivante à joindre.Réponses:
GS2, 3 octets
Les trois octets sont, dans l'ordre, les lignes divisées, inversées et jointes.
la source
Perl, 11 octets
Se comporte exactement comme
tac
. Ce code nécessite le-p
commutateur, que j'ai compté comme 1 octet.Essais
Comment ça marche
Comme expliqué ici , le
-p
commutateurwhile (<>) { ... ; print }
entoure essentiellement le programme, donc le code source est équivalent àPour chaque ligne d'entrée, nous ajoutons la ligne actuelle (
$_
) à$\
(initialement non définie), en mettant à jour cette dernière avec le résultat.Une fois toutes les lignes traitées,
print
imprime la valeur de la variable locale$_
(non définie dans cette étendue), suivie du séparateur d'enregistrement de sortie ($\
).la source
-p
commutateur enveloppe votre code dans une boucle qui commencewhile(<>){
et se termine} continue { print }
, ce qui permet de filtrer les entrées simplement en les modifiant$_
.$\=$_.$\
ajoute chaque ligne d'entrée au terminateur d'enregistrement de sortie et}{
termine lewhile
bloc fourni par Perl prématurément, de sorte que lecontinue
bloc n'y est plus attaché. Donc, toutes les lignes d'entrée sont ajoutées$\
dans l'ordre inverse, puis à la fincontinue { print }
, elles s'exécutent finalement, en imprimant "rien" ($_
sera indéfini après la fin de l'entrée), mais avec un terminateur de$\
.Pyth, 4 octets
.z
est l'entrée séparée par des lignes sous forme de liste, l'_
inverse et laj
joint par un caractère, qui par défaut est\n
.la source
FlogScript , 2 octets
(Essayez-le sur le golf d'anarchie .)
Le mode
)
enable--in-out-line-array
, et le reste du programme est"
, inversant le tableau de lignes.la source
Rétine , 7 octets
Avec une seule expression régulière, Retina s'exécute en mode Match. Cela n'imprime normalement que le nombre de correspondances, mais avec
!
nous le configurons pour imprimer les correspondances réelles à la place (séparées par des sauts de ligne).Le regex réel est simplement
.*$
..*
correspond à n'importe quelle ligne (potentiellement vide), car.
peut correspondre à n'importe quel caractère à l'exception des sauts de ligne. J'y arriverai$
dans une minute.Comment faire imprimer les allumettes à l'envers? En utilisant le mode de correspondance de droite à gauche de .NET, activé avec le
r
. Cela signifie que le moteur d'expression régulière démarre à la fin de la chaîne lors de la recherche de correspondances et fonctionne à l'envers.Enfin, le
m
fait$
correspondre la fin d'une ligne au lieu de la fin de la chaîne. Pourquoi en avons-nous même besoin? Le problème est que cela.*
génère des correspondances étrangères. Considérez la substitution d'expression régulièreappliqué à l'entrée
baaababaa
. Vous penseriez que cela donneraitbaaaxbaxbaax
, mais cela vous donne en faitbaaaxxbaxxbaaxx
. Pourquoi? Parce qu'après avoir fait correspondreaaa
le curseur du moteur se trouve entre lea
et leb
. Maintenant, il ne peut plus correspondre àa
s, mais ila*
est également satisfait d'une chaîne vide. Cela signifie qu'après chaque match, vous obtenez un autre match vide.Nous ne voulons pas cela ici, car cela introduirait des lignes vides supplémentaires, donc nous supprimons ces correspondances étrangères (qui sont au début des lignes, en raison du mode de droite à gauche) en exigeant que les correspondances incluent la fin la ligne.
la source
Haskell, 34 octets
[modifier]
Un octet enregistré en remplaçant
unlines
parconcat
.la source
CJam, 7 octets
Lit stdin, imprime sur stdout.
Explication:
la source
Pyth, 5 octets
Cela inverse l'ordre des lignes avec une approche simple de split-reverse-join, mais pas tout à fait comme tac .
Essayez-le en ligne.
la source
Befunge-93, 17 octets
Rien d'extraordinaire ici; il suffit de tout mettre sur la pile, puis de le retirer.
la source
Pure Bash (pas d'utilitaires externes), 56
C'est l'une des rares réponses à faire une
tac
émulation exacte , comme demandé dans le commentaire de Dennis :la source
Ruby, 16 octets
la source
JavaScript (SpiderMonkey Shell), 38 octets
Assez simple
read()
lit un fichierreadline()
lit une chaîne de STDIN[...str]
divisera str en un tableau de caractèresreverse()
inversera le tableaujoin``
collpase le tableau dans une chaînela source
Python 2, 52 octets
la source
import sys;print sys.stdin.read()[::-1]
?C #,
179171 octetsLit les lignes, les place dans une pile, puis les écrit à l'envers. J'utiliserais Mathematica pour cela, mais cela n'a aucun sens d'EOF.
la source
sed, 9 octets
Pas de vote positif, c'est un fameux monoplace sed.
la source
Perl, 16 octets
la source
Powershell, 41 octets
Stocke le contenu d'un fichier ligne par ligne
a
, l'inversea
et l'imprime finalement.la source
GolfScript, 7 octets
Test en ligne ici .
la source
Burlesque , 6 octets
ln
divise les lignes,<-
inverse,uN
joint les lignes et les formats pour la sortie brute.la source
Bash,
4843 caractères(Inspirés par le numérique Trauma de réponse Bash . Upvotes l'idée devrait aller à lui.)
Exemple d'exécution:
la source
mapfile -c1 -Cf
place demapfile -c1 -Cf a
.-C
premier.GNU Awk, 27 caractères
(Inspiré par Ed Morton de réponse GNU Awk . CW que je ne comptais pirater sa solution.)
Notez qu'en changeant
RT
→RS
cela devient Awk standard portable mais perd la possibilité de préserver l'absence de la nouvelle ligne finale.Exemple d'exécution:
la source
SNOBOL, 42 octets
la source
Gema, 25 caractères
Exemple d'exécution:
la source
Hassium ,
90 octets86 octetsVoir développé ici
la source
for
syntaxe. Voir un exemple icised, 7 octets
Cela fonctionne pour moi (et c'est la solution la plus courte ailleurs), mais je ne veux pas vraiment savoir pourquoi. Je viens de jouer avec le fameux truc de 9 octets jusqu'à ce que je trouve cela. Je suppose
G
que la première ligne ne fait rien?la source
G
ajoute une nouvelle ligne et le contenu de l'espace de rétention à l'espace de motif. Bien que l'ajout du contenu de l'espace deJavaScript (Node.js), 91 octets
la source
console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))
(92 octets)? Votre code actuel n'inverse pas les lignes.Bash + utilitaires communs, 25
Ici,
^G
c'est unBEL
caractère littéral . Je suppose que l'entrée est uniquement ascii imprimable.Cela permet de
tr
former l'intégralité de l'entrée sur une ligne en remplaçant les sauts de ligne par des BEL, puis derev
supprimer cette ligne, puis detr
retourner en multiligne, puis derev
replacer chaque ligne à nouveau, pour obtenir la sortie souhaitée.la source
MATLAB, 44
Fractionne la chaîne à de nouvelles lignes, retourne le tableau résultant, puis rejoint avec de nouveaux caractères de ligne.
la source
Julia, 65 octets
Cela prend un fichier comme argument de ligne de commande et imprime ses lignes dans l'ordre inverse. Les nouvelles lignes de fin sont déplacées vers l'avant, contrairement à
tac
ce qui est légitime.Non golfé:
la source
Pip , 3 + 2 = 5 octets
Utilise les drapeaux
r
etn
; lit de stdin.Le
r
drapeau indique l' entrée standard et le stocke en tant que liste de lignesg
(qui est normalement une liste de ligne de commande ar g s). Nous inversons ensuite cette liste et elle est imprimée automatiquement. L'n
indicateur provoque la sortie des listes avec la nouvelle ligne comme séparateur.la source