编写一个程序,将文本文件的第17位变成1


10

我和我的同事正在开发我们有时讨厌的旧版软件。每当您运行它时,调试断言就会四处飞扬,并且不能保证任何事情都会起作用。这轮代码高尔夫的动机来自于我的同事对我们的软件发表了以下看法。

“就像每次运行该程序一样,您同意某些服务条款,这些条款说硬盘上的第17位将变成1。”

目标:编写一个程序,该程序将精确复制文件并将文本文件的第17位变成1

  • 你可能EVERY文件的位为1,即你的程序必须表现出一定的智能,它仅针对每第17位
  • 你可能写入到原始文件中的任何方式或形式
  • 获奖者是在月底最小的程序提交

玩得开心!走!


7
1.每个问题都需要一个客观的获胜标准。大多数问题是code-golf,即以字节为单位的最短代码获胜。A code-challenge需要指定明确的评分系统。2.仅通过直接写入驱动器,才能将硬盘驱动器的第18位变成1。这不能通过创建和/或修改文件来实现。3.这样做会使整个驱动器无法使用,因此兼容的解决方案将具有破坏性。我不知道社区会收到编写恶意软件的请求的程度……
Dennis

2
如果我有足够的代表,我将投票重新提出这个问题。:/
Sammitch 2014年

3
@steveverrill我将其更改为代码高尔夫球,但是为了使事情变得有趣,我将其从18位更改为17位。
C. Tewalt 2014年

1
@matrixugly第17位肯定更有趣。请记住,以使现有答案无效的方式更改规则不是一种很好的形式(这就是为什么问题被搁置,以避免发布导致问题无法解决的答案。)但是现有答案没有无论如何都不符合其他现行规定,因此在这种情况下这不是什么大问题。
级圣河

1
如何读取文件?标准输入
Milo 2014年

Answers:


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。令人
难以置信的

1
做得好。它将“将每17位取一并转换为1”转换为““将第17位取而代之,然后将yt(to c 1)”
C. Tewalt

为什么这样做?我不明白..
克劳迪乌

1
是的,我不确定是否应该发布它,但是由于Perl的回答基本相同...满足文件I / O要求的Bash包装器会将字节数提高到46。但答案仍然最短。
丹尼斯

1
@matrixugly抱歉!规范使您的文件IO意图有些含糊。我个人不认识这个问题。并不是要继续利用codegolf 沙箱的优点,但是可以解决这个问题,并且可以避免这种需求混淆。无论如何都享受挑战
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

假定big-endian和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);}

不打高尔夫球

// 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在某些点应该为零。机器必须使用大端字节序(否则,您将使用00000000 10000000而不是10000000 00000000,这将提供错误的值)。
es1024

嗯...没关系。取出c = __builtin_bswap16(c);纠正。
Comintern 2014年

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整数并与进行按位或运算来工作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;
}

对输入的位进行计数,然后使用浮动位掩码设置第十七位。


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。使用位数组库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()
地下

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

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
而且,它是第17位,而不是第18位。
丹尼斯2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.