На некоторых терминалах нажатие клавиши backspace генерирует управляющий код ^H
для удаления предыдущего символа. Это породило странную идиому, где симулируются правки для комедийного эффекта :
Будьте добры к этому дураку ^ H ^ H ^ H ^ Hgentleman, он приезжает из корпоративного штаба.
Если задана строка с одним или несколькими ^H
символами, выведите результат возврата на каждый ^H
. Для ввода будут использоваться только печатные символы (ASCII 32-126), и они ^
будут отображаться только как ^H
. 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
Leaderboard
Вот список лидеров по языкам, любезно предоставленный Мартином Бюттнером .
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# 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
действительным?A
.Ответы:
GNU sed, 11 байт
Тестовый вывод:
источник
sed -r ':;s/(^|.)\^H//;t'
- это работает за счет дополнительных 6 байтов^H
что начало строки - это возврат на пустой текст.Pyth, 11 байт
Демонстрация.
источник
Гема, 6 байт
Образец прогона:
CW, потому что пример дурака против джентльмена занимает слишком много времени. (Убит после дня. Может быть, сбой в интерпретаторе? Все остальные примеры здесь обрабатываются за доли секунды.) На рекурсивный шаблон Gema, похоже, не влияет уровень рекурсии, но количество несоответствующего текста увеличивает время обработки экспоненциально ,
источник
\^H
совпадений, сопоставляя по одному символу за раз?
.C, 52 байта
Мы определяем функцию,
f
которая принимает указатель на строку в качестве ввода. После вызова функции этот указатель будет содержать измененную строку.Простой тест:
Вышеуказанные отпечатки:
источник
j
в вашемfor
цикле (конечно, тогда это одноразовое использование, но я ничего не вижу в правилах :)). Вы также можете объединить назначение с декрементом:j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}
(47 байт)s--, j+=3
и приоритета оператора, это не работает правильно.Haskell, 47 байтов
Определяет функцию
f :: String -> String
. Как это устроено:источник
h
и выполнивh(x,_)=x
для случая пустой строки.CJam,
1413 байтовКак это устроено
ОБНОВЛЕНИЕ: 1 байт сохранен благодаря jimmy23013
Попробуйте онлайн здесь
источник
W\ts
.Сетчатка, 13 байт
Сетчатка
Две строки должны идти в свои собственные файлы, но вы можете запустить код как один файл с
-s
флагом.На каждом шаге мы удаляем первое совпадение
.\^H
в строке. Мы повторяем это (с+
модификатором), пока не произойдет удаление.источник
(.*)
, как кажется, просто откладывается без изменений?.\^H
за один шаг. В противном случаеabc^H^H^H
результат будетab^
после первого шага.+1`.\^H
). ;)JavaScript ( ES6 ), 39 байт
источник
Perl,
201615 байт(14 символов кода + 1 символ опции командной строки.)
Образец прогона:
источник
1while s/.\^H//
s/.\^H//&&redo
redo
как-то не пробился в мои навыки. Придется изменить это.{ }
блока. (Причина, по которой он работает,perl -p
заключается в том, что-p
коммутатор автоматически оборачивает ваш код вwhile
цикл.) Версия Кевина работает в любых условиях.Юлия,
584241 байтСэкономлено 16 байтов благодаря manatwork и 1 благодаря Glen O!
Это создает рекурсивную функцию, которая принимает строку и возвращает строку.
Это заменяет одно вхождение за
^H
раз пустой строкой, в то время как вход содержит^
.Примеры:
источник
REGXY, 10 байт
Использует REGXY , язык подстановки регулярных выражений. Заменяет любой символ, сопровождаемый ^ H, ничем. Затем выполняется вторая строка, которая является просто указателем на предыдущую строку, повторяя подстановку, пока она не будет соответствовать.
Это компилируется и выполняется правильно с примером интерпретатора в ссылке выше, но решение, возможно, немного дерзкое, поскольку оно основано на допущении в неопределенности языковой спецификации. Спецификация утверждает, что первый токен в каждой строке (перед /) действует как метка, но предполагается, что нулевой указатель метки будет указывать на первую команду в файле с нулевой меткой (или другими словами, это 'null' является допустимой меткой). Менее нахальное решение было бы:
Что составляет 13 байтов.
источник
Python 3, 53 байта
Но лично мне больше нравится эта словесная версия:
Интересно то, что
на самом деле работает и дает
'Back'
, поэтому я попытался отобразить^H -> [:-1]
и любой другой символc -> 'c'
тогдаeval
, но, к сожалению, у вас не может быть никаких строк впоследствии без+
, так что это не получается:источник
+=
работает в циклеo=o[:-1]+x
, неo=o+x
o[:-2]=x
работы?str
Haskell,
5247 байтПример использования:
Как это устроено:
источник
Рубин,
272420 байт(19 символов кода + 1 символ командной строки.)
Благодаря:
Образец прогона:
источник
[]
!loop{$_[/.\^H/]=""}rescue""
эта более приятная, поскольку она демонстрирует крутость обработки исключений в Ruby.$_=$`+$'while~/.\^H/
на 20 (вы можете даже сбросить тильду, если вас не волнуетregexp literal in condition
предупреждение).ruby
просто по умолчанию используете 1.8, тогда какirb
использует ruby 2.1.5.Python 2, 50
Немного странно, что там есть секунда
lambda
, но пока, похоже, лучший Python.источник
Pyth - 19 байт
Реду работает действительно, очень хорошо с этим, но он делает только один символ за раз, поэтому мне пришлось потратить почти столько же символов, сколько и действующий алгоритм, чтобы заменить
^H
на разрыв строки. Ищите лучший способ сделать это.Попробуйте это онлайн здесь .
источник
TeaScript , 7 байтов [не конкурирует]
Не конкурировать, так как TeaScript был создан после того, как этот вызов был опубликован. Это здесь в качестве ссылки.
При этом используется новый TeaScript 3 и рекурсивные замены для удаления символов
источник
regerence
? xDК5, 64 байта
K на самом деле не предназначен для такой работы ...
источник
golflua, 36 байт
Образец прогона:
источник
Javascript, 62 байта
Не самый короткий, но отлично работает.
Это, вероятно, может быть сокращено много!
источник
R,
5452 байтаТа же основная идея, что и у моего Джулии . Это создает рекурсивную функцию, которая принимает строку и возвращает строку. Если вход равен самому себе с единственным вхождением
^H
удаленного, верните его, в противном случае вызовите функцию снова.Вы можете попробовать это онлайн !
источник
ECMAScript 6, 57 байт
Это,
вероятно, игра в гольф, просто должен придумать способ,вероятно, нетисточник
s=>{while(s!=(s=s.replace(/.\^H/,""));return s}
?while
иreturn
слишком долго, это может быть рекурсивной:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
~s.indexOf`^H`
может стать/\^H/.test(s)
Ява,
7877 байтисточник
(Visual) FoxPro любая версия 80 байт
Повторите перевод строки для очистки, найдя ^ H и сделав резервную копию одного символа.
источник
Юлия,
4139 байтОн использует ^ H в качестве разделителя, затем удаляет последний символ в каждой строке, затем объединяет следующую строку перед тем, как снова удалить последний символ. В отличие от другого ответа Джулии, это не рекурсивная функция.
Примечание. Я удалил имя функции из определения. Первоначально он сказал,
f(s)=
а неs->
, и вы использовали его какf("AAA^HB^H^H")
... но я сохраняю два байта, позволяя ему быть "анонимным", и использую себя в качестве своего имени. Вы используете это так:(вы также можете назначить переменную как
f=s->foldl((t,v)->chop(t)v,split(s,"^H"))
, тогдаf("AAA^HB^H^H")
будет работать)источник
RS, 8 байт
Технически это не считается, поскольку это зависит от функции, которую я добавил после того, как этот вопрос был опубликован. Тем не менее, я думаю, что это довольно аккуратно.
Живая демоверсия и тестовые случаи .
источник
?1
.Python 2, 74 + 2 = 76 байт
До сих пор я пробовал несколько подходов, это лучшее, что я смог придумать.
источник
Свинка, 84 байта
Вероятно, это можно сделать как функцию короче (1 байт, который я смог сохранить в быстром тестировании), но мне нравится аспект с одной строкой ... :-)
Брекеты взяты из аромата Mumps из Intersystems Cache, в котором я больше всего разбираюсь.
источник
Java - 123 байта
Мне лично эта
g---1
часть нравится больше всего.расширен (немного):
источник
Пакет - 138 байт
Первая строка - это способ сохранения нескольких байтов по длине
@echo off&setLocal enableDelayedExpansion
(который отключает эхо и включает отложенное расширение переменных, если вам интересно). Я объяснил это в Совете по игре в гольф в партии .Вторая строка - это хитрый маленький трюк для сохранения управляющего символа возврата в переменную. Это довольно глупо, и я не могу притворяться, что взял на себя ответственность за это. Это вроде как объяснено здесь . В основном использует команду prompt, чтобы сгенерировать символ возврата и записать его в переменную - в этом случае
!D!
.Последняя строка затем выполняет простую манипуляцию строк - заменить
^H
на!D!<SPACE>!D!
.К сожалению , это порождает такие случаи, как"AAA^HB^H^H"
- где он должен производить"A"
, он вместо этого производит"A"B
. Что несколько сбивает с толку. Я должен разобраться, как работает групповая обработка строк, более подробно.Благодаря некоторым полезным людям здесь - теперь я понимаю, что я сохранял только символ возврата (0x08) и перезаписывал только символы. Теперь он работает с примерами, подобными следующим:
источник