Tulis program yang mengubah setiap 17 bit file teks menjadi 1

10

Rekan kerja saya dan saya bekerja pada perangkat lunak lama yang kadang kami benci. Setiap kali Anda menjalankannya, pernyataan debug datang ke mana-mana, dan tidak pernah ada jaminan bahwa apa pun akan berfungsi. Motivasi untuk putaran kode golf ini datang dari rekan kerja saya yang mengatakan hal berikut tentang perangkat lunak kami .

"Ini seperti setiap kali Anda menjalankan program ini, Anda menyetujui beberapa ketentuan layanan yang mengatakan bahwa setiap bit ke-17 pada hard drive Anda akan berubah menjadi 1"

Sasaran: Menulis program yang akan membuat salinan file yang tepat dan mengubah setiap bit ke-17 file teks menjadi 1

  • Anda TIDAK boleh mengubah SETIAP bit file ke 1. yaitu program Anda harus menunjukkan beberapa kecerdasan bahwa itu hanya menargetkan setiap bit ke-17
  • Anda TIDAK boleh menulis ke file asli dengan cara apa pun
  • The Winner adalah penyampaian program yang terkecil di akhir bulan

Bersenang senanglah dengan yang satu ini! Pergilah!

C. Tewalt
sumber
7
1. Setiap pertanyaan membutuhkan kriteria kemenangan yang objektif. Sebagian besar pertanyaan adalah code-golfkode terpendek dalam byte yang menang. A code-challengemembutuhkan sistem penilaian yang ditentukan dengan baik. 2. Mengubah setiap bit ke-18 hard drive menjadi 1 hanya dimungkinkan dengan menulis langsung ke drive. Ini tidak dapat dilakukan dengan membuat dan / atau memodifikasi file. 3. Melakukan ini akan membuat seluruh drive tidak dapat digunakan, sehingga solusi yang sesuai akan merusak. Saya tidak tahu seberapa baik komunitas akan menerima permintaan untuk menulis malware ...
Dennis
2
Saya akan memilih untuk membuka kembali pertanyaan ini, kalau saja saya punya cukup perwakilan. :/
Sammitch
3
@steveverrill Saya akan mengubahnya menjadi kode golf, namun saya akan mengubahnya dari bit ke-18 ke bit ke-17, untuk membuat hal-hal menarik.
C. Tewalt
1
@matrixugly bit ke-17 tentu saja lebih menarik. Ingatlah bahwa itu bukan bentuk yang baik untuk mengubah aturan dengan cara yang membatalkan jawaban yang ada (itu sebabnya pertanyaan ditunda, untuk menghindari jawaban yang diposting yang membuat pertanyaan tidak mungkin untuk diperbaiki.) Namun jawaban yang ada tidak Bagaimanapun juga, tidak mematuhi aturan lain saat ini, jadi ini bukan masalah besar.
Level River St
1
Bagaimana file dibaca? stdin?
Milo

Jawaban:

9

CJam, 22 byte

q256b2H#b1f|2H#b256b:c

Cobalah online.

Menyentuh setiap bit ke-17, menghitung dari yang terakhir.

Saya telah menggunakan STDIN dan STDOUT karena CJam tidak memiliki file I / O. Jika tidak diizinkan, program dapat dibungkus dengan skrip Bash dengan biaya 24 byte tambahan:

cjam <(echo q256b2H#b1f\|2H#b256b:c)<"$1">"$2"

Bagaimana itu bekerja

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.                            ";
Dennis
sumber
1
+1, saya benar-benar perlu melihat CJam. Hebat berapa banyak kebingungan yang bisa Anda dapatkan dalam kode 22 byte yang masih berfungsi ...
Padarom
1
Sudah selesai dilakukan dengan baik. Itu dikonversi "Ambil setiap bit 17 dan mengubahnya menjadi 1" menjadi "" Tike vöery eiv 17th fiv dan putar yt (to c 1 "
C. Tewalt
Mengapa ini bekerja? Saya tidak mengikuti ..
Claudiu
1
Ya, saya tidak yakin apakah saya harus mempostingnya, tetapi karena jawaban Perl pada dasarnya sama ... Pembungkus Bash untuk memenuhi persyaratan I / O file akan meningkatkan jumlah byte menjadi 46. Lebih dari dua kali lebih lama, tapi tetap saja jawaban terpendek.
Dennis
1
@matrixugly maaf! spec meninggalkan file IO maksudmu sedikit ambigu. saya pribadi tidak mengenali masalah. bukan untuk terus mengomel pada manfaat dari kotak pasir codegolf , tetapi pertanyaan semakin tertutup dan kebingungan persyaratan ini mungkin bisa dihindari. menikmati tantangannya
ardnew
6

Perl 59

substitusi regex pada string bit:

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

pemakaian:

perl this.pl < infile.txt > outfile.txt
ardnew
sumber
endianness dapat diaktifkan dengan beralih di antara bdan Bdi packtemplat
ardnew
2

C, 125

Asumsikan bilangan bulat big-endian dan 16-bit .

Bekerja dengan menerapkan bitwise-OR pada setiap dua byte.

File input adalah y, output 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);}

