Tukar konten dua file

13

Ini adalah pertanyaan kode-golf. Anda perlu mengambil konten dari dua file terpisah (i.txt dan o.txt) dan menukar mereka. Anda dapat membuat file ketiga untuk membantu Anda dengan proses, tetapi minta program Anda menghapusnya setelah konten file ditukar. Mengganti nama file sekarang diizinkan lagi.

Program harus bekerja untuk semua konten file.

Kode terpendek menang, semua pengiriman yang memenuhi syarat akan dipilih.


sumber
2
Ganti nama file. Tidak perlu "mengambil konten" dan menukar mereka untuk mencapai hasil.
Darren Stone
@ Darren Stone Saya pikir itu harus ilegal. Terima kasih telah mengetahui bahwa sebelum jawaban diajukan.
Sepertinya kendala yang buruk, penggantian nama adalah cara terbaik untuk melakukan ini
hdante
1
Baiklah, saya bisa menghapus batasan ini.
6
@hdante tetapi 'mengganti nama file' tidak bertukar konten mereka . Pada sistem yang menggunakan inodes tujuan di sini akan untuk i.txt's inodemengandung data dari o.txt' s inode, dan sebaliknya, sehingga jika ada hardlinks untuk mereka inodes tempat lain, isinya akan muncul bertukar juga. Mengganti nama tidak bisa menyelesaikan itu.
AJMansfield

Jawaban:

9

zsh, 20

<i*>t;<o*>i*;mv t o*
Ry-
sumber
1
Aku seperti yang tanpa file sementara yang lebih baik, meskipun: i=`<i.txt`;<o*>i*;<<<$i>o*. Sayang sekali ini harus lebih pendek.
Ry-
1
Aturan diubah untuk mengizinkan penggantian nama file. Anda dapat memperbarui kode jika diinginkan.
Anda bisa menghemat 3 karakter dengan mengganti <t>o*;rm tdengan mv t o*!
F. Hauri
@ F. Hauri: Ah, terima kasih! (Ada aturan yang melarang penggantian nama pada satu titik.)
Ry-
Kode ini tidak benar. Ini hanya berfungsi dalam kasus khusus di mana i * dan o * hanya akan cocok dengan i.txt dan o.txt, yaitu tidak ada file lain dengan nama yang dimulai dengan "i" atau "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");?>

File Batch Windows, 42

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

File Batch Windows (args), 30

move %1 x&move %2 %1&move x %2
AsksAnyway
sumber
Saya tidak tahu Anda dapat menggunakan $r=renameuntuk membuat alias ke fungsi di PHP. Terima kasih!
AL
2

Dua berbasis ; 52 dan 62 karakter

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

Mungkin bukan yang lebih pendek, tapi saya menemukan kesenangan ini (dan tidak ada penggunaan file sementara ):

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

Di mana konten ditukar dan file diubah di tempat :

Contoh dijalankan

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

Dapat menghasilkan sesuatu seperti:

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

penggunaan xargs untuk menyederhanakan mv permintaan

Tidak lucu, tapi tetap menyenangkan.

set -- {i,o}.txt t&&eval 'xargs -n2 mv<<<"' \${1,3,2,1,3,2} \"
F. Hauri
sumber
Nota: Karena keluaran tambalan pertama tidak dialihkan, mereka menjadi sampah pada perintah tambalan kedua. Ini alasannya karena hanya satu yang patching file o.txtmuncul.
F. Hauri
2

PHP, 89

Saya pikir saya akan mencobanya.

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

Versi tidak disatukan:

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

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

Rupanya saya mengambil 2 jawaban di sini dan menggabungkannya .. oh well.

MisterBla
sumber
2

Ruby, 72 byte

Wow! Golf kode Ruby! Saya tidak berpikir itu pernah dicoba sebelumnya!

Dalam semua kenyataan, ini membutuhkan beberapa cara pintas Ruby yang bagus dan beberapa pola yang saya temukan. Ini adalah golf pertama saya dan sangat menyenangkan untuk dilakukan. Tanpa basa-basi lagi, inilah kode golfnya:

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

Dan versi yang tidak serigala

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

Faktor kunci dalam hal ini adalah bahwa parameter yang diteruskan ke File.renameapakah ini, tepatnya:

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

Semoga ini (tidak) masuk akal!

Aearnus
sumber
2

Powershell, 44 49 byte

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

dimana ren alias untuk Rename-Item . Script menggunakan dan menghapus file ketiga a.txt.

mazzy
sumber
1
Ini bisa gagal dengan penyandian tertentu. Karena gcstandarnya adalah UTF8NoBOM tetapi scstandarnya adalah ASCII. Coba beberapa file UTF-8 atau file biner dan Anda dapat melihat bagaimana itu bisa gagal.
AdmBorkBork
Memang. Terima kasih. Perlu -e by -nparameter untuk memastikan bahwa file tidak berubah. Akan menyenangkan untuk menambahkan parameter -readCount 0ke kinerja. Skrip dengan renamelebih pendek :) Tetap.
mazzy
1

