Trái tay ^ H ^ H ^ H ^ H ^ H ^ Không gian


47

Trên một số thiết bị đầu cuối, nhấn backspace sẽ tạo mã điều khiển ^Hđể xóa ký tự trước đó. Điều này đã dẫn đến một thành ngữ ngớ ngẩn trong đó các chỉnh sửa được cho là có hiệu lực hài :

Hãy tốt với kẻ ngốc này ^ H ^ H ^ H ^ Hgentman, anh ta đến từ trụ sở công ty.

Đưa ra một chuỗi có một hoặc nhiều ^H, xuất kết quả của khoảng cách trên mỗi chuỗi ^H. Đầu vào sẽ chỉ sử dụng các ký tự có thể in (ASCII 32-126) và ^sẽ chỉ xuất hiện dưới dạng ^H. Backspaces sẽ không bao giờ xảy ra trên văn bản trống.

Bạn không được cho rằng môi trường đầu ra hỗ trợ các mã điều khiển, đặc biệt là mã 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

Bảng xếp hạng

Đây là bảng xếp hạng ngôn ngữ, lịch sự của Martin Büttner .

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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


4
AAA^HB^H^Hhợp lệ không?
Nathan Merrill

@NathanMerrill Có, và kết quả là A.
xnor

3
Tôi nghi ngờ võng mạc sẽ làm tốt ở đây.
Claudiu

1
@Firthize: "Backspaces sẽ không bao giờ xảy ra trên văn bản trống."
Maltysen 10/07/2015

16
@Maria Tidal Tug quay trở lại ám ảnh tôi
Chấn thương kỹ thuật số

Câu trả lời:


69

GNU sed, 11 byte

:;s/.^H//;t

Đầu ra thử nghiệm:

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

5
Nhìn ai đã xuất hiện! Đó là Maria Tidal Tug ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ HDigital Trauma!
Alex A.

@AlexA. Tôi có thiếu một trò đùa không?
dùng253751

@immibis: Xem bình luận của Digital Trauma về câu hỏi.
Alex A.

sed -r ':;s/(^|.)\^H//;t'- điều này hoạt động với chi phí thêm 6 byte
aragaer

@aragaer Tại sao cần thiết? OP cho biết "Không gian tồn tại sẽ không bao giờ xảy ra trên văn bản trống ". Tôi nghĩ rằng ^Hphần đầu của chuỗi là một khoảng trống trên văn bản trống.
Chấn thương kỹ thuật số

19

Bình thường, 11 byte

.U+PbZcz"^H

Trình diễn, thuyết trình.

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

17

Gema, 6 byte

?#\^H=

Chạy mẫu:

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

CW, bởi vì ví dụ ngu ngốc so với quý ông mất quá nhiều thời gian. . .


Có một liên kết đến ngôn ngữ? Một tìm kiếm nhanh trên Github đã xuất hiện khá nhiều
Sp3000

Chắc chắn rồi. gema.sourceforge.net (BTW, dự án Gema đã được đăng ký 2003-10-27, trong khi GitHub được ra mắt 2008-04-10. Đó có thể là một lý do để không tìm thấy nó ở đó.)
manatwork 11/07/2015

Tôi tin rằng độ sâu đệ quy bằng với độ dài của chuỗi không khớp, bởi vì nó sẽ lặp lại nhiều lần cho đến khi các \^Hdao, khớp một ký tự tại một thời điểm ?.
isaacg 11/07/2015

15

C, 52 byte

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

Chúng tôi xác định một hàm flấy một con trỏ tới chuỗi làm đầu vào. Sau khi gọi hàm, con trỏ đó sẽ chứa một chuỗi đã sửa đổi.

Một bài kiểm tra đơn giản:

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

Các bản in trên:

Digital Trauma

