Hoán đổi nội dung của hai tập tin


13

Đây là một câu hỏi mã-golf. Bạn cần lấy nội dung của hai tệp riêng biệt (i.txt và o.txt) và trao đổi chúng. Bạn có thể tạo một tệp thứ ba để giúp bạn xử lý, nhưng yêu cầu chương trình của bạn xóa nó sau khi nội dung tệp được hoán đổi. Đổi tên các tập tin bây giờ được cho phép một lần nữa.

Các chương trình phải làm việc cho bất kỳ nội dung tập tin.

Mã chiến thắng ngắn nhất, tất cả các bài nộp đủ điều kiện sẽ được bình chọn.


2
Đổi tên các tập tin. Không cần phải "lấy nội dung" và trao đổi chúng để đạt được kết quả.
Darren Stone

@Darren Stone Tôi nghĩ rằng đó là bất hợp pháp. Cảm ơn đã nắm bắt được điều đó trước khi câu trả lời được gửi.

Có vẻ như một ràng buộc xấu, đổi tên là cách tốt nhất để làm điều này
hdante

1
Được rồi, tôi có thể loại bỏ ràng buộc này.

6
@hdante nhưng 'đổi tên tập tin' không trao đổi nội dung của chúng . Trên một hệ thống sử dụng inodes mục tiêu ở đây sẽ được cho i.txtinodeđể chứa các dữ liệu từ o.txt's inode, và ngược lại, do đó nếu có liên kết cứng cho những inodes ở nơi khác, nội dung của họ sẽ xuất hiện hoán đổi là tốt. Đổi tên không thể thực hiện được điều đó.
AJMansfield

Câu trả lời:


9

zsh, 20

<i*>t;<o*>i*;mv t o*

1
Tôi thích cái mà không có tập tin tạm thời tốt hơn, mặc dù : i=`<i.txt`;<o*>i*;<<<$i>o*. Thật tệ khi điều này phải ngắn hơn.
Ry- 28/12/13

1
Quy tắc thay đổi để cho phép đổi tên tập tin. Bạn có thể cập nhật mã của bạn nếu bạn muốn.

Bạn có thể tiết kiệm 3 ký tự bằng cách thay thế <t>o*;rm tbằng mv t o*!
F. Hauri

@ F.Hauri: À, cảm ơn! (Có các quy tắc chống đổi tên tại một thời điểm.)
Ry-

Mã này không đúng. Nó chỉ hoạt động trong trường hợp đặc biệt trong đó i * và o * sẽ chỉ khớp với i.txt và o.txt tương ứng, tức là không có tệp nào khác có tên bắt đầu bằng "i" hoặc "o".
Erwan Legrand

3

Con trăn, 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)

Con trăn, 65

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

Con trăn, 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");?>

Tập tin hàng loạt Windows, 42

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

Tệp hàng loạt Windows (args), 30

move %1 x&move %2 %1&move x %2

Tôi không biết bạn có thể sử dụng $r=renameđể tạo bí danh cho các hàm trong PHP. Cảm ơn!
AL

2

Hai dựa trên ansers; 52 và 62 ký tự

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

Có thể không ngắn hơn, nhưng tôi thấy điều này thú vị (và không sử dụng tệp tạm thời ):

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

Nơi nội dung được hoán đổi và các tệp được sửa đổi tại chỗ :

Chạy mẫu

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

Có thể tạo ra một cái gì đó như:

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

sử dụng xargs để đơn giản hóa mv các yêu cầu

Không phải là buồn cười, nhưng dù sao cũng tốt đẹp.

set -- {i,o}.txt t&&eval 'xargs -n2 mv<<<"' \${1,3,2,1,3,2} \"

Lưu ý: Vì đầu ra bản vá đầu tiên không được chuyển hướng, chúng trở thành rác trên lệnh vá thứ hai. Đây là lý do bởi vì chỉ có một patching file o.txtxuất hiện.
F. Hauri

2

PHP, 89

Tôi nghĩ tôi sẽ cho nó một phát súng.

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

Phiên bản bị đánh cắp:

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

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

Rõ ràng tôi đã lấy 2 câu trả lời ở đây và kết hợp chúng .. oh tốt.


2

Ruby, 72 byte

Ồ Một golf mã Ruby! Tôi không nghĩ rằng điều đó đã từng được cố gắng trước đây!

Trong thực tế, điều này đòi hỏi một số phím tắt Ruby đẹp và một vài mẫu mà tôi tìm thấy. Đó là sân golf đầu tiên của tôi từ trước đến giờ và nó rất thú vị. Nếu không có thêm rắc rối, đây là mã đánh gôn:

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

Và phiên bản không có người nhận

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

Yếu tố chính trong điều này là các tham số được truyền cho File.renamechính xác là:

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

Hy vọng điều này (không) có ý nghĩa!


2

Powershell, 44 49 byte

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

nơi renlà bí danh cho Rename-mục . Kịch bản sử dụng và xóa một tập tin thứ ba a.txt.


