Backhanded ^ H ^ H ^ H ^ H ^ H ^ Hspaces


47

Su alcuni terminali, premendo backspace viene generato il codice di controllo ^Hper eliminare il carattere precedente. Ciò ha dato origine a un linguaggio snarky in cui le modifiche sono finte per effetto comico :

Sii gentile con questo pazzo ^ H ^ H ^ H ^ Hgentleman, sta visitando dal quartier generale aziendale.

Dato una stringa con uno o più ^H, genera il risultato della spaziatura su ciascuno ^H. L'input utilizzerà solo caratteri stampabili (ASCII 32-126) e ^verrà visualizzato solo come ^H. Gli spazi posteriori non accadranno mai su testo vuoto.

Non si può presumere che l'ambiente di output supporti i codici di controllo, in particolare il codice 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

Classifica

Ecco una classifica per lingua, per gentile concessione di Martin Büttner .

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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


4
È AAA^HB^H^Hvalido?
Nathan Merrill,

@NathanMerrill Sì, e ne risulta A.
xnor

3
Sospetto che la retina farebbe bene qui.
Claudiu,

1
@Fatalize: "Backspaces non accadrà mai su testo vuoto".
Maltysen,

16
@Maria Tidal Tug torna a perseguitarmi
Digital Trauma,

Risposte:


69

GNU sed, 11 byte

:;s/.^H//;t

Uscita di prova:

$ 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
Guarda chi è arrivato! È Maria Tidal Tug ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ Trauma digitale!
Alex A.

@AlexA. Mi sto perdendo una battuta?
user253751

@immibis: vedi il commento di Digital Trauma sulla domanda.
Alex A.

sed -r ':;s/(^|.)\^H//;t'- Funziona a scapito di 6 byte extra
Aragaer,

@aragaer Perché è necessario? L'OP dice " Backspaces non accadrà mai su testo vuoto ". Penso che ^Hl'inizio della stringa sia un backspace su testo vuoto.
Trauma digitale,

19

Pyth, 11 byte

.U+PbZcz"^H

Dimostrazione.

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

Esecuzione di esempio:

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

CW, perché l'esempio sciocco contro gentiluomo impiega troppo tempo. (Ucciso dopo un giorno. Forse un problema tecnico nell'interprete? Tutti gli altri esempi qui vengono elaborati in frazioni di secondi.) Il modello ricorsivo di Gema non sembra essere influenzato dal livello di ricorsione, ma la quantità di testo non corrispondente aumenta il tempo di elaborazione in modo esponenziale .


C'è un link alla lingua? Una rapida ricerca su Github è
arrivata

Sicuro. gema.sourceforge.net (A proposito, il progetto Gema è stato registrato il 27-10-2003, mentre GitHub è stato lanciato il 10-04-2008. Questo potrebbe essere un motivo per non trovarlo lì.)
arte

Credo che la profondità di ricorsione sia uguale alla lunghezza della stringa non corrispondente, perché si ripeterà ancora e ancora fino ai \^Hmaches, abbinando un carattere alla volta al ?.
isaacg,

15

C, 52 byte

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

Definiamo una funzione fche accetta un puntatore alla stringa come input. Dopo la chiamata di funzione, quel puntatore conterrà una stringa modificata.

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

Le stampe sopra:

Digital Trauma

1
Questo è stato davvero intelligente. Un paio di cose che ho notato: i globuli sono già inizializzati a zero, quindi non c'è bisogno di iniziare jnel tuo forloop (ovviamente poi è monouso, ma non vedo nulla al riguardo nelle regole :)). Puoi anche combinare il compito con il decremento: j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47 byte)
Cole Cameron,


@undergroundmonorail dang, stavo solo ricontrollando per vedere se l'ho perso. Sono ancora nuovo nel campo del golf ma lo ricorderò per il futuro :). Grazie per le informazioni!
Cole Cameron,

