Backhanded ^ H ^ H ^ H ^ H ^ H ^ Hspace

47

W niektórych terminalach naciśnięcie klawisza Backspace generuje kod sterujący, ^Haby usunąć poprzedni znak. To dało początek ponuremu idiomowi, w którym udaje się wprowadzać zmiany w celu uzyskania efektu komediowego :

Bądź miły dla tego głupca ^ H ^ H ^ H ^ Hgentleman, który odwiedza z siedziby głównej firmy.

Biorąc pod uwagę ciąg z jednym lub więcej ^H, wypisuje wynik cofania na każdym z nich ^H. Dane wejściowe będą używać tylko znaków drukowalnych (ASCII 32-126) i ^będą wyświetlane tylko jako ^H. Backspace nigdy nie będzie się pojawiał na pustym tekście.

Nie można zakładać, że środowisko wyjściowe obsługuje kody sterujące, w szczególności kod cofania \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

Tabela liderów

Oto tabela liderów według języków, dzięki uprzejmości Martina Büttnera .

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

xnor
źródło
4
Jest AAA^HB^H^Hważny?
Nathan Merrill,
@NathanMerrill Tak, i to powoduje A.
xnor
3
Podejrzewam, że siatkówka dobrze by się tu spisała.
Claudiu,
1
@Fatalize: „Backspace nigdy nie będzie się pojawiał na pustym tekście”.
Maltysen,
16
@Maria Tidal Tug wraca, by mnie prześladować
Digital Trauma

Odpowiedzi:

69

GNU sed, 11 bajtów

:;s/.^H//;t

Wyjście testowe:

$ 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
$ 
Cyfrowa trauma
źródło
5
Zobacz, kto się pojawił! To Maria Tidal Tug ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ HDigital Trauma!
Alex A.,
@AlexA. Czy brakuje mi żartu?
user253751
@immibis: Zobacz komentarz Digital Trauma do pytania.
Alex A.,
sed -r ':;s/(^|.)\^H//;t'- działa to kosztem dodatkowych 6 bajtów
aragaer
@aragaer Dlaczego to konieczne? PO mówi: „ Backspace nigdy nie będzie się pojawiał na pustym tekście ”. Myślę, że ^Hpoczątkiem łańcucha jest backspace na pustym tekście.
Cyfrowa trauma
19

Pyth, 11 bajtów

.U+PbZcz"^H

Demonstracja.

.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
źródło
17

Gema, 6 bajtów

?#\^H=

Przykładowy przebieg:

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

CW, ponieważ przykład głupiec kontra dżentelmen trwa zbyt długo. (Zabity po dniu. Może usterka w tłumaczu? Wszystkie inne przykłady są przetwarzane w ułamkach sekund.) Poziom rekurencji nie wydaje się mieć wpływu na wzór rekurencyjny Gemy, ale ilość niepasującego tekstu wydłuża wykładniczo czas przetwarzania .

manatwork
źródło
Czy jest link do języka? Szybkie wyszukiwanie na Githubie pojawiło się całkiem sporo
Sp3000
Pewnie. gema.sourceforge.net (BTW, projekt Gema został zarejestrowany 27.10.2003, a GitHub został uruchomiony 2008-04-10. Może to być powód, aby go nie znaleźć.)
manatwork
Wierzę, że głębokość rekurencji jest równa długości niepasującego ciągu, ponieważ będzie powtarzał się wielokrotnie aż do \^Hmaczug, dopasowując jeden znak na raz do ?.
isaacg,
15

C, 52 bajty

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

Definiujemy funkcję, fktóra pobiera wskaźnik do łańcucha jako dane wejściowe. Po wywołaniu funkcji wskaźnik ten będzie zawierał zmodyfikowany ciąg.

Prosty test:

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

Powyższe wydruki:

Digital Trauma
BrainSteel
źródło
1
To było naprawdę sprytne. Zauważyłem kilka rzeczy: globały są już inicjowane na zero, więc nie musisz inicjować jw swojej forpętli (oczywiście wtedy jest to jednorazowe użycie, ale nie widzę nic w tym w regułach :)). Możesz także połączyć to zadanie ze zmniejszeniem: j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47 bajtów)
Cole Cameron,
@ColeCameron przegapiłeś to
undergroundmonorail
@undergroundmonorail dang, tylko dwukrotnie sprawdziłem, czy tego nie zauważyłem. Nadal jestem nowy w golfa, ale zapamiętam to na przyszłość :). Dzięki za informację!
Cole Cameron,
1
@ColeCameron To ma niesekwencjonowaną modyfikację i dostęp (UB), i niestety powoduje natychmiastowe EXC_BAD_ACCESS na moim kompilatorze / maszynie.
BrainSteel,
1
@Quentin Próbowałem tego, ale ze względu na przecinek s--, j+=3i pierwszeństwo operatora nie działa poprawnie.
BrainSteel
14

