এমন একটি প্রোগ্রাম লিখুন যা প্রতি 17 টি বিট পাঠ্য ফাইলের 1-এ পরিবর্তিত হয়


10

আমার সহকর্মী এবং আমি সফটওয়্যারটির একটি উত্তরাধিকার অংশে কাজ করি যা আমরা মাঝে মাঝে ঘৃণা করি। আপনি যখনই এটি চালাবেন, ডিবাগের দাবিগুলি যে কোনও জায়গায় উড়ে আসবে, এবং কোনও কিছু কার্যকর হবে এমন কোনও গ্যারান্টি এটি কখনও নয়। কোড গল্ফের এই রাউন্ডের অনুপ্রেরণাটি আমার সফ্টওয়্যার সম্পর্কে নিম্নলিখিতটি সহকর্মী থেকে এসেছে ।

"আপনি যখন এই প্রোগ্রামটি চালান প্রতিবারের মতো, আপনি পরিষেবার কিছু শর্তাদির সাথে সম্মত হন যা বলে যে আপনার হার্ড ড্রাইভের প্রতি 17 তম বিট 1 তে পরিণত হবে"

লক্ষ্য: এমন একটি প্রোগ্রাম লিখুন যা কোনও ফাইলের হুবহু অনুলিপি তৈরি করে এবং প্রতি 17 টি বিট পাঠ্য ফাইলের 1-এ পরিণত করবে

  • আপনি ফাইলের প্রতিটি বিট 1 এ পরিবর্তন করতে পারবেন না ie অর্থাত আপনার প্রোগ্রামটি অবশ্যই কিছু বুদ্ধি প্রদর্শন করবে যা এটি কেবল প্রতি 17 তম বিটকে লক্ষ্য করছে
  • আপনি কোনওভাবে আকার বা আকারে আসল ফাইলে লিখতে পারবেন না
  • বিজয়ী মাসের শেষে ক্ষুদ্রতম প্রোগ্রাম জমা হয়

এই এক সাথে মজা করুন! যাওয়া!


7
1. প্রতিটি প্রশ্নের একটি উদ্দেশ্য বিজয়ী মানদণ্ড প্রয়োজন। সর্বাধিক প্রশ্নগুলি code-golfহ'ল, বাইট জেতে সংক্ষিপ্ততম কোড। এগুলির code-challengeএকটি ভাল নির্দিষ্ট স্কোরিং সিস্টেম দরকার। ২. প্রতিটি হার্ড ড্রাইভের 18 তম বিটকে 1 এ 1 এ রূপান্তর করা কেবলমাত্র ড্রাইভে সরাসরি লিখেই সম্ভব। ফাইলগুলি তৈরি এবং / বা সংশোধন করে এটি সম্পাদন করা যায় না। ৩. এটি করার ফলে পুরো ড্রাইভটি ব্যবহারযোগ্য না হয়ে যায়, সুতরাং একটি উপযুক্ত সমাধানটি ধ্বংসাত্মক হবে। আমি জানি না সম্প্রদায় ম্যালওয়্যার লেখার জন্য একটি অনুরোধটি কতটা ভালভাবে গ্রহণ করবে ...
ডেনিস

2
আমি এই প্রশ্নটি পুনরায় খোলার পক্ষে ভোট দেব, যদি কেবল আমার যথেষ্ট প্রতিনিধি থাকত। :/
সাম্মিচ

3
@ স্টিভেভারিল আমি এটিকে কোড গল্ফে পরিবর্তন করব, তবে আমি বিষয়গুলি আকর্ষণীয় করে তুলতে এটি 18 তম বিট থেকে 17 তম বিটে পরিবর্তন করব।
সি তেওয়াল্ট

1
@ ম্যাট্রিক্সগলি 17 ম বিট অবশ্যই আরও আকর্ষণীয়। মনে রাখবেন যে বিদ্যমান উত্তরগুলিকে অবৈধ করে এমনভাবে নিয়মগুলি পরিবর্তন করা ভাল ফর্ম নয় (যাতে প্রশ্নগুলি উত্তর স্থির করা অসম্ভব বলে পোস্ট করা উত্তরগুলি এড়ানোর জন্য প্রশ্নগুলি আটকে রাখা হয়)) তবে বিদ্যমান উত্তরগুলি তা করতে পারে না যে কোনও উপায়ে অন্য বর্তমান নিয়ম মেনে চলবেন না, সুতরাং এই ক্ষেত্রে এটি কোনও বড় সমস্যা নয়।
স্তর নদী সেন্ট

1
ফাইলটি কীভাবে পড়বে? stdin?
মিলো

