एक प्रोग्राम लिखें जो पाठ फ़ाइल के प्रत्येक 17 वें बिट को 1 में बदल देता है


10

मेरे सहकर्मी और मैं एक विरासत सॉफ्टवेयर पर काम करते हैं जिससे हम कभी-कभी नफरत करते हैं। जब भी आप इसे चलाते हैं, डिबग एस्परेट्स हर जगह उड़ते हुए आते हैं, और यह कभी गारंटी नहीं है कि कुछ भी काम करेगा। कोड गोल्फ के इस दौर की प्रेरणा मेरे सहकर्मी ने हमारे सॉफ्टवेयर के बारे में बताई ।

"यह हर बार जब आप इस कार्यक्रम को चलाते हैं, तो आप सेवा की कुछ शर्तों से सहमत होते हैं, जो कहती हैं कि आपकी हार्ड ड्राइव पर हर 17 वें बिट को 1 में बदल दिया जाएगा"

लक्ष्य: एक प्रोग्राम लिखें जो एक फ़ाइल की एक सटीक प्रतिलिपि बना देगा और प्रत्येक 17 वीं बिट पाठ फ़ाइल को 1 में बदल देगा

  • आप कर सकते हैं नहीं कर देते हैं हर एक 1. यानी अपने कार्यक्रम के लिए फ़ाइल का सा कुछ खुफिया है कि यह केवल हर 17 वीं बिट लक्षित कर रहा है दिखाना चाहिए
  • आप मूल फ़ाइल को किसी भी तरह से आकार या रूप में नहीं लिख सकते हैं
  • विजेता महीने के अंत में छोटी से छोटी कार्यक्रम प्रस्तुत है

इस के साथ मज़े करो! जाओ!


7
1. प्रत्येक प्रश्न के लिए एक उद्देश्य जीतने की कसौटी की आवश्यकता होती है। सबसे अधिक सवाल code-golf, बाइट्स जीत में सबसे छोटा कोड है। एक code-challengeअच्छी तरह से निर्दिष्ट स्कोरिंग प्रणाली की आवश्यकता है। 2. हार्ड ड्राइव के हर 18 वें बिट को 1 में बदलना केवल ड्राइव पर सीधे लिखने से ही संभव है। यह फ़ाइलों को बनाने और / या संशोधित करके पूरा नहीं किया जा सकता है। 3. ऐसा करने से संपूर्ण ड्राइव अनुपयोगी हो जाएगा, इसलिए एक सुसंगत समाधान विनाशकारी होगा। मुझे नहीं पता कि समुदाय को मालवेयर लिखने का अनुरोध कितनी अच्छी तरह से मिलेगा ...
डेनिस

2
मैं इस प्रश्न को फिर से खोलने के लिए मतदान करूंगा, यदि केवल मेरे पास पर्याप्त प्रतिनिधि था। :/
शामिच

3
@steveverrill मैं इसे कोड गोल्फ में बदलूंगा, हालांकि मैं चीजों को दिलचस्प बनाने के लिए इसे 18 बिट से 17 बिट तक बदलने जा रहा हूं।
सी। टवाल्ट

1
@matrixugly 17 बिट निश्चित रूप से अधिक दिलचस्प है। ध्यान रखें कि नियमों को बदलने के लिए यह एक अच्छा तरीका नहीं है जो मौजूदा उत्तरों को अमान्य करता है (इसीलिए सवालों को दबाए रखा जाता है, ताकि उन उत्तरों से बचने के लिए जो प्रश्न को ठीक करना असंभव बना दें।) हालांकि मौजूदा उत्तर नहीं है। वैसे भी अन्य मौजूदा नियमों का अनुपालन नहीं है, इसलिए यह इस मामले में एक बड़ी समस्या नहीं है।
स्तर नदी सेंट

1
फ़ाइल को कैसे पढ़ा जाता है? stdin?
मिलो

जवाबों:


9

सीजेएम, 22 बाइट्स

q256b2H#b1f|2H#b256b:c

इसे ऑनलाइन आज़माएं।