Tidak disatukan

// 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
sumber
aturan tentang pertanyaan ini telah diperbarui ...
Level River St
@steveverrill dan jawabannya kini telah diperbarui
es1024
@Comintern Apa yang harus terjadi sekitar waktu ketika a menjadi 0:, 00000000 00000001 00000000 00000000 10000000 00000000dengan demikian aharus nol pada titik-titik tertentu. Mesin harus menggunakan big endian (atau yang Anda miliki 00000000 10000000alih - alih 10000000 00000000, yang akan memberikan nilai yang salah).
es1024
Hrm ... Sudahlah. Mengambil c = __builtin_bswap16(c);dikoreksi itu.
Comintern
2

Python 2, 112 byte

b=open('i').read().encode('hex')
open('o','w').write(('%x'%(int('1'+b,16)|16**len(b)/131071))[1:].decode('hex'))

Ini menetapkan setiap bit big-endian ke-17, mulai 17 dari awal. Tidak menggunakan perpustakaan. Ia bekerja dengan mengonversi file input ke ninteger bit- gigantic dan ORING dengan bitwise 2**n/(2**17 - 1) == 0b10000000000000000100000000000000001….

Anders Kaseorg
sumber
1

C - 139

Membaca dari file bernama "i", output ke file bernama "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;}

Dengan jeda baris:

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

Menghitung bit input dan kemudian menggunakan bitmask mengambang untuk mengatur setiap bit ketujuh belas.

Komintern
sumber
1

Jawa - 247

Menggunakan a BitSetdan loop sederhana alih-alih menangani / menutupi byte secara manual. Tentu saja ini java, boilerplate adalah setengah dari program, jadi tidak terlalu pendek.

Tetap saja, bukan yang terakhir! : 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());}}

Versi tanpa-gulir:

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());
    }
}
Geobit
sumber
1

Python - 98 byte

Baca dari saya, tulis ke o. Menggunakan perpustakaan 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'))
pengguna590028
sumber
Tidakkah harus demikian a[::17]=1?
undergroundmonorail
Juga, saya yakin Anda dapat menyimpan byte dengan from bitarray import*dan a=bitarray().
undergroundmonorail
0

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

Setiap kali saya melakukan salah satu dari tantangan 'memanipulasi bit individu sesuatu' ini, saya berharap Cobra atau .NET standard library memiliki binary string => integerkonverter.

Suram
sumber
0

Javascript (+ HTML5), 282

Mungkin bukan yang terpendek, tetapi ramah pengguna: D

Ini lintas browser, tetapi tampaknya chrome adalah satu-satunya yang memungkinkan ketika file html adalah file lokal (= akses dengan file://...). Untuk browser lain, Anda harus meletakkannya di server web.

File keluaran harus disimpan ke direktori unduhan default, mungkin dengan prompt file (tergantung pada konfigurasi Anda).

<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])">

Versi tidak disatukan:

<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
sumber
0

Python 3 - 187 byte


Membaca dari idan menulis ke o.

Kode:

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

Tidak Disatukan:

# 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
sumber
-1

Python 3 - 103 karakter

Ubah fke jalur file yang ingin Anda baca dan oke jalur file yang ingin Anda tulis.

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)) 
Peluruhan Beta
sumber
6
Setiap bit ke-17, bukan byte.
matsjoyce
1
Juga, ini ke-17, bukan ke-18.
Dennis