Pada beberapa terminal, menekan backspace menghasilkan kode kontrol ^H
untuk menghapus karakter sebelumnya. Ini memunculkan idiom snarky di mana pengeditan dibuat-buat untuk efek komedi :
Bersikap baik kepada orang bodoh ini ^ H ^ H ^ H ^ Hgentleman, dia mengunjungi dari kantor pusat perusahaan.
Diberikan string dengan satu atau lebih ^H
, output hasil backspacing pada masing-masing ^H
. Input hanya akan menggunakan karakter yang dapat dicetak (ASCII 32-126), dan ^
hanya akan muncul sebagai ^H
. Spasi mundur tidak akan pernah terjadi pada teks kosong.
Anda mungkin tidak berasumsi bahwa lingkungan output mendukung kode kontrol, khususnya kode 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
Papan peringkat
Berikut adalah papan peringkat berdasarkan bahasa, milik Martin Büttner .
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
# 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
validA
.Jawaban:
GNU sed, 11 byte
Output tes:
sumber
sed -r ':;s/(^|.)\^H//;t'
- ini bekerja dengan mengorbankan tambahan 6 byte^H
awal dari string adalah backspace pada teks kosong.Pyth, 11 byte
Demonstrasi.
sumber
Gema, 6 byte
Contoh dijalankan:
CW, karena contoh bodoh vs pria terlalu lama. (Dibunuh setelah sehari. Mungkin kesalahan pada penerjemah? Semua contoh lain di sini diproses dalam fraksi detik.) Pola rekursif Gema tampaknya tidak terpengaruh oleh tingkat rekursi, tetapi jumlah teks yang tidak cocok meningkatkan waktu pemrosesan secara eksponensial. .
sumber
\^H
maches, mencocokkan satu karakter pada satu waktu dengan yang lainnya?
.C, 52 byte
Kami mendefinisikan fungsi
f
yang mengambil pointer ke string sebagai input. Setelah pemanggilan fungsi, penunjuk itu akan berisi string yang dimodifikasi.Tes sederhana:
Cetakan di atas:
sumber
j
difor
loop Anda (tentu saja itu penggunaan tunggal, tapi saya tidak melihat apa-apa tentang itu dalam aturan :)). Anda juga dapat menggabungkan tugas dengan pengurangan:j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}
(47 bytes)s--, j+=3
dan operator diutamakan, itu tidak berfungsi dengan benar.Haskell, 47 byte
Menentukan fungsi
f :: String -> String
. Bagaimana itu bekerja:sumber
h
dan melakukanh(x,_)=x
untuk kasus string kosong.CJam,
1413 byteBagaimana itu bekerja
PEMBARUAN: 1 byte disimpan berkat jimmy23013
Cobalah online di sini
sumber
W\ts
.Retina, 13 byte
Retina
Dua baris harus menuju ke file mereka sendiri tetapi Anda dapat menjalankan kode sebagai satu file dengan
-s
bendera.Pada setiap langkah kami menghapus kecocokan pertama
.\^H
dalam string. Kami ulangi ini (dengan+
modifikator) hingga tidak ada penghapusan yang terjadi.sumber
(.*)
, karena tampaknya hanya dimasukkan kembali tidak berubah?.\^H
dalam satu langkah. Kalau tidak,abc^H^H^H
akan menghasilkanab^
setelah langkah pertama.+1`.\^H
). ;)JavaScript ( ES6 ), 39 byte
sumber
Perl,
201615 byte(14 karakter kode + 1 opsi opsi perintah karakter.)
Contoh dijalankan:
sumber
1while s/.\^H//
s/.\^H//&&redo
redo
entah bagaimana tidak masuk ke set keahlian saya. Harus mengubah itu.{ }
blok. (Alasan mengapa ia bekerjaperl -p
adalah karena-p
saklar secara otomatis membungkus kode Anda di dalam satuwhile
lingkaran.) Versi Kevin bekerja dalam pengaturan apa pun.Julia,
584241 byteDisimpan 16 byte berkat manatwork dan 1 berkat Glen O!
Ini menciptakan fungsi rekursif yang menerima string dan mengembalikan string.
Ini menggantikan satu kejadian
^H
sekaligus dengan string kosong saat input berisi^
.Contoh:
sumber
REGXY, 10 byte
Menggunakan REGXY , bahasa berbasis pengganti regex. Mengganti karakter apa pun yang diikuti oleh ^ H dengan tidak ada. Baris kedua kemudian mengeksekusi yang hanya sebuah penunjuk ke baris sebelumnya, mengulangi subtitusi sampai gagal mencocokkan.
Ini mengkompilasi dan mengeksekusi dengan benar dengan contoh juru bahasa pada tautan di atas, tetapi solusinya mungkin agak kurang ajar karena bergantung pada asumsi dalam ketidakjelasan spesifikasi bahasa. Spec menyatakan bahwa token pertama pada setiap baris (sebelum /) bertindak sebagai label, tetapi asumsinya adalah bahwa penunjuk label nol akan menunjuk kembali ke perintah pertama dalam file dengan label nol (atau dengan kata lain, bahwa 'nol' adalah label yang valid). Solusi yang kurang sopan adalah:
Yang berjumlah 13 byte.
sumber
Python 3, 53 byte
Tetapi secara pribadi saya lebih suka versi wordier ini:
Yang menarik adalah itu
benar-benar bekerja dan memberi
'Back'
, jadi saya mencoba memetakan^H -> [:-1]
dan char lainnyac -> 'c'
saat itueval
, tetapi sayangnya Anda tidak dapat memiliki string setelahnya tanpa+
, jadi ini gagal:sumber
+=
bekerja di loopo=o[:-1]+x
, bukano=o+x
o[:-2]=x
bekerja?str
Haskell,
5247 byteContoh penggunaan:
Bagaimana itu bekerja:
sumber
Ruby,
272420 byte(19 karakter kode + 1 opsi baris perintah karakter.)
Terimakasih untuk:
Contoh dijalankan:
sumber
[]
!loop{$_[/.\^H/]=""}rescue""
Yang ini lebih bagus karena menunjukkan pengecualian Ruby menangani kesejukan.$_=$`+$'while~/.\^H/
untuk 20 (Anda bahkan dapat menjatuhkan tilde jika Anda tidak peduli tentangregexp literal in condition
peringatan itu).ruby
masih default 1,8, sedangkanirb
menggunakan ruby 2.1.5.Python 2, 50
Agak aneh memiliki yang kedua
lambda
di sana, tetapi tampaknya menjadi Python terbaik sejauh ini.sumber
Pyth - 19 byte
Mengurangi bekerja dengan sangat, sangat baik dengan ini, tetapi itu hanya melakukan satu karakter pada satu waktu jadi saya harus menghabiskan hampir sebanyak karakter sebagai algo sebenarnya untuk melakukan penggantian
^H
dengan linebreak. Mencari cara yang lebih baik untuk melakukan itu.Cobalah online di sini .
sumber
TeaScript , 7 byte [Tidak bersaing]
Tidak bersaing karena TeaScript dibuat setelah tantangan ini diposting. Ini di sini sebagai referensi.
Ini menggunakan TeaScript 3 baru, dan diganti secara rekursif untuk menghapus karakter
sumber
regerence
? xDK5, 64 byte
K tidak benar-benar dirancang untuk pekerjaan semacam ini ...
sumber
golflua, 36 byte
Contoh dijalankan:
sumber
Javascript, 62 byte
Bukan yang terpendek, tetapi berfungsi dengan baik.
Ini mungkin bisa dipersingkat banyak!
sumber
R,
5452 byteIde dasar yang sama dengan jawaban Julia saya . Ini menciptakan fungsi rekursif yang menerima string dan mengembalikan string. Jika input sama dengan dirinya sendiri dengan satu kali penghapusan
^H
dihapus, kembalikan, atau panggil fungsi tersebut kembali.Anda dapat mencobanya secara online !
sumber
ECMAScript 6, 57 byte
Ini
mungkin golf, hanya memikirkan caramungkin tidaksumber
s=>{while(s!=(s=s.replace(/.\^H/,""));return s}
?while
danreturn
terlalu lama, ini bisa bersifat rekursif:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
~s.indexOf`^H`
bisa menjadi/\^H/.test(s)
Java,
7877 bytesumber
(Visual) FoxPro versi 80 byte apa pun
Mengulang terjemahan string menjadi kosong dengan menemukan ^ H dan mencadangkan satu karakter.
sumber
Julia,
4139 byteApa yang dilakukan adalah menggunakan ^ H sebagai pembatas, dan kemudian menghapus karakter terakhir pada setiap string kemudian menyatukan string berikutnya sebelum menghapus karakter terakhir lagi. Tidak seperti jawaban Julia lainnya, ini bukan fungsi rekursif.
Catatan: Saya telah menghapus nama fungsi dari definisi. Awalnya, katanya
f(s)=
bukans->
, dan Anda menggunakannya sebagaif("AAA^HB^H^H")
... tapi saya menyimpan dua byte dengan membiarkannya menjadi "anonim", dan gunakan sendiri sebagai namanya. Anda menggunakannya seperti ini:(Anda juga dapat menetapkan variabel sebagai
f=s->foldl((t,v)->chop(t)v,split(s,"^H"))
, laluf("AAA^HB^H^H")
akan berfungsi)sumber
rs, 8 byte
Secara teknis, ini tidak masuk hitungan, karena ini tergantung pada fitur yang saya tambahkan setelah pertanyaan ini diposting. Namun, saya pikir itu cukup rapi.
Demo langsung dan uji kasus .
sumber
?1
.Python 2, 74 + 2 = 76 Bytes
Saya sudah mencoba beberapa pendekatan sejauh ini, ini adalah yang terbaik yang bisa saya dapatkan sejauh ini.
sumber
Mumps, 84 Bytes
Ini mungkin bisa dibuat lebih pendek sebagai fungsi (1 byte saya dapat menyimpan dalam pengujian cepat) tapi saya agak suka aspek satu-liner ... :-)
Kawat gigi berasal dari rasa Intersystems Cache of Mumps yang merupakan hal yang paling saya fahami.
sumber
Java - 123 byte
Saya pribadi suka
g---1
bagian yang terbaik.diperluas (sedikit):
sumber
Gelombang - 138 byte
Baris pertama adalah cara untuk menghemat beberapa byte lebih lama
@echo off&setLocal enableDelayedExpansion
(yang mematikan gema dan memungkinkan ekspansi variabel tertunda, jika Anda bertanya-tanya). Saya menjelaskannya dalam Tips untuk Golf di Batch .Baris kedua adalah trik kecil yang rapi untuk menyimpan karakter kontrol backspace ke dalam variabel. Ini sangat berantakan, dan saya tidak bisa berpura-pura mengambil kredit untuk itu. Ini semacam dijelaskan di sini . Pada dasarnya menggunakan perintah prompt untuk menghasilkan karakter backspace dan menangkapnya dalam variabel - dalam hal ini
!D!
.Baris terakhir kemudian melakukan manipulasi string sederhana - ganti
^H
dengan!D!<SPACE>!D!
.Sayangnya itu rusak dengan kasus-kasus seperti"AAA^HB^H^H"
- di mana ia harus berproduksi"A"
, itu malah menghasilkan"A"B
. Yang agak membingungkan. Saya harus melihat bagaimana manipulasi string Batch bekerja lebih dalam lagi.Terima kasih kepada beberapa orang yang membantu di sini - Saya sekarang menyadari bahwa saya hanya menyimpan karakter backspace (0x08), dan begitu juga hanya menimpa karakter. Sekarang berfungsi dengan contoh-contoh seperti berikut:
sumber