Tangan kosong ^ H ^ H ^ H ^ H ^ H ^ Hspaces

47

Pada beberapa terminal, menekan backspace menghasilkan kode kontrol ^Huntuk menghapus karakter sebelumnya. Ini memunculkan idiom snarky di mana pengeditan dibuat-buat untuk efek komedi :

Bersikap baik kepada orang bodoh ini ^ H ^ H ^ H ^ Hgentleman, dia mengunjungi dari kantor pusat perusahaan.

Diberikan string dengan satu atau lebih ^H, output hasil backspacing pada masing-masing ^H. Input hanya akan menggunakan karakter yang dapat dicetak (ASCII 32-126), dan ^hanya akan muncul sebagai ^H. Spasi mundur tidak akan pernah terjadi pada teks kosong.

Anda mungkin tidak berasumsi bahwa lingkungan output mendukung kode kontrol, khususnya kode backspace \x08.

>> Horse^H^H^H^H^HCow
Cow

>> Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ.
Be nice to this gentleman, he's visiting from corporate HQ.

>> 123^H45^H^H^H78^H
17

>> Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma
Digital Trauma

Papan peringkat

Berikut adalah papan peringkat berdasarkan bahasa, milik Martin Büttner .

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Tidak
sumber
4
Apakah AAA^HB^H^Hvalid
Nathan Merrill
@NathanMerrill Ya, dan itu menghasilkan A.
xnor
3
Saya menduga retina akan bekerja dengan baik di sini.
Claudiu
1
@Fatalize: "Backspaces tidak akan pernah terjadi pada teks kosong."
Maltysen
16
@Maria Tidal Tug kembali menghantui saya
Digital Trauma

Jawaban:

69

GNU sed, 11 byte

:;s/.^H//;t

Output tes:

$ echo "Horse^H^H^H^H^HCow
Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ.
123^H45^H^H^H78^H
Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma" | sed ':;s/.^H//;t'
Cow
Be nice to this gentleman, he's visiting from corporate HQ.
17
Digital Trauma
$ 
Trauma Digital
sumber
5
Lihat siapa yang muncul! Ini Maria Tidal Tug ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ Trauma digital!
Alex A.
@AlexA. Apakah saya melewatkan lelucon?
user253751
@immibis: Lihat komentar Digital Trauma pada pertanyaan.
Alex A.
sed -r ':;s/(^|.)\^H//;t'- ini bekerja dengan mengorbankan tambahan 6 byte
aragaer
@aragaer Mengapa itu perlu? OP mengatakan " Backspaces tidak akan pernah terjadi pada teks kosong ". Saya pikir ^Hawal dari string adalah backspace pada teks kosong.
Trauma Digital
19

Pyth, 11 byte

.U+PbZcz"^H

Demonstrasi.

.U+PbZcz"^H
               Implicit: z = input()
      cz"^H    z.split("^H")
.U             reduce, with the first element of the list as the initial value.
   Pb          Remove the last character of what we have so far.
  +  Z         And add on the next segment.
               Print implicitly.
isaacg
sumber
17

Gema, 6 byte

?#\^H=

Contoh dijalankan:

bash-4.3$ gema -p '?#\^H=' <<< 'pizza is alright^H^H^H^H^H^Hwesome'
pizza is awesome

CW, karena contoh bodoh vs pria terlalu lama. (Dibunuh setelah sehari. Mungkin kesalahan pada penerjemah? Semua contoh lain di sini diproses dalam fraksi detik.) Pola rekursif Gema tampaknya tidak terpengaruh oleh tingkat rekursi, tetapi jumlah teks yang tidak cocok meningkatkan waktu pemrosesan secara eksponensial. .

manatwork
sumber
Apakah ada tautan ke bahasa itu? Pencarian cepat di Github menemukan beberapa
Sp3000
Tentu. gema.sourceforge.net (BTW, proyek Gema didaftarkan 2003-10-27, sementara GitHub diluncurkan 2008-04-10. Itu mungkin menjadi alasan untuk tidak menemukannya di sana.)
manatwork
Saya percaya kedalaman rekursi sama dengan panjang string yang tidak cocok, karena akan berulang lagi sampai \^Hmaches, mencocokkan satu karakter pada satu waktu dengan yang lainnya ?.
isaacg
15

