Зворотні ^ H ^ H ^ H ^ H ^ H ^ Hspaces


47

На деяких терміналах натискання на зворотному просторі створює керуючий код ^Hдля видалення попереднього символу. Це породило химерну ідіому, коли для комедійного ефекту виправлені зміни :

Будьте приємні до цього дурня ^ H ^ H ^ H ^ Hgentleman, він відвідує корпоративний штаб.

Давши рядок з одним або декількома ^H, виведіть результат зворотного пробілу на кожен ^H. Для введення використовуються лише символи для друку (ASCII 32-126) і ^відображатимуться лише як ^H. Зворотні простори ніколи не трапляться на порожньому тексті.

Ви можете не припускати, що вихідне середовище підтримує коди управління, зокрема код зворотної області \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

Таблиця лідерів

Ось мовна таблиця мов, люб’язно надана Мартіном Бюттнером .

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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


4
Чи AAA^HB^H^Hдійсно?
Натан Меррілл

@NathanMerrill Так, і це призводить до A.
xnor

3
Я підозрюю, що сітківка добре зробила б тут.
Клавдіу

1
@Fatalize: "Зворотні простори ніколи не трапляються на порожньому тексті."
Мальтісен

16
@Maria Tidal Tug повертається, щоб переслідувати мене
Digital Trauma

Відповіді:


69

GNU sed, 11 байт

:;s/.^H//;t

Тестовий вихід:

$ 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
Подивіться, хто з’явився! Це Марія Припливний буксир ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ HDigital Trauma!
Алекс А.

@AlexA. Я пропускаю жарт?
користувач253751

@immibis: Дивіться коментар Digital Trauma до цього питання.
Олексій А.

sed -r ':;s/(^|.)\^H//;t'- це працює за рахунок додаткових 6 байт
aragaer

@aragaer Чому це потрібно? В ОП зазначають, що " Резервні простори ніколи не трапляться на порожньому тексті ". Я думаю, ^Hщо початок рядка - це зворотна область порожнього тексту.
Цифрова травма

19

Pyth, 11 байт

.U+PbZcz"^H

Демонстрація.

.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

Гема, 6 байт

?#\^H=

Проба зразка:

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

CW, тому що приклад дурня проти джентльмена займає дуже багато часу. (Вбито через день. Можливо, в інтерпретаторі виникне збій? Усі інші приклади тут обробляються частинами секунд.) На рекурсивну схему Gema не впливає рівень рекурсії, але кількість невідповідного тексту збільшує час обробки експоненціально .


Чи є посилання на мову? Швидкий пошук на Github
виявив

Звичайно. gema.sourceforge.net (BTW, проект Gema був зареєстрований 2003-10-27, тоді як GitHub був запущений 2008-04-10. Це може бути причиною, щоб не знайти його там.)
manatwork

Я вважаю, глибина рекурсії дорівнює довжині невідповідної рядки, тому що вона буде повторюватися знову і знову, доки не буде проходити \^Hпараметр, що відповідає одному символу одночасно ?.
isaacg

15

C, 52 байти

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

Ми визначаємо функцію, fяка приймає вказівник на рядок як вхідний. Після виклику функції цей покажчик буде містити модифікований рядок.

Простий тест:

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

Наведені вище відбитки:

Digital Trauma

1
Це було справді розумно. Пару речей, які я помітив: глобальні картки вже ініціалізовані до нуля, тому не потрібно запускати jу свій forцикл (звичайно, тоді це одноразове використання, але я нічого не бачу в цьому в правилах :)). Ви також можете поєднати завдання із декрементом: j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47 байт)
Коул Камерон


@undergroundmonorail, я лише двічі перевіряв, чи не пропустив це. Я все ще нова в коді гольфу, але пам’ятаю це на майбутнє :). Дякую за інформацію!
Коул Камерон

1
@ColeCameron, який має незрозумілу модифікацію та доступ (UB), і викликає негайний EXC_BAD_ACCESS на моєму компіляторі / машині, на жаль.
BrainSteel

1
@Quentin Я спробував це, але через кому s--, j+=3та пріоритет оператора він не працює правильно.
BrainSteel

14

Haskell, 47 байт

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

Визначає функцію f :: String -> String. Як це працює:

    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
Я думаю, що ви можете зберегти байт, замінивши два випадки hта виконавши h(x,_)=xдля порожнього рядка.
Згарб

12

CJam, 14 13 байт

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

Як це працює

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

ОНОВЛЕННЯ: 1 байт збережено завдяки jimmy23013

Спробуйте його онлайн тут


2
1 байт коротше: W\ts.
jimmy23013

11

Сітківка, 13 байт

Сітківка

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

Два рядки повинні мати власні файли, але ви можете запустити код як один файл із -sпрапором.

На кожному кроці ми видаляємо першу відповідність .\^Hу рядку. Повторюємо це (з +модифікатором), поки не відбудеться видалення.


Просто цікавість: чому захоплення (.*), як здається, просто повернуто незмінним?
манатура

1
@manatwork Таким чином ми фіксуємо лише перший .\^Hза один крок. В іншому випадку abc^H^H^Hце призведе ab^до першого кроку.
випадковий

