दो फ़ाइलों की सामग्री स्वैप करें


13

यह एक कोड-गोल्फ प्रश्न है। आपको दो अलग-अलग फ़ाइलों (i.txt और o.txt) की सामग्री लेने और उन्हें स्वैप करने की आवश्यकता है। आप इस प्रक्रिया में मदद करने के लिए एक तीसरी फ़ाइल बना सकते हैं, लेकिन क्या फ़ाइल की सामग्री की अदला-बदली होने के बाद आपके प्रोग्राम ने इसे हटा दिया है। फ़ाइलों का नाम बदलना अब फिर से अनुमति है।

कार्यक्रम किसी भी फ़ाइल सामग्री के लिए काम करना चाहिए।

सबसे कम कोड जीतता है, सभी योग्य प्रस्तुतियाँ अप-वोट की जाएंगी।


2
फ़ाइलों का नाम बदलें। "सामग्री लेने" की आवश्यकता नहीं है और परिणाम प्राप्त करने के लिए उन्हें स्वैप करें।
डैरेन स्टोन

@ डेरेन स्टोन मुझे लगता है कि अवैध होना चाहिए। जवाब देने से पहले पकड़ने के लिए धन्यवाद।

एक खराब बाधा की तरह दिखता है, नाम बदलने का सबसे अच्छा तरीका है
HDante

1
ठीक है, मैं इस बाधा को हटा सकता हूं।

6
@hdante लेकिन 'फ़ाइलों का नाम बदलना' उनकी सामग्री का आदान-प्रदान नहीं कर रहा है । एक प्रणाली है कि का उपयोग करता है पर inodeरों यहां लक्ष्य के लिए होगा i.txt's inodeसे डेटा शामिल होने o.txts' inodeहै कि अगर वहाँ hardlinks हैं उन लोगों के लिए विपरीत है, और इसके, तो 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.Hauri: आह, धन्यवाद! (एक बिंदु पर नाम बदलने के खिलाफ नियम थे।)
Ry-

यह कोड सही नहीं है। यह केवल विशेष मामले में काम करता है जहां i * और o * क्रमशः केवल i.txt और o.txt से मेल खाते हैं, अर्थात "i" या "o" के साथ शुरू होने वाले नाम के साथ कोई अन्य फाइल नहीं है।
एरवान लेग्रैंड

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)

अजगर, ६३

import os;t='.txt'
for a,b in 'ix','oi','xo':os.rename(a+t,b+t)

पीएचपी, 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

विंडोज बैच फ़ाइल (args), 30

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

मुझे नहीं पता था कि आप $r=renamePHP में फ़ंक्शन के लिए उपनाम बनाने के लिए उपयोग कर सकते हैं । धन्यवाद!
अल

2

दो आधारित आंसर; 52 और 62 वर्ण

खोल: फैल + पैच (+ टी + सेड ...) 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);

Ungolfed संस्करण:

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

और अनगोल्डेड संस्करण

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

जहां नाम-वस्तु केren लिए उपनाम है । स्क्रिप्ट एक तीसरी फ़ाइल का उपयोग और हटाती है ।a.txt


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

सबसे छोटा नहीं, लेकिन बहुत सरल और पढ़ने में आसान। इसके अलावा, कोई मध्यवर्ती फ़ाइलें, केवल RAM।


1
यह देखते हुए कि यह एक कोड-गोल्फ है , आप कम से कम रिक्त स्थान निकाल सकते हैं और कम से कम कुछ के लिए प्रयास कर सकते हैं।
रय।

पूरी तरह से एहसास नहीं था कि यह कोड-गोल्फ था, क्षमा करें

1

पीएचपी

$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

शैल लिपि, २४

बैश में काम करता है और शायद सबसे ज्यादा गोले। मापदंडों के रूप में अपने दो फ़ाइलनामों के साथ पास करें।

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

यदि आप निश्चित फ़ाइल नाम चाहते हैं, तो यह ऐसा करेगा, 12 रुपये के दंड के लिए:

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

@ मिनिटेक, हाँ यह करता है। '' '' O.txt 'बन जाता है। वे mvऑपरेशन हैं, नहीं cp
डैरेन स्टोन

दूसरा सबसे अच्छा जवाब अब तक! इसे दो वर्णों से कम करें और आप जीतें! मुझे निश्चित फ़ाइलनामों की परवाह नहीं है।


1

विंडोज बैच फ़ाइल (48)

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

जब मैंने यह लिखा था तो मैं इस कमांड के बारे में भूल गया था ...


आपने अभी-अभी मेरी aफ़ाइल को ओवरवोट किया है !
डैनी

@ डैनी प्रश्न में कहा गया है कि आप दूसरी फ़ाइल बना सकते हैं, लेकिन इसे हटाना होगा।
किटकार्नेक्स २२

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 (आर / डब्ल्यू सामग्री)

फ़ाइल का नाम बदलें ( 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

ग्रूवी - 99 वर्ण

यह मेरा प्रयास है, ग्रूवी 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)

सी: \ ड्राइव में एक अस्थायी फ़ाइल टी के साथ नाम बदलना। गोल्फ में भी पहला प्रयास: एस

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

यदि पहले से ही संदर्भित है, तो इसे थोड़ा घटाकर 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)}

सी में एक काफी सरल उपाय जो काम करता है। यह .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

पर्ल, 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

लुआ ,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'अस्थायी फ़ाइल के रूप में उपयोग करके फ़ाइल नाम चर सेट करें । नाम बदलने और हटाने का काम करें।




0

स्माइलबासिक, 36 35 बाइट्स

@L
RENAME@OI[2-I],@IO[I]I=I+1GOTO@L
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.