C, 52 byte

j;f(char*s){for(j=0;*s=s[j];s[j]==94?s--,j+=3:s++);}

Kami mendefinisikan fungsi fyang mengambil pointer ke string sebagai input. Setelah pemanggilan fungsi, penunjuk itu akan berisi string yang dimodifikasi.

Tes sederhana:

int main(int argc, char** argv) {
    char buf[300] = "Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma";
    f(buf);
    printf(buf);
    return 0;
}

Cetakan di atas:

Digital Trauma
BrainSteel
sumber
1
Ini sangat pintar. Beberapa hal yang saya perhatikan: global sudah diinisialisasi ke nol, jadi tidak perlu init jdi forloop Anda (tentu saja itu penggunaan tunggal, tapi saya tidak melihat apa-apa tentang itu dalam aturan :)). Anda juga dapat menggabungkan tugas dengan pengurangan: j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47 bytes)
Cole Cameron
@ColeCameron Anda melewatkan ini
undergroundmonorail
@undergroundmonorail dang, saya hanya memeriksa dua kali untuk melihat apakah saya melewatkan itu. Saya masih baru dengan kode golf tapi saya akan mengingatnya untuk masa depan :). Terimakasih atas infonya!
Cole Cameron
1
@ColeCameron Itu memiliki modifikasi dan akses (UB) yang tidak diikuti, dan menyebabkan EXC_BAD_ACCESS langsung pada kompiler / mesin saya, sayangnya.
BrainSteel
1
@ Quentin saya mencobanya, tetapi karena koma dalam s--, j+=3dan operator diutamakan, itu tidak berfungsi dengan benar.
BrainSteel
14

Haskell, 47 byte

h(a,_:_:b)=f$init a++b;h(x,_)=x
f=h.span(/='^')

Menentukan fungsi f :: String -> String. Bagaimana itu bekerja:

    f "ab^Hc^Hd"
=== h ("ab", "^Hc^Hd")   (find ^H)
=== f ("a" ++ "c^Hd")    (backspace)
=== f "ac^Hd"            (join)
=== h ("ac", "^Hd")      (find ^H)
=== f ("a", "d")         (backspace)
=== f "ad"               (join)
=== h ("ad", "")         (find ^H)
=== "ad"                 (no ^H: base case)
Lynn
sumber
1
Saya pikir Anda dapat menyimpan byte dengan menukar dua kasus hdan melakukan h(x,_)=xuntuk kasus string kosong.
Zgarb
12

CJam, 14 13 byte

q"^H"/{W\ts}*

Bagaimana itu bekerja

q                   e# Read the entire input
 "^H"/              e# Split it on occurrences of string "^H"
      {    }*       e# Reduce on the split array
       W\t          e# This is the tricky part. We know that if there are two parts that we
                    e# are reducing on, they must be separated by "^H". Which in turn means
                    e# that from the first part, last characters needs to be deleted
                    e# So we simply put the second part in place of the last character of the
                    e# first part.
          s         e# Doing the above makes it a mixed array of character and string.
                    e# So we convert it to a single string, ready to be served as first part
                    e# in next reduce iteration

PEMBARUAN: 1 byte disimpan berkat jimmy23013

Cobalah online di sini

Pengoptimal
sumber
2
1 byte pendek: W\ts.
jimmy23013
11

Retina, 13 byte

Retina

+`.\^H(.*)
$1

Dua baris harus menuju ke file mereka sendiri tetapi Anda dapat menjalankan kode sebagai satu file dengan -sbendera.

Pada setiap langkah kami menghapus kecocokan pertama .\^Hdalam string. Kami ulangi ini (dengan +modifikator) hingga tidak ada penghapusan yang terjadi.

randomra
sumber
Hanya sebuah keingintahuan: mengapa penangkapan (.*), karena tampaknya hanya dimasukkan kembali tidak berubah?
manatwork
1
@manatwork Dengan cara ini kita hanya menangkap yang pertama .\^Hdalam satu langkah. Kalau tidak, abc^H^H^Hakan menghasilkan ab^setelah langkah pertama.
randomra
4
Permintaan maaf karena belum menerapkan batas pengganti (yang mungkin akan memungkinkan sesuatu seperti +1`.\^H). ;)
Martin Ender
10

