Twoim zadaniem jest symulacja kilku naciśnięć klawiszy wprowadzanych przez użytkownika.
Wkład
Tablica lub ciąg znaków z wybranym ogranicznikiem (spoza zakresu 32-126) zawierający co najmniej jedno „naciśnięcie klawisza”.
Ta tablica będzie zawierać tylko dwa typy ciągów: pasywne naciśnięcia klawiszy (pojedyncze znaki) i polecenia (znaki w nawiasach kwadratowych [ ]
).
- Pasywne naciśnięcia klawiszy
- Kody znaków ASCII
[32-126]
- Kody znaków ASCII
- Polecenia:
[B]
: backspace (usuń ostatni dodany znak, jeśli taki istnieje)[C]
: skopiuj wszystko, co już zostało napisane[D]
: usuń wszystko, co zostało napisane[P]
: wklej to, co zostało skopiowane
Wydajność
Ciąg produkowany przez naciśnięcia klawiszy.
Przykłady
['H', 'e', 'l', 'l', 'o'] -> 'Hello'
['H', 'e', 'l', 'l', 'o', ' ', '[C]', '[P]'] -> 'Hello Hello '
['[D]', 'D', '[B]'] -> ''
['H', '[C]', 'i', '[P]', '[C]', '[P]'] -> 'HiHHiH'
['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'b', '[P]', '[P]', 's', '!'] -> I like bees!
['N', '[P]'] -> 'N'
['#', '5', '0', 'K', '0', '0', '1', '[D]', '#', 'n', 'o', 't'] -> '#not'
['H', 'o', 'w', ' ', '[D]', 'H', 'e', 'y'] -> 'Hey'
['s', 'u', 'd', '[B]', 'p', '[C]', '[D]', 'I', ' ' , 'h', 'a', 'v', 'e', ' ', '[P]', 'p', 'e', 'r', '!'] -> 'I have supper!'
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
[D]
którym nie jest to jedyny używany, więc kod nie będzie po prostusplit('[D]')[1]
ani czymś innym .[D]
Odpowiedzi:
05AB1E ,
34333127 bajtówWykorzystuje kodowanie CP-1252 .
Wypróbuj online!
Wyjaśnienie
Pary funkcji ocenione w powyższym kodzie to:
Zaoszczędzono 4 bajty przy użyciu
mod 5
sztuczki z odpowiedzi Lynn CJamźródło
Klawisze Vim,
76, 64, 62, 58Dzięki Loovjo za uratowanie 7 naciśnięć klawiszy
Czy ktoś powiedział, że symuluje naciśnięcia klawiszy? Dobrze więc, że jest to dobra rzecz, mój ulubiony język do golfa w to wszystko o symulowanie klawiszy!
Dane wejściowe są w tym formacie:
To dość prosta odpowiedź. To po prostu tłumaczy każde „polecenie” na skrót klawiaturowy vim tego polecenia. Weźmy to linia po linii.
To oszczędza tonę bajtów. Vim ma wbudowaną „linię poleceń”, w której możesz tworzyć mapowania, zmieniać ustawienia, zapisywać pliki itp. Tutaj tworzymy mapowanie.
:no
oznacza skrót „:nnoremap
co oznacza, że kiedy jesteśmy w trybie normalnym, zamień tę lewą stronę na prawą”. Ponieważ dzwonimy:%s/
pięć razy , to dużo oszczędza. To\M
niezła sztuczka. Oznacza to, że następujące wyszukiwanie będzie „Very No Magic”, co oznacza, że regex[B]
będzie pasował do dosłownego tekstu,[B]
a nie do zakresu zawierającego tylko B. Ponieważ większość poleceń zastępczych ma w nawiasach kwadratowych, wypełniamy pierwsze.Następnie wywołujemy pięć poleceń zastępczych. Warto zauważyć, dlaczego dzwoniłem
<C-v>
tyle razy. Postacie podoba<esc>
,<C-v>
,<C-r>
, itd. Są niedrukowalnych znaków i musi być wpisane w wierszu polecenia z<C-v>
.[B]: backspace. Ten jest dość łatwy. Po prostu zamień każdy
[B]
zCtrl-h
nich na ekwiwalent backspace w vimie.[C]: skopiuj wszystko, co już zostało napisane. To jest przetłumaczone na
<esc>0y$A
. To znaczy:Moglibyśmy prawie po prostu zrobić
Y
zamiast tego,0y$
co oznacza „szarpać całą linię”, ale to także przyciąga nową linię, której nie chcemy.[D]: usuń wszystko, co zostało napisane. Jest
<esc>"_S
. Tak jak poprzednio,<esc>
wychodzi z trybu wstawiania, dzięki czemu możemy uruchamiać polecenia. Jest kilka rzeczy, które są tutaj wygodniejsze. Tak robimy[P]: wklej to, co zostało skopiowane. Ten jest również bardzo prosty. To tylko
<C-r>"
co oznaczaInsert the contents of register '"'
."
okazuje się być głównym rejestrem, na który „y”.Po przetłumaczeniu wszystkich poleceń musimy połączyć wszystkie wiersze razem, usuwając wszystkie znaki nowego wiersza. Dzięki naszemu mapowaniu to jest po prostu
<bs>
Jest to Backspace (ASCII 0x08) i musimy ją ze względu na[
to wypełnione.Do tej pory przetłumaczyliśmy dane wejściowe na kod vim i wystarczy je uruchomić. Więc my:
źródło
<C-r>
udokumentowano efekt trybu Wstaw ?:h mode_keystroke
. W tym przypadku byłoby to:h i_ctrl-r
/g
flagą. Dodam te szczegóły.0ii<esc>D@"
robi?CJam , 33 bajty
Wypróbuj online!
Wyjaśnienie
1>3b
Mapy „funkcji skrótu”[B]
do 291 (= 1 mod 5),[D]
do 297 (= 2 mod 5),[P]
do 333 (= 3 mod 5),[C]
do 294 (= 4 mod 5).Ta wartość (mod 5) jest używana jako indeks do listy fragmentów kodu CJam:
h
jednoznakowych"h"
zwracany jest fragment , który wypycha ciąg stosów jednoznakowych na stos.[B]
ten fragment;
jest zwracany, który pojawia się element.[D]
ten fragment];
jest zwracany, który czyści stos.[P]
ten fragmentL~
jest zwracany, który dołącza zmiennąL
na stosie.[C]
ten fragment]:L~
jest zwracany, który przechowuje aktualną stosu w zmiennejL
.Te fragmenty są łączone i wykonywane; ostatni stos jest drukowany domyślnie przez CJam.
L
jest początkowo pustą listą, więc bufor kopiowania jest początkowo „pusty”.źródło
Python 2,
969593 bajtówźródło
or"E"
do definicjix
oszczędzania miejsca?x
nie jest tego warte.x=="C"
Może po prostu byćo=="[C]"
.Galaretka ,
50 5148 bajtówTryItOnline
Lub wszystkie przypadki testowe
W jaki sposób?
Na przykład
- z kapitałem
'B'
jako przypadek testowy, ponieważ zanim naprawiłem błąd, wróciłby"I likeees!"
źródło
['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']
.JavaScript (ES6),
84807776 bajtówZaoszczędź 3 bajty dzięki @Neil, 1 więcej dzięki @ edc65
.map
ma dwa bajty dłużej:Testowy fragment kodu
Pokaż fragment kodu
źródło
reduce
wersji za pomocą(s,[c,z])
..map
wersji.x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')
1 bajt mniej. Co ciekawe, niezdefiniowany <jakikolwiek znak jest fałszywyx=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")
ratuje jeszcze jedną postać. Jeśli z jest prawdą, wklej, w przeciwnym razie dodaj char do wyniku.z?s+t:s+c
czyli o 1 bajt więcej niżs+=z?t:c
Perl,
5350 bajtówObejmuje +1 dla
-p
Podaj dane wejściowe STDIN zakończone znakami nowej linii (ostatni znak nowej linii może zostać pominięty, więc liczy się jako ciąg oddzielony znakami nowej linii):
daje
keystrokes.pl
:Prawie złapałem odpowiedź galaretki, ale diabeł uciekł do 48 bajtów ...
źródło
Python
120 119116 bajtówIdeone
Funkcja rekurencyjna z wejściem,
s
lista naciśnięć klawiszy.Każde połączenie rekurencyjne aktualizuje tekst zwrotny
r
, aw przypadku[C]
schowka,c
ażs
będzie pusty.Nowe wartości
r
ic
są uznane przez indeksowanie w słowniku,{...}
i przekazywane z rozpakowaniu*
. Pasywne naciśnięcia klawiszys[0][1:2]
zwrócą pusty ciąg, a''
zamiast tego zostanie użyty klucz .źródło
lambda s,r='',c=''
zamiast definicji lambdalambda s,r,c=''
?s
), więc funkcja musi działać bez żadnych innych danych wejściowych.Haskell,
136 133 130127 bajtówWypróbuj na Ideone.
Objaśnienie:
k
wykonuje rekursję ogona na liście poleceń.b
to bufor, w którym skonstruowany jest ciąg,c
zapisuje skopiowaną część.Edycja: Aby zapisać niektóre bajty, polecenia
[B][C][D][P]
nie są już dokładnie dopasowane, ale porównywane: mniej niż'C'
? ->B
i tak dalej. Dzięki @nimi za zapisanie 3 bajtów.źródło
init b
zgłasza wyjątek, jeślib
jest pustą listą.Mathematica, 100 bajtów
Funkcja anonimowa. Pobiera listę ciągów wejściowych i zwraca ciąg wyjściowy. Zignoruj wygenerowane wiadomości.
źródło
Java 7,
207203 bajtówZ pewnością można to jeszcze trochę pograć w golfa,
ale to moja pierwsza odpowiedź.zastąpionych przezequals
Dokonam edycji po znalezieniu czegoś do usunięcia tych -prawdzeń ..charAt
, ale prawdopodobnie nadal można grać w golfa ..Kod niepoznany i testowy:
Wypróbuj tutaj.
Wydajność:
źródło
PHP, 131 bajtów
17 bajtów zapisanych przez trójskładnikowego operatora @IsmaelMiguel
źródło
<?$c=[];foreach($_GET[a]as$k=>$v)$v=="[P]"?$o=array_merge($o,$c):($v=="[C]"?$c=$o:($v=="[B]"?array_pop($o):$v=="[D]"?$o=[]:$o[]=$v));echo join($o);
. (zastąpił całyif()
łańcuch łańcuchem operacji szkoleniowych).PHP, 108 bajtów
Wykorzystuje podejście oparte na łańcuchach, a nie na tablicy.
Użyj jak:
edit: zapisano 8 bajtów, zmieniając kolejność znaków?: s i czyniąc je ujemnymi, aby uniknąć konieczności używania tylu nawiasów;
źródło
$s=$argv[++$i]
zamiastnull!==$s=$argv[++$i]
jeśli używasz PHP> 7, możesz napisać,$s=$argv[++$i]??0
aby pominąć ogłoszenie'0'
zobaczenie, jak'0'
fałszywe. Jest tak wiele innych uwag, że pominięcie tego w szczególności wydaje się stratą czasu.SpecBAS - 216 bajtów
Dane wejściowe są podawane jako ciąg znaków z przecinkami, które są następnie przekształcane w tablicę.
źródło
V , 49 bajtów
Wypróbuj online!
Ponieważ zawiera znaki niedrukowalne, oto zrzut heksowy:
To tylko bezpośrednie tłumaczenie mojej odpowiedzi vima , abym mógł konkurować z Jelly. Niestety, wciąż jestem o jeden bajt, ale wciąż pracuję nad ostatnim. :)
W każdym razie jestem bardziej dumny z tej odpowiedzi, więc jeśli chcesz uzyskać bardzo szczegółowe wyjaśnienie, przeczytaj je zamiast tego.
źródło
Właściwie 56 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Java, 181
Bardziej czytelna wersja:
źródło
if(s.length()>1){...}else
p==1
nap<2
MATL , 46 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
TCL, 186 bajtów
Ładnie sformatowany:
Chciałem tylko udowodnić, że mogę to zrobić w TCL
źródło
foreach
nalmap
;return
przezset x
. Oto, co mogę powiedzieć na pierwszy rzut oka.Scala, 158 bajtów
Nie golfowany:
Rozwiązuje ten problem jako fałd z wynikiem, a schowek jako akumulator. Niestety, scala nie ma trójskładnikowego operatora warunkowego, ale zamiast tego używa go
if else
jako wyrażenia.źródło
PHP 7.1,
9592 bajtówUwaga: wymaga PHP 7.1 do kompensacji ciągów ujemnych.
Bez ujemnych przesunięć łańcucha (101 bajtów):
Uruchom tak:
Wyjaśnienie
Poprawki
źródło