İki dosyanın içeriğini değiştir


13

Bu bir kod golf sorusu. İki ayrı dosyanın (i.txt ve o.txt) içeriğini almanız ve bunları değiştirmeniz gerekir. İşlemde size yardımcı olacak üçüncü bir dosya oluşturabilirsiniz, ancak dosya içeriği değiştirildikten sonra programınızın dosyayı silmesini sağlayabilirsiniz. Dosyaları yeniden adlandırmaya artık izin veriliyor.

Programlar herhangi bir dosya içeriği için çalışmalıdır.

En kısa kod kazanır, uygun olan tüm başvurular oylanır.


2
Dosyaları yeniden adlandırın. Sonucu elde etmek için "içeriği al" ve takas etmeye gerek yok.
Darren Stone

@Darren Stone Bunun yasa dışı olması gerektiğini düşünüyorum. Yanıtlar gönderilmeden önce bunu yakaladığınız için teşekkür ederiz.

Kötü bir kısıtlama gibi görünüyor, yeniden adlandırma bunu yapmanın en iyi yoludur
hdante

1
Pekala, bu kısıtlamayı kaldırabilirim.

6
@hdante ancak 'dosyaları yeniden adlandırma' içeriğini değiştirmiyor . Kullandığı bir sistemde inodeburaya hedefi olurdu i.txt's inodeverilerini içerecek şekilde o.txts' inodeolanlara sabit bağlarının varsa böylece tersi, ve yardımcısı inodebaşka yerde s, bunların içerikleri de takas olarak görünür. Yeniden adlandırma bunu başaramaz.
AJMansfield

Yanıtlar:


9

zsh, 20

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

1
Geçici dosya daha iyi olmadan gibi ben olsa: i=`<i.txt`;<o*>i*;<<<$i>o*. Bunun daha kısa olması çok kötü.
Ry-

1
Dosyaların yeniden adlandırılmasına izin vermek için kurallar değiştirildi. İsterseniz kodunuzu güncelleyebilirsiniz.

Sen değiştirerek 3 karakter kurtarabilecek <t>o*;rm ttarafından mv t o*!
F. Hauri

@ F.Hauri: Ah, teşekkürler! (Bir noktada yeniden adlandırmaya karşı kurallar vardı.)
Ry-

Bu kod doğru değil. Yalnızca i * ve o * 'nun sırasıyla yalnızca i.txt ve o.txt ile eşleşeceği özel durumda çalışır, yani "i" veya "o" ile başlayan bir ada sahip başka bir dosya yoktur.
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 Toplu İş Dosyası, 42

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

Windows Toplu İş Dosyası (argümanlar), 30

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

$r=renamePHP işlevlerine takma adlar oluşturmak için kullanabileceğinizi bilmiyordum . Teşekkürler!
AL

2

İki tabanlı anser; 52 ve 62 karakter

kabuk: fark + yama (+ tee + sed ...) 52

Belki daha kısa değil, ama bu eğlenceli buluyorum (ve geçici dosya kullanımı yoktur ):

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

İçerik nerede takas edilir ve dosyalar değiştirilir yerde :

Örnek çalışma

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

Gibi bir şey üretebilir:

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

istekleri basitleştirmek için xargs kullanımımv

Komik değil ama yine de güzel.

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

Not: İlk yama çıkışı yeniden yönlendirilmediğinden, ikinci yama komutunda çöp haline gelirler. Nedeni bu, çünkü sadece biri patching file o.txtortaya çıkıyor.
F. Hauri

2

PHP, 89

Denemek istediğimi düşündüm.

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

Ungolfed sürümü:

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

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

Görünüşe göre burada 2 cevap aldım ve birleştirdim .. oh iyi.


2

Yakut, 72 bayt

Vaov! Bir Ruby kod golf! Bunun daha önce denendiğini sanmıyorum!

Tüm gerçekte, bu bazı güzel Ruby kısayolları ve bulduğum birkaç desen gerektiriyordu. Bu benim ilk golf oldu ve yapmak çok eğlenceliydi. Daha fazla uzatmadan, golfçü kodu:

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

Ve ungolfed versiyonu

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

Buradaki anahtar faktör, geçirilen parametrelerin File.renametam olarak şudur :

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

Umarım bu anlam ifade etmez!


2

Powershell, 44 49 bayt

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

Rename-Itemren takma adı nerede . Komut dosyası üçüncü bir dosyayı kullanır ve siler .a.txt


1
Bu belirli kodlamada başarısız olabilir. Çünkü gcvarsayılan UTF8NoBOM ama scvarsayılan ASCII olduğunu. Bazı UTF-8 dosyalarını veya ikili dosyaları deneyin ve nasıl başarısız olabileceğini görebilirsiniz.
AdmBorkBork

