Zamień zawartość dwóch plików

13

To jest pytanie do golfa. Musisz wziąć zawartość dwóch oddzielnych plików (i.txt i o.txt) i zamienić je. Możesz utworzyć trzeci plik, który pomoże ci w tym procesie, ale twój program usunie go po zamianie zawartości pliku. Zmiana nazw plików jest teraz znów dozwolona.

Programy muszą działać dla dowolnej zawartości pliku.

Zwycięża najkrótszy kod, wszystkie kwalifikujące się zgłoszenia zostaną poddane pod głosowanie.


źródło
2
Zmień nazwę plików. Nie trzeba „pobierać treści” i zamieniać ich, aby osiągnąć wynik.
Darren Stone
@Darren Stone Myślę, że powinno to być nielegalne. Dziękujemy za wyłapanie tego przed przesłaniem odpowiedzi.
Wygląda na złe ograniczenie, najlepszym sposobem jest zmiana nazwy
hdante
1
W porządku, mogę usunąć to ograniczenie.
6
@hdante, ale „zmiana nazw plików” nie powoduje wymiany ich zawartości . W systemie, który używa inodes celem tutaj byłoby dla i.txt„s inodezawierać dane z o.txt” s inodei odwrotnie, tak, że jeśli istnieją hardlinki do tych inodes gdzie indziej, ich zawartość będzie wyświetlana wymienili również. Zmiana nazwy nie może tego osiągnąć.
AJMansfield

Odpowiedzi:

9

zsh, 20

<i*>t;<o*>i*;mv t o*
Ry-
źródło
1
I jak jeden bez plik tymczasowy lepiej, choć: i=`<i.txt`;<o*>i*;<<<$i>o*. Szkoda, że ​​to musi być krótsze.
Ry-
1
Zmieniono reguły, aby umożliwić zmianę nazw plików. Możesz zaktualizować swój kod, jeśli chcesz.
Możesz zapisać 3 znaki, zastępując <t>o*;rm tje mv t o*!
F. Hauri
@ F.Hauri: Ach, dzięki! (W pewnym momencie
obowiązywały zasady odmawiające
Ten kod jest nieprawidłowy. Działa tylko w szczególnym przypadku, gdy i * i o * będą pasowały tylko odpowiednio i.txt i o.txt, tj. Nie ma innego pliku o nazwie zaczynającej się od „i” lub „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");?>

Plik wsadowy Windows, 42

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

Plik wsadowy Windows (args), 30

move %1 x&move %2 %1&move x %2
Asks Anyway
źródło
Nie wiedziałem, że możesz używać $r=renamedo tworzenia aliasów funkcji w PHP. Dzięki!
AL
2

Dwa ansery bazujące na ; 52 i 62 znaki

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

Może nie krótszy, ale uważam to za zabawne (i nie ma zastosowania pliku tymczasowego ):

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

W przypadku wymiany treści i modyfikacji plików w miejscu :

Przykładowy przebieg

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

Może produkować coś takiego:

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

użycie xargs w celu uproszczenia mv żądań

Nie tak zabawny, ale i tak miły.

set -- {i,o}.txt t&&eval 'xargs -n2 mv<<<"' \${1,3,2,1,3,2} \"
F. Hauri
źródło
Uwaga: Ponieważ wyjście pierwszej łatki nie jest przekierowywane, stają się śmieciami przy drugim poleceniu łatki. To jest powód, ponieważ patching file o.txtpojawia się tylko jeden .
F. Hauri
2

PHP, 89

Myślałem, że dam temu szansę.

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

Wersja bez golfa:

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

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

Najwyraźniej wziąłem tutaj 2 odpowiedzi i połączyłem je ... no cóż.

MisterBla
źródło
2

Rubinowy, 72 bajty

Łał! Golf Ruby Code! Nie sądzę, żeby kiedykolwiek próbowano!

W rzeczywistości wymagało to jednak ładnych skrótów Ruby i kilku wzorów, które znalazłem. To był mój pierwszy golf i to było bardzo fajne. Bez zbędnych ceregieli, oto kod do gry w golfa:

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

I wersja bez golfa

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

Kluczowym czynnikiem jest to, że parametry przekazywane do File.renamesą dokładnie takie:

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

Mam nadzieję, że to (nie) ma sens!

Aearnus
źródło
2

PowerShell, 44 49 bajtów

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

gdzie renjest alias dla Rename-Item . Skrypt wykorzystuje i usuwa trzeci plik a.txt.

mazzy
źródło
1
Może się to nie powieść przy pewnym kodowaniu. Ponieważ gcdomyślnie jest to UTF8NoBOM, ale scdomyślnie jest to ASCII. Wypróbuj niektóre pliki UTF-8 lub pliki binarne, a zobaczysz, jak może się nie powieść.
AdmBorkBork,
W rzeczy samej. Dzięki. Potrzebne są -e by -nparametry, aby pliki pozostały niezmienione. Byłoby miło dodać parametr -readCount 0do wydajności. Skrypt z renamejest krótszy :) Naprawiono.
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)}

