สลับเนื้อหาของสองไฟล์


13

นี่คือคำถามที่รหัสกอล์ฟ คุณต้องนำเนื้อหาของไฟล์สองไฟล์แยกกัน (i.txt และ o.txt) และสลับไฟล์ คุณสามารถสร้างไฟล์ที่สามเพื่อช่วยให้คุณมีกระบวนการ แต่มีโปรแกรมของคุณลบมันหลังจากที่เนื้อหาของไฟล์จะถูกสลับ อนุญาตให้เปลี่ยนชื่อไฟล์ได้อีกครั้ง

โปรแกรมจะต้องทำงานกับเนื้อหาไฟล์ใด ๆ

รหัสที่สั้นที่สุดจะชนะการส่งที่มีสิทธิ์ทั้งหมดจะได้รับการโหวต


2
เปลี่ยนชื่อไฟล์ ไม่จำเป็นต้อง "รับเนื้อหา" และสลับเพื่อให้ได้ผลลัพธ์
Darren Stone

@Darren Stone ฉันคิดว่ามันผิดกฎหมาย ขอบคุณที่ติดตามก่อนส่งคำตอบ

ดูเหมือนข้อ จำกัด ที่ไม่ดีการเปลี่ยนชื่อเป็นวิธีที่ดีที่สุดในการทำเช่นนี้
hdante

1
เอาล่ะฉันสามารถลบข้อ จำกัด นี้ได้

6
@hdante แต่ 'เปลี่ยนชื่อไฟล์' ไม่ได้แลกเปลี่ยนเนื้อหาของพวกเขา ในระบบที่ใช้inodeเป้าหมายที่นี่จะเป็นi.txtเรื่องinodeที่จะมีข้อมูลจากo.txt's inodeและในทางกลับกันเพื่อที่ว่าถ้ามี hardlinks กับผู้inodes อื่น ๆ เนื้อหาของพวกเขาจะปรากฏสลับเช่นกัน การเปลี่ยนชื่อไม่สามารถทำได้
AJMansfield

คำตอบ:


9

zsh, 20

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

1
i=`<i.txt`;<o*>i*;<<<$i>o*ฉันเหมือนคนที่ไม่มีแฟ้มชั่วคราวดีกว่าแม้ว่า: มันแย่มากที่จะต้องสั้นกว่านี้
Ry-

1
มีการเปลี่ยนแปลงกฎเพื่ออนุญาตการเปลี่ยนชื่อไฟล์ คุณสามารถอัปเดตรหัสของคุณได้หากต้องการ

คุณสามารถบันทึกได้ 3 ตัวอักษรโดยแทนที่<t>o*;rm tด้วยmv t o*!
F. Hauri

@ F.Hauri: อ้าขอบคุณ! (มีกฎว่าด้วยการเปลี่ยนชื่อในจุดหนึ่ง)
Ry-

รหัสนี้ไม่ถูกต้อง ใช้งานได้เฉพาะในกรณีพิเศษที่ i * และ o * จะจับคู่เฉพาะ i.txt และ o.txt ตามลำดับนั่นคือไม่มีไฟล์อื่นที่มีชื่อขึ้นต้นด้วย "i" หรือ "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");?>

ไฟล์ Windows Batch, 42

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

ไฟล์ Windows Batch (args), 30

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

ฉันไม่รู้ว่าคุณสามารถใช้$r=renameสร้างนามแฝงกับฟังก์ชันใน PHP ได้ ขอบคุณ!
อัล

2

สองแอนเซอร์ที่ใช้52 และ 62 ตัวอักษร

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

อาจจะไม่สั้นกว่านี้ แต่ฉันพบว่ามันสนุก (และไม่มีการใช้ไฟล์ชั่วคราว ):

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

ที่มีเนื้อหาจะสลับและไฟล์ที่มีการแก้ไขในสถานที่ :

วิ่งตัวอย่าง

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

