バックハンド^ H ^ H ^ H ^ H ^ H ^ Hspaces


47

一部の端末では、バックスペースを押すと^H、前の文字を削除するための制御コードが生成されます。これにより、編集がコメディ効果を装ってこっけいなイディオムが発生しました

この愚か者に親切にしてください^ H ^ H ^ H ^ H紳士、彼は本社から訪問しています。

1つ以上^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

リーダーボード

これは、MartinBüttnerの厚意による言語別のリーダーボードです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# 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が戻ってきて私を悩ませる
デジタルトラウマ

回答:


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
誰が現れたのか見てください!Maria Tidal Tug ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H Digital Trauma!
アレックスA.

@AlexA。冗談がありませんか?
user253751

@immibis:質問に関するDigital Traumaのコメントを参照してください。
アレックスA.

sed -r ':;s/(^|.)\^H//;t'-これは余分な6バイトの費用で動作します
-aragaer

@aragaerなぜそれが必要なのですか?OPは、「空のテキストではバックスペースが発生しない」と述べています^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

Gema、6バイト

?#\^H=

サンプル実行:

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

CW、愚か者対紳士の例は非常に長い時間がかかります。(1日後に殺されます。おそらくインタープリターに不具合がありますか?ここにある他のすべての例は、ほんの数秒で処理されます。)Gemaの再帰パターンは再帰レベルの影響を受けませんが。


言語へのリンクはありますか?Githubでのクイック検索はかなりの数になりました
Sp3000

承知しました。gema.sourceforge.net(ところで、Gemaプロジェクトは
2003

再帰の深さは一致しない文字列の長さと等しくなると\^H思います。なぜなら、マッチするまで何度も繰り返し、一度に1文字ずつ一致するから?です。
-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
これは本当に賢いことでした。私が気づいたいくつかのこと:グローバルはすでにゼロに初期化されているのでjforループで初期化する必要はありません(もちろんそれは単回使用ですが、ルールにはそれについて何も表示されません:))。割り当てと減分を組み合わせることもできます:j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47バイト)
コールキャメロン


@undergroundmonorail dang、私はそれを逃したかどうかを確認するためにダブルチェックしていました。私はまだゴルフをコーディングするのは初めてですが、将来のために覚えています:)。情報をありがとう!
コールキャメロン

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
私はあなたが2つのケースを交換することでバイトを保存することができると思う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

更新:jimmy23013のおかげで1バイト節約

こちらからオンラインでお試しください


2
1バイト短縮:W\ts
jimmy23013

11

網膜、13バイト

網膜

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

2行はそれぞれのファイルに移動する必要がありますが、-sフラグを使用して1つのファイルとしてコードを実行できます。

各ステップ.\^Hで、文字列の最初の一致を削除します。+削除が行われないまでこれを(修飾子を使用して)繰り返します。


ただの好奇心:をキャプチャするのはなぜ(.*)変更されていないように見えるのですか?
マナトワーク

1
@manatworkこの方法では、最初の.\^Hステップのみを1ステップでキャプチャします。それ以外の場合abc^H^H^Hab^、最初のステップの後になります。
randomra

