Échanger le contenu de deux fichiers

13

C'est une question de code-golf. Vous devez prendre le contenu de deux fichiers distincts (i.txt et o.txt) et les échanger. Vous pouvez créer un troisième fichier pour vous aider dans le processus, mais demandez à votre programme de le supprimer une fois le contenu du fichier échangé. Renommer les fichiers est à nouveau autorisé.

Les programmes doivent fonctionner pour tout contenu de fichier.

Le code le plus court gagne, toutes les soumissions éligibles seront votées.


la source
2
Renommez les fichiers. Pas besoin de "prendre le contenu" et de les échanger pour obtenir le résultat.
Darren Stone
@Darren Stone Je pense que cela devrait être illégal. Merci d'avoir saisi cela avant que les réponses ne soient soumises.
Ressemble à une mauvaise contrainte, renommer est le meilleur moyen de le faire
hdante
1
D'accord, je peux supprimer cette contrainte.
6
@hdante mais «renommer des fichiers» n'échange pas leur contenu . Sur un système qui utilise inodes, le but ici serait que i.txtles s inodecontiennent les données o.txtdes s inode, et vice versa, de sorte que s'il existe des liens physiques vers ces inodes ailleurs, leur contenu apparaîtra également échangé. Renommer ne peut pas accomplir cela.
AJMansfield

Réponses:

9

zsh, 20

<i*>t;<o*>i*;mv t o*
Ry-
la source
1
Je comme celui sans un fichier temporaire mieux, si: i=`<i.txt`;<o*>i*;<<<$i>o*. C'est dommage que cela doive être plus court.
Ry-
1
Les règles ont été modifiées pour permettre de renommer les fichiers. Vous pouvez mettre à jour votre code si vous le souhaitez.
Vous pouvez enregistrer 3 caractères en les remplaçant <t>o*;rm tpar mv t o*!
F.Hauri
@ F.Hauri: Ah, merci! (Il y avait des règles contre le changement de nom à un moment donné.)
Ry-
Ce code n'est pas correct. Cela ne fonctionne que dans le cas spécial où i * et o * ne correspondront respectivement qu'à i.txt et o.txt, c'est-à-dire qu'il n'y a pas d'autre fichier avec un nom commençant par "i" ou "o".
Erwan Legrand
3

Python, 77

import os;t='.txt';r,i,o,x=[os.rename,'i'+t,'o'+t,'1'+t];r(i,x);r(o,i);r(x,o)

Python, 65

import os;t='.txt'
for a,b in zip('iox','xio'):os.rename(a+t,b+t)

Python, 63

import os;t='.txt'
for a,b in 'ix','oi','xo':os.rename(a+t,b+t)

PHP, 68

<?$r=rename;$t='.txt';$r("i$t","x");$r("o$t","i$t");$r("x","o$t");?>

Fichier de commandes Windows, 42

move i.txt x&move o.txt i.txt&move x o.txt

Fichier de commandes Windows (args), 30

move %1 x&move %2 %1&move x %2
Demandes
la source
Je ne savais pas que vous pouvez utiliser $r=renamepour créer des alias de fonctions en PHP. Merci!
AL
2

Deux ansers à base de ; 52 et 62 caractères

coque: diff + patch (+ tee + sed ...) 52

Peut-être pas le plus court, mais je trouve ça amusant (et il n'y a pas d'utilisation de fichier temporaire ):

diff -u [io]*|tee >(patch -r -)|sed 1s/i/o/|patch -R

Où le contenu est échangé et les fichiers sont modifiés en place :

Exemple d'exécution

swapContent() { diff -u $1 $2|tee >(patch -r -)|sed 1s/$1/$2/|patch -R ;}

while read page file ;do man -Pcol\ -b $page >$file.txt;done <<<$'man i\nbash o'
printf "%s %8d  %s\n" $(join -j 2 <(stat -c '%s %n' [io]*) <(md5sum [io]*))
swapContent [io]*
printf "%s %8d  %s\n" $(join -j 2 <(stat -c '%s %n' [io]*) <(md5sum [io]*))

