Tauschen Sie den Inhalt zweier Dateien aus

13

Dies ist eine Code-Golf-Frage. Sie müssen den Inhalt von zwei separaten Dateien (i.txt und o.txt) nehmen und diese austauschen. Sie können eine dritte Datei erstellen, die Sie bei diesem Vorgang unterstützt. Ihr Programm löscht sie jedoch, nachdem der Dateiinhalt ausgetauscht wurde. Das Umbenennen der Dateien ist nun wieder erlaubt.

Programme müssen für jeden Dateiinhalt funktionieren.

Gewinnt der kürzeste Code, werden alle teilnahmeberechtigten Einsendungen upgestimmt.


quelle
2
Benennen Sie die Dateien um. Sie müssen die Inhalte nicht "nehmen" und austauschen, um das Ergebnis zu erzielen.
Darren Stone
@ Darren Stone Ich finde das sollte illegal sein. Vielen Dank, dass Sie das abgefangen haben, bevor die Antworten eingereicht wurden.
Sieht aus wie eine schlechte Einschränkung, Umbenennen ist der beste Weg, um dies zu tun
hdante
1
Okay, ich kann diese Einschränkung entfernen.
6
@hdante aber 'Umbenennen von Dateien' tauscht nicht ihren Inhalt aus . Auf einem System, auf dem inodes verwendet wird, ist das Ziel, dass i.txts inodedie Daten von o.txts enthält inodeund umgekehrt. Wenn also an inodeanderer Stelle Hardlinks zu diesen bestehen , werden deren Inhalte ebenfalls ausgetauscht. Umbenennen kann das nicht.
AJMansfield

Antworten:

9

zsh, 20

<i*>t;<o*>i*;mv t o*
Ry-
quelle
1
Ich mag die man ohne eine temporäre Datei besser, aber: i=`<i.txt`;<o*>i*;<<<$i>o*. Schade, dass das kürzer sein muss.
Ry
1
Die Regeln wurden geändert, um das Umbenennen von Dateien zu ermöglichen. Sie können Ihren Code bei Bedarf aktualisieren.
Sie könnten 3 Zeichen sparen, <t>o*;rm tindem mv t o*Sie durch ersetzen !
F. Hauri
@ F.Hauri: Ah, danke! (Es gab Regeln gegen das Umbenennen an einem Punkt.)
Ry
Dieser Code ist nicht korrekt. Dies funktioniert nur in dem speziellen Fall, in dem i * und o * nur mit i.txt bzw. o.txt übereinstimmen, dh es gibt keine andere Datei mit einem Namen, der entweder mit "i" oder "o" beginnt.
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");?>

Windows-Batchdatei, 42

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

Windows-Batchdatei (args), 30

move %1 x&move %2 %1&move x %2
AsksAnyway
quelle
Ich wusste nicht, dass Sie $r=renameAliase für Funktionen in PHP erstellen können . Vielen Dank!
AL
2

Zwei basierte ansers; 52 und 62 Zeichen

Shell: Diff + Patch (+ Tee + Sed ...) 52

Vielleicht nicht die kürzere, aber ich finde das lustig (und es gibt keine Verwendung von temporären Dateien):

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

Wo Inhalte getauscht und Dateien werden geändert in Ort :

Probelauf

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]*))

Könnte so etwas produzieren wie:

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

Verwendung von xargs zur Vereinfachung von mv Anfragen

Nicht so lustig, aber trotzdem nett.

set -- {i,o}.txt t&&eval 'xargs -n2 mv<<<"' \${1,3,2,1,3,2} \"
F. Hauri
quelle
Hinweis: Da die Ausgabe des ersten Patches nicht umgeleitet wird, werden sie beim zweiten Patch-Befehl zu Müll. Dies ist der Grund, weil nur eine patching file o.txtangezeigt wird.
F. Hauri
2

PHP, 89

Ich dachte, ich würde es versuchen.

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

Ungolfed-Version:

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

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

Anscheinend habe ich 2 Antworten von hier genommen und sie kombiniert .. na ja.

MisterBla
quelle
2

Ruby, 72 Bytes

Beeindruckend! Ein Ruby Code Golf! Ich glaube nicht, dass das jemals zuvor versucht wurde!

In Wirklichkeit waren dafür einige nette Ruby-Shortcuts und ein paar Patterns erforderlich, die ich gefunden habe. Es war mein erstes Golfspiel überhaupt und es hat sehr viel Spaß gemacht. Hier ist ohne weiteres der Golf-Code:

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

Und die ungolfed version

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

Der Schlüsselfaktor dabei ist, dass die Parameter an den übergebenen File.rename genau dies sind:

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

Hoffe das ergibt (keinen) Sinn!

Aearnus
quelle
2

Powershell, 44 49 Bytes

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

wo renist Alias ​​für Rename-Item . Das Skript verwendet und löscht eine dritte Datei a.txt.

mazzy
quelle
1
Dies kann bei bestimmten Codierungen fehlschlagen. Da die gcStandardeinstellung UTF8NoBOM ist, ist die scStandardeinstellung ASCII. Probieren Sie einige UTF-8-Dateien oder Binärdateien aus, und Sie können sehen, wie es fehlschlagen kann.
AdmBorkBork
Tatsächlich. Vielen Dank. Es werden -e by -nParameter benötigt , um sicherzustellen, dass die Dateien unverändert bleiben. Es wäre schön, -readCount 0der Leistung einen Parameter hinzuzufügen . Das Skript mit renameist kürzer :) Behoben.
mazzy
1