1
Điều này thực sự thông minh. Một vài điều tôi nhận thấy: toàn cầu đã được khởi tạo về 0, vì vậy không cần phải khởi tạo jtrong forvòng lặp của bạn (tất nhiên sau đó là sử dụng một lần, nhưng tôi không thấy bất cứ điều gì về quy tắc đó :)). Bạn cũng có thể kết hợp bài tập với phần giảm: j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47 byte)
Cole Cameron


@undergroundmonorail dang, tôi chỉ kiểm tra lại xem tôi có bỏ sót không. Tôi vẫn chưa quen với môn đánh gôn nhưng tôi sẽ nhớ điều đó trong tương lai :). Cảm ơn bạn về thông tin!
Cole Cameron

1
@ColeCameron Điều đó có một sửa đổi và truy cập (UB) chưa được xử lý và không may gây ra EXC_BAD_ACCESS ngay lập tức trên trình biên dịch / máy của tôi.
BrainSteel

1
@Quentin Tôi đã thử điều đó, nhưng vì dấu phẩy s--, j+=3và ưu tiên toán tử, nó không hoạt động đúng.
BrainSteel 12/07/2015

14

Haskell, 47 byte

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

Xác định một hàm f :: String -> String. Làm thế nào nó hoạt động:

    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)

1
Tôi nghĩ bạn có thể lưu một byte bằng cách hoán đổi hai trường hợp hvà thực hiện h(x,_)=xcho trường hợp chuỗi rỗng.
Zgarb

12

CJam, 14 13 byte

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

Làm thế nào nó hoạt động

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

CẬP NHẬT: 1 byte được lưu nhờ vào jimmy23013

Dùng thử trực tuyến tại đây


2
Ngắn hơn 1 byte : W\ts.
jimmy23013

11

Võng mạc, 13 byte

Võng mạc

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

Hai dòng sẽ đi đến các tệp riêng của chúng nhưng bạn có thể chạy mã dưới dạng một tệp có -scờ.

Ở mỗi bước, chúng tôi xóa kết quả khớp đầu tiên .\^Htrong chuỗi. Chúng tôi lặp lại điều này (với công cụ +sửa đổi) cho đến khi không có xóa.


Chỉ là một sự tò mò: tại sao việc bắt giữ (.*), vì nó dường như chỉ được đặt lại không thay đổi?
manatwork 11/07/2015

1
@manatwork Cách này chúng tôi chỉ nắm bắt đầu tiên .\^Htrong một bước. Nếu không abc^H^H^Hsẽ dẫn đến ab^sau bước đầu tiên.
ngẫu nhiên

