テキストファイルの17番目ごとのビットを1にするプログラムを記述します。


10

私の同僚と私は、時々嫌うレガシーソフトウェアに取り組んでいます。実行するたびに、デバッグアサートがどこにでも飛んでくるので、何かが機能するという保証はありません。このコードゴルフラウンドの動機は、同僚がソフトウェアについて次のように述べたことにあります

「このプログラムを実行するたびに、ハードドライブの17番目のビットがすべて1に変わると言ういくつかの利用規約に同意しているようです」

目標:ファイルの正確なコピーを作成し、テキストファイルの17番目ごとのビットを1にするプログラムを作成する

  • あなたはありませ回しEVERYのそれだけですべての17ビットをターゲットにしていることをいくつかの知性を示さなければなりません。1.つまり、あなたのプログラムにファイルのビットを
  • あなたはありませ一切の形状または形態で、元のファイルへの書き込み
  • 受賞者は、月末の最小のプログラムの提出であります

これを楽しんでください!行こう!


7
1.すべての質問には、客観的な勝利基準が必要です。ほとんどの質問はですcode-golf。つまり、バイト単位の最短コードが優先されます。Aにcode-challengeは、明確なスコアリングシステムが必要です。2.ハードドライブの18ビットごとを1にすることは、ドライブに直接書き込むことによってのみ可能です。これは、ファイルを作成または変更することでは実現できません。3.これを行うと、ドライブ全体が使用できなくなるため、準拠したソリューションは破壊的になります。コミュニティがマルウェアを作成するリクエストをどの程度うまく受け取るかわかりません...
Dennis

2
私が十分な担当者を持っている場合にのみ、私はこの質問を再開するために投票します。:/
サミッチ2014

3
@steveverrill私はコードゴルフに変更しますが、面白いように18ビットから17ビットに変更します。
C. Tewalt 2014

1
@matrixugly 17番目のビットは確かにもっと興味深いです。既存の回答を無効にするような方法でルールを変更することは良い形ではないことを覚えておいてください(そのため、質問の修正が不可能になるような回答が投稿されないようにするために質問が保留になります)。ただし、既存の回答ではとにかく他の現在のルールに準拠していないので、この場合は大きな問題ではありません。
Level River St

1
ファイルはどのように読み込まれますか?stdin?
ミロ2014

回答:


9

CJam、22バイト

q256b2H#b1f|2H#b256b:c

オンラインでお試しください。

最後から数えて、17番目ごとのビットに触れます。

CJamにはファイルI / Oがないため、私はSTDINとSTDOUTを使用しました。それが許可されていない場合は、プログラムをBashスクリプトでラップして、追加の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を調べる必要があります。22バイトのコードがどれほど難読化され、目的を果たしているのか...
Padarom

1
よくやった。これは、「17ビットごとに1に変換」を「Tike vheeöery17th fivに変換し、yt(to c 1」に
変換します

なぜこれが機能するのですか?私はフォローしません..
Claudiu 2014

1
はい、投稿する必要があるかどうかはわかりませんでしたが、Perlの回答は基本的に同じでした...ファイルI / O要件を満たすBashラッパーは、バイト数を46に増やします。それでも最短の答えです。
Dennis

1
@matrixuglyごめんなさい!仕様により、ファイルIOの意図が少しあいまいになりました。私は個人的に問題を認識しませんでした。codegolf sandboxのメリットを常に主張するのではなく、問題が解決され、この要件の混乱が回避された可能性があります。関係なく挑戦を楽しんだ
ardnew

6

Perl 59

ビット文字列の正規表現置換:

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

使用法:

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

エンディアンを切り替えることで切り替えることができますbし、Bpackのテンプレート
ardnew

2

C、125

ビッグエンディアンと16ビット整数を想定しています

2バイトごとにビット単位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);}

未ゴルフ

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

この質問のルールが更新されました...
Level River St

@steveverrillと回答がそれに応じて更新されました
es1024

@Comintern aが0になるときの周りで何が起こるか:00000000 00000001 00000000 00000000 10000000 00000000したがってa、特定のポイントで0 になるはずです。マシンはビッグエンディアンを使用する必要があります(または、の00000000 10000000代わりに10000000 00000000使用すると、間違った値が返されます)。
es1024 2014

うーん...気にしないで。取り出してc = __builtin_bswap16(c);修正しました。
Comintern

2

Python 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ビット整数に変換し、とビットごとにORすることで機能し2**n/(2**17 - 1) == 0b10000000000000000100000000000000001…ます。


1

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

入力のビットをカウントし、浮動ビットマスクを使用して17ビットごとに設定します。


1

Java-247

BitSetバイトを手動で処理/マスクする代わりに、単純なループを使用します。もちろん、これはJavaであり、ボイラープレートはプログラムの半分なので、正確に短くはありません。

それでも、最後はありません!:D

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

Python-98バイト

iから読み取り、oに書き込みます。bitarrayライブラリを使用https://pypi.python.org/pypi/bitarray

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

ない

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)

これらの「何かの個々のビットを操作する」課題の1つを行うたびに、Cobraまたは.NET標準ライブラリのいずれかにbinary string => integerコンバーターがあったことを願っています。


0

JavaScript(+ HTML5)、282

おそらく最短ではありませんが、ユーザーフレンドリーです:D

これはクロスブラウザですが、htmlファイルがローカルファイル(=でのアクセスfile://...)の場合に許可されるのはChromeだけです。その他のブラウザの場合は、Webサーバーに配置する必要があります。

出力ファイルは、デフォルトのダウンロードディレクトリに保存する必要があります(おそらく構成によっては)ファイルプロンプトを使用します。

<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

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

非ゴルフ:

# 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

Python 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ビットごとです。
matsjoyce 2014

1
また、18日ではなく17日です。
Dennis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.