Rubin

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)}

Verkürzte Version:

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])}

Nicht die kürzeste, aber sehr einfach und leicht zu lesen. Auch keine Zwischendateien, nur RAM.


quelle
1
Da es sich um ein Codegolf handelt , könnten Sie zumindest die Felder herausnehmen und etwas für die kürzeste versuchen.
Ry
Total habe nicht
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
quelle
10
Das ist nicht wirklich golfen :(
Jakob Bowyer
1

Shell-Skript, 24

Funktioniert in Bash und wahrscheinlich den meisten Shells. Übergeben Sie mit Ihren beiden Dateinamen als Parameter.

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

Wenn Sie feste Dateinamen möchten, ist dies gegen eine Gebühr von 12 Zeichen möglich:

mv i.txt ੴ;mv o.txt i.txt;mv ੴ o.txt
Darren Stone
quelle
@minitech, ja, das tut es. 'ੴ' wird zu 'o.txt'. Das sind mvOperationen, nicht cp.
Darren Stone
Zweitbeste Antwort bisher! Reduzieren Sie es um zwei Zeichen und Sie gewinnen! Ich interessiere mich nicht für feste Dateinamen.
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
quelle
1

Windows-Batchdatei (48)

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

Ich habe den Move-Befehl vergessen, als ich das geschrieben habe ...

kitcar2000
quelle
Du hast gerade meine aDatei überschrieben !
Danny
@Danny Die Frage besagt, dass Sie möglicherweise eine andere Datei erstellen, diese jedoch gelöscht werden muss.
kitcar2000
1

C 162

Golfed: Verwendet t.txt als tmp-Datei und tauscht die Namen aus, entfernt dann 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;}

Bearbeiten: 2 Leerzeichen entfernt

Bacchusbeale
quelle
1

PHP - 172

Golf-Version von @ EisaAdils Antwort

$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);
Vorwärts
quelle
1

Rebol - 46 (Datei umbenennen) oder 55 (Schreib- / Leseinhalt)

Datei umbenennen ( tals temporäre Datei verwenden):

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

Dateiinhalt einlesen, dann ausschreiben:

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

PHP, 45

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

Nicht sehr golfen, aber bisher kürzestes PHP.

mleko
quelle
Dateierweiterungen fehlen.
Titus
1

Groovy - 99 Zeichen

Dies ist mein Versuch mit Groovy 2.2.1. Ich habe versucht, es zu tun, ohne es umzubenennen:

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

Ungolfed:

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
quelle
1

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

Umbenennen mit einer temporären Datei t im Laufwerk c: \. Auch erster Golfversuch: 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

Wenn scrrun.dll bereits referenziert ist, könnte es ein bisschen auf 126 ... 110 reduziert werden.

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
quelle
Sieht aus wie Ihr Code viel Leerzeichen hat. Bist du sicher, dass sie gebraucht werden? Sie können ein viel besseres Ergebnis erzielen, wenn Sie sie entfernen.
user12205
Ich glaube nicht , dass der Editor benötigt nur schleudert ihn in entfernt abgesehen von wo es nötig ist :).
jaybee3
1

C: 65 Zeichen

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

Eine recht einfache Lösung in C, die den Job macht. Es verwendet einen temporären Namen ( .txt) für eine der Dateien, bevor es den richtigen neuen Namen erhält.

Ungolfed (Beachten Sie, wie die Syntax-Hervorhebung im Define fehlschlägt, ein Fehler wurde aufgedeckt!):

#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
quelle
1

Perl, 120 Bytes (Inhaltsaustausch ohne Dateiumbenennung)

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

Der Dateiinhalt wird in den Speicher gestellt und in die andere Datei zurückgeschrieben. So i.txtundo.txt muss ins Gedächtnis passen.

Da der Dateiinhalt tatsächlich ausgetauscht wird, werden Hardlinks automatisch aktualisiert, siehe AJManfields Kommentar .

Ungolfed:

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
quelle
1

Windows Batch, 39 Bytes

ren i.txt x&ren o.txt i.txt&ren x o.txt
Peter Ferrie
quelle
1

Lua ,71 70 Bytes

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

Probieren Sie es online!

Definieren Sie osdie Betriebssystembibliothek als globale Tabelle, damit wir schreiben renameund removeanstelle von os.renameund os.remove. (Dies bedeutet im Übrigen auch, dass die Ein-Buchstaben-Variablen tatsächlich Felder in der osTabelle sind.) Erstellen Sie einen kurzen Alias ​​für os.rename, um Platz zu sparen. Richten Sie Dateinamenvariablen '.txt'als temporäre Datei ein. Führen Sie das Umbenennen und Löschen durch.

Cyclaminist
quelle
1

PHP, 52 Bytes

AsksAnyway´s PHP modernisiert & golfen:

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

Laufen Sie mit php -nr '<code>'.

Titus
quelle
1

Tcl , 122 Bytes

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

Probieren Sie es online!


Tcl , 169 Bytes

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

Probieren Sie es online!

Sergiol
quelle
0

SmileBASIC, 36 35 Bytes

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