উত্তর:


9

সিজেম, 22 বাইট

q256b2H#b1f|2H#b256b:c

এটি অনলাইনে চেষ্টা করুন।

শেষ থেকে গণনা করে প্রতি 17 তম বিটকে স্পর্শ করে।

আমি STDIN এবং STDOUT ব্যবহার করেছি যেহেতু সিজেমের কোনও ফাইল 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, আমার সত্যিকার অর্থে সিজেএম খতিয়ে দেখা উচিত। জট্টিল কত কিংকর্তব্যবিমূঢ়তা আপনি যে এখনও একটি উদ্দেশ্য করে তোলে ... একটি 22 বাইট কোড মধ্যে পেতে পারেন
Padarom

1
সাবাশ. এটি "প্রতি 17 তম বিটটি নিয়ে যান এবং 1" এ "" রূপান্তরিত করে "" টিকে ভিহে ইয়ারি 17 তম এফআইভিতে পরিণত করুন এবং ইয়ট (সি 1 তে পরিণত করুন)
সি তেওয়াল্ট

কেন এই কাজ করে? আমি অনুসরণ করি না ..
ক্লদিউ

1
হ্যাঁ, আমি এটি পোস্ট করব কিনা তা নিশ্চিত ছিলাম না, তবে যেহেতু পার্ল উত্তরটি মূলত একই রকম ছিল ... ফাইল আই / ও প্রয়োজনীয়তা পূরণের জন্য একটি ব্যাশ র‍্যাপার বাইট গণনাটি 46-এ উন্নীত করবে twice তবে এখনও সংক্ষিপ্ত উত্তর।
ডেনিস

1
@ ম্যাট্রিক্সুগলি দুঃখিত! অনুমানটি আপনার ফাইলটি IO এর উদ্দেশ্যটিকে কিছুটা অস্পষ্ট রেখে দিয়েছে left আমি ব্যক্তিগতভাবে কোনও সমস্যা চিহ্নিত করতে পারি নি। কোডগল্ফ স্যান্ডবক্সের গুণাগুণকে ক্ষতিগ্রস্থ করার জন্য নয়, তবে প্রশ্নটি বন্ধ হয়ে যাচ্ছে এবং এই প্রয়োজনীয় বিভ্রান্তি সম্ভবত এড়ানো যেতে পারত। নির্বিশেষে চ্যালেঞ্জটি উপভোগ করেছেন

6

পার্ল 59

বিট স্ট্রিংগুলিতে রেজেক্স প্রতিস্থাপন:

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

ব্যবহার:

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

endianness মধ্যে স্যুইচ দ্বারা টগল করা যেতে পারে bএবং Bpackটেমপ্লেট
ardnew

2

সি, 125

বিগ-এন্ডিয়ান এবং 16-বিট পূর্ণসংখ্যা ধরে নেয়

প্রতি দুটি বাইটে কিছুটা বিয়ার-ওআর প্রয়োগ করে কাজ করে।

ইনপুট ফাইল হয় 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);
    }
}

এই প্রশ্নের নিয়ম আপডেট করা হয়েছে ...
স্তরের নদী সেন্ট

@ স্টিভেরিল এবং উত্তর এখন সেই অনুযায়ী আপডেট করা হয়েছে
es1024

কয়টা বাজে প্রায় ঘটা উচিত যখন 0 হয়ে @Comintern: 00000000 00000001 00000000 00000000 10000000 00000000, এইভাবে aশূন্য নির্দিষ্ট বিন্দুতে হওয়া উচিত। মেশিনটিতে অবশ্যই বড় এন্ডিয়ান ব্যবহার করা উচিত (না হলে এর 00000000 10000000পরিবর্তে আপনার কাছে থাকতে হবে 10000000 00000000, যা ভুল মান দেয়)।
es1024

Hrm ... কিছু মনে করবেন না। গ্রহণ 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" নামের একটি ফাইল থেকে পড়া, "ও" নামের একটি ফাইলের আউটপুট।

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

জাভা - 247

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 বাইট

আমি পড়ুন, ও লিখুন। বিটারে লাইব্রেরি 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

জাভাস্ক্রিপ্ট (+ এইচটিএমএল 5), 282

সম্ভবত সংক্ষিপ্ততম নয়, তবে এটি ব্যবহারকারী বান্ধব: ডি

এটি ক্রস ব্রাউজার, তবে মনে হয় যে এইচটিএমএল ফাইল কোনও স্থানীয় ফাইল (= এর সাথে অ্যাক্সেস 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])">

অবরুদ্ধ সংস্করণ:

<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 তম নয়।
ডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.