สามารถผลิตสิ่งที่ชอบ:

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

ใช้ xargs เพื่อทำให้ mvคำร้องของ่ายขึ้น

ไม่ตลก แต่ก็ดีอยู่ดี

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

หมายเหตุ: เนื่องจากเอาต์พุตแพตช์แรกไม่ได้ถูกเปลี่ยนทิศทางพวกมันจะกลายเป็นขยะในคำสั่ง patch ที่สอง นี่คือเหตุผลเพราะมีเพียงหนึ่งpatching file o.txtปรากฏ
F. Hauri

2

PHP, 89

ฉันคิดว่าฉันจะให้มันยิง

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

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

เห็นได้ชัดว่าฉันเอา 2 คำตอบของที่นี่และรวมพวกเขา .. โอ้ดี


2

Ruby, 72 ไบต์

ว้าว! รหัสกอล์ฟ Ruby! ฉันไม่คิดว่าเคยลองมาก่อน!

แม้ว่าในความเป็นจริงทั้งหมดนี้ต้องใช้ทางลัด Ruby ที่ดีและรูปแบบคู่ที่ฉันพบ มันเป็นสนามกอล์ฟครั้งแรกของฉันและสนุกมากที่จะทำ โดยไม่ต้องกังวลใจต่อไปนี้เป็นรหัส golfed:

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

และเวอร์ชันที่ไม่ดี

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

ปัจจัยสำคัญในการนี้คือพารามิเตอร์ที่ส่งผ่านไปยังสิ่งFile.renameนี้คือ:

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

หวังว่านี่จะไม่สมเหตุสมผลเลย!


2

Powershell, 44 49 ไบต์

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

ที่renเป็นนามแฝงสำหรับเปลี่ยนชื่อรายการ a.txtสคริปต์การใช้งานและลบไฟล์ที่สาม


1
สิ่งนี้อาจล้มเหลวด้วยการเข้ารหัสบางอย่าง เนื่องจากgcค่าเริ่มต้นคือ UTF8NoBOM แต่scค่าเริ่มต้นคือ ASCII ลองใช้ไฟล์ UTF-8 บางไฟล์หรือไฟล์ไบนารีและคุณสามารถดูว่ามันจะล้มเหลวได้อย่างไร
AdmBorkBork

จริง ขอบคุณ มันต้องการ-e by -nพารามิเตอร์เพื่อให้แน่ใจว่าไฟล์ไม่เปลี่ยนแปลง มันเป็นการดีที่จะเพิ่มพารามิเตอร์-readCount 0ให้กับประสิทธิภาพ สคริปต์renameสั้นลง :) แก้ไข
mazzy

1

ทับทิม

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

ฉบับย่อ:

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

ไม่ใช่สั้นที่สุด แต่ง่ายมากและอ่านง่าย นอกจากนี้ไม่มีไฟล์กลาง RAM เท่านั้น


1
ระบุว่ามันเป็นรหัสกอล์ฟอย่างน้อยที่สุดคุณก็สามารถกำจัดช่องว่างและลองให้สั้นที่สุด
Ry-

โดยสิ้นเชิงไม่ทราบว่ามันเป็นรหัสกอล์ฟขออภัย

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
นั่นไม่จริงกอล์ฟ :(
Jakob Bowyer

1

เชลล์สคริปต์ 24

ใช้งานได้ใน Bash และอาจเป็นหอยส่วนใหญ่ ส่งผ่านสองชื่อไฟล์ของคุณเป็นพารามิเตอร์

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

หากคุณต้องการชื่อไฟล์คงที่นี้จะทำเพื่อโทษ 12 ถ่าน:

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

@minitech ใช่มันเป็นเช่นนั้น 'ੴ' กลายเป็น 'o.txt' เหล่านี้คือการดำเนินงานไม่ได้mv cp
Darren Stone

คำตอบที่ดีที่สุดที่สองจนถึงตอนนี้! ลดมันด้วยตัวละครสองตัวและคุณจะชนะ! ฉันไม่สนใจชื่อไฟล์คงที่


1

ไฟล์ Windows Batch (48)

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

ฉันลืมเกี่ยวกับคำสั่งย้ายเมื่อฉันเขียนสิ่งนี้ ...


คุณเขียนทับaไฟล์ของฉัน!
Danny

@Danny คำถามระบุว่าคุณอาจสร้างไฟล์อื่นได้ แต่ต้องลบทิ้ง
kitcar2000

1

C 162

Golfed: ใช้ t.txt เป็นไฟล์ tmp และเปลี่ยนชื่อจากนั้นลบ 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;}