Aslında. Teşekkürler. -e by -nDosyaların değişmediğinden emin olmak için parametrelere ihtiyacı vardır . -readCount 0Performansa bir parametre eklemek güzel olurdu . İle komut dosyası renamedaha kısa :) Sabit.
mazzy

1

Yakut

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

Kısaltılmış versiyon:

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

En kısa değil, ama çok basit ve okunması kolay. Ayrıca, ara dosyalar yok, sadece RAM.


1
Bir kod golf olduğu göz önüne alındığında, en azından boşlukları çıkarabilir ve en kısa için biraz deneyebilirsiniz.
Ry-

Tamamen kod golf olduğunu fark etmedi, üzgünüm

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
Bu gerçekten golf değil :(
Jakob Bowyer

1

Kabuk betiği, 24

Bash ve muhtemelen çoğu kabukta çalışır. İki dosya adınızla parametre olarak iletin.

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

Sabit dosya adları istiyorsanız, bunu 12 karakterlik bir ceza için yapacaksınız:

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

@minitech, evet öyle. 'ੴ', 'o.txt' olur. Bunlar mvoperasyonlar, değil cp.
Darren Stone

Şimdiye kadar ikinci en iyi cevap! İki karakterle azaltın ve kazanın! Sabit dosya adlarını önemsemiyorum.

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)

1

Windows Toplu İş Dosyası (48)

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

Bunu yazarken hareket komutunu unuttum ...


Dosyamın üzerine yazdın a!
Danny

@Danny Soru, başka bir dosya oluşturabileceğinizi, ancak silinmesi gerektiğini belirtir.
kitcar2000

1

C 162

Golfçülü: tmp dosyası olarak t.txt dosyasını kullanır ve adları değiştirir, ardından t.txt dosyasını kaldırır.

#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;}

Düzenleme: 2 boşluk kaldırıldı


1

PHP - 172

@ EisaAdil'in cevabının golf edilmiş versiyonu

$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 (dosyayı yeniden adlandır) veya 55 (r / w içeriği)

Dosyayı yeniden adlandır ( tgeçici dosya olarak kullanarak ):

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

Dosya içeriğini okuyun ve yazın:

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

Çok golfy ama şimdiye kadar en kısa PHP.


dosya uzantıları eksik.
Titus

1

Harika - 99 karakter

Bu benim girişimim, Groovy 2.2.1 ile. Yeniden adlandırmadan yapmaya çalıştım:

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

C: \ sürücüsünde geçici dosya t ile yeniden adlandırma. Ayrıca ilk golf denemesi: 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 zaten başvuruluyorsa, onu 126 ... 110'a kadar azaltabilir.

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

Kodunuzda çok fazla boşluk olduğu anlaşılıyor. İhtiyaç duyulduğundan emin misiniz? Kaldırırsanız çok daha iyi bir puan elde edebilirsiniz.
user12205

Editör sadece gerekli attı gerekli olduğunu sanmıyorum. Gerekli olan yerden ayrı kaldırıldı :)
jaybee3

1

C: 65 karakter

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

C işini yapan oldukça basit bir çözüm. .txtDosyalardan birine uygun yeni adını vermeden önce geçici bir ad ( ) kullanır .

Ungolfed (tanımda sözdizimi vurgulamanın nasıl başarısız olduğunu unutmayın, bir hata ortaya çıkarıldı!):

#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 bayt (İçerik yeniden adlandırılmadan değiştirilir)

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

Dosya içerikleri belleğe yerleştirilir ve diğer dosyaya geri yazılır. Böylece i.txtve o.txtbelleğe sığması gerekir.

Dosya içeriği gerçekten değiştirildiği için, sabit bağlantılar otomatik olarak güncellenir, bkz. AJManfield'ın yorumu .

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 bayt

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

Çevrimiçi deneyin!

Define os, işletim sistemi kütüphanesi küresel tablo olarak biz yazabiliriz böylece renameve removeyerine os.renameve os.remove. (Bu arada tek harfli değişkenlerin aslında ostablodaki alanlar olduğu anlamına gelir .) os.renameBiraz yer kazanmak için kısa takma adlar oluşturun . '.txt'Geçici dosya olarak kullanarak dosya adı değişkenlerini ayarlayın . Yeniden adlandırma ve silme işlemlerini yapın.


1

PHP, 52 bayt

AsksAnyway'in php modernize ve golf:

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

İle çalıştırın php -nr '<code>'.


1

Tcl , 122 bayt

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

Çevrimiçi deneyin!


Tcl , 169 bayt

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

Çevrimiçi deneyin!


0

SmileBASIC, 36 35 bayt

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.