Skrócona wersja:

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

Nie najkrótszy, ale bardzo prosty i łatwy do odczytania. Brak plików pośrednich, tylko pamięć RAM.


źródło
1
Biorąc pod uwagę, że jest to gra w golfa kodowego , możesz przynajmniej usunąć przestrzenie i spróbować jak najkrócej.
Ry-
Niestety, nie zdawałem sobie sprawy, że to kod-golf, przepraszam
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
źródło
10
To nie jest tak naprawdę golfy :(
Jakob Bowyer
1

Skrypt powłoki, 24

Działa w Bash i prawdopodobnie w większości powłok. Przekaż z dwoma nazwami plików jako parametrami.

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

Jeśli chcesz naprawić nazwy plików, zrobi to za karę 12 znaków:

mv i.txt ੴ;mv o.txt i.txt;mv ੴ o.txt
Darren Stone
źródło
@minitech, tak to robi. „ੴ” staje się „o.txt”. To nie są mvoperacje cp.
Darren Stone
Jak dotąd druga najlepsza odpowiedź! Zmniejsz go o dwie postacie, a wygrasz! Nie dbam o ustalone nazwy plików.
1

Pyton:

import os
l,e='i_o'*2,'.txt'
for x,y in zip(l,l[1:])[::2]:
 os.rename(x+e,y+e)
tamasgal
źródło
1

Plik wsadowy Windows (48)

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

Zapomniałem o poleceniu move, pisząc to ...

kitcar2000
źródło
Właśnie nadpisałeś mój aplik!
Danny
@ Danny Pytanie mówi, że możesz utworzyć inny plik, ale należy go usunąć.
kitcar2000
1

C 162

Gra w golfa: używa t.txt jako pliku tmp i zamienia nazwy, a następnie usuwa 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;}

Edycja: usunięto 2 spacje

Bacchusbeale
źródło
1

PHP - 172

Wersja odpowiedzi EisaAdil w golfa

$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
źródło
1

Rebol - 46 (zmiana nazwy pliku) lub 55 (zawartość r / w)

Zmień nazwę pliku (używając tjako pliku tymczasowego):

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

Wczytaj, a następnie zapisz zawartość pliku:

a: read i: %i.txt
b: read o: %o.txt
write o a 
write i b
draegtun
źródło
1

PHP, 45

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

Niezbyt golfowy, ale jak dotąd najkrótszy PHP.

mleko
źródło
brakuje rozszerzeń plików.
Tytus
1

Groovy - 99 znaków

To jest moja próba z Groovy 2.2.1. Próbowałem to zrobić bez zmiany nazwy:

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

Nie golfowany:

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
źródło
1

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

Zmiana nazwy za pomocą pliku tymczasowego t na dysku c: \. Również pierwsza próba golfa: 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

Jeżeli odwołanie do scrrun.dll już istnieje, może go nieco obniżyć do 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
źródło
Wygląda na to, że twój kod ma dużo białych znaków. Czy jesteś pewien, że są potrzebne? Możesz uzyskać znacznie lepszy wynik, jeśli je usuniesz.
user12205
Wydaje
1

C: 65 znaków

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

Dość proste rozwiązanie w C, które spełnia swoje zadanie. Używa tymczasowej nazwy ( .txt) dla jednego z plików przed nadaniem mu poprawnej nowej nazwy.

Niegolfowany (zwróć uwagę na to, jak podświetlenie składni kończy się niepowodzeniem w definicji, wykryto błąd!):

#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
źródło
1

Perl, 120 bajtów (zamiana zawartości bez zmiany nazwy pliku)

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

Zawartość pliku jest zapisywana w pamięci i zapisywana z powrotem w innym pliku. Tak więc i.txti o.txtmusi pasować do pamięci.

Ponieważ zawartość pliku jest faktycznie wymieniana, twarde linki są aktualizowane automatycznie, patrz komentarz AJManfield .

Nie golfowany:

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
źródło
1

Pakiet Windows, 39 bajtów

ren i.txt x&ren o.txt i.txt&ren x o.txt
Peter Ferrie
źródło
1

Lua ,71 70 bajtów

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

Wypróbuj online!

Zdefiniuj osbibliotekę systemu operacyjnego jako tabelę globalną, abyśmy mogli pisać renamei removezamiast os.renamei os.remove. (Nawiasem mówiąc, oznacza to również, że zmienne jednoliterowe są w rzeczywistości polami w ostabeli.) Utwórz krótki alias, os.renameaby zaoszczędzić trochę miejsca. Skonfiguruj zmienne nazw plików, używając ich '.txt'jako pliku tymczasowego. Wykonaj zmianę nazwy i usuwanie.

cyklista
źródło
1

PHP, 52 bajty

Pyta Anyway zmodernizowany i grał w golfa:

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

Uruchom z php -nr '<code>'.

Tytus
źródło
1

Tcl , 122 bajty

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

Wypróbuj online!


Tcl , 169 bajtów

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

Wypróbuj online!

sergiol
źródło
0

SmileBASIC, 36 35 bajtów

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
12Me21
źródło