Haskell, 47 bajtów

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

Definiuje funkcję f :: String -> String. Jak to działa:

    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
źródło
1
Myślę, że możesz zapisać bajt, zamieniając dwa przypadki hi wykonując h(x,_)=xdla pustego ciągu znaków.
Zgarb
12

CJam, 14 13 bajtów

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

Jak to działa

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

AKTUALIZACJA: 1 bajt zapisany dzięki jimmy23013

Wypróbuj online tutaj

Optymalizator
źródło
2
1 bajt krócej: W\ts.
jimmy23013,
11

Siatkówka, 13 bajtów

Siatkówka oka

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

Dwie linie powinny przejść do własnych plików, ale możesz uruchomić kod jako jeden plik z -sflagą.

Na każdym kroku usuwamy pierwsze dopasowanie dla .\^Hciągu. Powtarzamy to (z +modyfikatorem), dopóki nie nastąpi usunięcie.

randomra
źródło
Ciekawostka: po co przechwytywanie (.*), jak się wydaje, po prostu odsunięte bez zmian?
manatwork
1
@manatwork W ten sposób rejestrujemy pierwszy .\^Hw jednym kroku. W przeciwnym razie abc^H^H^Hspowodowałoby to ab^po pierwszym kroku.
randomra
4
Przepraszamy za niewdrożenie limitu wymiany (co prawdopodobnie pozwoliłoby na coś takiego +1`.\^H). ;)
Martin Ender
10

JavaScript ( ES6 ), 39 bajtów

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
źródło
10

Perl, 20 16 15 bajtów

(Kod 14 znaków + opcja wiersza poleceń 1 znak).

s/.\^H//&&redo

Przykładowy przebieg:

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.
człowiek w pracy
źródło
1
Uratuj 4 znaki:1while s/.\^H//
Kevin Reid,
Łał! To wspaniale @KevinReid. Dziękuję Ci.
manatwork
1
Jeszcze jedno:s/.\^H//&&redo
Dennis,
Dziękuję @Dennis. redojakoś nie trafił do mojego zestawu umiejętności. Będę musiał to zmienić.
manatwork
2
Zauważ, że wersja @ Dennisa będzie działać (zgodnie z zamierzeniami) tylko wtedy, gdy będzie to jedyna instrukcja wewnątrz pętli lub { }bloku. (Powodem, dla którego działa, perl -pjest to, że -pprzełącznik automatycznie otacza kod w whilepętli.) Wersja Kevina działa w każdym ustawieniu.
Ilmari Karonen,
9

Julia, 58 42 41 bajtów

Zaoszczędzono 16 bajtów dzięki manatwork i 1 dzięki Glen O!

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

Tworzy to funkcję rekurencyjną, która akceptuje ciąg i zwraca ciąg.

Zastępuje to jedno wystąpienie ^H naraz pustym łańcuchem, gdy dane wejściowe zawierają ^.

Przykłady:

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.
źródło
Po raz pierwszy widzę Julię na wolności. Miły!
Ogaday
8

REGXY, 10 bajtów

Używa REGXY , języka opartego na podstawieniu wyrażenia regularnego. Zastępuje dowolny znak, po którym następuje ^ H, niczym. Następnie wykonywana jest druga linia, która jest tylko wskaźnikiem do poprzedniej linii, powtarzając podstawienie, dopóki nie dopasuje się.

/.\^H//
//

To kompiluje się i wykonuje poprawnie z przykładowym tłumaczem w powyższym linku, ale rozwiązanie jest być może nieco bezczelne, ponieważ opiera się na założeniu niejasności specyfikacji języka. Specyfikacja określa, że ​​pierwszy token w każdym wierszu (przed /) działa jak etykieta, ale zakłada się, że pusty wskaźnik-wskaźnik wskaże z powrotem pierwsze polecenie w pliku z pustą etykietą (lub innymi słowy, że „null” jest prawidłową etykietą). Mniej bezczelnym rozwiązaniem byłoby:

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

Co odpowiada 13 bajtom.

Jarmex
źródło
7

Python 3, 53 bajty

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

Ale osobiście bardziej podoba mi się ta bardziej sformułowana wersja:

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

Ciekawe jest to, że

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

faktycznie działa i daje 'Back', więc starałem się map ^H -> [:-1]i innych char c -> 'c'wtedy eval, ale niestety nie można mieć żadnych ciągów potem bez +, więc to się nie powiedzie:

'B''a''c''k''h''a''n''d''e''d'[:-1][:-1][:-1][:-1][:-1][:-1]'s''p''a''c''e''s'
Sp3000
źródło
Hej ... to całkiem miłe.
Alex Van Liew
+=działa w pętli
CalculatorFeline
@CatsAreFluffy It's o=o[:-1]+xnot noto=o+x
Sp3000 11.04.16
Ups, przegapiłem to. Czy coś takiego o[:-2]=xdziała?
CalculatorFeline
@CatsAreFluffy Nie możesz przypisać dostr
Sp3000 11.04.16
7

Haskell, 52 47 bajtów

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

Przykład użycia:

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

Jak to działa:

                  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
źródło
6

Ruby, 27 24 20 bajtów

(Kod 19 znaków + opcja wiersza poleceń 1 znak.)

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

Dzięki:

  • Ventero za sugerowanie użycia zmiennych globalnych (-4 znaki)

Przykładowy przebieg:

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.
człowiek w pracy
źródło
+1 Myślałem, że zrobię odpowiedź Rubiego, dopóki jej nie zobaczę - jestem prawie pewien, że będzie tak mała, jak się da. Świetne wykorzystanie []!
daniero
Na początku pojawiła się inna wersja: loop{$_[/.\^H/]=""}rescue""ta jest ładniejsza, ponieważ pokazuje wyjątkowość Ruby dotyczącą obsługi.
manatwork
Haha, to wspaniale :)
daniero
1
Lepiej późno niż wcale: $_=$`+$'while~/.\^H/za 20 (możesz nawet upuścić tyldę, jeśli nie obchodzi cię regexp literal in conditionostrzeżenie).
Ventero,
1
@manatwork: Technicznie pojawia się we wszystkich wersjach Ruby> = 1.9 (literały regularne i literałowe w warunkach były przestarzałe po 1.8), domyślam się, że rubypo prostu nadal domyślnie 1.8, podczas gdy irbużywa Ruby 2.1.5.
Ventero,
4

Python 2, 50

To trochę dziwne, mając sekundę lambda, ale wydaje się być najlepszym jak dotąd Pythonem.

lambda s:reduce(lambda a,b:a[:-1]+b,s.split('^H'))
feersum
źródło
3

Pyth - 19 bajtów

Zmniejszenie działa naprawdę, bardzo dobrze z tym, ale robi tylko jeden znak na raz, więc musiałem wydać prawie tyle znaków, ile rzeczywisty algo, aby zastąpić ^Hłamanie linii. Szukasz lepszego sposobu na zrobienie tego.

u?+GHnHbPGjbcz"^H"k

Wypróbuj online tutaj .

Maltysen
źródło
3

TeaScript , 7 bajtów [nie konkuruje]

Nie konkuruje, ponieważ TeaScript powstał po opublikowaniu tego wyzwania. To jest tutaj jako odniesienie.

xW/.\^H

Wykorzystuje nowy TeaScript 3 i rekurencyjne zamienia, aby usunąć znaki

Downgoat
źródło
1
Z jakiegoś powodu liczy się to jako 8859 bajtów na tablicy wyników ze względu na link ISO 8859 ...
ev3commander
regerence? xD
kot
2

K5, 64 bajty

K tak naprawdę nie jest przeznaczony do tego rodzaju pracy ...

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

golflua, 36 bajtów

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

Przykładowy przebieg:

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.
człowiek w pracy
źródło
2

JavaScript, 62 bajty

Nie najkrótszy, ale działa dobrze.

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

Prawdopodobnie można to znacznie skrócić!

Ismael Miguel
źródło
1
Nie najkrótszy i ani nie działa (wypróbuj jeden z przypadków testowych). Wyrażenie regularne nie powinno być globalne (usuń / g)
edc65
@ edc65 Dzięki za wskazówkę. Próbowałem kilku rzeczy i zadziałały. Właśnie dlatego tak pisałem
Ismael Miguel
2

R, 54 52 bajtów

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

Ten sam podstawowy pomysł, co moja odpowiedź Julii . Tworzy to funkcję rekurencyjną, która akceptuje ciąg i zwraca ciąg. Jeśli dane wejściowe są sobie równe z jednym wystąpieniem^H usuniętego, zwróć je, w przeciwnym razie ponownie wywołaj funkcję.

Możesz spróbować online !

Alex A.
źródło
2

ECMAScript 6, 57 bajtów

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

Jest to prawdopodobnie gra w golfa, po prostu wymyślę sposób, który prawdopodobnie nie

Downgoat
źródło
2
Jak o s=>{while(s!=(s=s.replace(/.\^H/,""));return s}?
lrn
Lub, jeśli whilei returnsą zbyt długie, może być rekurencyjne:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
lrn
@ lm należy dodać drugi parametr „” do zamiany. Masz moją odpowiedź :)
edc65,
Prawdziwe. I musi być tam pusty argument ciągu, musiałem skopiować niewłaściwą wersję :(
lrn
~s.indexOf`^H`może stać się/\^H/.test(s)
Nie to, że Karol
2

Java, 78 77 bajtów

String f(String a){while(!a.equals(a=a.replaceFirst(".\\^H","")));return a;}
Olivia Trewin
źródło
1
Możesz usunąć spację po przecinku, aby zapisać jeden znak.
ProgramFOX,
2

(Wizualnie) FoxPro dowolna wersja 80 bajtów

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

Powtarzanie tłumaczenia ciągu znaków na pusty przez znalezienie ^ H i utworzenie kopii zapasowej jednego znaku.

Chris
źródło
2

Julia, 41 39 bajtów

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

Wykorzystuje ^ H jako separator, a następnie usuwa ostatni znak z każdego łańcucha, a następnie konkatenuje następny łańcuch przed usunięciem ostatniego znaku. W przeciwieństwie do innych odpowiedzi Julii, nie jest to funkcja rekurencyjna.

Uwaga: usunąłem nazwę funkcji z definicji. Początkowo było to napisane f(s)=zamiast s->, a ty użyłeś go jako f("AAA^HB^H^H")... ale oszczędzam dwa bajty, pozwalając, aby był "anonimowy" i używał siebie jako nazwy. Używasz go w ten sposób:

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

(możesz także przypisać do niego zmienną, ponieważ f=s->foldl((t,v)->chop(t)v,split(s,"^H"))wtedy f("AAA^HB^H^H")będzie działać)

Glen O
źródło
2

rs, 8 bajtów

Technicznie nie ma to znaczenia, ponieważ zależy to od funkcji dodanej po opublikowaniu tego pytania. Myślę jednak, że jest całkiem fajnie.

+?1.\^H/

Prezentacje na żywo i przypadki testowe .

kirbyfan64sos
źródło
Czy nowa funkcja zastępuje limit?
xnor
@xnor Tak: ?1.
kirbyfan64sos
@Optimizer Dlaczego? W każdym razie przegrywasz z Gema. : O
kirbyfan64sos
Tak :(. Zobaczyłem gema po opublikowaniu komentarza
Optimizer
1

Python 2, 74 + 2 = 76 bajtów

Do tej pory wypróbowałem kilka podejść, jest to najlepsze, jakie udało mi się do tej pory wymyślić.

n=input();o='';c=0
for l in n:d=l=='^';o=[o+l*(1-c),o[:-1]][d];c=d
print o
Kade
źródło
4
Skąd pochodzą te 2 dodatkowe bajty?
xnor
Wejście @xnor musi być otoczone cudzysłowami, aby to zadziałało. Zapomniałem umieścić tego w poście.
Kade,
1
Myślę, że zwykłą konwencją było zezwolenie na bezpłatne przyjmowanie argumentów łańcuchowych w cudzysłowach, ale nie jestem do końca pewien.
xnor
1

Świnka, 84 bajtów

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

To może być prawdopodobnie krótsze jako funkcja (1 bajt, który udało mi się zapisać w szybkich testach), ale trochę podoba mi się aspekt jednowierszowy ... :-)

Aparat ortodontyczny pochodzi ze smaku Mumps Intersystems Cache, w którym jestem najbardziej zaznajomiony.

zmerch
źródło
1

Java - 123 bajty

Osobiście najbardziej podoba mi się ta g---1część.

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

rozwinięty (nieznacznie):

  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;
  }
Stretch Maniac
źródło
1

Partia - 138 bajtów

@!! 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!%

Pierwszy wiersz to sposób na zaoszczędzenie kilku bajtów na dłuższą metę @echo off&setLocal enableDelayedExpansion(która wyłącza echo i umożliwia opóźnione rozszerzanie zmiennych, jeśli się zastanawiasz). Wyjaśniłem to w Poradach do gry w golfa w partii .

Druga linia to fajna sztuczka polegająca na zapisaniu znaku kontrolnego backspace w zmiennej. To dość zuchwałe i nie mogę udawać, że się za to uznam. To jest trochę wyjaśnione tutaj . Zasadniczo używa polecenia zachęty do wygenerowania znaku cofania i przechwytuje go w zmiennej - w tym przypadku !D!.

Ostatni wiersz następnie wykonuje prostą manipulację ciąg - wymienić ^Hz !D!<SPACE>!D!.

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

Niestety łamie się z przypadkami takimi jak "AAA^HB^H^H"- tam, gdzie powinien produkować "A", zamiast tego produkuje "A"B. Co jest nieco mylące. Będę musiał przyjrzeć się, jak manipulowanie ciągiem wsadowym działa bardziej szczegółowo.

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

Dzięki kilku pomocnym osobom tutaj - teraz zdaję sobie sprawę, że zapisywałem tylko znak backspace (0x08), a więc tylko nadpisywałem postacie. Działa teraz z następującymi przykładami:

C:\>bsp.bat "AAA^HB^H^H"
"A"
nieprzyzwoity
źródło