Rückhand ^ H ^ H ^ H ^ H ^ H ^ Hspaces

47

Bei einigen Terminals wird durch Drücken der Rücktaste der Steuercode ^Hzum Löschen des vorherigen Zeichens generiert . Dies führte zu einer raffinierten Redewendung, in der Änderungen für einen komödiantischen Effekt vorgetäuscht werden :

Sei nett zu diesem Idioten. Er ist zu Besuch vom Hauptquartier des Unternehmens.

Bei einer Zeichenfolge mit einer oder mehreren Zeichenfolgen wird ^Hdas Ergebnis des Zurücksetzens für jede Zeichenfolge ausgegeben ^H. Die Eingabe verwendet nur druckbare Zeichen (ASCII 32-126) und ^wird nur als angezeigt ^H. Bei leerem Text treten niemals Leerzeichen auf.

Sie können nicht davon ausgehen, dass die Ausgabeumgebung Steuercodes unterstützt, insbesondere den Backspace-Code \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

Bestenliste

Hier ist eine sprachspezifische Rangliste mit freundlicher Genehmigung von Martin Büttner .

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

xnor
quelle
4
Ist AAA^HB^H^Hgültig?
Nathan Merrill
@ NathanMerrill Ja, und es ergibt sich A.
Xnor
3
Ich vermute, Netzhaut würde hier gut tun.
Claudiu
1
@Fatalize: "Backspaces werden niemals bei leerem Text auftreten."
Maltysen
16
@ Maria Tidal Tug kommt zurück, um mich zu verfolgen
Digital Trauma

Antworten:

69

GNU sed, 11 Bytes

:;s/.^H//;t

Testausgang:

$ 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
$ 
Digitales Trauma
quelle
5
Guck mal, wer aufgetaucht ist! Es ist Maria Gezeitenschlepper ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ HDigitales Trauma!
Alex A.
@AlexA. Vermisse ich einen Scherz?
user253751
@immibis: Siehe den Kommentar von Digital Trauma zu dieser Frage.
Alex A.
sed -r ':;s/(^|.)\^H//;t'- Dies funktioniert auf Kosten von zusätzlichen 6 Bytes
Aragaer
@aragaer Warum ist das notwendig? Das OP sagt " Backspaces werden niemals bei leerem Text auftreten ". Ich denke, ^Hder Anfang der Zeichenfolge ist ein Backspace für leeren Text.
Digital Trauma
19

Pyth, 11 Bytes

.U+PbZcz"^H

Demonstration.

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

Gema, 6 Bytes

?#\^H=

Probelauf:

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

CW, weil das Beispiel Dummkopf gegen Gentleman viel zu lange dauert. (Nach einem Tag erledigt. Vielleicht ein Fehler im Interpreter? Alle anderen Beispiele hier werden in Bruchteilen von Sekunden verarbeitet.) Gemas rekursives Muster scheint nicht von der Rekursionsstufe betroffen zu sein, aber die Menge an nicht übereinstimmendem Text erhöht die Verarbeitungszeit exponentiell .

Handarbeit
quelle
Gibt es einen Link zur Sprache? Eine schnelle Suche nach Github ergab einige
Sp3000
Sicher. gema.sourceforge.net ( Übrigens , das Gema-Projekt wurde am 27.10.2003 registriert, während GitHub am 10.04.2008 gestartet wurde. Das könnte ein Grund sein, es dort nicht zu finden.)
manatwork
Ich glaube, die Rekursionstiefe entspricht in etwa der Länge der nicht übereinstimmenden Zeichenfolge, da sie bis zu den Maches immer wieder \^Hwiederholt wird und jeweils ein Zeichen mit dem übereinstimmt ?.
Isaacg
15

C, 52 Bytes

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

Wir definieren eine Funktion f, die als Eingabe einen Zeiger auf den String nimmt. Nach dem Funktionsaufruf enthält dieser Zeiger eine geänderte Zeichenfolge.

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

