두 파일의 내용 바꾸기


13

이것은 코드 골프 질문입니다. 두 개의 개별 파일 (i.txt 및 o.txt)의 내용을 가져 와서 바꿔야합니다. 프로세스에 도움이되는 세 번째 파일을 만들 수 있지만 파일 내용이 바뀌면 프로그램에서 파일을 삭제하도록 할 수 있습니다. 파일 이름 바꾸기가 다시 허용됩니다.

모든 파일 내용에 대해 프로그램이 작동해야합니다.

코드가 가장 짧은 경우, 모든 적격 제출이 투표됩니다.


2
파일 이름을 바꿉니다. 결과를 달성하기 위해 "콘텐츠를 가져와"교환 할 필요가 없습니다.
Darren Stone

@Darren Stone 나는 그것이 불법이어야한다고 생각합니다. 답변을 제출하기 전에 확인해 주셔서 감사합니다.

제약 조건이 나쁜 것 같습니다. 이름을 바꾸는 것이 가장 좋은 방법입니다.
hdante

1
좋아, 나는이 제약을 제거 할 수있다.

6
@hdante 그러나 '파일 이름 바꾸기'는 내용을 교환 하지 않습니다 . 사용하는 시스템에서 inode여기의 목표가 될 것 i.txt'이야 inode로부터 데이터를 포함하는 o.txt의' inode그가 하드 링크가있는 경우 너무, 반대, 그리고 그 반대를 inode다른 곳이야, 그 내용이 잘으로 교체되어 나타납니다. 이름을 바꾸면 달성 할 수 없습니다.
AJMansfield

답변:


9

zsh, 20

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

1
그래도 임시 파일이없는 것을 좋아합니다 i=`<i.txt`;<o*>i*;<<<$i>o*. 더 짧아야한다는 것은 너무 나쁩니다.
Ry- December

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

파이썬, 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)

파이썬, 65

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

파이썬, 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");?>

윈도우 배치 파일, 42

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

Windows 배치 파일 (args), 30

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

$r=renamePHP에서 함수의 별칭을 만드는 데 사용할 수 있다는 것을 몰랐습니다 . 감사!
AL

2

두 개의 기반 ansers; 52 및 62 자

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

참고 : 첫 번째 패치 출력이 리디렉션되지 않으므로 두 번째 패치 명령에서 가비지가됩니다. 이것이 하나만 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

루비, 72 바이트

와! 루비 코드 골프! 나는 그것이 전에 시도 된 적이 없다고 생각합니다!

그러나 실제로 이것은 멋진 루비 단축키와 내가 찾은 몇 가지 패턴이 필요했습니다. 그것은 나의 첫번째 골프 였고하는 것은 매우 재미 있었다. 더 이상 고민하지 않으면 골프 코드가 있습니다.

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

그리고 ungolfed 버전

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

파워 쉘, 44 49 바이트

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

여기서 Rename-Item의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

파이썬 :

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

1

윈도우 배치 파일 (48)

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

이것을 쓸 때 이동 명령을 잊어 버렸습니다 ...


방금 내 a파일을 덮어 썼습니다 !
Danny

@Danny이 질문은 다른 파일을 만들 수 있지만 삭제해야한다는 내용입니다.
kitcar2000

1

C 162

골프 : 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

PHP, 45

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

골프는 아니지만 지금까지 가장 짧은 PHP.


파일 확장자가 없습니다.
Titus

1

그루비-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

언 골프 드 :

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)

c : \ 드라이브에서 임시 파일 t를 사용하여 이름을 바꿉니다. 또한 골프 첫 시도 : 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

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 (구문 강조 표시가 define에서 어떻게 실패하는지, 버그가 발견되었습니다!) :

#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.txto.txt메모리에 적합해야합니다.

파일 내용이 실제로 교환되기 때문에 하드 링크가 자동으로 업데이트됩니다 (AJManfield의 설명 참조) .

언 골프 드 :

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

루아 ,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'임시 파일로 사용하여 파일 이름 변수를 설정 하십시오. 이름을 바꾸고 삭제하십시오.


1

PHP, 52 바이트

AsksAnyway의 PHP 현대화 및 골프 :

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

로 실행하십시오 php -nr '<code>'.



0

SmileBASIC, 36 35 바이트

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.