แก้ไข: ลบ 2 ช่องว่าง


1

PHP - 172

คำตอบของ @ 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 (เปลี่ยนชื่อไฟล์) หรือ 55 (เนื้อหา r / w)

เปลี่ยนชื่อไฟล์ (ใช้tเป็นไฟล์ชั่วคราว):

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

อ่านแล้วเขียนเนื้อหาไฟล์:

a: read i: %i.txt
b: read o: %o.txt
write o a 
write i b


1

Groovy - 99 ตัวอักษร

นี่คือความพยายามของฉันด้วย Groovy 2.2.1 ฉันพยายามทำโดยไม่เปลี่ยนชื่อ:

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)

1

VBA (148 ... 132) และ (126 ... 110)

การเปลี่ยนชื่อไฟล์ temp ในไดรฟ์ c: \ ความพยายามครั้งแรกที่สนามกอล์ฟ:

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

หากมีการอ้างอิง scrrun.dll อยู่แล้วสามารถลดระดับลงเหลือ 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

ดูเหมือนว่ารหัสของคุณมีช่องว่างมากมาย คุณแน่ใจหรือว่าจำเป็น คุณสามารถทำคะแนนได้ดีกว่ามากถ้าคุณลบออก
user12205

ฉันไม่คิดว่ามันจำเป็นแก้ไขเพียงแค่โยนมันในนำออกนอกเหนือจากที่มันจำเป็น :).
jaybee3

1

C: 65 ตัวอักษร

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

ทางออกที่ค่อนข้างง่ายใน C ที่ทำงานได้ มันใช้ชื่อชั่วคราว ( .txt) สำหรับหนึ่งในไฟล์ก่อนที่จะให้ชื่อใหม่ที่เหมาะสม

Ungolfed (โปรดสังเกตว่าการเน้นไวยากรณ์ล้มเหลวในการกำหนดข้อผิดพลาดได้ถูกค้นพบ!):

#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 ไบต์ (เนื้อหาการแลกเปลี่ยนโดยไม่เปลี่ยนชื่อไฟล์)

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

เนื้อหาไฟล์ถูกใส่ในหน่วยความจำและเขียนกลับไปยังไฟล์อื่น ดังนั้นi.txtและo.txtจะต้องพอดีกับหน่วยความจำ

เนื่องจากเนื้อหาของแฟ้มมีการแลกเปลี่ยนจริงเชื่อมโยงอย่างหนักมีการปรับปรุงโดยอัตโนมัติดู AJManfield ของความคิดเห็น

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


1

Lua ,71 70 ไบต์

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

ลองออนไลน์!

กำหนดosห้องสมุดระบบปฏิบัติการเป็นตารางทั่วโลกเพื่อให้เราสามารถเขียนrenameและremoveแทนและos.rename os.remove(โดยบังเอิญนี่หมายความว่าตัวแปรหนึ่งตัวอักษรเป็นฟิลด์จริงในosตาราง) สร้างนามแฝงสั้น ๆos.renameเพื่อประหยัดพื้นที่ ตั้งค่าตัวแปรชื่อไฟล์โดยใช้'.txt'เป็นไฟล์ชั่วคราว ทำการเปลี่ยนชื่อและลบ




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.