4
Вибачення за те, що поки не застосовано ліміт заміни (що, можливо, дозволить щось подібне +1`.\^H). ;)
Мартін Ендер

10

JavaScript ( ES6 ), 39 байт

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 байт

(Код 14 символів + параметр командного рядка з 1 символом.)

s/.\^H//&&redo

Проба зразка:

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
Збережіть 4 символи:1while s/.\^H//
Кевін Рейд,

Оце Так! Це чудово @KevinReid Дякую.
манатура

1
Ще один:s/.\^H//&&redo
Денніс

Дякую, @Dennis. redoякось не пробився в мій набір навичок. Треба буде це змінити.
манатурка

2
Зауважте, що версія @ Dennis буде працювати (як задумано), якщо це єдиний вислів всередині циклу або { }блоку. (Причина, по якій він працює, perl -pполягає в тому, що -pкомутатор автоматично загортає ваш код у whileцикл.) Версія Кевіна працює в будь-яких умовах.
Ільмарі Каронен

9

Джулія, 58 42 41 байт

Збережено 16 байт завдяки манатурству та 1 подяку Глен О!

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

Це створює рекурсивну функцію, яка приймає рядок і повертає рядок.

Це замінює одночасне виникнення ^Hпорожнього рядка, а вхід містить ^.

Приклади:

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

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

Це вперше я бачив Джулію в дикій природі. Приємно!
Огадай

8

REGXY, 10 байт

Використовує REGXY , мову на основі заміщення регулярних виразів . Замінює будь-який символ, за яким слідує ^ H нічим. Потім виконується другий рядок, який є лише вказівником на попередній рядок, повторюючи заміну, поки вона не збігається.

/.\^H//
//

Це компілюється та виконується правильно з інтерпретатором зразка за посиланням, наведеним вище, але рішення, можливо, дещо сміливе, оскільки воно покладається на припущення про розпливчастість мовної специфікації. Специфікація зазначає, що перший маркер у кожному рядку (перед /) діє як мітка, але припущення полягає в тому, що нульовий мітка-вказівник буде вказувати на першу команду у файлі з нульовою міткою (або іншими словами, що 'null' є дійсною міткою). Менш нахабним рішенням було б:

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

Що становить 13 байт.


7

Python 3, 53 байти

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

Але особисто мені подобається ця більш жорстка версія:

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

Цікавим є те, що

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

насправді працює і дає 'Back', тому я спробував скласти карту ^H -> [:-1]та будь-які інші символи c -> 'c'тоді eval, але, на жаль, ви не можете мати жодних рядків після цього без +, тому це не вдається:

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

Гей ... це дуже акуратно.
Alex Van Liew

+=працює в циклі
CalculatorFeline

@CatsAreFluffy Це o=o[:-1]+xне такo=o+x
Sp3000

Ой, пропустив це. Чи щось на кшталт o[:-2]=xроботи?
CalculatorFeline

@CatsAreFluffy Ви не можете призначитиstr
Sp3000

7

Haskell, 52 47 байт

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

Приклад використання:

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

Як це працює:

                  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

Рубі, 27 24 20 байт

(Код 19 символів + 1 символ командного рядка.)

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

Завдяки:

  • Вентеро за пропозицію використовувати глобальні змінні (-4 символи)

Проба зразка:

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 Я думав, що відповім Рубі, поки не побачив цього - я впевнений, що це так мало, як це вийде. Прекрасне використання []!
daniero

На початку була інша версія: loop{$_[/.\^H/]=""}rescue""ця приємна, оскільки вона демонструє виняток Рубі, що охолоджує.
манатура

Ха-ха, це чудово :)
daniero

1
Краще пізно, ніж ніколи: $_=$`+$'while~/.\^H/на 20 (ти навіть можеш скинути тильд, якщо тебе не хвилює regexp literal in conditionпопередження).
Вентеро

1
@manatwork: Технічно він відображається у всіх версіях рубіну> = 1.9 (регулярні вирази та рядкові літерали в умовах були застарілі після 1.8), я думаю, що ви rubyпросто все ще знаходяться за замовчуванням 1.8, тоді як irbвикористовує ruby ​​2.1.5.
Вентеро

4

Пітон 2, 50

Це трохи дивно мати секунду lambdaтам, але, здається, найкращий Python поки що.

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

3

Pyth - 19 байт

Скорочення працює справді, дуже добре з цим, але це робить лише один знак за один раз, тому мені довелося витратити майже стільки символів, скільки власне альго, щоб зробити заміну ^Hна linebreak. Шукаєте кращого способу зробити це.

u?+GHnHbPGjbcz"^H"k

Спробуйте його онлайн тут .


3

TeaScript , 7 байт [не конкурує]

Не змагаючись, оскільки TeaScript був зроблений після публікації цього виклику. Це тут як довідка.

xW/.\^H

Для цього використовується новий TeaScript 3, а для видалення символів відбувається рекурсивна заміна


1
Чомусь це вважається 8859 байтами в таблиці лідерів через посилання ISO 8859 ...
ev3commander

regerence? xD
кіт

2

К5, 64 байти

K насправді не призначений для такої роботи ...

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

2

гольфлуа, 36 байт

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

Проба зразка:

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 байти

Не найкоротший, але працює чудово.

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

Це, напевно, можна дуже скоротити!


1
Не найкоротший і не працює в будь-якому випадку (спробуйте будь-який із тестових випадків).
Regexp

@ edc65 Дякую за пораду. Я спробував деякі речі, і вони спрацювали. Тому я опублікував так
Ісмаель Мігель

2

R, 54 52 байти

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

Та сама основна ідея, як і моя відповідь Юлії . Це створює рекурсивну функцію, яка приймає рядок і повертає рядок. Якщо вхід дорівнює самому одному ^Hвилученню, поверніть його, інакше знову викликайте функцію.

Ви можете спробувати онлайн !


2

ECMAScript 6, 57 байт

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

Це, мабуть, гольф, просто треба думати про спосіб, мабуть, не


2
Як щодо s=>{while(s!=(s=s.replace(/.\^H/,""));return s}?
lrn

Або, якщо whileі returnзанадто довго, це може бути рекурсивної:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
ЛРН

@lm вам слід додати другий параметр "" для заміни. Тоді ви маєте мою відповідь :)
edc65

Правда. І аргумент порожнього рядка повинен бути там, я, мабуть, скопіював неправильну версію :(
lrn

~s.indexOf`^H`може стати/\^H/.test(s)
Не те, щоб Чарльз

2

Java, 78 77 байт

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

1
Ви можете видалити пробіл після коми, щоб зберегти одну таблицю.
ProgramFOX

2

(Visual) FoxPro будь-якої версії 80 байт

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

Повторення перекладу рядка порожнім, знайшовши ^ H та створивши резервну копію одного символу.


2

Джулія, 41 39 байт

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

Це - використання ^ H як роздільника, а потім видалення останнього символу з кожного рядка, а потім об'єднання наступного рядка перед тим, як знову видалити останній символ. На відміну від інших відповідей Юлії, це не рекурсивна функція.

Примітка. Ім'я функції вилучено з визначення. Спочатку це було сказано, f(s)=а не s->, і ви використовували це як f("AAA^HB^H^H")... але я зберігаю два байти, дозволяючи йому бути "анонімним", і використовую себе як своє ім'я. Ви використовуєте його так:

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

(Ви також можете призначити йому змінну як f=s->foldl((t,v)->chop(t)v,split(s,"^H")), тоді f("AAA^HB^H^H")буде працювати)


2

rs, 8 байт

Технічно це не враховується, оскільки це залежить від функції, яку я додав після розміщення цього питання. Однак я думаю, що це досить акуратно.

+?1.\^H/

Демонстраційні демонстраційні та тестові приклади .


Чи є нова функція заміною ліміту?
xnor

@xnor Так: the ?1.
kirbyfan64sos

@Optimizer Чому? Ви все одно програєте Gema : O
kirbyfan64sos

Так :(. Побачив gema після публікації коментаря
Optimizer

1

Пітон 2, 74 + 2 = 76 байт

Я спробував кілька підходів до цього часу, це найкраще, що я міг придумати до цих пір.

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

4
Звідки беруться ці 2 зайві байти?
xnor

Введення @xnor повинно бути оточене цитатами, щоб це працювало. Я забув поставити це на посаді.
Каде

1
Я думаю, що звичайна умова полягала в тому, щоб дозволити безперешкодні аргументи в котируваннях, але я не зовсім впевнений.
xnor

1

Свинка, 84 байт

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

Можливо, це може бути скорочене як функцію (1 байт мені вдалося зберегти при швидкому тестуванні), але мені якось подобається однолінійний аспект ... :-)

Підтяжки походять від аромату свинки Intersystems Cache, що саме я найбільше знаю.


1

Java - 123 байти

Мені особисто подобається g---1найкраща частина.

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

розширений (злегка):

  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

Пакет - 138 байт

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

Перший рядок - це спосіб збереження декількох байт на довгий @echo off&setLocal enableDelayedExpansion(який вимикає відлуння та дозволяє затримати розширення змінних, якщо вам було цікаво). Я пояснив це в Порадих щодо гольфу в Партії .

Другий рядок - це акуратний маленький трюк для збереження символу управління заднім простором у змінну. Це досить хакі, і я не можу претендувати на те, що беру на це кредит. Це свого роду пояснено тут . В основному використовує команду prompt для створення символу резервної області та захоплює його змінною - у цьому випадку !D!.

Заключний рядок виконує просту маніпуляцію з рядком - замінити ^Hна !D!<SPACE>!D!.

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

На жаль, він розривається із справами на кшталт "AAA^HB^H^H"- де він повинен виробляти "A", він замість цього виробляє "A"B. Що дещо заплутано. Мені доведеться вивчити, як працює маніпуляція Batch string на деякій більшій глибині.

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

Завдяки деяким корисним людям тут - я тепер усвідомлюю, що я зберігав лише символ зворотного простору (0x08), і так лише переписував символи. Тепер він працює з такими прикладами:

C:\>bsp.bat "AAA^HB^H^H"
"A"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.