1
@ColeCameron Questo ha una modifica e accesso (UB) senza conseguenze, e sfortunatamente causa un EXC_BAD_ACCESS immediato sul mio compilatore / macchina.
BrainSteel,

1
@Quentin L'ho provato, ma a causa della virgola in s--, j+=3e della precedenza dell'operatore, non funziona correttamente.
BrainSteel,

14

Haskell, 47 byte

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

Definisce una funzione f :: String -> String. Come funziona:

    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
Penso che puoi salvare un byte scambiando i due casi he facendo h(x,_)=xil caso stringa vuota.
Zgarb,

12

CJam, 14 13 byte

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

Come funziona

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

AGGIORNAMENTO: 1 byte salvato grazie a jimmy23013

Provalo online qui


2
1 byte più breve: W\ts.
jimmy23013,

11

Retina, 13 byte

Retina

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

Le due righe dovrebbero andare ai propri file ma è possibile eseguire il codice come un file con il -sflag.

Ad ogni passaggio eliminiamo la prima corrispondenza per .\^Hnella stringa. Lo ripetiamo (con il +modificatore) fino a quando non si verifica alcuna eliminazione.


Solo una curiosità: perché la cattura di (.*), come sembra essere rimessa inalterata?
arte

1
@manatwork In questo modo catturiamo solo il primo .\^H in un solo passaggio. Altrimenti abc^H^H^Hsi tradurrebbe in ab^dopo il primo passo.
randomra,

4
Mi scuso per non aver ancora implementato un limite di sostituzione (che probabilmente consentirebbe qualcosa di simile +1`.\^H). ;)
Martin Ender l'

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

(Codice di 14 caratteri + opzione della riga di comando di 1 carattere.)

s/.\^H//&&redo

Esecuzione di esempio:

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
Salva 4 personaggi:1while s/.\^H//
Kevin Reid l'

Wow! È fantastico @KevinReid. Grazie.
arte

1
Ancora uno:s/.\^H//&&redo
Dennis l'

Grazie, @Dennis. redoin qualche modo non si è fatto strada nel mio set di abilità. Dovrà cambiarlo.
arte

2
Nota che la versione di @Dennis funzionerà (come previsto) solo se è l'unica istruzione all'interno di un ciclo o di un { }blocco. (Il motivo per cui funziona perl -pè che lo -pswitch avvolge automaticamente il codice all'interno di un whileciclo.) La versione di Kevin funziona in qualsiasi impostazione.
Ilmari Karonen,

9

Julia, 58 42 41 byte

Risparmiato 16 byte grazie a manatwork e 1 grazie a Glen O!

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

Ciò crea una funzione ricorsiva che accetta una stringa e restituisce una stringa.

Ciò sostituisce un'occorrenza di ^Halla volta con una stringa vuota mentre l'input contiene^ .

Esempi:

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

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

Questa è la prima volta che vedo Julia allo stato brado. Bello!
Ogaday,

8

REGXY, 10 byte

Utilizza REGXY , un linguaggio basato sulla sostituzione regex. Sostituisce qualsiasi carattere seguito da ^ H senza nulla. Viene quindi eseguita la seconda riga, che è solo un puntatore alla riga precedente, ripetendo la sostituzione fino a quando non riesce a corrispondere.

/.\^H//
//

Questo compila ed esegue correttamente con l'interprete di esempio nel link sopra, ma la soluzione è forse un po 'sfacciata in quanto si basa su un presupposto nella vaghezza delle specifiche del linguaggio. La specifica afferma che il primo token su ogni riga (prima di /) funge da etichetta, ma il presupposto è che un puntatore di etichetta null punterà al primo comando nel file con un'etichetta null (o in altre parole, che "null" è un'etichetta valida). Una soluzione meno sfacciata sarebbe:

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

Ciò equivale a 13 byte.


7

Python 3, 53 byte

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

Ma personalmente mi piace di più questa versione più wordier:

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

La cosa interessante è che

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

effettivamente funziona e dà 'Back', così ho cercato di mappare ^H -> [:-1]e qualsiasi altro carattere c -> 'c'poi eval, ma purtroppo non si può avere tutte le stringhe in seguito senza +, quindi questo non riesce:

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

Ehi ... è abbastanza carino.
Alex Van Liew,

+=funziona in loop
CalculatorFeline

@CatsAreFluffy È o=o[:-1]+x, nono=o+x
Sp3000 l'

Oops, l'ho perso. Funziona qualcosa di simile o[:-2]=x?
Calcolatrice

@CatsAreFluffy Non è possibile assegnare astr
Sp3000

7

Haskell, 52 47 byte

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

Esempio di utilizzo:

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

Come funziona:

                  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

Rubino, 27 24 20 byte

(Codice di 19 caratteri + opzione della riga di comando di 1 carattere.)

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

Grazie a:

  • Ventero per aver suggerito di usare le variabili globali (-4 caratteri)

Esecuzione di esempio:

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 Ho pensato di dare una risposta a Ruby fino a quando non l'avessi visto - Sono abbastanza sicuro che sia piccolo come sarà. Ottimo utilizzo di []!
daniero,

All'inizio c'era un'altra versione: loop{$_[/.\^H/]=""}rescue""questa è più bella in quanto dimostra l'eccezione di Ruby nel gestire la freddezza.
arte

Haha, è fantastico :)
daniero l'

1
Meglio tardi che mai: $_=$`+$'while~/.\^H/per 20 (puoi anche far cadere la tilde se non ti interessa l' regexp literal in conditionavvertimento).
Ventero,