Rubi

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

Versi singkat:

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

Bukan yang terpendek, tetapi sangat sederhana dan mudah dibaca. Juga, tidak ada file perantara, hanya RAM.


sumber
1
Mengingat bahwa ini adalah kode-golf , Anda setidaknya bisa mengeluarkan spasi dan mencoba yang paling singkat.
Ry-
Benar-benar tidak menyadari itu kode-golf, maaf
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
sumber
10
Thats not really golfy :(
Jakob Bowyer
1

Script shell, 24

Bekerja di Bash dan mungkin sebagian besar shell. Lulus dengan dua nama file Anda sebagai parameter.

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

Jika Anda ingin memperbaiki nama file maka ini akan melakukannya, untuk penalti 12 char:

mv i.txt ੴ;mv o.txt i.txt;mv ੴ o.txt
Darren Stone
sumber
@minitech, ya itu benar. 'ੴ' menjadi 'o.txt'. Itu mvoperasi, bukan cp.
Darren Stone
Jawaban terbaik kedua sejauh ini! Kurangi dengan dua karakter dan Anda menang! Saya tidak peduli dengan nama file yang diperbaiki.
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
sumber
1

File Batch Windows (48)

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

Saya lupa tentang perintah pindah ketika saya menulis ini ...

kitcar2000
sumber
Anda baru saja menimpa afile saya !
Danny
@Danny Pertanyaannya menyatakan bahwa Anda dapat membuat file lain, tetapi harus dihapus.
kitcar2000
1

C 162

Golfed: menggunakan t.txt sebagai file tmp dan menukar nama kemudian menghapus 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: dihapus 2 spasi

bacchusbeale
sumber
1

PHP - 172

Versi Golf jawaban @ 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);
Cepat
sumber
1

Rebol - 46 (ganti nama file) atau 55 (konten r / w)

Ganti nama file (menggunakan tfile sementara):

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

Baca lalu tulis konten file:

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

PHP, 45

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

PHP tidak terlalu golfy tetapi terpendek sejauh ini.

mleko
sumber
ekstensi file tidak ada.
Titus
1

Groovy - 99 karakter

Ini adalah usaha saya, dengan Groovy 2.2.1. Saya mencoba melakukannya tanpa mengganti nama:

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

Tidak Disatukan:

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

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

Mengganti nama dengan file temp t di c: \ drive. Juga upaya pertama di 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

Jika scrrun.dll sudah direferensikan, bisa kurangi sedikit menjadi 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
sumber
Sepertinya kode Anda memiliki banyak spasi. Apakah Anda yakin mereka dibutuhkan? Anda dapat memiliki skor yang jauh lebih baik jika Anda menghapusnya.
user12205
Saya tidak berpikir itu diperlukan editor hanya melemparkannya. Dihapus terpisah dari tempat itu diperlukan :)
jaybee3
1

C: 65 karakter

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

Solusi yang cukup sederhana dalam C yang melakukan pekerjaan. Ini menggunakan nama sementara (.txt ) untuk salah satu file sebelum memberinya nama baru yang tepat.

Tidak digabungkan (perhatikan bagaimana penyorotan sintaks gagal di define, bug telah ditemukan!):

#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;
}
Untuk S
sumber
1

Perl, 120 byte (Isi bertukar tanpa mengganti nama file)

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

Isi file dimasukkan ke dalam memori dan ditulis kembali ke file lainnya. Dengan demikian i.txtdan o.txtharus masuk ke dalam memori.

Karena konten file sebenarnya dipertukarkan, tautan keras diperbarui secara otomatis, lihat komentar AJManfield .

Tidak Disatukan:

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

Windows Batch, 39 byte

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

Lua ,71 70 byte

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

Cobalah online!

Tentukan os, perpustakaan sistem operasi, sebagai tabel global sehingga kita dapat menulis renamedan removebukannya os.renamedan os.remove. (Kebetulan ini juga berarti variabel satu huruf sebenarnya adalah bidang dalam ostabel.) Buat alias pendek untuk os.renamemenghemat ruang. Atur variabel nama file, gunakan '.txt'sebagai file sementara. Lakukan pengubahan nama dan penghapusan.

pengendara sepeda
sumber
1

PHP, 52 byte

Php AsksAnyway dimodernisasi & di- golf :

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

Jalankan dengan php -nr '<code>'.

Titus
sumber
1

Tcl , 122 byte

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

Cobalah online!


Tcl , 169 byte

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

Cobalah online!

sergiol
sumber
0

SmileBASIC, 36 35 byte

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