1
Điều này có thể thất bại với mã hóa nhất định. Bởi vì gcmặc định là UTF8NoBOM nhưng scmặc định là ASCII. Hãy thử một số tệp UTF-8 hoặc tệp nhị phân và bạn có thể thấy nó có thể thất bại như thế nào.
admBorkBork

Thật. Cảm ơn. Nó cần -e by -ncác tham số để đảm bảo rằng các tập tin không thay đổi. Nó sẽ là tốt đẹp để thêm một tham số -readCount 0cho hiệu suất. Kịch bản với renamengắn hơn :) Đã sửa.
mê mẩn

1

Hồng ngọc

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

Phiên bản rút gọn:

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

Không phải là ngắn nhất, nhưng rất đơn giản và dễ đọc. Ngoài ra, không có tập tin trung gian, chỉ có RAM.


1
Cho rằng đó là một môn đánh gôn , ít nhất bạn có thể lấy ra các khoảng trống và thử phần nào ngắn nhất.
Ry-

Hoàn toàn không nhận ra đó là môn đánh gôn, xin lỗi

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
Đó không phải là golf thực sự :(
Jakob Bowyer

1

Kịch bản Shell, 24

Hoạt động trong Bash và có lẽ hầu hết các vỏ. Vượt qua với hai tên tệp của bạn làm tham số.

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

Nếu bạn muốn tên tập tin cố định thì điều này sẽ làm điều đó, với hình phạt 12 char:

mv i.txt ੴ;mv o.txt i.txt;mv ੴ o.txt

@minitech, đúng vậy. 'ੴ' trở thành 'o.txt'. Đó là những mvhoạt động, không phải cp.
Darren Stone

Câu trả lời tốt thứ hai cho đến nay! Giảm nó bằng hai nhân vật và bạn thắng! Tôi không quan tâm đến tên tập tin cố định.

1

Con trăn

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

1

Tập tin hàng loạt Windows (48)

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

Tôi quên mất lệnh di chuyển khi tôi viết điều này ...


Bạn chỉ cần ghi đè lên atập tin của tôi !
Daniel

@Danny Câu hỏi cho biết bạn có thể tạo một tệp khác, nhưng nó phải bị xóa.
kitcar2000

1

C 162

Golfed: sử dụng t.txt làm tệp tmp và hoán đổi tên sau đó xóa 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;}

Chỉnh sửa: xóa 2 khoảng trắng


1

PHP - 172

Phiên bản chơi gôn của câu trả lời của @ 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 (đổi tên tệp) hoặc 55 (nội dung r / w)

Đổi tên tệp (sử dụng tlàm tệp tạm thời):

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

Đọc trong đó viết ra nội dung tập tin:

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

Không phải là rất golf nhưng PHP ngắn nhất cho đến nay.


phần mở rộng tập tin bị thiếu.
Tít

1

Groovy - 99 ký tự

Đây là nỗ lực của tôi, với Groovy 2.2.1. Tôi đã cố gắng để làm điều đó mà không đổi tên:

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

Ung dung:

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) và (126 ... 110)

Đổi tên bằng tệp tạm thời t trong ổ đĩa c: \. Cũng là nỗ lực đầu tiên tại 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

Nếu Scrrun.dll đã được tham chiếu, có thể giảm nó xuống còn 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

Có vẻ như mã của bạn có rất nhiều khoảng trắng. Bạn có chắc là chúng cần thiết? Bạn có thể có một số điểm tốt hơn nhiều nếu bạn loại bỏ chúng.
dùng12205

Tôi không nghĩ rằng nó cần trình soạn thảo chỉ cần ném nó vào. Đã xóa khỏi nơi cần thiết :)
jaybee3

1

C: 65 ký tự

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

Một giải pháp khá đơn giản trong C đó là công việc. Nó sử dụng một tên tạm thời (.txt ) cho một trong các tệp trước khi đặt tên mới đúng.

Ungolfed (lưu ý cách đánh dấu cú pháp không thành công trong định nghĩa, một lỗi đã được phát hiện!):

#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 (Nội dung hoán đổi mà không đổi tên tệp)

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

Nội dung tệp được đưa vào bộ nhớ và ghi lại vào tệp khác. Như vậy i.txto.txt phải phù hợp với bộ nhớ.

Vì nội dung tệp thực sự được trao đổi, các liên kết cứng được cập nhật tự động, hãy xem nhận xét của AJManfield .

Ung dung:

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)

Hãy thử trực tuyến!

Xác định os, thư viện hệ điều hành, như bảng toàn cầu để chúng ta có thể viết renameremovethay vì os.renameos.remove. (Ngẫu nhiên điều này cũng có nghĩa là các biến một chữ cái thực sự là các trường trong osbảng.) Tạo bí danh ngắn os.renameđể tiết kiệm không gian. Thiết lập các biến tên tệp, sử dụng '.txt'làm tệp tạm thời. Thực hiện đổi tên và xóa.


1

PHP, 52 byte

AsksAnyway ứcs php hiện đại hóa & chơi gôn:

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

Chạy với 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

Hãy thử trực tuyến!


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

Hãy thử trực tuyến!


0

SmileBASIC, 36 35 byte

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.