Pourrait produire quelque chose comme:

i.txt    46007  1da1f7533e0eab1e97cce97bb7ca1d3b
o.txt   321071  7dcd230890faf4ef848d4745eda14407
patching file o.txt
i.txt   321071  7dcd230890faf4ef848d4745eda14407
o.txt    46007  1da1f7533e0eab1e97cce97bb7ca1d3b

utilisation de xargs pour simplifier mv requêtes

Pas aussi drôle, mais sympa quand même.

set -- {i,o}.txt t&&eval 'xargs -n2 mv<<<"' \${1,3,2,1,3,2} \"
F. Hauri
la source
Remarque: comme la première sortie de correctif n'est pas redirigée, elles deviennent des ordures lors de la deuxième commande de correctif. C'est la raison car un seul patching file o.txtapparaît.
F.Hauri
2

PHP, 89

Je pensais que je lui donnerais une chance.

<?php $f1='f1.txt';$f2='f2.txt';$ft='ft.txt';copy($f1,$ft);copy($f2,$f1);rename($ft,$f2);

Version non golfée:

<?php
$f1 = 'f1.txt';
$f2 = 'f2.txt';
$ft = 'ft.txt';

copy($f1, $ft);
copy($f2, $f1);
rename($ft, $f2);

Apparemment, j'ai pris 2 réponses d'ici et les ai combinées .. eh bien.

MisterBla
la source
2

Rubis, 72 octets

Hou la la! Un golf Ruby Code! Je ne pense pas que cela ait été tenté auparavant!

Dans toute la réalité cependant, cela nécessitait de bons raccourcis Ruby et quelques modèles que j'ai trouvés. C'était mon tout premier golf et c'était très amusant à faire. Sans plus tarder, voici le code du golf:

3.times{|x|x*=2;t=".txt";a=([?i,?a,?o]*2);File.rename(a[x]+t,a[x+1]+t)}

Et la version non golfée

3.times do |x|
    x = x * 2
    t=".txt"
    a=([?i,?a,?o]*2)
    File.rename(a[x]+t, a[x+1]+t)}
end

Le facteur clé est que les paramètres passés au File.renamesont exactement les suivants:

File.rename "i.txt", "a.txt"
File.rename "o.txt", "i.txt"
File.rename "a.txt", "o.txt"

J'espère que cela n'a pas de sens!

Aearnus
la source
2

Powershell, 44 49 octets

$t='.txt'
ren i$t a$t -fo
ren o$t i$t
ren a$t o$t

renest l'alias de Rename-Item . Le script utilise et supprime un troisième fichier a.txt.

mazzy
la source
1
Cela peut échouer avec certains encodages. Parce que la gcvaleur par défaut est UTF8NoBOM mais la scvaleur par défaut est ASCII. Essayez des fichiers UTF-8 ou des fichiers binaires et vous pouvez voir comment cela peut échouer.
AdmBorkBork
En effet. Merci. Il a besoin de -e by -nparamètres pour garantir que les fichiers restent inchangés. Ce serait bien d'ajouter un paramètre -readCount 0aux performances. Le script avec renameest plus court :) Fixe.
mazzy
1

Rubis

i1="i.txt"
i2="o.txt"
c1=IO.readlines(i2)
c2=IO.readlines(i1)
File.open(i1){|x|x.puts(c1)}
File.open(i2){|x|x.puts(c2)}

Version raccourcie:

a=["i.txt","o.txt"]
(0..1).each{|x|b[x]=IO.readlines(a[x])*"\n"}
a.reverse!
(0..1).each{|x|IO.write(a[x],b[x])}

Pas le plus court, mais très simple et facile à lire. En outre, aucun fichier intermédiaire, uniquement de la RAM.


la source
1
Étant donné qu'il s'agit d'un code-golf , vous pouvez au moins supprimer les espaces et essayer un peu pour le plus court.
Ry-
Je ne savais absolument pas que c'était du code-golf, désolé
1

PHP