1
@manatwork: tecnicamente appare in tutte le versioni di ruby> = 1.9 (regex e valori letterali delle stringhe in condizioni erano deprecati dopo 1.8), immagino che il tuo rubyvalore predefinito sia semplicemente 1.8, mentre irbusa ruby ​​2.1.5.
Ventero,

4

Python 2, 50

È un po 'strano avere un secondo lambdalì dentro, ma sembra essere il miglior Python finora.

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

3

Pyth - 19 byte

Ridurre funziona davvero molto bene con questo, ma fa solo un carattere alla volta, quindi ho dovuto spendere quasi tutti i caratteri dell'algo reale per sostituire un ^Hinterruzione di riga. Alla ricerca di un modo migliore per farlo.

u?+GHnHbPGjbcz"^H"k

Provalo online qui .


3

TeaScript , 7 byte [Non in competizione]

Non competere perché TeaScript è stato realizzato dopo che questa sfida è stata pubblicata. Questo è qui come riferimento.

xW/.\^H

Questo utilizza il nuovo TeaScript 3 e sostituisce ricorsivo per rimuovere i caratteri


1
Per qualche motivo questo conta come 8859 byte nella classifica a causa del collegamento ISO 8859 ...
ev3commander

regerence? xD
cat

2

K5, 64 byte

K non è davvero progettato per questo tipo di lavoro ...

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

Esecuzione di esempio:

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

Non il più corto, ma funziona bene.

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

Questo probabilmente può essere abbreviato molto!


1
Non è il più breve e non funziona in entrambi i casi (provare uno dei casi di test). Il regexp non dovrebbe essere globale (remove / g)
edc65

@ edc65 Grazie per il suggerimento. Ho provato alcune cose e hanno funzionato. Ecco perché ho pubblicato in questo modo
Ismael Miguel l'

2

R, 54 52 byte

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

Stessa idea di base della mia risposta Julia . Ciò crea una funzione ricorsiva che accetta una stringa e restituisce una stringa. Se l'ingresso è uguale a se stesso con una singola occorrenza di ^Hrimosso, restituirlo, altrimenti chiamare nuovamente la funzione.

Puoi provarlo online !


2

ECMAScript 6, 57 byte

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

Questo è probabilmente golfabile, devo solo pensare a un modo probabilmente no


