W niektórych terminalach naciśnięcie klawisza Backspace generuje kod sterujący, ^H
aby usunąć poprzedni znak. To dało początek ponuremu idiomowi, w którym udaje się wprowadzać zmiany w celu uzyskania efektu komediowego :
Bądź miły dla tego głupca ^ H ^ H ^ H ^ Hgentleman, który odwiedza z siedziby głównej firmy.
Biorąc pod uwagę ciąg z jednym lub więcej ^H
, wypisuje wynik cofania na każdym z nich ^H
. Dane wejściowe będą używać tylko znaków drukowalnych (ASCII 32-126) i ^
będą wyświetlane tylko jako ^H
. Backspace nigdy nie będzie się pojawiał na pustym tekście.
Nie można zakładać, że środowisko wyjściowe obsługuje kody sterujące, w szczególności kod cofania \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
Tabela liderów
Oto tabela liderów według języków, dzięki uprzejmości Martina Büttnera .
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# 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
ważny?A
.Odpowiedzi:
GNU sed, 11 bajtów
Wyjście testowe:
źródło
sed -r ':;s/(^|.)\^H//;t'
- działa to kosztem dodatkowych 6 bajtów^H
początkiem łańcucha jest backspace na pustym tekście.Pyth, 11 bajtów
Demonstracja.
źródło
Gema, 6 bajtów
Przykładowy przebieg:
CW, ponieważ przykład głupiec kontra dżentelmen trwa zbyt długo. (Zabity po dniu. Może usterka w tłumaczu? Wszystkie inne przykłady są przetwarzane w ułamkach sekund.) Poziom rekurencji nie wydaje się mieć wpływu na wzór rekurencyjny Gemy, ale ilość niepasującego tekstu wydłuża wykładniczo czas przetwarzania .
źródło
\^H
maczug, dopasowując jeden znak na raz do?
.C, 52 bajty
Definiujemy funkcję,
f
która pobiera wskaźnik do łańcucha jako dane wejściowe. Po wywołaniu funkcji wskaźnik ten będzie zawierał zmodyfikowany ciąg.Prosty test:
Powyższe wydruki:
źródło
j
w swojejfor
pętli (oczywiście wtedy jest to jednorazowe użycie, ale nie widzę nic w tym w regułach :)). Możesz także połączyć to zadanie ze zmniejszeniem:j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}
(47 bajtów)s--, j+=3
i pierwszeństwo operatora nie działa poprawnie.Haskell, 47 bajtów
Definiuje funkcję
f :: String -> String
. Jak to działa:źródło
h
i wykonująch(x,_)=x
dla pustego ciągu znaków.CJam,
1413 bajtówJak to działa
AKTUALIZACJA: 1 bajt zapisany dzięki jimmy23013
Wypróbuj online tutaj
źródło
W\ts
.Siatkówka, 13 bajtów
Siatkówka oka
Dwie linie powinny przejść do własnych plików, ale możesz uruchomić kod jako jeden plik z
-s
flagą.Na każdym kroku usuwamy pierwsze dopasowanie dla
.\^H
ciągu. Powtarzamy to (z+
modyfikatorem), dopóki nie nastąpi usunięcie.źródło
(.*)
, jak się wydaje, po prostu odsunięte bez zmian?.\^H
w jednym kroku. W przeciwnym razieabc^H^H^H
spowodowałoby toab^
po pierwszym kroku.+1`.\^H
). ;)JavaScript ( ES6 ), 39 bajtów
źródło
Perl,
201615 bajtów(Kod 14 znaków + opcja wiersza poleceń 1 znak).
Przykładowy przebieg:
źródło
1while s/.\^H//
s/.\^H//&&redo
redo
jakoś nie trafił do mojego zestawu umiejętności. Będę musiał to zmienić.{ }
bloku. (Powodem, dla którego działa,perl -p
jest to, że-p
przełącznik automatycznie otacza kod wwhile
pętli.) Wersja Kevina działa w każdym ustawieniu.Julia,
584241 bajtówZaoszczędzono 16 bajtów dzięki manatwork i 1 dzięki Glen O!
Tworzy to funkcję rekurencyjną, która akceptuje ciąg i zwraca ciąg.
Zastępuje to jedno wystąpienie
^H
naraz pustym łańcuchem, gdy dane wejściowe zawierają^
.Przykłady:
źródło
REGXY, 10 bajtów
Używa REGXY , języka opartego na podstawieniu wyrażenia regularnego. Zastępuje dowolny znak, po którym następuje ^ H, niczym. Następnie wykonywana jest druga linia, która jest tylko wskaźnikiem do poprzedniej linii, powtarzając podstawienie, dopóki nie dopasuje się.
To kompiluje się i wykonuje poprawnie z przykładowym tłumaczem w powyższym linku, ale rozwiązanie jest być może nieco bezczelne, ponieważ opiera się na założeniu niejasności specyfikacji języka. Specyfikacja określa, że pierwszy token w każdym wierszu (przed /) działa jak etykieta, ale zakłada się, że pusty wskaźnik-wskaźnik wskaże z powrotem pierwsze polecenie w pliku z pustą etykietą (lub innymi słowy, że „null” jest prawidłową etykietą). Mniej bezczelnym rozwiązaniem byłoby:
Co odpowiada 13 bajtom.
źródło
Python 3, 53 bajty
Ale osobiście bardziej podoba mi się ta bardziej sformułowana wersja:
Ciekawe jest to, że
faktycznie działa i daje
'Back'
, więc starałem się map^H -> [:-1]
i innych charc -> 'c'
wtedyeval
, ale niestety nie można mieć żadnych ciągów potem bez+
, więc to się nie powiedzie:źródło
+=
działa w pętlio=o[:-1]+x
not noto=o+x
o[:-2]=x
działa?str
Haskell,
5247 bajtówPrzykład użycia:
Jak to działa:
źródło
Ruby,
272420 bajtów(Kod 19 znaków + opcja wiersza poleceń 1 znak.)
Dzięki:
Przykładowy przebieg:
źródło
[]
!loop{$_[/.\^H/]=""}rescue""
ta jest ładniejsza, ponieważ pokazuje wyjątkowość Ruby dotyczącą obsługi.$_=$`+$'while~/.\^H/
za 20 (możesz nawet upuścić tyldę, jeśli nie obchodzi cięregexp literal in condition
ostrzeżenie).ruby
po prostu nadal domyślnie 1.8, podczas gdyirb
używa Ruby 2.1.5.Python 2, 50
To trochę dziwne, mając sekundę
lambda
, ale wydaje się być najlepszym jak dotąd Pythonem.źródło
Pyth - 19 bajtów
Zmniejszenie działa naprawdę, bardzo dobrze z tym, ale robi tylko jeden znak na raz, więc musiałem wydać prawie tyle znaków, ile rzeczywisty algo, aby zastąpić
^H
łamanie linii. Szukasz lepszego sposobu na zrobienie tego.Wypróbuj online tutaj .
źródło
TeaScript , 7 bajtów [nie konkuruje]
Nie konkuruje, ponieważ TeaScript powstał po opublikowaniu tego wyzwania. To jest tutaj jako odniesienie.
Wykorzystuje nowy TeaScript 3 i rekurencyjne zamienia, aby usunąć znaki
źródło
regerence
? xDK5, 64 bajty
K tak naprawdę nie jest przeznaczony do tego rodzaju pracy ...
źródło
golflua, 36 bajtów
Przykładowy przebieg:
źródło
JavaScript, 62 bajty
Nie najkrótszy, ale działa dobrze.
Prawdopodobnie można to znacznie skrócić!
źródło
R,
5452 bajtówTen sam podstawowy pomysł, co moja odpowiedź Julii . Tworzy to funkcję rekurencyjną, która akceptuje ciąg i zwraca ciąg. Jeśli dane wejściowe są sobie równe z jednym wystąpieniem
^H
usuniętego, zwróć je, w przeciwnym razie ponownie wywołaj funkcję.Możesz spróbować online !
źródło
ECMAScript 6, 57 bajtów
Jest to
prawdopodobnie gra w golfa, po prostu wymyślę sposób, któryprawdopodobnie nieźródło
s=>{while(s!=(s=s.replace(/.\^H/,""));return s}
?while
ireturn
są zbyt długie, może być rekurencyjne:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
~s.indexOf`^H`
może stać się/\^H/.test(s)
Java,
7877 bajtówźródło
(Wizualnie) FoxPro dowolna wersja 80 bajtów
Powtarzanie tłumaczenia ciągu znaków na pusty przez znalezienie ^ H i utworzenie kopii zapasowej jednego znaku.
źródło
Julia,
4139 bajtówWykorzystuje ^ H jako separator, a następnie usuwa ostatni znak z każdego łańcucha, a następnie konkatenuje następny łańcuch przed usunięciem ostatniego znaku. W przeciwieństwie do innych odpowiedzi Julii, nie jest to funkcja rekurencyjna.
Uwaga: usunąłem nazwę funkcji z definicji. Początkowo było to napisane
f(s)=
zamiasts->
, a ty użyłeś go jakof("AAA^HB^H^H")
... ale oszczędzam dwa bajty, pozwalając, aby był "anonimowy" i używał siebie jako nazwy. Używasz go w ten sposób:(możesz także przypisać do niego zmienną, ponieważ
f=s->foldl((t,v)->chop(t)v,split(s,"^H"))
wtedyf("AAA^HB^H^H")
będzie działać)źródło
rs, 8 bajtów
Technicznie nie ma to znaczenia, ponieważ zależy to od funkcji dodanej po opublikowaniu tego pytania. Myślę jednak, że jest całkiem fajnie.
Prezentacje na żywo i przypadki testowe .
źródło
?1
.Python 2, 74 + 2 = 76 bajtów
Do tej pory wypróbowałem kilka podejść, jest to najlepsze, jakie udało mi się do tej pory wymyślić.
źródło
Świnka, 84 bajtów
To może być prawdopodobnie krótsze jako funkcja (1 bajt, który udało mi się zapisać w szybkich testach), ale trochę podoba mi się aspekt jednowierszowy ... :-)
Aparat ortodontyczny pochodzi ze smaku Mumps Intersystems Cache, w którym jestem najbardziej zaznajomiony.
źródło
Java - 123 bajty
Osobiście najbardziej podoba mi się ta
g---1
część.rozwinięty (nieznacznie):
źródło
Partia - 138 bajtów
Pierwszy wiersz to sposób na zaoszczędzenie kilku bajtów na dłuższą metę
@echo off&setLocal enableDelayedExpansion
(która wyłącza echo i umożliwia opóźnione rozszerzanie zmiennych, jeśli się zastanawiasz). Wyjaśniłem to w Poradach do gry w golfa w partii .Druga linia to fajna sztuczka polegająca na zapisaniu znaku kontrolnego backspace w zmiennej. To dość zuchwałe i nie mogę udawać, że się za to uznam. To jest trochę wyjaśnione tutaj . Zasadniczo używa polecenia zachęty do wygenerowania znaku cofania i przechwytuje go w zmiennej - w tym przypadku
!D!
.Ostatni wiersz następnie wykonuje prostą manipulację ciąg - wymienić
^H
z!D!<SPACE>!D!
.Niestety łamie się z przypadkami takimi jak"AAA^HB^H^H"
- tam, gdzie powinien produkować"A"
, zamiast tego produkuje"A"B
. Co jest nieco mylące. Będę musiał przyjrzeć się, jak manipulowanie ciągiem wsadowym działa bardziej szczegółowo.Dzięki kilku pomocnym osobom tutaj - teraz zdaję sobie sprawę, że zapisywałem tylko znak backspace (0x08), a więc tylko nadpisywałem postacie. Działa teraz z następującymi przykładami:
źródło