$f1 = 'file1.txt';
$f2 = 'file2.txt';

$f1contents = file_get_contents ($f1);
$f2contents = file_get_contents ($f2);

file_put_contents($f1, $f2contents);
file_put_contents($f2, $f1contents);
Eisa Adil
la source
10
Ce n'est pas vraiment du golf :(
Jakob Bowyer
1

Script shell, 24

Fonctionne dans Bash et probablement la plupart des coquilles. Passez avec vos deux noms de fichiers comme paramètres.

mv $1 ੴ;mv $2 $1;mv ੴ $2

Si vous voulez des noms de fichiers fixes, cela le fera, pour une pénalité de 12 caractères:

mv i.txt ੴ;mv o.txt i.txt;mv ੴ o.txt
Darren Stone
la source
@minitech, oui. 'ੴ' devient 'o.txt'. Ce sont des mvopérations, non cp.
Darren Stone
Deuxième meilleure réponse à ce jour! Réduisez-le de deux caractères et vous gagnez! Je me fiche des noms de fichiers fixes.
1

Python:

import os
l,e='i_o'*2,'.txt'
for x,y in zip(l,l[1:])[::2]:
 os.rename(x+e,y+e)
tamasgal
la source
1

Fichier de commandes Windows (48)

type i.txt>a&type o.txt>i.txt&type a>o.txt&del a

J'ai oublié la commande move lorsque j'ai écrit ceci ...

kitcar2000
la source
Vous venez d'écraser mon afichier!
Danny
@Danny La question indique que vous pouvez créer un autre fichier, mais il doit être supprimé.
kitcar2000
1

C 162

Golfé: utilise t.txt comme fichier tmp et échange les noms, puis supprime t.txt.

#include <stdio.h>
#define R(x,y) rename(x,y)
#define X(x) remove(x)
int main(){char *i="i.txt",*o="o.txt",*t="t.txt";R(i,t);X(i);R(o,i);R(t,o);X(t);return 0;}

Edit: supprimé 2 espaces

bacchusbeale
la source
1

PHP - 172

Version golfée de la réponse de @ EisaAdil

$f1='file1.txt';$f2='file2.txt';$f1contents=file_get_contents($f1);$f2contents=file_get_contents($f2);file_put_contents($f1,$f2contents);file_put_contents($f2,$f1contents);
Spedwards
la source
1

Rebol - 46 (renommer le fichier) ou 55 (contenu r / w)

Renommer le fichier (en utilisant tcomme fichier temporaire):

r: :rename 
r i: %i.txt %t
r o: %o.txt i
r %t o

Lisez puis écrivez le contenu du fichier:

a: read i: %i.txt
b: read o: %o.txt
write o a 
write i b
draegtun
la source
1

PHP, 45

<?php
copy('i','t');copy('o','i');rename('t','o');

Pas très golfique mais le PHP le plus court jusqu'à présent.

mleko
la source
les extensions de fichier sont manquantes.
Titus
1

Groovy - 99 caractères

C'est ma tentative, avec Groovy 2.2.1. J'ai essayé de le faire sans renommer:

f={new File(it+".txt")}
w={x,y->x.withWriter{it.write y}}
i=f "i"
o=f "o"
t=i.text
w i,o.text
w o,t

Non golfé:

file = { new File(it+".txt") }
writeTextToFile = { x,y -> x.withWriter{it.write y} }

iFile = file("i")
oFile = file("o")

iText = iFile.text
writeTextToFile (iFile,oFile.text)
writeTextToFile (oFile,iText)
Michael Easter
la source
1

VBA (148 ... 132) et (126 ... 110)

Renommer avec un fichier temporaire t dans le lecteur c: \. Aussi première tentative de golf: S

Sub s():Set f=CreateObject("Scripting.FileSystemObject"):i="c:\i.txt":t="c:\t":f.MoveFile i,t:f.MoveFile "c:\o.txt",i:Kill t:End Sub

Si scrrun.dll est déjà référencé, pourrait le réduire un peu à 126 ... 110.