4
Xin lỗi vì chưa thực hiện giới hạn thay thế (có thể sẽ cho phép một cái gì đó như +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>


10

Perl, 20 16 15 byte

(Mã 14 ký tự + 1 ký tự tùy chọn dòng lệnh.)

s/.\^H//&&redo

Chạy mẫu:

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.

1
Lưu 4 ký tự:1while s/.\^H//
Kevin Reid

Ồ Thật tuyệt vời @KevinReid. Cảm ơn bạn.
manatwork 11/07/2015

1
Thêm một điều nữa:s/.\^H//&&redo
Dennis

Cảm ơn bạn, @Dennis. redobằng cách nào đó không đi vào bộ kỹ năng của tôi. Sẽ phải thay đổi điều đó.
manatwork 12/07/2015

2
Lưu ý rằng phiên bản của @ Dennis sẽ chỉ hoạt động (như dự định) nếu đó là câu lệnh duy nhất bên trong một vòng lặp hoặc một { }khối. (Lý do tại sao nó hoạt động perl -plà vì công -ptắc tự động bọc mã của bạn trong một whilevòng lặp.) Phiên bản của Kevin hoạt động trong bất kỳ cài đặt nào.
Ilmari Karonen

9

Julia, 58 42 41 byte

Đã lưu 16 byte nhờ thao tác và 1 nhờ Glen O!

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

Điều này tạo ra một hàm đệ quy chấp nhận một chuỗi và trả về một chuỗi.

Điều này thay thế một lần xuất hiện ^Htại một thời điểm bằng một chuỗi trống trong khi đầu vào chứa ^.

Ví dụ:

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

julia> f("pizza is alright^H^H^H^H^H^Hwesome")
"pizza is awesome"

Đây là lần đầu tiên tôi thấy Julia trong thế giới hoang dã. Đẹp!
Ogaday 9/2/2016

8

ĐĂNG KÝ, 10 byte

Sử dụng REGXY , một ngôn ngữ dựa trên regex thay thế. Thay thế bất kỳ ký tự nào theo sau ^ H không có gì. Dòng thứ hai sau đó thực thi chỉ là một con trỏ đến dòng trước đó, lặp lại sự thay thế cho đến khi nó không khớp.

/.\^H//
//

Điều này biên dịch và thực thi chính xác với trình thông dịch mẫu trong liên kết ở trên, nhưng giải pháp có lẽ hơi táo tợn vì nó dựa vào một giả định về sự mơ hồ của đặc tả ngôn ngữ. Thông số kỹ thuật nói rằng mã thông báo đầu tiên trên mỗi dòng (trước /) hoạt động như một nhãn, nhưng giả định là con trỏ nhãn null sẽ quay lại lệnh đầu tiên trong tệp có nhãn null (hay nói cách khác là rằng 'null' là nhãn hợp lệ). Một giải pháp ít táo tợn hơn sẽ là:

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

Số tiền lên tới 13 byte.


7

Python 3, 53 byte

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

Nhưng cá nhân tôi thích phiên bản wordier này tốt hơn:

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

Điều thú vị là

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

Thực sự hoạt động và cho đi 'Back', vì vậy tôi đã cố gắng lập bản đồ ^H -> [:-1]và bất kỳ char nào khác c -> 'c'sau đó eval, nhưng thật không may, bạn không thể có bất kỳ chuỗi nào sau đó mà không có a +, vì vậy điều này thất bại:

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

Heyy ... đó là khá gọn gàng.
Alex Van Liew

+=hoạt động trong vòng lặp
CalculatorFeline

@CatsAreFluffy Đó là o=o[:-1]+x, khôngo=o+x
Sp3000

Rất tiếc, đã bỏ lỡ điều đó. Có cái gì đó như o[:-2]=xcông việc?
Máy

@CatsAreFluffy Bạn không thể chỉ định chostr
Sp3000

7

Haskell, 52 47 byte

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

Ví dụ sử dụng:

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

Làm thế nào nó hoạt động:

                  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

6

Ruby, 27 24 20 byte

(Mã 19 ký tự + 1 ký tự tùy chọn dòng lệnh.)

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

Nhờ vào:

  • Ventero đã đề xuất sử dụng các biến toàn cục (-4 ký tự)

Chạy mẫu:

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.

+1 Tôi nghĩ tôi sẽ trả lời Ruby cho đến khi tôi thấy điều này - tôi khá chắc chắn rằng nó nhỏ như nó sẽ nhận được. Công dụng tuyệt vời của []!
daniero 11/07/2015

Ban đầu có một phiên bản khác: Phiên bản loop{$_[/.\^H/]=""}rescue""này đẹp hơn vì nó thể hiện sự lạnh lùng xử lý ngoại lệ của Ruby.
manatwork 11/07/2015

Haha, đó là một người tuyệt vời :)
daniero 11/07/2015