Die obigen Drucke:

Digital Trauma
BrainSteel
quelle
1
Das war wirklich klug. Ein paar Dinge, die mir aufgefallen sind: Globals sind bereits auf Null initialisiert, so dass Sie jin Ihrer forSchleife nicht initialisieren müssen (natürlich ist es dann einmalig, aber ich sehe nichts darüber in den Regeln :)). Sie können die Zuweisung auch mit der Dekrementierung kombinieren: j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47 Bytes)
Cole Cameron
@ColeCameron du hast das verpasst
undergroundmonorail
@undergroundmonorail verdammt, ich habe nur zweimal nachgesehen, ob ich das verpasst habe. Ich bin noch neu im Code-Golf, aber das werde ich mir für die Zukunft merken :). Danke für die Information!
Cole Cameron
1
@ColeCameron Das hat eine ungeordnete Änderung und Zugriff (UB) und verursacht leider einen sofortigen EXC_BAD_ACCESS auf meinem Compiler / Computer.
BrainSteel
1
@Quentin Ich habe das versucht, aber aufgrund des Kommas s--, j+=3und der Vorrangstellung der Operatoren funktioniert es nicht richtig.
BrainSteel,
14

Haskell, 47 Bytes

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

Definiert eine Funktion f :: String -> String. Wie es funktioniert:

    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
quelle
1
Ich denke, Sie können ein Byte speichern, indem Sie die beiden Fälle von hund h(x,_)=xfür die leere Zeichenfolge Fall tauschen .
Zgarb,
12

CJam, 14 13 Bytes

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

Wie es funktioniert

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

UPDATE: 1 Byte gespeichert dank jimmy23013

Probieren Sie es hier online aus

Optimierer
quelle
2
1 Byte kürzer: W\ts.
Jimmy23013
11

Retina, 13 Bytes

Retina

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

Die zwei Zeilen sollten in ihre eigenen Dateien gehen, aber Sie können den Code als eine Datei mit dem -sFlag ausführen .

Bei jedem Schritt löschen wir die erste Übereinstimmung für .\^Hin der Zeichenfolge. Wir wiederholen dies (mit dem +Modifikator), bis keine Löschung mehr erfolgt.

