Em alguns terminais, pressionar backspace gera o código de controle ^H
para excluir o caractere anterior. Isso deu origem a um idioma sarcástico, onde as edições são simuladas para efeito cômico :
Seja gentil com esse tolo ... H ^ H ^ H ^ Hgentleman, ele está visitando do QG corporativo.
Dada uma string com um ou mais ^H
, produza o resultado do backspacing em cada um ^H
. A entrada usará apenas caracteres imprimíveis (ASCII 32-126) e ^
aparecerá apenas como ^H
. Backspaces nunca acontecerão em texto vazio.
Você não pode assumir que o ambiente de saída suporta códigos de controle, em particular o código de 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
Entre os melhores
Aqui está uma tabela de classificação por idioma, cortesia de Martin Büttner .
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/52946/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45497;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*((?:[^,\s]|\s+[^-,\s])*)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
AAA^HB^H^H
válido?A
.Respostas:
GNU sed, 11 bytes
Saída de teste:
fonte
sed -r ':;s/(^|.)\^H//;t'
- Esta opção funciona à custa de extra de 6 bytes^H
o início da string é um backspace no texto vazio.Pitão, 11 bytes
Demonstração.
fonte
Gema, 6 bytes
Exemplo de execução:
CW, porque o exemplo de tolo vs. cavalheiro leva muito tempo. (Morto após um dia. Talvez uma falha no intérprete? Todos os outros exemplos aqui são processados em frações de segundos.) O padrão recursivo do Gema não parece ser afetado pelo nível de recursão, mas a quantidade de texto não correspondente aumenta exponencialmente o tempo de processamento .
fonte
\^H
repetirá repetidamente até os maches, correspondendo um caractere de cada vez ao?
.C, 52 bytes
Definimos uma função
f
que leva um ponteiro para a string como entrada. Após a chamada da função, esse ponteiro conterá uma string modificada.Um teste simples:
As impressões acima:
fonte
j
no seufor
loop (é claro que é de uso único, mas não vejo nada sobre isso nas regras :)). Você também pode combinar a atribuição com o decréscimo:j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}
(47 bytes)s--, j+=3
e da precedência do operador, ele não funciona direito.Haskell, 47 bytes
Define uma função
f :: String -> String
. Como funciona:fonte
h
e fazendoh(x,_)=x
pelo caso de string vazio.CJam,
1413 bytesComo funciona
ATUALIZAÇÃO: 1 byte salvo graças a jimmy23013
Experimente online aqui
fonte
W\ts
.Retina, 13 bytes
Retina
As duas linhas devem ir para seus próprios arquivos, mas você pode executar o código como um arquivo com o
-s
sinalizador.Em cada etapa, excluímos a primeira correspondência
.\^H
na string. Repetimos isso (com o+
modificador) até que nenhuma exclusão ocorra.fonte
(.*)
, como parece ser adiada, permanece inalterada?.\^H
em uma etapa. Caso contrárioabc^H^H^H
, resultariaab^
após o primeiro passo.+1`.\^H
). ;)JavaScript ( ES6 ), 39 bytes
fonte
Perl,
201615 bytes(Código de 14 caracteres + opção de linha de comando de 1 caractere.)
Exemplo de execução:
fonte
1while s/.\^H//
s/.\^H//&&redo
redo
de alguma forma, não entrou no meu conjunto de habilidades. Terá que mudar isso.{ }
bloco. (A razão pela qual ele funcionaperl -p
é que o-p
comutador agrupa automaticamente seu código dentro de umwhile
loop.) A versão de Kevin funciona em qualquer configuração.Julia,
584241 bytesEconomizou 16 bytes graças ao manatwork e 1 graças ao Glen O!
Isso cria uma função recursiva que aceita uma string e retorna uma string.
Isso substitui uma ocorrência de
^H
cada vez por uma sequência vazia enquanto a entrada contém^
.Exemplos:
fonte
REGXY, 10 bytes
Usa REGXY , um idioma baseado em substituição de regex. Substitui qualquer caractere seguido por ^ H por nada. A segunda linha então executa o que é apenas um ponteiro para a linha anterior, repetindo a substituição até que ela não corresponda.
Isso compila e executa corretamente com o intérprete de amostra no link acima, mas a solução talvez seja um pouco atrevida, pois se baseia em uma suposição de imprecisão na especificação da linguagem. A especificação especifica que o primeiro token em cada linha (antes de /) atua como um rótulo, mas a suposição é que um ponteiro de rótulo nulo apontará de volta para o primeiro comando no arquivo com um rótulo nulo (ou seja, que 'null' é um rótulo válido). Uma solução menos atrevida seria:
O que equivale a 13 bytes.
fonte
Python 3, 53 bytes
Mas, pessoalmente, eu gosto mais desta versão mais wordier:
O interessante é que
realmente funciona e dá
'Back'
, então tentei mapear^H -> [:-1]
e qualquer outro caracterec -> 'c'
entãoeval
, mas infelizmente você não pode ter nenhuma sequência posteriormente sem um+
, então isso falha:fonte
+=
funciona no loopo=o[:-1]+x
, nãoo=o+x
o[:-2]=x
funciona?str
Haskell,
5247 bytesExemplo de uso:
Como funciona:
fonte
Ruby,
272420 bytes(Código de 19 caracteres + opção de linha de comando de 1 caractere.)
Graças a:
Exemplo de execução:
fonte
[]
!loop{$_[/.\^H/]=""}rescue""
Essa é melhor, pois demonstra a exceção de Ruby ao lidar com a frieza.$_=$`+$'while~/.\^H/
por 20 (você pode até soltar o til se não se importar com oregexp literal in condition
aviso).ruby
ainda é o padrão 1.8, enquantoirb
usa o ruby 2.1.5.Python 2, 50
É um pouco estranho ter um segundo
lambda
lá, mas parece ser o melhor Python até agora.fonte
Pitão - 19 bytes
Reduzir funciona muito, muito bem com isso, mas apenas um caractere de cada vez, então tive que gastar quase tantos caracteres quanto o algo real para substituir o
^H
quebra de linha. Procurando uma maneira melhor de fazer isso.Experimente online aqui .
fonte
TeaScript , 7 bytes [Não competindo]
Não competir, pois o TeaScript foi feito após o lançamento deste desafio. Isto é aqui como referência.
Isso usa o novo TeaScript 3 e substituições recursivas para remover os caracteres
fonte
regerence
? xDK5, 64 bytes
K não é realmente projetado para esse tipo de trabalho ...
fonte
golflua, 36 bytes
Exemplo de execução:
fonte
Javascript, 62 bytes
Não é o mais curto, mas funciona bem.
Provavelmente isso pode ser muito reduzido!
fonte
R,
5452 bytesA mesma idéia básica da minha resposta de Julia . Isso cria uma função recursiva que aceita uma string e retorna uma string. Se a entrada for igual a si mesma com uma única ocorrência de
^H
remoção, retorne-a, caso contrário, chame a função novamente.Você pode experimentá-lo online !
fonte
ECMAScript 6, 57 bytes
Isso
provavelmenteéjogável, só preciso pensar em uma maneira queprovavelmente nãofonte
s=>{while(s!=(s=s.replace(/.\^H/,""));return s}
?while
ereturn
forem muito longos, pode ser recursivo: #var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
~s.indexOf`^H`
pode se tornar/\^H/.test(s)
Java,
7877 bytesfonte
(Visual) FoxPro qualquer versão 80 bytes
Repetindo a tradução de string para vazia, localizando ^ H e fazendo backup de um caractere.
fonte
Julia,
4139 bytesO que está fazendo é usar ^ H como um delimitador e, em seguida, remover o último caractere de cada sequência e concatenar a próxima sequência antes de remover o último caractere novamente. Diferentemente da outra resposta de Julia, essa não é uma função recursiva.
Nota: removi o nome da função da definição. Originalmente, dizia em
f(s)=
vez des->
, e você o usou comof("AAA^HB^H^H")
... mas estou economizando dois bytes deixando "anônimo" e use-se como seu nome. Você o usa assim:(você também pode atribuir uma variável a ela como
f=s->foldl((t,v)->chop(t)v,split(s,"^H"))
, entãof("AAA^HB^H^H")
funcionará)fonte
rs, 8 bytes
Tecnicamente, isso não conta, pois depende de um recurso que eu adicionei após a postagem desta pergunta. No entanto, acho bem legal.
Demonstração ao vivo e casos de teste .
fonte
?1
.Python 2, 74 + 2 = 76 bytes
Eu tentei algumas abordagens até agora, este é o melhor que pude apresentar até agora.
fonte
Caxumba, 84 bytes
Provavelmente isso poderia ser reduzido em função (1 byte que eu consegui salvar em testes rápidos), mas eu meio que gosto do aspecto de uma linha ... :-)
Os aparelhos vêm do sabor de caxumba do Intersystems, que é o que eu mais gosto.
fonte
Java - 123 bytes
Eu pessoalmente gosto da
g---1
parte da melhor.expandido (ligeiramente):
fonte
Lote - 138 bytes
A primeira linha é uma maneira de salvar alguns bytes ao longo do tempo
@echo off&setLocal enableDelayedExpansion
(que desativa o eco e permite a expansão atrasada das variáveis, caso você esteja se perguntando). Expliquei isso em Dicas para jogar golfe no lote .A segunda linha é um pequeno truque para salvar o caractere de controle de backspace em uma variável. É muito hacky, e não posso fingir ter crédito por isso. É meio que explicado aqui . Basicamente, usa o comando prompt para gerar um caractere de backspace e captura-o em uma variável - nesse caso
!D!
.A linha final executa a manipulação simples de cadeia de - substitua
^H
por!D!<SPACE>!D!
.Infelizmente, ele rompe com casos como"AAA^HB^H^H"
- onde deveria produzir"A"
, em vez disso produz"A"B
. O que é um pouco confuso. Vou ter que analisar como a manipulação de strings em lote funciona com mais profundidade.Graças a algumas pessoas úteis por aqui - agora percebo que estava apenas salvando o caractere de backspace (0x08) e, portanto, apenas substituindo os caracteres. Agora ele funciona com exemplos como o seguinte:
fonte