ประชด ^ ^ H H ^ ^ H H ^ ^ H Hspaces


47

ในบางเทอร์มินัลการกด backspace สร้างรหัสควบคุม^Hเพื่อลบอักขระก่อนหน้า สิ่งนี้ก่อให้เกิดสำนวนที่น่าสะอิดสะเอียนต่อกันซึ่งการแก้ไขถูกแกล้งเพื่อให้ได้ผลที่ตลกขบขัน :

เป็นคนดีกับคนโง่คนนี้ ^ H ^ H ^ H ^ Hgentleman เขากำลังเยี่ยมชมจากกองบัญชาการองค์กร

ได้รับสตริงที่มีหนึ่งหรือมากกว่าหนึ่ง^Hของการส่งออกผลมาจากการ backspacing ^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

ลีดเดอร์บอร์ด

นี่เป็นลีดเดอร์โดยภาษามารยาทของมาร์ตินBüttner

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


4
คือAAA^HB^H^Hถูกต้อง?
นาธานเมอร์ริลล์

@NathanMerrill Aใช่และมันจะส่งผลใน
xnor

3
ฉันสงสัยว่าเรตินาจะทำได้ดีที่นี่
Claudiu

1
@Falize: "Backspaces จะไม่เกิดขึ้นกับข้อความเปล่า"
Maltysen

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
ดูสิว่าใครปรากฏตัว! มันคือ Tidal Tug จากมาเรีย ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ การบาดเจ็บ HDigital!
Alex A.

@AlexA ฉันคิดถึงเรื่องตลกหรือเปล่า?
user253751


sed -r ':;s/(^|.)\^H//;t'- ใช้งานได้โดยมีค่าใช้จ่ายเพิ่มเติม 6 ไบต์
aragaer

@aragaer ทำไมถึงจำเป็น? OP กล่าวว่า " Backspaces จะไม่เกิดขึ้นกับข้อความว่างเปล่า " ฉันคิดว่า^Hจุดเริ่มต้นของสตริงคือ backspace บนข้อความว่างเปล่า
บาดเจ็บทางดิจิทัล

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 เนื่องจากตัวอย่างคนโง่กับสุภาพบุรุษใช้เวลานานเกินไป (ถูกฆ่าตายหลังจากหนึ่งวันอาจเป็นความผิดพลาดในล่ามหรือไม่ตัวอย่างอื่น ๆ ที่นี่ได้รับการประมวลผลในเวลาไม่กี่วินาที) รูปแบบการเรียกซ้ำของ Gema ดูเหมือนจะไม่ได้รับผลกระทบจากระดับการเรียกซ้ำ แต่จำนวนข้อความที่ไม่ตรงกัน .


มีลิงค์ไปยังภาษาหรือไม่ การค้นหาอย่างรวดเร็วของ Github กลับกลายเป็นค่อนข้างน้อย
Sp3000

แน่ใจ gema.sourceforge.net (BTW, โครงการ Gema ได้รับการจดทะเบียน 2003-10-27 ในขณะที่ GitHub เปิดตัว 2008-04-10 ซึ่งอาจเป็นเหตุผลที่ไม่พบที่นั่น)
จัดการ

ผมเชื่อว่าลึกเรียกซ้ำตัวเองเป็นอย่างเท่าเทียมกันกับความยาวของสตริงที่ไม่ตรงกันเพราะมันจะ recurse อีกครั้งและอีกครั้งจนกว่า\^Hmaches ?ที่ตรงกับตัวละครตัวหนึ่งในช่วงเวลาที่จะมี
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 bytes)
Cole Cameron


@undergroundmonorail แดงฉันแค่ตรวจสอบอีกครั้งเพื่อดูว่าฉันพลาดหรือเปล่า ฉันยังใหม่กับการเขียนโค้ดกอล์ฟ แต่ฉันจะจำมันไว้สำหรับอนาคต :) ขอบคุณสำหรับข้อมูล!
Cole Cameron

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สำหรับกรณีสตริงว่าง
Zgarb

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
@ การจัดการด้วยวิธีนี้เราจะจับภาพแรก.\^Hในขั้นตอนเดียวเท่านั้น มิฉะนั้นabc^H^H^Hจะส่งผลให้ab^หลังจากขั้นตอนแรก
Randomra