2
Che ne dici s=>{while(s!=(s=s.replace(/.\^H/,""));return s}?
lrn,

O, se whilee returnsono troppo a lungo, potrebbe essere ricorsivo:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
LRN

@lm dovresti aggiungere il secondo parametro "" per sostituire. Allora hai la mia risposta :)
edc65, l'

Vero. E l'argomento stringa vuota deve essere lì, devo aver copiato la versione sbagliata :(
lrn

~s.indexOf`^H`può diventare/\^H/.test(s)
Non che Charles

2

Java, 78 77 byte

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

1
È possibile rimuovere lo spazio dopo la virgola per salvare un carattere.
Programma FOX il

2

(Visual) FoxPro qualsiasi versione 80 byte

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

Ripetendo la traduzione della stringa da svuotare trovando ^ H ed eseguendo il backup di un carattere.


2

Julia, 41 39 byte

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

Quello che sta facendo è usare ^ H come delimitatore, quindi rimuovere l'ultimo carattere su ogni stringa e poi concatenare la stringa successiva prima di rimuovere nuovamente l'ultimo carattere. A differenza dell'altra risposta di Julia, questa non è una funzione ricorsiva.

Nota: ho rimosso il nome della funzione dalla definizione. Inizialmente, diceva f(s)=piuttosto che s->, e l'hai usato come f("AAA^HB^H^H")... ma sto salvando due byte lasciando che sia "anonimo", e usi se stesso come nome. Lo usi in questo modo:

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

(puoi anche assegnare una variabile ad essa come f=s->foldl((t,v)->chop(t)v,split(s,"^H")), quindi f("AAA^HB^H^H")funzionerà)



1

Python 2, 74 + 2 = 76 byte

Finora ho provato alcuni approcci, questo è il migliore che ho potuto inventare finora.

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

4
Da dove vengono quei 2 byte extra?
xnor

L'input di @xnor deve essere racchiuso tra virgolette perché funzioni. Ho dimenticato di metterlo nel post.
Kade, l'

1
Penso che la solita convenzione sia stata quella di consentire che gli argomenti di stringa fossero presi tra virgolette gratuitamente, ma non ne sono del tutto sicuro.
xnor

1

Parotite, 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

Questo potrebbe probabilmente essere abbreviato in funzione (1 byte sono stato in grado di salvare in test rapidi) ma mi piace un po 'l'aspetto di una riga ... :-)

Le parentesi graffe provengono dal sapore della parotite di Intersystems Cache che è quello in cui sono più esperto.


1

Java - 123 byte

Personalmente mi piace la g---1parte migliore.

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

espanso (leggermente):

  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

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

La prima riga è un modo per salvare alcuni byte nel lungo @echo off&setLocal enableDelayedExpansion (che disattiva l'eco e abilita l'espansione ritardata delle variabili, nel caso ti stavi chiedendo). L'ho spiegato in Tips for Golfing in Batch .

La seconda riga è un piccolo trucco per salvare un carattere di controllo backspace in una variabile. È piuttosto confuso, e non posso pretendere di prendermi il merito. È spiegato qui . Fondamentalmente usa il comando prompt per generare un carattere backspace e lo acquisisce in una variabile - in questo caso!D! .

La riga finale esegue quindi la semplice manipolazione della stringa di - sostituisci ^Hcon !D!<SPACE>!D!.

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

Sfortunatamente si rompe con casi come "AAA^HB^H^H"- dove dovrebbe produrre "A", invece produce "A"B. Il che è alquanto confuso. Dovrò esaminare in che modo la manipolazione della stringa batch funziona in modo più approfondito.

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

Grazie ad alcune persone utili qui - ora mi rendo conto che stavo solo salvando il personaggio backspace (0x08), e quindi stavo solo sovrascrivendo i personaggi. Ora funziona con esempi come i seguenti:

C:\>bsp.bat "AAA^HB^H^H"
"A"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.