4
置換制限をまだ実装していないことをおologiesびします(おそらくのようなものを許可します+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
デニス

ありがとう、デニス。redoどういうわけか、私のスキルセットには入りませんでした。それを変更する必要があります。
マナトワーク

2
@Dennisのバージョンは、ループまたは{ }ブロック内の唯一のステートメントである場合にのみ(意図したとおりに)動作することに注意してください。(これが機能する理由perl -pは、-pスイッチがコードをwhileループ内に自動的にラップするためです。)Kevinのバージョンはどのような設定でも機能します。
イルマリカロネン

9

ジュリア、58 42 41バイト

マナトワークのおかげで16バイト、グレンOのおかげで1バイト節約されました!

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

これにより、文字列を受け入れて文字列を返す再帰関数が作成されます。

これにより^H、入力にが含まれて^いる間、一度に1つの出現が空の文字列に置き換えられます。

例:

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

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

ジュリアを野生で見たのはこれが初めてです。いいね!
-Ogaday

8

REGXY、10バイト

正規表現置換ベースの言語であるREGXYを使用します。^ Hが後に続く文字を何も置き換えません。次に、前の行へのポインターである2行目が実行され、一致が失敗するまで置換が繰り返されます。

/.\^H//
//

これは上記のリンクのサンプルインタープリターで正しくコンパイルおよび実行されますが、言語仕様のあいまいさの前提に依存しているため、ソリューションはおそらく少し生意気です。仕様では、各行の最初のトークン(/の前)がラベルとして機能しますが、nullラベルポインターは、nullラベル(つまり、その「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'

ちょっと...それはかなりきちんとしている。
アレックスヴァンリュー

+=ループ内で動作します
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/

おかげで:

  • グローバル変数の使用を提案するためのVentero(-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私はこれを見るまでRubyの答えを出そうと思っていました-これが得られるほど小さいと確信しています。の素晴らしい使い方[]
daniero

最初に別のバージョンがありました。loop{$_[/.\^H/]=""}rescue""これは、Rubyの例外処理のクールさを示しているため、より優れています。
マナトワーク

ハハ、それは素晴らしいものです:)
daniero

1
絶対に遅れるよりも良い:$_=$`+$'while~/.\^H/20(regexp literal in condition警告を気にしない場合は、チルダを削除することもできます)。
ヴェンテロ

1
@manatwork:技術的にそれはすべてのRubyのバージョンで表示されます> = 1.9(条件における正規表現と文字列リテラルは1.8後に廃止され)、私はあなたの推測rubyのに対し、単にまだデフォルト1.8 irb用途は2.1.5ルビー。
ヴェンテロ

4

Python 2、50

lambdaそこに秒があることは少し奇妙ですが、これまでのところ最高のPythonのようです。

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


3

TeaScript、7バイト[非競合]

このチャレンジが投稿された後にTeaScriptが作成されたため、競合ません。これは参照としてここにあります。

xW/.\^H

これは、新しいTeaScript 3を使用し、再帰的に置き換えて文字を削除します


1
何らかの理由であるためISO 8859のリンクのリーダーボード上の8859バイトとしてこのカウント...
ev3commander

regerence?xD-

2

K5、64バイト

Kは、この種の作業用に実際には設計されていません...

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

2

golflua、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
最短ではなく、さらに機能しません(テストケースのいずれかを試してください)。正規表現はグローバルであってはなりません(/ gを削除)
edc65

@ 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)
lrn

@lm 2番目のパラメーター「」を追加して置換する必要があります。その後、私の答えがあります:)
edc65

本当です。そして、空の文字列引数が存在する必要があります、間違ったバージョンをコピーしたに違いありません:(
lrn

~s.indexOf`^H`になることができます/\^H/.test(s)
チャールズではない


2

(ビジュアル)FoxPro任意のバージョン80バイト

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

^ Hを見つけて1文字をバックアップすることにより、文字列変換を空に繰り返します。


2

ジュリア、41 39バイト

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

デリミタとして^ Hを使用し、各文字列の最後の文字を削除してから、次の文字列を連結してから最後の文字を再度削除しています。他のジュリアの答えとは異なり、これは再帰的な関数ではありません。

注:定義から関数名を削除しました。もともと、f(s)=ではなく、と言っていましたがs->、あなたはそれをf("AAA^HB^H^H")... として使用しましたが、私はそれを「匿名」にして2バイト節約し、その名前として自分自身を使用しています。次のように使用します。

(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はい:?1
kirbyfan64sos

@Optimizerなぜですか?とにかくGemaに負けています。:O
kirbyfan64sos

うん:(。コメントを投稿した後、ジェマを見た
オプティマイザー

1

Python 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バイトを保存できました)。

ブレースは、私が最も興味を持っているMumpsの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(これにより、エコーがオフになり、不思議に思った場合に備えて変数の遅延展開が可能になります)。バッチでのゴルフのヒントで説明しました。

2行目は、バックスペース制御文字を変数に保存するためのすてきな小さなトリックです。それはかなりハックであり、私はそれを信用するふりをすることはできません。ここで説明します。基本的にpromptコマンドを使用してバックスペース文字を生成し、変数にキャプチャします(この場合)!D!

最後の行は、-replace ^Hwithの単純な文字列操作を実行し!D!<SPACE>!D!ます。

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

残念ながら、次のような場合に壊れます"AAA^HB^H^H"-どこで生成するか"A"、代わりに生成し"A"Bます。これはやや混乱しています。バッチ文字列操作がどのように機能するかをもう少し詳しく調べる必要があります。

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

ここにいる親切な人々のおかげで、バックスペース文字(0x08)のみを保存し、文字を上書きするだけであることがわかりました。次のような例で動作するようになりました。

C:\>bsp.bat "AAA^HB^H^H"
"A"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.