4
ขออภัยที่ยังไม่ได้ใช้งานขีด จำกัด การแทนที่ (ซึ่งอาจจะอนุญาตให้คล้าย+1`.\^H) ;)
Martin Ender

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//
Kevin Reid

ว้าว! ยอดเยี่ยม @KevinReid ขอขอบคุณ.
จัดการ

1
อีกหนึ่ง:s/.\^H//&&redo
Dennis

ขอบคุณ @Dennis redoอย่างใดไม่ได้เข้าไปในชุดทักษะของฉัน จะต้องเปลี่ยนว่า
จัดการ

2
โปรดทราบว่าเวอร์ชันของ @ Dennis จะใช้งานได้ (ตามที่ตั้งใจ) หากเป็นคำสั่งเฉพาะภายในลูปหรือ{ }บล็อก (เหตุผลที่ใช้งานได้ก็perl -pคือ-pสวิตช์จะล้อมโค้ดของคุณไว้ในwhileลูปโดยอัตโนมัติ) เวอร์ชั่นของเควินทำงานได้ในทุกการตั้งค่า
Ilmari Karonen

9

Julia, 58 42 41 ไบต์

บันทึกแล้ว 16 ไบต์ขอบคุณ manatwork และ 1 ขอบคุณ Glen O!

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"

นี่เป็นครั้งแรกที่ฉันเห็นจูเลียอยู่ในป่า ดี!
Ogaday

8

REGXY ขนาด 10 ไบต์

ใช้REGXYซึ่งเป็นภาษาที่ใช้ในการทดแทน regex แทนที่อักขระใด ๆ ตามด้วย ^ H ด้วย nothing บรรทัดที่สองจากนั้นเรียกใช้งานซึ่งเป็นเพียงตัวชี้ไปยังบรรทัดก่อนหน้าทำซ้ำการแทนที่จนกว่าจะไม่ตรงกัน

/.\^H//
//

สิ่งนี้รวบรวมและดำเนินการอย่างถูกต้องกับล่ามตัวอย่างในลิงค์ด้านบน แต่วิธีการแก้ปัญหาอาจจะหน้าด้านเล็กน้อยเนื่องจากต้องอาศัยข้อสันนิษฐานในความคลุมเครือของข้อกำหนดภาษา ข้อมูลจำเพาะระบุว่าโทเค็นแรกในแต่ละบรรทัด (ก่อนหน้า /) ทำหน้าที่เป็นเลเบล แต่ข้อสันนิษฐานคือตัวชี้เลเบลตัวชี้จะชี้กลับไปที่คำสั่งแรกในไฟล์ที่มีเลเบล null (หรือกล่าวอีกนัยหนึ่งคือ นั่นคือ 'โมฆะ' เป็นป้ายกำกับที่ถูกต้อง) วิธีแก้ปัญหาหน้าด้านที่น้อยกว่าคือ:

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

ซึ่งมีขนาดเท่ากับ 13 ไบต์


7

Python 3, 53 ไบต์

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

แต่โดยส่วนตัวฉันชอบรุ่น wordier นี้ดีกว่า:

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แต่น่าเสียดายที่คุณไม่มีสตริงใด ๆ หลังจากนั้นหากไม่มี a +ดังนั้นสิ่งนี้จึงล้มเหลว:

'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

Ruby, 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 ฉันคิดว่าฉันจะทำคำตอบทับทิมจนกระทั่งฉันเห็นสิ่งนี้ - ฉันค่อนข้างแน่ใจว่ามันมีขนาดเล็กเท่าที่จะได้รับ การใช้งานที่ยอดเยี่ยมของ[]!
daniero

มีอีกเวอร์ชั่นหนึ่งในตอนแรก: loop{$_[/.\^H/]=""}rescue""อันนี้ดีกว่าเพราะมันแสดงให้เห็นถึงข้อยกเว้นของ Ruby ที่จัดการความเยือกเย็น
จัดการ

ฮ่า ๆ ว่าเป็นหนึ่งที่ดี :)
daniero

1
ดีกว่าไม่สาย: $_=$`+$'while~/.\^H/สำหรับ 20 (คุณสามารถปล่อยเครื่องหมายตัวหนอนหากคุณไม่สนใจregexp literal in conditionคำเตือน)
Ventero

1
@ การผลิตเชิงเทคนิค: มันปรากฏในทุกรุ่นทับทิม> = 1.9 (regex และตัวอักษรสตริงในเงื่อนไขถูกคัดค้านหลังจาก 1.8) ฉันเดาว่าคุณrubyยังคงใช้ค่าเริ่มต้น 1.8 ในขณะที่irbใช้ทับทิม 2.1.5
Ventero

4

Python 2, 50

มันค่อนข้างแปลกที่มีlambdaอยู่ในนั้น แต่ดูเหมือนจะเป็นงูหลามที่ดีที่สุดจนถึงตอนนี้

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

3

Pyth - 19 ไบต์

ลดผลงานได้ดีจริง ๆ กับสิ่งนี้ แต่ทำทีละตัวเท่านั้นดังนั้นฉันจึงต้องใช้เวลาเกือบทุกตัวอักษรให้ได้มากเท่ากับ algo จริง ๆ เพื่อแทนที่^Hด้วย linebreak กำลังมองหาวิธีที่ดีกว่าในการทำเช่นนั้น

u?+GHnHbPGjbcz"^H"k

ลองมันออนไลน์ได้ที่นี่


3

TeaScript , 7 ไบต์ [ไม่แข่งขัน]

การแข่งขันไม่เป็น TeaScript ถูกสร้างขึ้นหลังจากความท้าทายนี้ถูกโพสต์ นี่คือการอ้างอิง

xW/.\^H

สิ่งนี้ใช้ TeaScript 3 ใหม่และแทนที่ซ้ำเพื่อลบอักขระ


1
ด้วยเหตุผลบางอย่างนี้นับเป็น 8859 ไบต์บนลีดเดอร์บอร์ดเนื่องจากลิงก์ ISO 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
ไม่ใช่อันที่สั้นที่สุดและใช้งานไม่ได้ (ลองใช้กรณีทดสอบ) regexp ไม่ควรอยู่ในระดับโลก (ลบ / g)
edc65

@ edc65 ขอบคุณสำหรับเคล็ดลับ ฉันลองบางสิ่งและพวกเขาก็ทำงาน นั่นเป็นเหตุผลที่ฉันโพสต์แบบนั้น
Ismael Miguel

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}ล่ะ
lnn

