Hapus semua karakter ASCII yang tidak dapat dicetak

9

Tantangan Anda, jika Anda diberi kode untuk menerimanya, berjalan sebagai berikut:

Anda dapat memilih salah satu dari dua tantangan berikut untuk diterapkan:

Tantangan # 1

  • Baca dari file a.txt
  • Tulis hanya karakter ASCII yang dapat dicetak (nilai 32-126) ke file b.txt

Tantangan # 2

  • Dengan file a.txt, hapus semua karakter dalam file kecuali karakter ASCII yang dapat dicetak (nilai 32-126)

Spesifikasi aktif a.txt

a.txt adalah file teks biasa yang dapat menyertakan nilai ASCII mulai 0-255 (bahkan tidak ditentukan / kontrol) dan ukurannya dapat berkisar hingga 1 GB.

Kemenangan

Jawaban dengan jumlah kode sumber terkecil dalam byte akan menang.

Timtech
sumber
@Malachi Itu agak besar; bagaimana Anda menyarankan saya mengunggahnya?
Timtech
Kriteria kemenangan Anda salah. Misalnya saja saya bisa. Tambahkan komentar yang sangat panjang ke kode saya, dan menangkan.
Mhmd
2
@ user689 Dan itu akan terjadi jika saya memiliki program yang sangat lambat. Saya berasumsi bahwa yang ia maksudkan adalah skor paling tidak menang.
Oberon
1
@Malachi tapi itu berarti lebih lambat lebih baik, dan pertanyaannya diberi tag kode tercepat .
Oberon
@amon saya akan membuatnya kode-golf sebagai gantinya.
Timtech

Jawaban:

6

SH

Tantangan 1, 24 23 karakter

tr -dc \ -~<a.txt>b.txt
Bonus : variasi pada set karakter yang akan dihapus.
tr -dc " -~
"<a.txt>b.txt                       # preserves printables + line feed

tr -dc "[:space:] -~"<a.txt>b.txt   # preserves printables + whitespace
FireFly
sumber
1
Anda dapat mengambil ruang sebelum<
Tobia
Kamu benar! Itu sangat jelek sehingga saya lupa tentang itu. : D
FireFly
1

Bash + Perl

Tantangan 1 - 31 byte

perl -petr/\ -~//cd a.txt>b.txt

Tantang 2 - 28 byte

perl -i -petr/\ -~//cd a.txt
amon
sumber
Hmm, itu berlari dan membuat b.txttapi karakter lain tetap ada.
Timtech
@Timtech tidak dapat mereproduksi, vim tidak menunjukkan hal-hal yang tidak patut untuk saya (ketika melihat b.txttantangan 1)
amon
1

Keduanya Tantangan 1.

C - 132 karakter

#include<stdio.h>
k;main(){FILE*f=fopen("a.txt","rb");FILE*g=fopen("b.txt","w");while(!feof(f))(k=getc(f))>31&&k<127&&putc(k,g);}

Python - 78 karakter

file("b.txt","w").write(filter(lambda x:'~'>=x>' ',file("a.txt").read()))
Oberon
sumber
Apakah ini Python 3?
Timtech
Python tidak berfungsi dengan 3.3.3. Sunting: Sepertinya Anda harus membuat file terlebih dahulu.
Timtech
Saya menjalankannya di Python 2.7 (r27: 82525).
Oberon
1

Brainfuck: 92

+[[->+>+<<]>>>++++++++[->++++++++++++<<---->]>--[<<[->]>[<]>-]<+<[[-]>-<]>[[-]<<.>>]<<[-]<,]

Brainfuck tidak dapat membuka file sehingga Anda menggunakan stdin / stdout redirection (# 1)

bf strip.bf < a.txt > b.txt

Kode yang sama di Extended Brainfuck : 68

+[(->+>+)3>8+(->12+<<4-)>2-[<<[->]>[<]>-]<+<([-]>-)>([-]2<.)2<[-]<,]
Sylwester
sumber
1

PowerShell (43, 43)

Tantangan 1: (43)

(gc -raw a.txt) -replace"[^ -x7e]","">b.txt

Tantangan 2: (43)

(gc -raw a.txt) -replace"[^ -x7e]","">a.txt
mikrobia
sumber
Mengapa tidak menggunakan ~bukan x7e? Anda juga dapat meninggalkan ,""argumen dan menjaga efek yang sama saya percaya.
Etan Reisner
0

iX3, 388

Set  in [c]:  '1'
Loop start   ([c]  of 1  to 999999999)
   Read from file  'a.txt' into [T] (read from [c], 1 bytes)
   Modify text  '[T]' into [R] (code in Hex)
   Set  in [N]:  '&H[R]' (calculate)
   If  True: '([N]=10)'
      Write into file  'b.txt' line '' (Append)
   End If
   If  True: '([N]>31)&([N]<127)'
      Write into file  'b.txt' line '[T]' (Append, no linefeed)
   End If
Loop end
Timtech
sumber
0

Tantangan # 1

Ruby (52)

 IO.write (f="a.txt"),IO.read(f).gsub(/\p{Cntrl}/,'')
daniero
sumber
0

Retina , 7 byte

Regex sederhana untuk menghapus ASCII yang tidak dapat dicetak.

[^ -~]

Cobalah online!

Masukan tes disalin dari pos SO ini .

mbomb007
sumber
Saya pikir Anda melewatkan membaca / menulis ke a/b.txtaspek tantangan
Jo King
1
@JoKing Retina tidak dapat membuka file. Sama seperti jawaban ini , jadi tidak apa-apa.
mbomb007
0

Tcl , 122 123 byte

set g [open b.txt w]
lmap c [split [read [open a.txt]] ""] {scan $c %c v
if $v>31&$v<127 {puts -nonewline $g $c}}
close $g

Cobalah online!

sergiol
sumber
0

K4 , 36 33 byte

Larutan:

`b.txt 1:{x@&31<x*127>x}@1:`a.txt

Penjelasan:

Di atas adalah untuk Tantangan A, ganti b.txtuntuk a.txtuntuk Tantangan B.

`b.txt 1:{x@&31<x*127>x}@1:`a.txt / the solution
                         1:`a.txt / binary read (1:) "a.txt"
                        @         / apply to 
         {             }          / lambda taking 1 implicit arg (x)
                  127>x           / 127 greater than?
                 *                / multiply by
                x                 / x
             31<                  / 31 less than?
            &                     / indices where true
          x@                      / index into x at these indices
`b.txt 1:                         / binary write to "b.txt"
streetster
sumber
0

Burlesque - 21 byte

{**{31.>}{127.<}m&}f[

Ini dapat disingkat menjadi menggantikan 128dengan '<DEL>(di mana DEL adalah karakter hapus) tapi saya tidak yakin bagaimana saya dapat memposting DEL di sini (juga mengganti 31dan kemudian Anda juga dapat menyingkirkan** )).

Juga, dalam versi WIP Anda dapat melakukan ini :un:ln.

mroman
sumber