JavaScript ( ES6 ), 39 byte

f=s=>(t=s.replace(/.\^H/,''))!=s?f(t):t

// TEST

Out=x=>O.innerHTML+=x+'\n'

Test=_=>(Out(I.value + "\n-> " + f(I.value)),I.value='')

;["Horse^H^H^H^H^HCow"
,"Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."
,"123^H45^H^H^H78^H"
,"Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma"]
.forEach(t => Out(t + "\n-> " + f(t)))
#I { width:400px }
<pre id=O></pre>
<input id=I><button onclick='Test()'>-></button>

edc65
sumber
10

Perl, 20 16 15 byte

(14 karakter kode + 1 opsi opsi perintah karakter.)

s/.\^H//&&redo

Contoh dijalankan:

bash-4.3$ perl -pe 's/.\^H//&&redo' <<< "Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."
Be nice to this gentleman, he's visiting from corporate HQ.
manatwork
sumber
1
Simpan 4 karakter:1while s/.\^H//
Kevin Reid
Wow! Itu bagus @KevinReid. Terima kasih.
manatwork
1
Satu lagi:s/.\^H//&&redo
Dennis
Terima kasih, @Dennis. redoentah bagaimana tidak masuk ke set keahlian saya. Harus mengubah itu.
manatwork
2
Perhatikan bahwa versi @ Dennis hanya akan berfungsi (sebagaimana dimaksud) jika itu adalah satu-satunya pernyataan di dalam loop atau { }blok. (Alasan mengapa ia bekerja perl -padalah karena -psaklar secara otomatis membungkus kode Anda di dalam satu whilelingkaran.) Versi Kevin bekerja dalam pengaturan apa pun.
Ilmari Karonen
9

Julia, 58 42 41 byte

Disimpan 16 byte berkat manatwork dan 1 berkat Glen O!

f(s)='^'s?f(replace(s,r".\^H","",1)):s

Ini menciptakan fungsi rekursif yang menerima string dan mengembalikan string.

Ini menggantikan satu kejadian ^Hsekaligus dengan string kosong saat input berisi ^.

Contoh:

julia> f("123^H45^H^H^H78^H")
"17"

julia> f("pizza is alright^H^H^H^H^H^Hwesome")
"pizza is awesome"
Alex A.
sumber
Ini adalah pertama kalinya aku melihat Julia di alam liar. Bagus!
Ogaday
8

REGXY, 10 byte

Menggunakan REGXY , bahasa berbasis pengganti regex. Mengganti karakter apa pun yang diikuti oleh ^ H dengan tidak ada. Baris kedua kemudian mengeksekusi yang hanya sebuah penunjuk ke baris sebelumnya, mengulangi subtitusi sampai gagal mencocokkan.

/.\^H//
//

Ini mengkompilasi dan mengeksekusi dengan benar dengan contoh juru bahasa pada tautan di atas, tetapi solusinya mungkin agak kurang ajar karena bergantung pada asumsi dalam ketidakjelasan spesifikasi bahasa. Spec menyatakan bahwa token pertama pada setiap baris (sebelum /) bertindak sebagai label, tetapi asumsinya adalah bahwa penunjuk label nol akan menunjuk kembali ke perintah pertama dalam file dengan label nol (atau dengan kata lain, bahwa 'nol' adalah label yang valid). Solusi yang kurang sopan adalah:

a/.\^H//
b//a

Yang berjumlah 13 byte.

Jarmex
sumber
7

Python 3, 53 byte

o=""
for x in input().split("^H"):o=o[:-1]+x
print(o)

Tetapi secara pribadi saya lebih suka versi wordier ini:

H=input().split("^H")
print(eval("("*~-len(H)+")[:-1]+".join(map(repr,H))))

Yang menarik adalah itu

'B''a''c''k''h''a''n''d''e''d'[:-1][:-1][:-1][:-1][:-1][:-1]

benar-benar bekerja dan memberi 'Back', jadi saya mencoba memetakan ^H -> [:-1]dan char lainnya c -> 'c'saat itu eval, tetapi sayangnya Anda tidak dapat memiliki string setelahnya tanpa +, jadi ini gagal:

'B''a''c''k''h''a''n''d''e''d'[:-1][:-1][:-1][:-1][:-1][:-1]'s''p''a''c''e''s'
Sp3000
sumber
Heyy ... itu cukup rapi.
Alex Van Liew
+=bekerja di loop
CalculatorFeline
@CatsAreFluffy Ini o=o[:-1]+x, bukano=o+x
Sp3000
Ups, ketinggalan itu. Apakah ada yang suka o[:-2]=xbekerja?
CalculatorFeline
@CatsAreFluffy Anda tidak dapat menetapkanstr
Sp3000
7

Haskell, 52 47 byte

import Data.Lists
foldl1((++).init).splitOn"^H"

Contoh penggunaan:

> map (foldl1((++).init).splitOn"^H") ["Horse^H^H^H^H^HCow", "123^H45^H^H^H78^H", "Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma"]
["Cow","17","Digital Trauma"]

Bagaimana itu bekerja:

                  splitOn"^H"     -- split on substring "^H", e.g "Horse^H^H^H^H^HCow" -> ["Horse","","","","","Cow"]
                 .                -- then
foldl1(         )                 -- fold from left by
            init                  --   first dropping the last char from the left argument
       (++).                      --   second concatenating left and right argument
nimi
sumber
6

Ruby, 27 24 20 byte

(19 karakter kode + 1 opsi baris perintah karakter.)

