2つのファイルの内容を交換する


13

これはコードゴルフの質問です。2つの別個のファイル(i.txtおよびo.txt)の内容を取得して、それらを交換する必要があります。3番目のファイルを作成してプロセスを支援することもできますが、ファイルの内容が交換された後にプログラムで削除してください。ファイルの名前変更が再び許可されるようになりました。

プログラムは、すべてのファイルコンテンツに対して機能する必要があります。

最短のコードが勝ち、対象となるすべての提出が投票されます。


2
ファイルの名前を変更します。結果を達成するために「コンテンツを取得」し、それらを交換する必要はありません。
ダレンストーン

@Darren Stoneそれは違法だと思う。回答が提出される前にそれを見つけてくれてありがとう。

悪い制約のように見える、名前の変更は、これを行うための最善の方法である
hdante

1
さて、この制約を削除できます。

6
@hdanteしかし、「名前の変更ファイルは」されていないその内容を交換します。使用しているシステム上のinodeためにここでの目標は次のようになりi.txt「S inodeからのデータを含むようにo.txts」はinode、その逆も、ハードリンクはそれらに存在する場合にそうことをinode他の場所でね、その内容が同様に入れ替わっ表示されます。名前を変更してもそれは達成できません。
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.ハウリ

@ F.Hauri:ああ、ありがとう!(ある時点で名前の変更を
禁止する

このコードは正しくありません。これは、i *とo *がそれぞれi.txtとo.txtのみに一致する特別な場合にのみ機能します。つまり、「i」または「o」で始まる名前のファイルは他にありません。
エルワンルグラン

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バッチファイル、42

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

Windowsバッチファイル(引数)、30

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

$r=renamePHPで関数のエイリアスを作成するために使用できるとは知りませんでした。ありがとう!
AL

2

2つのベースのアンサー。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} \"

注:最初のパッチ出力はリダイレクトされないため、2番目のパッチコマンドでガベージになります。これは、1つしかpatching file o.txt表示されないためです。
F.ハウリ

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バイト

うわー!ルビーコードゴルフ!私はそれが前に試みられたとは思わない!

しかし現実には、これにはいくつかの素敵なRubyショートカットといくつかのパターンが必要でした。初めてのゴルフで、とても楽しかったです。さらに苦労することなく、ここにゴルフのコードがあります:

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

ここrenRename-Itemのエイリアスです。スクリプトは3番目のファイルを使用して削除します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- 2013

完全にそれがコード・ゴルフ、申し訳ありませんでした気づいていなかった

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
それは本当にゴルフ好きではない:(
ヤコブボウヤー

1

シェルスクリプト、24

Bashおよびおそらくほとんどのシェルで動作します。2つのファイル名をパラメーターとして渡します。

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

固定ファイル名が必要な場合は、12文字のペナルティでこれを行います:

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

@minitech、そうです。「ੴ」は「o.txt」になります。それらはmv操作であり、ではありませんcp
ダレンストーン

これまでで2番目に良い答えです!2文字減らすと勝ちます!固定ファイル名は気にしません。


1

Windowsバッチファイル(48)

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

これを書いたときに移動コマンドを忘れました...


あなたは私のaファイルを上書きしました!
ダニー

@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

PHP、45

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

それほどゴルフではありませんが、これまでで最短のPHPです。


ファイル拡張子がありません。
タイタス

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

ゴルフをしていない:

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適切な新しい名前を付ける前に、ファイルの1つに)をします。

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.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オペレーティングシステムライブラリをグローバルテーブルとして定義し、renameandのremove代わりにos.renameandを記述できるようにしos.removeます。(ちなみに、これは1文字の変数が実際にはosテーブル内のフィールドであることも意味します。)os.renameスペースを節約するために短いエイリアスを作成します。'.txt'一時ファイルとして使用して、ファイル名変数を設定します。名前の変更と削除を行います。




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.