हर 17 वें बिट को छूता है, आखिरी से गिनती करता है।

मैंने STDIN और STDOUT का उपयोग किया है क्योंकि CJam के पास कोई फ़ाइल I / O नहीं है। यदि इसकी अनुमति नहीं है, तो कार्यक्रम को 24 अतिरिक्त बाइट की कीमत पर बैश स्क्रिप्ट में लपेटा जा सकता है:

cjam <(echo q256b2H#b1f\|2H#b256b:c)<"$1">"$2"

यह काम किस प्रकार करता है

q                      " Read from STDIN.                                                 ";
 256b                  " Convert to integer by considering the input a base 256 number.   ";
     2H#b              " Convert to array by considering the integer a base 2**17 number. ";
         1f|           " Set the LSB of every integer in the array element to 1.          ";
            2H#b       " Convert to integer by considering the array a base 2**17 number. ";
                256b   " Convert to array by considering the integer a base 256 number.   ";
                    :c " Turn character codes into characters.                            ";

1
+1, मुझे वास्तव में CJam पर ध्यान देने की आवश्यकता है। बहुत बढ़िया
आपत्ति है

1
बहुत बढ़िया। इसने "प्रत्येक 17 वीं बिट को परिवर्तित किया और इसे 1 में बदल दिया" "Tike vhe eöery 17 fiv और बारी yt (to c 1"
C. Tewalt

यह काम क्यों करता है? मैं पीछा नहीं करता ..
क्लाउडी

1
हां, मुझे यकीन नहीं था कि मुझे इसे पोस्ट करना चाहिए, लेकिन चूंकि पर्ल जवाब मूल रूप से एक ही था ... फ़ाइल को पूरा करने के लिए एक बैश आवरण I / O आवश्यकताओं को बाइट गिनती 46 तक ऊंचा करना होगा। दो बार से अधिक लंबे समय तक। लेकिन फिर भी सबसे छोटा जवाब।
डेनिस

1
@matrixugly क्षमा करें! युक्ति ने आपकी फ़ाइल IO को थोड़ा अस्पष्ट बनाने का इरादा छोड़ दिया। मैं व्यक्तिगत रूप से एक मुद्दे को पहचान नहीं पाया। कोडगॉल्फ सैंडबॉक्स की खूबियों पर हारपिंग रखना नहीं है , लेकिन सवाल बंद हो रहा है और इस आवश्यकता भ्रम को शायद टाला जा सकता है। भले ही चुनौती का आनंद लिया
ardnew

6

पर्ल 59

बिट स्ट्रिंग्स पर रेगेक्स प्रतिस्थापन:

$/=$\;$_=unpack"B*",<>;s|(.{16}).|${1}1|g;print pack"B*",$_

उपयोग:

perl this.pl < infile.txt > outfile.txt

endianness के बीच स्विच करके टॉगल किया जा सकता bहै और Bमें packटेम्पलेट्स
ardnew

2

सी, 125

बड़े-एंडियन और 16-बिट पूर्णांक मानता है

हर दो बाइट्स पर एक बिटवाइस-OR लागू करके काम करता है।

इनपुट फ़ाइल है y, आउटपुट है z

unsigned a,b;main(c){void*f=fopen("y","r"),*g=fopen("z","w");while(b=fread(&c,1,2,f))c|=a,a?a/=2:(a=32768),fwrite(&c,1,b,g);}

Ungolfed

// The commented out /* short */ may be used if int is not 16 bits, and short is. 
unsigned /* short */ a = 0,b;
main(/* short */ c){
    void *f = fopen("y", "r"), *g = fopen("z", "w");
    while(b = fread(&c, 1, 2, f)){
      // __builtin_bswap16 may be used if you are using GCC on a little-endian machine. 
      //c = __builtin_bswap16(c);
        c |= a;
        if(a) a >>= 1;
        else a = 32768;
      //c = __builtin_bswap16(c);
        fwrite(&c, 1, b, g);
    }
}

इस सवाल पर नियमों को अद्यतन किया गया है ...
लेवल रिवर सेंट।

@steveverrill और जवाब अब तदनुसार अपडेट किया गया है
es1024

@Comintern 0 होने पर उस समय के आसपास क्या होना चाहिए: 00000000 00000001 00000000 00000000 10000000 00000000इस प्रकार aकुछ बिंदुओं पर शून्य होना चाहिए। मशीन को बड़े एंडियन का उपयोग करना चाहिए (या 00000000 10000000इसके बजाय आपके पास होगा 10000000 00000000, जो गलत मूल्य देगा)।
es1024

ह्म्म्म ... कोई बात नहीं। निकाल कर c = __builtin_bswap16(c);ठीक किया।
Comintern

2

पायथन 2, 112 बाइट्स

b=open('i').read().encode('hex')
open('o','w').write(('%x'%(int('1'+b,16)|16**len(b)/131071))[1:].decode('hex'))

यह हर 17 वें बड़े-एंडियन बिट को सेट करता है, शुरुआत से 17 वीं शुरुआत। यह कोई पुस्तकालयों का उपयोग करता है। यह इनपुट फ़ाइल को विशाल-श्रेणी nपूर्णांक और बिटवाइज़ ओरिंग के साथ परिवर्तित करके काम करता है 2**n/(2**17 - 1) == 0b10000000000000000100000000000000001…


1

सी - 139

"I" नामक फ़ाइल से पढ़ता है, "o" नामक फ़ाइल में आउटपुट करता है।

c;main(){unsigned char b,m=1;void *i=fopen("i","r"),*o=fopen("o","w");for(;(b=fgetc(i))<129;fputc(b,o))((c+=8)%17<8)?b|=m=(m-1)?m/2:128:0;}

लाइन ब्रेक के साथ:

c;main()
{
    unsigned char b,m=1;
    void *i=fopen("i","r"),*o=fopen("o","w");
    for(;(b=fgetc(i))<129;fputc(b,o))
        ((c+=8)%17<8)?b|=m=(m-1)?m/2:128:0;
}

इनपुट के बिट्स को गिनता है और फिर हर सत्रह बिट को सेट करने के लिए एक फ्लोटिंग बिटमास्क का उपयोग करता है।


1

जावा - २४ 24

BitSetमैन्युअल रूप से बाइट्स को हैंडल / मास्क करने के बजाय एक और एक साधारण लूप का उपयोग करता है । बेशक यह जावा है, बॉयलरप्लेट आधा कार्यक्रम है, इसलिए यह बिल्कुल छोटा नहीं है।

फिर भी, आखिरी नहीं! : डी

import java.util.*;import java.nio.file.*;class F{public static void main(String[]a)throws Exception{BitSet b=BitSet.valueOf(Files.readAllBytes(Paths.get(a[0])));for(int j=0;j<b.size();b.set(j),j+=17);Files.write(Paths.get("o"),b.toByteArray());}}

नो-स्क्रॉल संस्करण:

import java.util.*;
import java.nio.file.*;
class F{
    public static void main(String[]a)throws Exception{
        BitSet b=BitSet.valueOf(Files.readAllBytes(Paths.get(a[0])));
        for(int j=0;j<b.size();b.set(j),j+=17);
        Files.write(Paths.get("o"),b.toByteArray());
    }
}

1

पायथन - 98 बाइट्स

I से पढ़ें, ओ से लिखें। बिटार्रे लाइब्रेरी https://pypi.python.org/pypi/bitarray का उपयोग करता है

from bitarray import*;a=bitarray();a.fromfile(open('i','rb'));a[::17]=1;a.tofile(open('o','wb'))

ungolfed

from bitarray import *
a=bitarray()
a.fromfile(open('i','rb'))
a[::17]=1
a.tofile(open('o','wb'))

क्या यह होना चाहिए a[::17]=1?
भूमिगत

इसके अलावा, मेरा मानना ​​है कि आप एक बाइट के साथ from bitarray import*और बचा सकते हैं a=bitarray()
भूमिगत

0

कोबरा - 308

use System.Text.RegularExpressions
class P
    def main
        t,b='',File.readAllBytes('x')
        for n,i in b.numbered,for l in 8,b[n]=if(l,b[n],0)+if(Regex.replace(t+='00000000'[(j=Convert.toString(i,2)).length:]+j,'.{17}',do(m as Match)='[m]'[:-1]+'1')[n*=8:n+8][7-l]<c'1',0,2**l)to uint8
        File.writeAllBytes('y',b)

जब भी मैं इनमें से किसी एक को 'कुछ के व्यक्तिगत बिट्स' में हेरफेर करता हूं, तो मेरी इच्छा है कि कोबरा या .NET मानक लाइब्रेरी में एक binary string => integerकनवर्टर हो।


0

जावास्क्रिप्ट (+ HTML5), २ HTML२

संभवतः सबसे छोटा नहीं है, लेकिन यह उपयोगकर्ता के अनुकूल है: डी

यह क्रॉस ब्राउज़र है, लेकिन ऐसा लगता है कि क्रोम केवल एक ही इसकी अनुमति देता है जब html फ़ाइल एक स्थानीय फ़ाइल (= के साथ पहुंच file://...) होती है। अन्य ब्राउज़रों के लिए, आपको इसे एक वेब सर्वर पर रखना होगा।

आउटपुट फ़ाइल को डिफ़ॉल्ट डाउनलोड निर्देशिका में सहेजा जाना चाहिए, हो सकता है कि फ़ाइल प्रॉम्प्ट (आपके कॉन्फ़िगरेशन के आधार पर) के साथ हो।

<input type=file onchange="r=new FileReader();r.onloadend=function(){w=window;a=new Uint8Array(r.result);for(i=17;i<a.length*8;i+=17)a[i/8>>0]|=1<<8-i%8;w.location.replace(w.URL.createObjectURL(new Blob([a],{type:'application/octet-binary'})));};r.readAsArrayBuffer(this.files[0])">

Ungolfed संस्करण:

<input type=file onchange="
    var reader = new FileReader();
    reader.onloadend = function() {
        var arr = new Uint8Array(reader.result);
        for(var i = 17 ; i < arr.length * 8 ; i += 17) {
            arr[Math.floor(i / 8)] |= 1 << (8 - (i % 8));
        }
        window.location.replace(
            window.URL.createObjectURL(
                new Blob([arr], {type: 'application/octet-binary'})
            )
        );
    };
    reader.readAsArrayBuffer(this.files[0]);
">

0

पायथन 3 - 187 बाइट्स


से पढ़ता है iऔर में लिखता है o

कोड:

o=open;j="".join;f=list(j(format(x,"08b")for x in o("i","rb").read()))
f[16::17]="1"*(len(f)//17)
with o("o","wb") as f2:f2.write(bytes(int(j(f[i*8:(i+1)*8]),2)for i in range(len(f)//8)))

Ungolfed:

# read file and convert to binary string e.g. "101010010101010101"
f = list("".join(format(x, "08b") for x in open("in.txt", "rb").read()))
# set every 17th bit to 1
f[16::17] = "1" * (len(f)//17)
with open("out.txt","wb") as f2:
    data = []
    for i in range(len(f)//8)): # for each byte
        byte = "".join(f[i*8:(i+1)*8] # get each byte
        data.append(int(byte),2) # convert to int
    f2.write(bytes(data)) # convert to byte string and write

-1

पायथन 3 - 103 वर्ण

fजिस फ़ाइल को आप पढ़ना चाहते हैं उसका पथ बदलें और oजिस फ़ाइल को आप लिखना चाहते हैं उसका पथ बदलें ।

l=open;t=list(l(f,'r').read())
for i in range(len(t)):
 if i%18==0:t[i]='1'
l(o,'w').write(''.join(t)) 

6
यह हर 17 वीं बिट है, बाइट नहीं।
मत्सजॉयसे

1
इसके अलावा, यह 17 वां है, 18 वां नहीं है।
डेनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.