Поменять местами содержимое двух файлов

13

Это вопрос кода-гольфа. Вам нужно взять содержимое двух отдельных файлов (i.txt и o.txt) и поменять их местами. Вы можете создать третий файл, чтобы помочь вам в этом процессе, но ваша программа удалит его после замены содержимого файла. Переименование файлов теперь разрешено снова.

Программы должны работать для любого содержимого файла.

Самый короткий код выигрывает, все подходящие материалы будут подвергнуты голосованию.


источник
2
Переименуйте файлы. Не нужно «брать содержимое» и менять их местами для достижения результата.
Даррен Стоун,
@Darren Stone Я думаю, это должно быть незаконно. Спасибо, что поймали это, прежде чем ответы были представлены.
Похоже, плохое ограничение, переименование является лучшим способом сделать это
hdante
1
Хорошо, я могу снять это ограничение.
6
@hdante, но «переименование файлов» не обменивается их содержимым . В системе, которая использует inodes, цель состоит в том i.txt, inodeчтобы она содержала данные из o.txts inode, и наоборот, так что если есть жесткие ссылки на них в inodeдругом месте, их содержимое также будет поменяться местами. Переименование не может этого достичь.
AJMansfield

Ответы:

9

зш, 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: Ах, спасибо! (Были правила против переименования в одной точке.)
Ry-
Этот код неверен. Он работает только в особом случае, когда 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)

Питон, 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 (args), 30

move %1 x&move %2 %1&move x %2
AsksAnyway
источник
Я не знал, что вы можете использовать $r=renameдля создания псевдонимов для функций в PHP. Благодарность!
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появляется.
Ф. Хаури
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 ответа здесь и объединил их ... да ладно.

MisterBla
источник
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"

Надеюсь, что это (не) имеет смысл!

Aearnus
источник
2

Powershell, 44 49 байт

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

где renпсевдоним для Rename-Item . Скрипт использует и удаляет третий файл a.txt.

Mazzy
источник
1
Это может не сработать с определенной кодировкой. Потому что по gcумолчанию UTF8NoBOM, а по scумолчанию ASCII. Попробуйте некоторые файлы UTF-8 или двоичные файлы, и вы увидите, как он может потерпеть неудачу.
AdmBorkBork
В самом деле. Благодарю. Нужны -e by -nпараметры, чтобы файлы оставались неизменными. Было бы неплохо добавить параметр -readCount 0производительности. Сценарий с renameкороче :) Исправлено.
Маззи
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])}

Не самый короткий, но очень простой и удобный для чтения. Также нет промежуточных файлов, только оперативная память.


источник
1
Учитывая, что это код-гольф , вы могли бы по крайней мере убрать пробелы и попробовать что-нибудь самое короткое.
Ry-
Полностью не осознавал, что это был code-golf, извините
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

Работает в Баш и, вероятно, большинство снарядов. Передайте с двумя именами файлов в качестве параметров.

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

Если вам нужны фиксированные имена файлов, тогда это будет сделано, для штрафа в 12 символов:

mv i.txt ੴ;mv o.txt i.txt;mv ੴ o.txt
Даррен Стоун
источник
@minitech, да, это так. «ੴ» становится «o.txt». Это не mvоперации cp.
Даррен Стоун
Второй лучший ответ до сих пор! Уменьшите его на два символа и вы выиграете! Меня не волнуют фиксированные имена файлов.
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)
tamasgal
источник
1

Пакетный файл Windows (48)

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

Я забыл про команду перемещения, когда писал это ...

kitcar2000
источник
Вы просто переписали мой aфайл!
Дэнни
@Danny В вопросе говорится, что вы можете создать другой файл, но он должен быть удален.
kitcar2000
1

С 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 пробела

bacchusbeale
источник
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);
Spedwards
источник
1

Rebol - 46 (переименовать файл) или 55 (ч / б содержимое)

Переименовать файл (используя 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
draegtun
источник
1

PHP, 45

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

Не очень хороший, но самый короткий PHP.

Mleko
источник
Расширения файлов отсутствуют.
Тит
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)

Переименование с помощью временного файла t на диске c: \. Также первая попытка игры в гольф: 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
jaybee3
источник
Похоже, в вашем коде много пробелов. Вы уверены, что они нужны? Вы можете получить гораздо лучший результат, если уберете их.
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

Пакет Windows, 39 байт

ren i.txt x&ren o.txt i.txt&ren x o.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'качестве временного файла. Делаем переименование и удаление.

cyclaminist
источник
1

PHP, 52 байта

Php от AsksAnyway, модернизированный и играющий в гольф:

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

Беги с php -nr '<code>'.

Titus
источник
0

SmileBASIC, 36 35 байт

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
12Me21
источник