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.


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*

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

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} \"

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.


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!


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.


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.


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

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

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

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 ...


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


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

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

1

PHP, 45

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

PHP tidak terlalu golfy tetapi terpendek sejauh ini.


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)

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

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

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


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.


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>'.


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!


0

SmileBASIC, 36 35 byte

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.