randomra
quelle
Nur eine Kuriosität: Warum wird das Capturen von (.*), wie es scheint, nur unverändert zurückgesetzt?
Handarbeit
1
@manatwork Auf diese Weise erfassen wir nur den ersten .\^Hin einem Schritt. Sonst abc^H^H^Hwürde sich ab^nach dem ersten Schritt ergeben.
Randomra
4
Entschuldigung, dass Sie noch kein Ersatzlimit implementiert haben (was wahrscheinlich so etwas erlauben würde +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
quelle
10

Perl, 20 16 15 Bytes

(14 Zeichen Code + 1 Zeichen Befehlszeilenoption.)

s/.\^H//&&redo

Probelauf:

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.
Mann bei der Arbeit
quelle
1
Speichern Sie 4 Zeichen:1while s/.\^H//
Kevin Reid
Beeindruckend! Das ist großartig @ KevinReid. Danke.
manatwork
1
Eine weitere:s/.\^H//&&redo
Dennis
Vielen Dank, @Dennis. redoirgendwie nicht in meine Fähigkeiten eingedrungen. Muss das ändern.
Manatwork
2
Beachten Sie, dass die Version von @ Dennis nur funktioniert (wie beabsichtigt), wenn dies die einzige Anweisung innerhalb einer Schleife oder eines { }Blocks ist. (Der Grund, warum es funktioniert, perl -pist, dass der -pSchalter Ihren Code automatisch in eine whileSchleife einhüllt .) Kevins Version funktioniert in jeder Einstellung.
Ilmari Karonen
9

Julia, 58 42 41 Bytes

Dank Manatwork 16 Byte und dank Glen O 1 Byte eingespart!

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

Dadurch wird eine rekursive Funktion erstellt, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt.

Dies ersetzt jeweils ein Vorkommen ^Hdurch eine leere Zeichenfolge, während die Eingabe enthält ^.

Beispiele:

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.
quelle
Dies ist das erste Mal, dass ich Julia in freier Wildbahn gesehen habe. Nett!
Ogaday
8

REGXY, 10 Bytes

Verwendet REGXY , eine auf Regex-Substitution basierende Sprache. Ersetzt ein beliebiges Zeichen gefolgt von ^ H durch nichts. Dann wird die zweite Zeile ausgeführt, die nur ein Zeiger auf die vorherige Zeile ist, und die Ersetzung wiederholt, bis sie nicht mehr übereinstimmt.

/.\^H//
//

Dies wird mit dem Beispiel-Interpreter im obigen Link korrekt kompiliert und ausgeführt, aber die Lösung ist möglicherweise etwas frech, da sie von einer Annahme in der Unbestimmtheit der Sprachspezifikation abhängt. Die Spezifikation gibt an, dass das erste Token in jeder Zeile (vor dem /) als Beschriftung fungiert. Es wird jedoch davon ausgegangen, dass ein Null-Beschriftungszeiger auf den ersten Befehl in der Datei mit einer Null-Beschriftung verweist (oder mit anderen Worten, das 'null' ist ein gültiges Etikett). Eine weniger freche Lösung wäre:

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

Das sind 13 Bytes.

Jarmex
quelle
7

Python 3, 53 Bytes

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

Aber persönlich gefällt mir diese wortreichere Version besser:

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

Das Interessante ist das

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

tatsächlich funktioniert und gibt 'Back', so dass ich zu kartieren versucht ^H -> [:-1]und andere Zeichen c -> 'c'dann eval, aber leider kann man keine Saiten hat danach ohne +, so dass dies fehlschlägt:

'B''a''c''k''h''a''n''d''e''d'[:-1][:-1][:-1][:-1][:-1][:-1]'s''p''a''c''e''s'
Sp3000
quelle
Heyy ... das ist ziemlich ordentlich.
Alex Van Liew
+=arbeitet in der Schleife
CalculatorFeline
@CatsAreFluffy Es ist o=o[:-1]+x, nichto=o+x
Sp3000
Hoppla, habe das verpasst. Arbeitet etwas wie o[:-2]=x?
CalculatorFeline
@CatsAreFluffy Sie können nicht zuweisenstr
Sp3000
7

Haskell, 52 47 Bytes

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

Anwendungsbeispiel:

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

Wie es funktioniert:

                  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
quelle
6

Ruby, 27 24 20 Bytes

(19 Zeichen Code + 1 Zeichen Befehlszeilenoption.)

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

Dank an:

  • Ventero für den Vorschlag, die globalen Variablen (-4 Zeichen) zu verwenden

Probelauf:

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.
Mann bei der Arbeit
quelle
+1 Ich dachte, ich würde eine Ruby-Antwort machen, bis ich das sehe - ich bin mir ziemlich sicher, dass das so klein ist, wie es nur geht. Großartige Nutzung von []!
Daniero
Am Anfang gab es eine andere Version: loop{$_[/.\^H/]=""}rescue""Diese ist schöner, da sie Rubys Ausnahmebehandlungskühle demonstriert.
manatwork
Haha, das ist großartig :)
daniero
1
Besser spät als nie: $_=$`+$'while~/.\^H/für 20 (Sie können die Tilde sogar fallen lassen, wenn Sie sich nicht für die regexp literal in conditionWarnung interessieren ).
Ventero
1
@manatwork: Technisch erscheint es in allen Ruby-Versionen> = 1.9 (Regex- und String-Literale in Bedingungen wurden nach 1.8 veraltet), ich vermute, Sie haben rubyeinfach noch die Standardeinstellungen 1.8, während irbRuby 2.1.5 verwendet wird.
Ventero
4

Python 2, 50

Es ist ein bisschen seltsam, eine Sekunde drin zu haben lambda, aber es scheint der beste Python zu sein, den es bisher gibt.

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

Pyth - 19 Bytes

Reduce funktioniert sehr, sehr gut damit, aber es wird immer nur ein Zeichen ^Hangezeigt. Ich musste also fast so viele Zeichen wie das eigentliche Algo ausgeben, um ein Ersetzen durch einen Zeilenumbruch zu erreichen. Suche nach einem besseren Weg, das zu tun.

u?+GHnHbPGjbcz"^H"k

Probieren Sie es hier online aus .

Maltysen
quelle
3

TeaScript , 7 Bytes [Nicht konkurrierend]

Nachdem diese Herausforderung veröffentlicht wurde, wurde kein Wettbewerb als TeaScript durchgeführt. Dies ist hier als Referenz.

xW/.\^H

Dies verwendet das neue TeaScript 3 und rekursive Ersetzungen, um die Zeichen zu entfernen

Downgoat
quelle
1
Aus irgendeinem Grund zählt dies aufgrund der ISO 8859-Verknüpfung als 8859 Byte auf der Bestenliste ...
ev3commander
regerence? xD
Katze
2

K5, 64 Bytes

K ist nicht wirklich für diese Art von Arbeit konzipiert ...

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

Golflua, 36 Bytes

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

Probelauf:

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.
Mann bei der Arbeit
quelle
2

Javascript, 62 Bytes

Nicht die kürzeste, aber funktioniert gut.

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

Dies kann wahrscheinlich viel verkürzt werden!

Ismael Miguel
quelle
1
Nicht die kürzeste und funktioniert auch nicht (probieren Sie einen der Testfälle aus). Der reguläre Ausdruck sollte nicht global sein (remove / g)
edc65
@ edc65 Danke für den Tipp. Ich habe einige Dinge ausprobiert und sie haben funktioniert. Deshalb habe ich so gepostet
Ismael Miguel
2

R, 54 52 Bytes

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

Gleiche Grundidee wie meine Julia-Antwort . Dadurch wird eine rekursive Funktion erstellt, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Wenn die Eingabe mit einem Vorkommen von gleich ist^H entfernten , geben Sie sie zurück, andernfalls rufen Sie die Funktion erneut auf.

Sie können es online ausprobieren !

Alex A.
quelle
2

ECMAScript 6, 57 Bytes

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

Das ist wahrscheinlich golfen, muss mir nur einen Weg überlegen, wahrscheinlich nicht

Downgoat
quelle
2
Wie wäre es s=>{while(s!=(s=s.replace(/.\^H/,""));return s}?
lrn
Oder, wenn whileund returnsind zu lang, könnte es rekursiv sein:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
lrn
@lm Sie sollten den zweiten Parameter "" zum Ersetzen hinzufügen. Dann hast du meine Antwort :)
edc65
Wahr. Und das leere Argument muss da sein, ich muss die falsche Version kopiert haben :(
lrn
~s.indexOf`^H`werden kann/\^H/.test(s)
Nicht dass Charles
2

Java, 78 77 Bytes

String f(String a){while(!a.equals(a=a.replaceFirst(".\\^H","")));return a;}
Olivia Trewin
quelle
1
Sie können das Leerzeichen nach dem Komma entfernen, um ein Zeichen zu speichern.
ProgramFOX
2

(Visual) FoxPro jede Version 80 Bytes

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

Wiederholen Sie die String-Übersetzung, um sie zu leeren, indem Sie ^ H suchen und ein Zeichen sichern.

Chris
quelle
2

Julia, 41 39 Bytes

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

Was es tut, ist, ^ H als Begrenzer zu verwenden und dann das letzte Zeichen in jeder Zeichenkette zu entfernen und dann die nächste Zeichenkette zu verketten, bevor das letzte Zeichen wieder entfernt wird. Im Gegensatz zur anderen Julia-Antwort ist dies keine rekursive Funktion.

Hinweis: Ich habe den Funktionsnamen aus der Definition entfernt. Ursprünglich hieß es f(s)=eher als s->, und Sie haben es als f("AAA^HB^H^H")... verwendet, aber ich spare zwei Bytes, indem ich es "anonym" sein lasse und es als seinen Namen verwende. Du benutzt es so:

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

(Sie können ihm auch eine Variable zuweisen als f=s->foldl((t,v)->chop(t)v,split(s,"^H")), dann f("AAA^HB^H^H")wird es funktionieren)

Glen O
quelle
2

RS, 8 Bytes

Technisch gesehen zählt dies nicht, da es von einer Funktion abhängt, die ich nach dem Posten dieser Frage hinzugefügt habe. Allerdings finde ich es ziemlich ordentlich.

+?1.\^H/

Live-Demo und Testfälle .

kirbyfan64sos
quelle
Ist das neue Feature ein Limit-Ersatz?
Xnor
@xnor Ja: die ?1.
kirbyfan64sos
@Optimizer Warum? Du verlierst sowieso gegen Gema. : O
kirbyfan64sos
Yeah :(. Saw Gema nach dem Posten Kommentar
Optimierer
1

Python 2, 74 + 2 = 76 Bytes

Ich habe bisher ein paar Ansätze ausprobiert, dies ist das Beste, was ich bisher finden konnte.

n=input();o='';c=0
for l in n:d=l=='^';o=[o+l*(1-c),o[:-1]][d];c=d
print o
Kade
quelle
4
Woher kommen diese 2 zusätzlichen Bytes?
xnor
Die @ xnor-Eingabe muss in Anführungszeichen gesetzt werden, damit dies funktioniert. Ich habe vergessen, das in die Post zu setzen.
Kade
1
Ich glaube, die übliche Konvention war, dass man String-Argumente kostenlos in Anführungszeichen setzen kann, aber ich bin mir nicht ganz sicher.
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

Dies könnte wahrscheinlich als eine Funktion kürzer gemacht werden (1 Byte konnte ich in schnellen Tests speichern), aber ich mag irgendwie den Einzeiler-Aspekt ... :-)

Die Klammern stammen aus der Intersystems Cache-Variante von Mumps, mit der ich mich am besten auskenne.

Zmerch
quelle
1

Java - 123 Bytes

Mir persönlich gefällt das g---1Teil am besten.

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

erweitert (leicht):

  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
quelle
1

Batch - 138 Bytes

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

In der ersten Zeile werden einige Bytes über die Länge gespeichert @echo off&setLocal enableDelayedExpansion(wodurch das Echo deaktiviert und die verzögerte Erweiterung von Variablen ermöglicht wird, falls Sie sich fragen). Ich erklärte es in Tipps zum Golfen in Batch .

Die zweite Zeile ist ein kleiner Trick, um ein Backspace-Steuerzeichen in einer Variablen zu speichern. Es ist ziemlich abgedreht, und ich kann nicht so tun, als würde ich das würdigen. Es wird hier irgendwie erklärt . Verwendet im Allgemeinen den Eingabeaufforderungsbefehl, um ein Backspace-Zeichen zu generieren und es in einer Variablen zu erfassen - in diesem Fall!D! .

Die letzte Zeile führt dann die einfache Manipulation von - replace ^Hwith durch !D!<SPACE>!D!.

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

Leider bricht es mit Fällen wie "AAA^HB^H^H"- wo es produzieren sollte, produziert "A"es stattdessen "A"B. Welches ist etwas verwirrend. Ich werde genauer untersuchen, wie die Manipulation von Batch-Strings funktioniert.

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

Dank einiger hilfsbereiter Leute hier - mir ist jetzt klar, dass ich nur das Backspace-Zeichen (0x08) gespeichert habe und daher nur die Zeichen überschrieb. Es funktioniert jetzt mit Beispielen wie dem folgenden:

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