Sub s():Set f=new FileSystemObject:i="c:\i.txt":t="c:\t":f.MoveFile i,t:f.MoveFile "c:\o.txt",i:Kill t:End Sub
jaybee3
la source
On dirait que votre code a beaucoup d'espace. Êtes-vous sûr qu'ils sont nécessaires? Vous pouvez avoir un score bien meilleur si vous les supprimez.
user12205
Je ne pense pas qu'il avait besoin de l'éditeur vient de jeter dans Enlevée à part où il est nécessaire :).
jaybee3
1

C: 65 caractères

#define r(a,b)rename(#a".txt",#b".txt");
main(){r(i,)r(o,i)r(,o)}

Une solution assez simple en C qui fait l'affaire. Il utilise un nom temporaire (.txt ) pour l'un des fichiers avant de lui donner son nouveau nom approprié.

Ungolfed (notez comment la coloration syntaxique échoue dans la définition, un bug a été découvert!):

#include <stdio.h>

#define r(a, b) rename(#a ".txt", #b ".txt");

int main()
{
    r(i,  ) // rename("i.txt",  ".txt");
    r(o, i) // rename("o.txt", "i.txt");
    r( , o) // rename( ".txt", "o.txt");

    return 0;
}
Fors
la source
1

Perl, 120 octets (échange de contenu sans changement de nom de fichier)

use open IO,':bytes';undef$/;open I,"<i.txt";$I=<I>;open I,"<o.txt";open O,">i.txt";print O<I>;open O,">o.txt";print O$I

Le contenu du fichier est mis en mémoire et réécrit dans l'autre fichier. Ainsi i.txteto.txt doit s'inscrire dans la mémoire.

Étant donné que le contenu du fichier est réellement échangé, les liens physiques sont mis à jour automatiquement, voir le commentaire d'AJManfield .

Non golfé:

use open IO => ':bytes'; # binmode, not needed for Unix, but needed for Windows
undef $/;                # read whole file instead of lines
open I, "<i.txt";        # open i.txt for reading
$I = <I>;                # read i.txt
open I, "<o.txt";        # open o.txt for reading
open O, ">i.txt";        # open i.txt for writing
print O <I>;             # read o.txt and put the contents in i.txt
open O, ">o.txt";        # open o.txt for writing
print O $I;              # write o.txt with contents of old i.txt
Heiko Oberdiek
la source
1

Windows Batch, 39 octets

ren i.txt x&ren o.txt i.txt&ren x o.txt
peter ferrie
la source
1

Lua ,71 70 octets

_ENV=os t='.txt'i,o,r='i'..t,'o'..t,rename r(i,t)r(o,i)r(t,o)remove(t)

Essayez-le en ligne!

Définissez os, la bibliothèque du système d'exploitation, comme la table globale afin que nous puissions écrire renameet removeau lieu de os.renameet os.remove. (Soit dit en passant, cela signifie également que les variables à une lettre sont en fait des champs de la ostable.) Créez un alias court pour os.renameéconomiser de l'espace. Configurez les variables de nom de fichier en utilisant '.txt'comme fichier temporaire. Faites le renommage et la suppression.

cyclaministe
la source
1

PHP, 52 octets

Le php d'AsksAnyway modernisé et golfé:

($r=rename)(i.$e=".txt",x);$r(o.$e,i.$e);$r(x,o.$e);

Courir avec php -nr '<code>' .

Titus
la source
1

Tcl , 122 octets

set A [read [open i.txt]]
puts [set i [open i.txt w]] [read [open o.txt]]
puts [set o [open o.txt w]] $A
close $i
close $o

Essayez-le en ligne!


Tcl , 169 octets

set A [read [set i [open i.txt r]]]
set B [read [set o [open o.txt r]]]
close $i
close $o
puts [set i [open i.txt w]] $B
puts [set o [open o.txt w]] $A
close $i
close $o

Essayez-le en ligne!

sergiol
la source
0

SmileBASIC, 36 35 octets

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
12Me21
la source