Напишите программу, которая превращает каждый 17-й бит текстового файла в 1

10

Мой коллега и я работаем над устаревшим программным обеспечением, которое мы иногда ненавидим. Всякий раз, когда вы запускаете его, повсеместно появляются отладочные утверждения, и никогда не гарантируется, что что-нибудь сработает. Мотивация к этому раунду игры в гольф кода пришла от моего сотрудника, который сказал следующее о нашем программном обеспечении .

«Как каждый раз, когда вы запускаете эту программу, вы соглашаетесь с некоторыми условиями обслуживания, согласно которым каждый 17-й бит на вашем жестком диске будет превращен в 1»

Цель: написать программу, которая сделает точную копию файла и превратит каждый 17-й бит текстового файла в 1

  • Вы НЕ МОЖЕТЕ превращать КАЖДЫЙ бит файла в 1. т. Е. Ваша программа должна демонстрировать некоторую информацию о том, что она нацелена только на каждый 17-й бит
  • Вы можете НЕ писать в исходный файл каким - либо образом или иной форме
  • Победитель наименьшее представление программы в конце месяца

Веселитесь с этим! Идти!

C. Tewalt
источник
7
1. Каждый вопрос нуждается в объективном критерии победы. Большинство вопросов code-golf, т.е. самый короткий код в байтах, выигрывает. А code-challengeнужна четко определенная система начисления очков. 2. Превратить каждый 18-й бит жесткого диска в 1 возможно только путем записи непосредственно на диск. Это не может быть достигнуто путем создания и / или изменения файлов. 3. Это сделает весь привод непригодным для использования, поэтому совместимое решение будет разрушительным. Я не знаю, насколько хорошо сообщество получит запрос на написание вредоносного ПО ...
Деннис
2
Я бы проголосовал, чтобы вновь открыть этот вопрос, если бы у меня было достаточно представителей. :/
Саммит
3
@steveverrill Я изменю это на code golf, однако я собираюсь изменить его с 18-го на 17-й, чтобы сделать вещи интересными.
C. Tewalt
1
@matrixugly 17-й бит, конечно, интереснее. Имейте в виду, что не стоит менять правила таким образом, чтобы сделать недействительными существующие ответы (поэтому вопросы откладываются, чтобы избежать публикации ответов, которые делают вопрос невозможным исправить). Однако существующий ответ не в любом случае не соответствует другим действующим правилам, так что в этом случае это не большая проблема.
Уровень Река St
1
Как читается файл? STDIN?
Майло

Ответы:

9

CJam, 22 байта

q256b2H#b1f|2H#b256b:c

Попробуйте онлайн.

Касается каждого 17-го бита, считая с последнего.

Я использовал STDIN и STDOUT, так как CJam не имеет файлового ввода-вывода. Если это не разрешено, программу можно обернуть в сценарий 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 vhe eöery 17-й пятый и поверните yt (в c 1 "
C. Tewalt
Почему это работает? Я не следую ..
Клавдиу
1
Да, я не был уверен, стоит ли его публиковать, но поскольку Perl-ответ сделал в основном то же самое ... Оболочка Bash, отвечающая требованиям ввода-вывода, повысила бы число байтов до 46. Более чем вдвое больше, но все равно самый короткий ответ.
Деннис
1
@matrixugly извините! спецификация оставила ваше намерение ввода-вывода немного двусмысленным. Я лично не узнал проблему. не продолжать приставать к достоинствам песочницы Codegolf , но, возможно, этого вопроса можно было избежать, и это смешение требований можно было бы избежать. наслаждался испытанием независимо
ardnew
6

Perl 59

Подстановка регулярных выражений в битовых строках:

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

Применение:

perl this.pl < infile.txt > outfile.txt
ardnew
источник
порядок байтов можно переключать, переключаясь между шаблонами bи Bв нихpack
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
источник
правила по этому вопросу были обновлены ...
Level River St
@steveverrill и ответ теперь обновлены соответственно
es1024
@Comintern Что должно происходить в то время, когда a становится 0:, 00000000 00000001 00000000 00000000 10000000 00000000следовательно, aдолжно быть нулем в определенных точках. Машина должна использовать порядковый номер с прямым порядком байтов (иначе 00000000 10000000вместо этого вы бы получили 10000000 00000000неправильное значение).
es1024
Хм ... Неважно. Вынос c = __builtin_bswap16(c);исправил.
Коминтерн
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

С - 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

Ява - 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());
    }
}
Geobits
источник
1

Python - 98 байт

Читайте от меня, пишите о. Использует библиотеку 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'))

ungolfed

from bitarray import *
a=bitarray()
a.fromfile(open('i','rb'))
a[::17]=1
a.tofile(open('o','wb'))
user590028
источник
Разве это не должно быть 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)

Каждый раз, когда я выполняю одну из этих задач «манипулировать отдельными кусочками чего-либо», мне бы хотелось, чтобы в Cobra или стандартной библиотеке .NET был binary string => integerконвертер.

Οurous
источник
0

Javascript (+ HTML5), 282

Наверное, не самый короткий, но удобный для пользователя: D

Это кросс-браузер, но кажется, что Chrome - единственный, который позволяет, когда 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])">

Безголовая версия:

<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]);
">
sebcap26
источник
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)))

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
matsjoyce
источник
-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
1
Кроме того, это 17-й, а не 18-й.
Деннис