หรือถ้าwhileและreturnมีความยาวเกินไปก็อาจจะเรียกซ้ำ:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
LRN

@lm คุณควรเพิ่มพารามิเตอร์ตัวที่สอง "" เพื่อแทนที่ ถ้าอย่างนั้นคุณจะได้คำตอบของฉัน :)
edc65

จริง และอาร์กิวเมนต์สตริงว่างต้องอยู่ที่นั่นฉันต้องคัดลอกเวอร์ชั่นผิด :(
lrn

~s.indexOf`^H`สามารถกลายเป็น/\^H/.test(s)
ไม่ใช่ว่า Charles

2

Java, 78 77 ไบต์

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

1
คุณสามารถลบช่องว่างหลังเครื่องหมายจุลภาคเพื่อบันทึกหนึ่งอักขระ
ProgramFOX

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 และสำรองอักขระหนึ่งตัว


2

Julia, 41 39 ไบต์

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

สิ่งที่มันทำคือการใช้ ^ H เป็นตัวคั่นแล้วเอาอักขระตัวสุดท้ายในแต่ละสายแล้วเชื่อมต่อสายอักขระถัดไปก่อนที่จะลบอักขระตัวสุดท้ายอีกครั้ง ต่างจากคำตอบ Julia อื่น ๆ นี่ไม่ใช่ฟังก์ชั่นวนซ้ำ

หมายเหตุ: ฉันได้ลบชื่อฟังก์ชันออกจากคำจำกัดความแล้ว แต่เดิมมันบอกว่า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 ?1ใช่ที่:
kirbyfan64sos

@Optimizer ทำไม? คุณกำลังแพ้ Gema อยู่ดี : O
kirbyfan64sos

ใช่ :(. เห็น gema หลังจากโพสต์ความคิดเห็น
เครื่องมือเพิ่มประสิทธิภาพ

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
ไบต์พิเศษเหล่านั้นมาจากไหน
xnor

@xnor input ต้องล้อมรอบด้วยเครื่องหมายคำพูดเพื่อให้ทำงานได้ ฉันลืมใส่ไว้ในโพสต์
Kade

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 ของคางทูมซึ่งเป็นสิ่งที่ฉันเชี่ยวชาญมากที่สุด


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(ซึ่งจะปิดเสียงก้องและเปิดใช้งานการขยายตัวของตัวแปรล่าช้าในกรณีที่คุณสงสัย) ผมอธิบายไว้ในเคล็ดลับสำหรับการเล่นกอล์ฟในชุด

บรรทัดที่สองเป็นเคล็ดลับเล็กน้อยในการบันทึกอักขระควบคุม backspace ลงในตัวแปร มันค่อนข้างแฮ็คและฉันไม่สามารถทำเป็นเครดิตได้ การจัดเรียงของมันอธิบายที่นี่ โดยทั่วไปใช้คำสั่ง prompt เพื่อสร้างตัวอักษร backspace และจับมันในตัวแปร - ในกรณี!D!นี้

บรรทัดสุดท้ายแล้วจะดำเนินการจัดการสตริงที่เรียบง่ายของ - แทนที่ด้วย^H!D!<SPACE>!D!

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

แต่น่าเสียดายที่จะแบ่งกับกรณีเช่น"AAA^HB^H^H"- ที่มันควรจะผลิตก็ผลิตแทน"A" "A"Bซึ่งค่อนข้างสับสน ฉันจะต้องดูว่าการจัดการสตริง Batch ทำงานอย่างไรในเชิงลึกยิ่งขึ้น

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

ต้องขอขอบคุณผู้คนที่เป็นประโยชน์ที่นี่ - ตอนนี้ฉันรู้แล้วว่าฉันเพิ่งบันทึกอักขระ backspace (0x08) เท่านั้นและดังนั้นจึงเป็นการเขียนทับอักขระเท่านั้น ตอนนี้มันทำงานได้กับตัวอย่างดังนี้:

C:\>bsp.bat "AAA^HB^H^H"
"A"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.