En algunos terminales, presionar la tecla de retroceso genera el código de control ^H
para eliminar el carácter anterior. Esto dio lugar a un idioma sarcástico donde las ediciones están fingidas para lograr un efecto cómico :
Sé amable con este tonto ^ H ^ H ^ H ^ Hgentleman, él está visitando desde la sede corporativa.
Dada una cadena con uno o más ^H
, genera el resultado del retroceso en cada uno ^H
. La entrada utilizará solo caracteres imprimibles (ASCII 32-126) y ^
solo aparecerá como ^H
. Los espacios de retroceso nunca sucederán en texto vacío.
No puede suponer que el entorno de salida admite códigos de control, en particular el código de retroceso \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
Tabla de clasificación
Aquí hay una tabla de clasificación por idioma, cortesía de Martin Büttner .
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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
valido?A
.Respuestas:
GNU sed, 11 bytes
Prueba de salida:
fuente
sed -r ':;s/(^|.)\^H//;t'
- esto funciona a expensas de 6 bytes adicionales^H
el comienzo de la cadena es un retroceso en el texto vacío.Pyth, 11 bytes
Demostración.
fuente
Gema, 6 bytes
Ejecución de muestra:
CW, porque el ejemplo de tonto contra caballero lleva demasiado tiempo. (Asesinado después de un día. ¿Tal vez una falla en el intérprete? Todos los demás ejemplos aquí se procesan en fracciones de segundos.) El patrón recursivo de Gema no parece verse afectado por el nivel de recursión, pero la cantidad de texto que no coincide aumenta exponencialmente el tiempo de procesamiento .
fuente
\^H
maches, haciendo coincidir un carácter a la vez con el?
.C, 52 bytes
Definimos una función
f
que toma un puntero a la cadena como entrada. Después de la llamada a la función, ese puntero contendrá una cadena modificada.Una prueba simple:
Las impresiones anteriores:
fuente
j
en sufor
ciclo (por supuesto, es de un solo uso, pero no veo nada al respecto en las reglas :)). También puede combinar la asignación con la disminución:j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}
(47 bytes)s--, j+=3
y la precedencia del operador, no funciona bien.Haskell, 47 bytes
Define una función
f :: String -> String
. Cómo funciona:fuente
h
y haciendoh(x,_)=x
el caso de la cadena vacía.CJam,
1413 bytesCómo funciona
ACTUALIZACIÓN: 1 byte guardado gracias a jimmy23013
Pruébalo en línea aquí
fuente
W\ts
.Retina, 13 bytes
Retina
Las dos líneas deben ir a sus propios archivos, pero puede ejecutar el código como un archivo con la
-s
bandera.En cada paso eliminamos la primera coincidencia de
.\^H
la cadena. Repetimos esto (con el+
modificador) hasta que no se elimine.fuente
(.*)
, ya que parece ser simplemente puesta sin cambios?.\^H
en un solo paso. Deabc^H^H^H
lo contrario resultaríaab^
después del primer paso.+1`.\^H
). ;)JavaScript ( ES6 ), 39 bytes
fuente
Perl,
201615 bytes(Código de 14 caracteres + opción de línea de comando de 1 carácter).
Ejecución de muestra:
fuente
1while s/.\^H//
s/.\^H//&&redo
redo
de alguna manera no llegó a mi conjunto de habilidades. Tendrá que cambiar eso.{ }
bloque. (La razón por la que funcionaperl -p
es que el-p
interruptor envuelve automáticamente su código dentro de unwhile
bucle). La versión de Kevin funciona en cualquier entorno.Julia,
584241 bytes¡Ahorré 16 bytes gracias a manatwork y 1 gracias a Glen O!
Esto crea una función recursiva que acepta una cadena y devuelve una cadena.
Esto reemplaza una aparición de
^H
a la vez con una cadena vacía mientras la entrada contiene^
.Ejemplos:
fuente
REGXY, 10 bytes
Utiliza REGXY , un lenguaje basado en la sustitución de expresiones regulares. Reemplaza cualquier carácter seguido de ^ H con nada. Luego se ejecuta la segunda línea, que es solo un puntero a la línea anterior, repitiendo la sustitución hasta que no coincida.
Esto compila y se ejecuta correctamente con el intérprete de muestra en el enlace anterior, pero la solución es quizás un poco descarada ya que se basa en una suposición en la imprecisión de la especificación del lenguaje. La especificación establece que el primer token en cada línea (antes de /) actúa como una etiqueta, pero se supone que un puntero de etiqueta nulo apuntará de nuevo al primer comando en el archivo con una etiqueta nula (o en otras palabras, ese 'nulo' es una etiqueta válida). Una solución menos descarada sería:
Lo que equivale a 13 bytes.
fuente
Python 3, 53 bytes
Pero personalmente me gusta más esta versión más prolija:
Lo interesante es que
en realidad funciona y da
'Back'
, así que intenté mapear^H -> [:-1]
y cualquier otro carácter enc -> 'c'
ese momentoeval
, pero desafortunadamente no puedes tener ninguna secuencia después sin un+
, así que esto falla:fuente
+=
funciona en el bucleo=o[:-1]+x
, noo=o+x
o[:-2]=x
trabajo?str
Haskell,
5247 bytesEjemplo de uso:
Cómo funciona:
fuente
Rubí,
272420 bytes(Código de 19 caracteres + opción de línea de comando de 1 carácter).
Gracias a:
Ejecución de muestra:
fuente
[]
!loop{$_[/.\^H/]=""}rescue""
esta es mejor, ya que demuestra la frialdad de manejo de excepciones de Ruby.$_=$`+$'while~/.\^H/
por 20 (incluso puedes soltar la tilde si no te importa laregexp literal in condition
advertencia).ruby
simplemente sigue siendo predeterminado 1.8, mientras queirb
usa ruby 2.1.5.Pitón 2, 50
Es un poco extraño tener un segundo
lambda
allí, pero parece ser el mejor Python hasta ahora.fuente
Pyth - 19 bytes
Reducir funciona muy, muy bien con esto, pero solo tiene un carácter a la vez, por lo que tuve que gastar casi tantos caracteres como el algoritmo real para reemplazar un
^H
salto de línea. Buscando una mejor manera de hacerlo.Pruébelo en línea aquí .
fuente
TeaScript , 7 bytes [No compite]
No compitió ya que TeaScript se creó después de publicar este desafío. Esto está aquí como referencia.
Utiliza el nuevo TeaScript 3, y reemplaza recursivamente para eliminar los caracteres.
fuente
regerence
? xDK5, 64 bytes
K no está realmente diseñado para este tipo de trabajo ...
fuente
golflua, 36 bytes
Ejecución de muestra:
fuente
Javascript, 62 bytes
No es el más corto, pero funciona bien.
¡Esto probablemente se puede acortar mucho!
fuente
R,
5452 bytesLa misma idea básica que mi respuesta de Julia . Esto crea una función recursiva que acepta una cadena y devuelve una cadena. Si la entrada es igual a sí misma con una sola ocurrencia de
^H
eliminación, devuélvala, de lo contrario, llame a la función nuevamente.¡Puedes probarlo en línea !
fuente
ECMAScript 6, 57 bytes
Esto es
probablemente golfable, solo tengo que pensar en una forma queprobablemente nofuente
s=>{while(s!=(s=s.replace(/.\^H/,""));return s}
?while
yreturn
son demasiado largos, podría ser recursivo:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
~s.indexOf`^H`
puede convertirse/\^H/.test(s)
Java,
7877 bytesfuente
(Visual) FoxPro cualquier versión 80 bytes
Repetir la traducción de la cadena al vacío al encontrar ^ H y hacer una copia de seguridad de un carácter.
fuente
Julia,
4139 bytesLo que está haciendo es usar ^ H como delimitador, y luego eliminar el último carácter de cada cadena y luego concatenar la siguiente cadena antes de eliminar nuevamente el último carácter. A diferencia de la otra respuesta de Julia, esta no es una función recursiva.
Nota: he eliminado el nombre de la función de la definición. Originalmente, decía
f(s)=
más ques->
, y lo usaste comof("AAA^HB^H^H")
... pero estoy ahorrando dos bytes al dejar que sea "anónimo", y usarlo como su nombre. Lo usas así:(también puede asignarle una variable como
f=s->foldl((t,v)->chop(t)v,split(s,"^H"))
, entoncesf("AAA^HB^H^H")
funcionará)fuente
rs, 8 bytes
Técnicamente, esto no cuenta, ya que depende de una característica que agregué después de que se publicó esta pregunta. Sin embargo, creo que es bastante bueno.
Demostración en vivo y casos de prueba .
fuente
?1
.Python 2, 74 + 2 = 76 bytes
He intentado algunos enfoques hasta ahora, este es el mejor que he podido encontrar hasta ahora.
fuente
Paperas, 84 bytes
Esto probablemente podría acortarse como una función (1 byte que pude guardar en pruebas rápidas) pero me gusta el aspecto de una línea ... :-)
Las llaves provienen del sabor Intersystems Cache de Paperas, que es lo que más conozco.
fuente
Java - 123 bytes
Personalmente, me gusta la
g---1
parte que mejor.expandido (ligeramente):
fuente
Lote - 138 bytes
La primera línea es una forma de guardar unos pocos bytes a lo largo
@echo off&setLocal enableDelayedExpansion
(lo que desactiva el eco y permite la expansión retardada de las variables, en caso de que se lo pregunte). Lo expliqué en Tips for Golfing in Batch .La segunda línea es un pequeño truco para guardar el carácter de control de retroceso en una variable. Es bastante hacky, y no puedo pretender tomar el crédito por ello. Se explica más o menos aquí . Básicamente usa el comando prompt para generar un carácter de retroceso y lo captura en una variable, en este caso
!D!
.La línea final realiza la simple manipulación de cadenas de - reemplazar
^H
con!D!<SPACE>!D!
.Desafortunadamente, rompe con casos como"AAA^HB^H^H"
: donde debería producir"A"
, en su lugar produce"A"B
. Lo cual es algo confuso. Tendré que analizar cómo funciona la manipulación de cadenas de Batch con más profundidad.Gracias a algunas personas útiles por aquí , ahora me doy cuenta de que solo estaba guardando el carácter de retroceso (0x08), por lo que solo estaba sobrescribiendo los caracteres. Ahora funciona con ejemplos como los siguientes:
fuente