$_=$`+$'while/.\^H/

Terimakasih untuk:

  • Ventero karena menyarankan untuk menggunakan variabel global (-4 karakter)

Contoh dijalankan:

bash-4.3$ ruby -pe '$_=$`+$'"'"'while/.\^H/' <<< "Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."
Be nice to this gentleman, he's visiting from corporate HQ.
manatwork
sumber
+1 Saya pikir saya akan melakukan jawaban Ruby sampai saya melihat ini - saya cukup yakin ini sekecil yang akan didapat. Penggunaan hebat []!
daniero
Ada versi lain di awal: loop{$_[/.\^H/]=""}rescue""Yang ini lebih bagus karena menunjukkan pengecualian Ruby menangani kesejukan.
manatwork
Haha, itu hebat :)
daniero
1
Lebih baik terlambat daripada tidak pernah: $_=$`+$'while~/.\^H/untuk 20 (Anda bahkan dapat menjatuhkan tilde jika Anda tidak peduli tentang regexp literal in conditionperingatan itu).
Ventero
1
@manatwork: Secara teknis ini muncul di semua versi ruby> = 1.9 (regex dan string literal dalam kondisi sudah usang setelah 1,8), saya kira Anda rubymasih default 1,8, sedangkan irbmenggunakan ruby ​​2.1.5.
Ventero
4

Python 2, 50

Agak aneh memiliki yang kedua lambdadi sana, tetapi tampaknya menjadi Python terbaik sejauh ini.

lambda s:reduce(lambda a,b:a[:-1]+b,s.split('^H'))
feersum
sumber
3

Pyth - 19 byte

Mengurangi bekerja dengan sangat, sangat baik dengan ini, tetapi itu hanya melakukan satu karakter pada satu waktu jadi saya harus menghabiskan hampir sebanyak karakter sebagai algo sebenarnya untuk melakukan penggantian ^Hdengan linebreak. Mencari cara yang lebih baik untuk melakukan itu.

u?+GHnHbPGjbcz"^H"k

Cobalah online di sini .

Maltysen
sumber
3

TeaScript , 7 byte [Tidak bersaing]

Tidak bersaing karena TeaScript dibuat setelah tantangan ini diposting. Ini di sini sebagai referensi.

xW/.\^H

Ini menggunakan TeaScript 3 baru, dan diganti secara rekursif untuk menghapus karakter

Downgoat
sumber
1
Untuk beberapa alasan ini dianggap sebagai 8859 byte pada papan peringkat karena tautan ISO 8859 ...
ev3commander
regerence? xD
cat
2

K5, 64 byte

K tidak benar-benar dirancang untuk pekerjaan semacam ini ...

{[s]$[2>#s;s;`=t:*&{"^H"~2#x_s}'1+!-2+#s;s;,/2#2!|(0,t,3+t)_s]}/
kirbyfan64sos
sumber
2

golflua, 36 byte

\f(s)@o!=s o=s;s=s:g(".^H","",1)$~s$

Contoh dijalankan:

Lua 5.2.2  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> \f(s)@o!=s o=s;s=s:g(".^H","",1)$~s$
> w(f("Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."))
Be nice to this gentleman, he's visiting from corporate HQ.
manatwork
sumber
2

Javascript, 62 byte

Bukan yang terpendek, tetapi berfungsi dengan baik.

t=prompt();while(t.match(R=/.\^H/))t=t.replace(R,'');alert(t);

Ini mungkin bisa dipersingkat banyak!

Ismael Miguel
sumber
1
Bukan yang terpendek dan tidak berfungsi sama sekali (coba salah satu kasus uji). Regexp tidak boleh global (hapus / g)
edc65
@ edc65 Terima kasih atas tipnya. Saya mencoba beberapa hal dan mereka berhasil. Itu sebabnya saya memposting seperti itu
Ismael Miguel
2

R, 54 52 byte

f=function(s)ifelse(s==(r=sub(".\\^H","",s)),r,f(r))

Ide dasar yang sama dengan jawaban Julia saya . Ini menciptakan fungsi rekursif yang menerima string dan mengembalikan string. Jika input sama dengan dirinya sendiri dengan satu kali penghapusan ^Hdihapus, kembalikan, atau panggil fungsi tersebut kembali.

Anda dapat mencobanya secara online !

Alex A.
sumber
2

ECMAScript 6, 57 byte

s=>{while(~s.indexOf`^H`)s=s.replace(/.\^H/,'');return s}

Ini mungkin golf, hanya memikirkan cara mungkin tidak

Downgoat
sumber
2
Bagaimana dengan s=>{while(s!=(s=s.replace(/.\^H/,""));return s}?
lrn
Atau, jika whiledan returnterlalu lama, ini bisa bersifat rekursif:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
lrn
@lm Anda harus menambahkan "" parameter kedua untuk penggantian. Maka Anda memiliki jawaban saya :)
edc65
Benar. Dan argumen string kosong harus ada di sana, saya harus menyalin versi yang salah :(
lrn
~s.indexOf`^H`bisa menjadi/\^H/.test(s)
Bukan itu Charles
2

Java, 78 77 byte

String f(String a){while(!a.equals(a=a.replaceFirst(".\\^H","")));return a;}
Olivia Trewin
sumber
1
Anda dapat menghapus spasi setelah koma untuk menyimpan satu char.
ProgramFOX
2

(Visual) FoxPro versi 80 byte apa pun

PARA t
DO WHILE AT('^H',t)>0
t = STRT(t,SUBS(t,AT('^H',t)-1,3))
ENDDO
RETU t

Mengulang terjemahan string menjadi kosong dengan menemukan ^ H dan mencadangkan satu karakter.

Chris
sumber
2

Julia, 41 39 byte

s->foldl((t,v)->chop(t)v,split(s,"^H"))

Apa yang dilakukan adalah menggunakan ^ H sebagai pembatas, dan kemudian menghapus karakter terakhir pada setiap string kemudian menyatukan string berikutnya sebelum menghapus karakter terakhir lagi. Tidak seperti jawaban Julia lainnya, ini bukan fungsi rekursif.

Catatan: Saya telah menghapus nama fungsi dari definisi. Awalnya, katanya f(s)=bukan s->, dan Anda menggunakannya sebagai f("AAA^HB^H^H")... tapi saya menyimpan dua byte dengan membiarkannya menjadi "anonim", dan gunakan sendiri sebagai namanya. Anda menggunakannya seperti ini:

(s->foldl((t,v)->chop(t)v,split(s,"^H")))("AAA^HB^H^H")

(Anda juga dapat menetapkan variabel sebagai f=s->foldl((t,v)->chop(t)v,split(s,"^H")), lalu f("AAA^HB^H^H")akan berfungsi)

Glen O
sumber
2

rs, 8 byte

Secara teknis, ini tidak masuk hitungan, karena ini tergantung pada fitur yang saya tambahkan setelah pertanyaan ini diposting. Namun, saya pikir itu cukup rapi.

+?1.\^H/

Demo langsung dan uji kasus .

kirbyfan64sos
sumber
Apakah fitur baru ini merupakan pengganti batas?
xnor
@xnata Ya: itu ?1.
kirbyfan64sos
@Optimizer Mengapa? Lagipula kau kalah dari Gema. : O
kirbyfan64sos
Ya :(. Lihat gema setelah mengirim komentar
Pengoptimal
1

Python 2, 74 + 2 = 76 Bytes

Saya sudah mencoba beberapa pendekatan sejauh ini, ini adalah yang terbaik yang bisa saya dapatkan sejauh ini.

n=input();o='';c=0
for l in n:d=l=='^';o=[o+l*(1-c),o[:-1]][d];c=d
print o
Kade
sumber
4
Dari mana asal 2 byte tambahan itu?
xnor
@xnor input harus dikelilingi oleh tanda kutip agar ini berfungsi. Saya lupa meletakkannya di pos.
Kade
1
Saya pikir konvensi yang biasa adalah untuk memungkinkan argumen string diambil dalam tanda kutip secara gratis, tapi saya tidak sepenuhnya yakin.
xnor
1

Mumps, 84 Bytes

R Z S T="",Y=$L(Z,"^H") F I=1:1:Y{S T=T_$P(Z,"^H",I) S:I<Y T=$E(T,1,$L(T)-1)} W !,T

Ini mungkin bisa dibuat lebih pendek sebagai fungsi (1 byte saya dapat menyimpan dalam pengujian cepat) tapi saya agak suka aspek satu-liner ... :-)

Kawat gigi berasal dari rasa Intersystems Cache of Mumps yang merupakan hal yang paling saya fahami.

zmerch
sumber
1

Java - 123 byte

Saya pribadi suka g---1bagian yang terbaik.

String f(char[] a){String b="";for(int g=-1;++g<a.length;b=(a[g++]=='^'?b.substring(0,b.length()-1):b+a[g---1]));return b;}

diperluas (sedikit):

  String f(char[] a) {
      String b = "";
      for (int g = -1;
           ++g < a.length;
           b = (a[g++]=='^' 
                ? b.substring(0, b.length() - 1) 
                : b + a[g---1])
      );
      return b;
  }
Regangkan Maniac
sumber
1

Gelombang - 138 byte

@!! 2>nul||cmd/q/v/c%0 %1&&exit/b
set s=%1&for /F %%a in ('"prompt $H&echo on&for %%b in (1)do rem"')do set D=%%a
echo %s:^H=!D! !D!%

Baris pertama adalah cara untuk menghemat beberapa byte lebih lama @echo off&setLocal enableDelayedExpansion(yang mematikan gema dan memungkinkan ekspansi variabel tertunda, jika Anda bertanya-tanya). Saya menjelaskannya dalam Tips untuk Golf di Batch .

Baris kedua adalah trik kecil yang rapi untuk menyimpan karakter kontrol backspace ke dalam variabel. Ini sangat berantakan, dan saya tidak bisa berpura-pura mengambil kredit untuk itu. Ini semacam dijelaskan di sini . Pada dasarnya menggunakan perintah prompt untuk menghasilkan karakter backspace dan menangkapnya dalam variabel - dalam hal ini !D!.

Baris terakhir kemudian melakukan manipulasi string sederhana - ganti ^Hdengan !D!<SPACE>!D!.

C:\>bsp.bat "testing^H^H^H test"
"test test"

Sayangnya itu rusak dengan kasus-kasus seperti "AAA^HB^H^H"- di mana ia harus berproduksi "A", itu malah menghasilkan "A"B. Yang agak membingungkan. Saya harus melihat bagaimana manipulasi string Batch bekerja lebih dalam lagi.

C:\>bsp.bat "AAA^HB^H^H"
"A"B

Terima kasih kepada beberapa orang yang membantu di sini - Saya sekarang menyadari bahwa saya hanya menyimpan karakter backspace (0x08), dan begitu juga hanya menimpa karakter. Sekarang berfungsi dengan contoh-contoh seperti berikut:

C:\>bsp.bat "AAA^HB^H^H"
"A"
hapus clemeat
sumber