텍스트 파일의 모든 17 비트를 1로 바꾸는 프로그램 작성


10

동료와 저는 때때로 우리가 싫어하는 레거시 소프트웨어를 사용합니다. 당신이 그것을 실행할 때마다, 디버그 주장은 어디에서나 날아오고, 아무것도 작동한다는 것을 결코 보장하지 않습니다. 이 코드 골프 라운드의 동기는 동료 가 우리 소프트웨어에 대해 다음과 같이 말한 것입니다 .

"이 프로그램을 실행할 때마다 하드 드라이브의 모든 17 비트가 1로 바뀌는 서비스 약관에 동의하는 것입니다."

목표 : 파일의 정확한 사본을 만들고 텍스트 파일의 모든 17 비트를 1로 바꾸는 프로그램을 작성하십시오.

  • 파일의 모든 비트를 1로 바꿀 수는 없습니다 . 즉, 프로그램은 17 비트마다 타겟팅한다는 지능을 보여 주어야합니다.
  • 어떤 형태 나 형태로도 원본 파일에 쓸 수 없습니다
  • 우승자는 월말에 작은 프로그램 제출하다

이것으로 재미있게 보내십시오! 가다!


7
1. 모든 질문에는 객관적인 승리 기준이 필요합니다. 대부분의 질문은 code-golf즉, 가장 짧은 바이트 단위의 코드입니다. A는 code-challenge잘 지정된 채점 시스템이 필요합니다. 2. 하드 드라이브의 모든 18 비트를 1로 바꾸는 것은 드라이브에 직접 쓰면 가능합니다. 파일을 작성 및 / 또는 수정하여 수행 할 수 없습니다. 3. 이렇게하면 전체 드라이브를 사용할 수 없게되므로 호환 솔루션이 손상 될 수 있습니다. 커뮤니티가 악성 코드 작성 요청을 얼마나 잘 받을지 모르겠습니다 ...
Dennis

2
충분한 담당자가 있다면이 질문을 다시 열도록 투표했습니다. :/
Sammitch

3
@steveverrill 코드 골프로 바꾸겠습니다.하지만 18 비트에서 17 비트로 바꿔서 재미있게 만들겠습니다.
C. Tewalt

1
@matrixugly 17 비트는 확실히 더 흥미 롭습니다. 기존 답변을 무효화하는 방식으로 규칙을 변경하는 것은 좋은 형식이 아님을 명심하십시오 (따라서 답변을 게시 할 수 없도록하기 위해 질문이 보류되는 이유). 기존 답변은 그렇지 않습니다. 어쨌든 다른 현재 규칙을 준수하지 않으므로이 경우 큰 문제는 아닙니다.
Level River St

1
파일을 어떻게 읽습니까? stdin?
Milo

답변:


9

CJam, 22 바이트

q256b2H#b1f|2H#b256b:c

온라인으로 사용해보십시오.

마지막부터 세어 17 번째 비트마다 터치합니다.

CJam에 파일 I / O가 없기 때문에 STDIN과 STDOUT을 사용했습니다. 이것이 허용되지 않으면 프로그램은 24 바이트의 추가 비용으로 Bash 스크립트로 래핑 될 수 있습니다.

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 바이트 코드로 얼마나 난독화할 수
있을까요

1
잘 했어. "모든 17 번째 비트를 가져 와서 1로 바꾼다"를 ""17 번째 fiv로 바꾸고 yt (to c 1 "로
바꾼다)

왜 이것이 작동합니까? 나는 따르지 않는다.
Claudiu

1
예, 게시해야할지 확실하지 않았지만 Perl 답변은 기본적으로 동일하기 때문에 ... 파일 I / O 요구 사항을 충족하는 Bash 래퍼는 바이트 수를 46으로 올릴 것입니다. 그러나 여전히 가장 짧은 대답.
Dennis

1
@matrixugly 죄송합니다! 사양은 파일 IO 의도를 약간 모호하게했습니다. 나는 개인적으로 문제를 인식하지 못했습니다. codegolf sandbox 의 장점을 계속 활용하지 말고 질문이 닫히고이 요구 사항 혼란을 피할 수 있었을 것입니다. 에 관계없이 도전을 즐겼다
ardnew

6

펄 59

비트 문자열의 정규식 대체 :

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

용법:

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

엔디안의 전환은 토글 할 수 bB에서 pack템플릿
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

a가 0이되면 시간을 주위에 발생해야 어떤 @Comintern : 00000000 00000001 00000000 00000000 10000000 00000000따라서 a특정 지점에서 0이어야합니다. 기계는 빅 엔디안을 사용해야합니다 (또는 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비트 정수 로 변환 하고 비트 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

자바-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 바이트

i에서 읽고 o에 씁니다. 비트 어레이 라이브러리를 사용합니다 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않습니까?
undergroundmonorail

또한, 나는 당신이 바이트를 저장할 수 있다고 생각 from bitarray import*하고 a=bitarray().
undergroundmonorail

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)

이 중 하나를 수행 할 때마다 '어딘가의 개별 비트를 조작하는'과제를 해결할 때마다 Cobra 또는 .NET 표준 라이브러리에 binary string => integer변환기 가 있기를 바랍니다 .


0

자바 스크립트 (+ HTML5), 282

아마도 가장 짧지는 않지만 사용자 친화적입니다. : D

크로스 브라우저이지만 html 파일이 로컬 파일 일 때 크롬이 허용하는 유일한 것 같습니다 (= with with 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)))

언 골프 드 :

# 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 비트마다입니다.
matsjoyce

1
또한 18 일이 아닌 17 일입니다.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.