1
Muộn còn hơn không: $_=$`+$'while~/.\^H/trong 20 (thậm chí bạn có thể bỏ dấu ngã nếu bạn không quan tâm đến regexp literal in conditioncảnh báo).
Ventero

1
@manatwork: Về mặt kỹ thuật, nó xuất hiện trong tất cả các phiên bản ruby> = 1.9 (regex và chuỗi ký tự trong điều kiện không được dùng sau 1.8), tôi đoán rubyđơn giản là bạn vẫn mặc định 1.8, trong khi irbsử dụng ruby ​​2.1.5.
Ventero

4

Con trăn 2, 50

Có một chút kỳ lạ khi có một giây lambdatrong đó, nhưng dường như là Python tốt nhất cho đến nay.

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

3

Pyth - 19 byte

Giảm hoạt động thực sự, thực sự tốt với điều này nhưng nó chỉ thực hiện một char mỗi lần nên tôi đã phải sử dụng gần như nhiều ký tự như thuật toán thực tế để thay thế ^Hbằng ngắt dòng. Tìm kiếm một cách tốt hơn để làm điều đó.

u?+GHnHbPGjbcz"^H"k

Hãy thử trực tuyến tại đây .


3

TeaScript , 7 byte [Không cạnh tranh]

Không cạnh tranh như TeaScript đã được thực hiện sau khi thử thách này được đăng. Đây là tài liệu tham khảo.

xW/.\^H

Điều này sử dụng TeaScript 3 mới và thay thế đệ quy để loại bỏ các ký tự


1
Vì một số lý do, số này được tính là 8859 byte trên bảng xếp hạng vì liên kết ISO 8859 ...
ev3commander

regerence? xD
con mèo

2

K5, 64 byte

K không thực sự được thiết kế cho loại công việc này ...

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

2

golflua, 36 byte

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

Chạy mẫu:

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.

2

Javascript, 62 byte

Không phải là ngắn nhất, nhưng hoạt động tốt.

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

Điều này có lẽ có thể được rút ngắn rất nhiều!


1
Không phải là ngắn nhất và không hoạt động (cũng có thể thử bất kỳ trường hợp thử nghiệm nào).
Regrec

@ edc65 Cảm ơn vì tiền boa. Tôi đã thử một số thứ và họ đã làm việc. Đó là lý do tại sao tôi đăng bài như thế
Ismael Miguel

2

R, 54 52 byte

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

Ý tưởng cơ bản giống như câu trả lời Julia của tôi . Điều này tạo ra một hàm đệ quy chấp nhận một chuỗi và trả về một chuỗi. Nếu đầu vào bằng chính nó với một lần xuất hiện ^Hbị loại bỏ, hãy trả lại, nếu không hãy gọi lại hàm.

Bạn có thể thử trực tuyến !


2

ECMAScript 6, 57 byte

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

Đây có lẽ là golf, chỉ cần nghĩ ra một cách có thể không


2
Thế còn s=>{while(s!=(s=s.replace(/.\^H/,""));return s}?
LRN

Hoặc, nếu whilereturnquá dài, nó có thể được đệ quy:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
lrn

@lm bạn nên thêm tham số thứ hai "" để thay thế. Sau đó, bạn có câu trả lời của tôi :)
edc65

Thật. Và đối số chuỗi trống cần phải có, tôi phải sao chép phiên bản sai :(
lrn

~s.indexOf`^H`có thể trở thành/\^H/.test(s)
Không phải Charles

2

Java, 78 77 byte

String f(String a){while(!a.equals(a=a.replaceFirst(".\\^H","")));return a;}

1
Bạn có thể xóa khoảng trắng sau dấu phẩy để lưu một char.
Chương trìnhFOX

2

(Trực quan) FoxPro bất kỳ phiên bản 80 byte

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

Lặp lại dịch chuỗi thành trống bằng cách tìm ^ H và sao lưu một ký tự.


2

Julia, 41 39 byte

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

Những gì nó đang làm là sử dụng ^ H làm dấu phân cách, và sau đó xóa ký tự cuối cùng trên mỗi chuỗi sau đó nối chuỗi tiếp theo trước khi xóa lại ký tự cuối cùng. Không giống như câu trả lời khác của Julia, đây không phải là một hàm đệ quy.

Lưu ý: Tôi đã xóa tên hàm khỏi định nghĩa. Ban đầu, nó nói f(s)=đúng hơn là s->, và bạn đã sử dụng nó như f("AAA^HB^H^H")... nhưng tôi đang tiết kiệm hai byte bằng cách để nó là "ẩn danh" và sử dụng chính nó làm tên của nó. Bạn sử dụng nó như thế này:

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

(bạn cũng có thể gán một biến cho nó là f=s->foldl((t,v)->chop(t)v,split(s,"^H")), sau đó f("AAA^HB^H^H")sẽ hoạt động)


2

rs, 8 byte

Về mặt kỹ thuật, điều này không được tính, vì nó phụ thuộc vào một tính năng tôi đã thêm sau khi câu hỏi này được đăng. Tuy nhiên, tôi nghĩ nó khá gọn gàng.

+?1.\^H/

Bản demo và trường hợp thử nghiệm trực tiếp .


Là tính năng mới thay thế giới hạn?
xnor

@xnor Có: cái ?1.
kirbyfan64sos

@Optimizer Tại sao? Dù sao bạn cũng thua Gema. : O
kirbyfan64sos

Yeah :(. Saw gema sau khi đăng bình luận
Trình tối ưu hóa

1

Python 2, 74 + 2 = 76 byte

Tôi đã thử một vài cách tiếp cận cho đến nay, đây là cách tốt nhất mà tôi có thể đưa ra cho đến nay.

n=input();o='';c=0
for l in n:d=l=='^';o=[o+l*(1-c),o[:-1]][d];c=d
print o

4
2 byte thêm đó đến từ đâu?
xnor

Đầu vào @xnor phải được bao quanh bởi dấu ngoặc kép để làm việc này. Tôi quên để nó trong bài viết.
Kade

1
Tôi nghĩ rằng quy ước thông thường là cho phép các đối số chuỗi được trích dẫn miễn phí, nhưng tôi không hoàn toàn chắc chắn.
xnor

1

Quai bị, 84 byte

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

Điều này có thể được thực hiện ngắn hơn dưới dạng một hàm (1 byte tôi có thể lưu trong thử nghiệm nhanh) nhưng tôi giống như khía cạnh một lớp lót ... :-)

Niềng răng đến từ hương vị Cache của Intersystems, đó là điều tôi thành thạo nhất.


1

Java - 123 byte

Cá nhân tôi thích g---1phần tốt nhất.

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

mở rộng (một chút):

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

1

Mẻ - 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!%

Dòng đầu tiên là một cách lưu một vài byte trong thời gian dài @echo off&setLocal enableDelayedExpansion(tắt tiếng vang và cho phép mở rộng các biến bị trì hoãn, trong trường hợp bạn đang tự hỏi). Tôi đã giải thích nó trong Mẹo chơi gôn trong Batch .

Dòng thứ hai là một mẹo nhỏ gọn gàng để lưu ký tự điều khiển backspace vào một biến. Nó khá là hack, và tôi không thể giả vờ lấy tín dụng cho nó. Nó được giải thích ở đây . Về cơ bản sử dụng lệnh prompt để tạo một ký tự backspace và bắt nó trong một biến - trong trường hợp này !D!.

Dòng cuối cùng sau đó thực hiện thao tác chuỗi đơn giản của - thay thế ^Hbằng !D!<SPACE>!D!.

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

Thật không may, nó phá vỡ với các trường hợp như "AAA^HB^H^H"- nơi nó nên sản xuất "A", thay vào đó nó sản xuất "A"B. Mà có phần khó hiểu. Tôi sẽ phải xem xét cách thao tác chuỗi Batch hoạt động ở độ sâu hơn.

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

Cảm ơn một số người hữu ích ở đây - bây giờ tôi nhận ra rằng tôi chỉ lưu ký tự backspace (0x08), và do đó chỉ ghi đè lên các ký tự. Bây giờ nó hoạt động với các ví dụ như sau:

C:\>bsp.bat "AAA^HB^H^H"
"A"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.