Tuş vuruşlarını simüle edin


33

İşiniz, kullanıcının girdiği birkaç tuş vuruşunu simüle etmektir.

Giriş

En az bir 'tuş vuruşu' içeren bir sınırlayıcı dizi veya sınırlayıcıya sahip bir dizi (32-126 aralığı dışında).

Bu dizi yalnızca iki tür dize içerecektir: pasif tuş vuruşlarını (tek karakter) ve komutları (köşeli parantez içindeki karakter [ ]).

  • Pasif tuş vuruşları
    1. ASCII karakter kodları [32-126]
  • Komutlar:
    1. [B] : backspace (varsa bir tane eklenen son karakteri kaldır)
    2. [C] : önceden yazılmış olanları kopyala
    3. [D] : yazılanların hepsini sil
    4. [P] : kopyalananı yapıştır

Çıktı

Tuş vuruşları tarafından üretilen dize.

Örnekler

['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!'

Bu , bayt cinsinden en kısa kod kazanır!


Bilginize Kodumda bir hata buldum, arılar için B harfiyle bir test davası önerebilir miyim :)
Jonathan Allan

Aynı zamanda [D], kullanılanın sadece olmadığı bir örnek olmalı , bu yüzden kod sadece olmayacak split('[D]')[1].
mbomb007

@ mbomb007, test vakaları ekledim (# 8, # 9)
Daniel

Ve sanırım mbomb007, çoklu silme işlemleriyle bir test davası istiyordu.
Martin Ender

@MartinEnder, ah, başka komutların olduğu bir tanesini istediğini düşünmüştüm[D]
Daniel

Yanıtlar:


7

05AB1E , 34 33 31 27 bayt

CP-1252 kodlamasını kullanır .

õUvygiyJë"XJ¨DU\"4äyáÇ5%è.V

Çevrimiçi deneyin!

açıklama

õU                                  # initialize X as the empty string
v                                   # for each y in input
 ygiyJ                              # if len(y) == 1 join y with stack
      ë                             # else
       "XJ¨DU\"                     # push this string
               4ä                   # split into 4 parts (of size [2,1,2,1])
                 yá                 # push only letters of y
                   Ç5%              # mod its ascii code by 5
                      è             # index into the string above with this
                       .V           # evaluate as 05AB1E code

Yukarıdaki kodda değerlendirilen fonksiyon çiftleri şunlardır:

DU    # [C] -> duplicate and store in X
XJ    # [P] -> push X and join with stack
¨     # [B] -> remove last char of string
\     # [D] -> remove top of stack 

Lynn'in CJam cevapmod 5 hilesi kullanarak 4 bayt kurtardı


34

Vim, 76, 64, 62 , 58 tuş vuruşlarını

7 tuş vuruşunu kurtardığı için Loovjo'ya teşekkürler


Birisi tuş vuruşlarını taklit etti mi dedi ? O zaman, golf oynamak için en sevdiğim dil, tuş vuruşlarını simüle etmekle ilgili iyi bir şey !

:no s :%s/\M[
sB]/<C-v><C-h>
sC]/<C-v><esc>0y$A
sD]/<C-v><esc>"_S
sP]/<C-v><C-r>"
s<bs>\n
S<C-r>"

Giriş bu biçimde gelir:

h
e
l
l
o

[C]
[P]

Bu oldukça basit bir cevap. Sadece her bir "komutu" sadece bu komutun vim tuş vuruşuna çevirir. Satır satır atalım.

:no s :%s/\M[

Bu bir ton bayt kazandırır . Vim'de harita oluşturabileceğiniz, ayarları değiştirebileceğiniz, dosyaları kaydedebileceğiniz vb. Yerleşik bir "komut satırı" vardır. Burada bir harita oluşturuyoruz. :nokısaca :nnoremap"normal moddayken bu sol tarafı bu sağ tarafla değiştir." anlamına gelir. :%s/ Beş farklı kez aradığımız için , bu çok tasarruf sağlıyor. \MGüzel bir hile. Bu, aşağıdaki aramanın "Çok Büyülü Değil" [B]olacağı anlamına gelir; bu, regex'in içinde [B]yalnızca B içeren bir aralık yerine değişmez metinle eşleşeceği anlamına gelir . İkame komutlarının çoğunluğu içinde parantez içerdiğinden, ilkini doldururuz.

Sonra beş yedek komut çağırırız. Neden <C-v>bu kadar çok aradığımı belirtmeye değer . Karakterler gibi <esc>, <C-v>, <C-r>vb basılamaz karakterler ve komut satırına yazılmalıdır <C-v>.

  • [B]: geri al. Bu oldukça kolay. Bunun için her bir ikame [B]ile Ctrl-hvim geriye doğru eşdeğer olan.

  • [C]: önceden yazılmış olanları kopyala. Bu çevrilmiştir <esc>0y$A. Bunun anlamı:

    <esc>      " Escape to normal mode
         0     " Move to the beginning of this line
          y$   " Yank to the end of the line
            A  " Re enter insert mode at the end of this line.
    

    Neredeyse basitçe bunun Yyerine 0y$"bütün çizgiyi aşmak" anlamına gelebilirdi , ama bu istemediğimiz yeni bir çizgiyi de kapar.

  • [D]: Yazılanların hepsini sil. Bu <esc>"_S. Daha önce olduğu gibi, <esc>insert modundan çıkar , böylece komutları çalıştırabiliriz. Burada daha uygun olan bazı şeyler var. Öyleyse yapıyoruz

      S         " Delete this whole line and enter insert mode again
    "_          " Send it to 'the black hole register'. This is just so that we don't overwrite the main register.
    
  • [P]: kopyalananı yapıştırın. Bu da çok basit. Sadece <C-r>"bu demektir Insert the contents of register '"'. "'y' için çektiğiniz ana kayıt olur.

Artık tüm komutları çevirdiğimize göre, tüm yeni satır karakterlerini kaldırarak tüm satırları bir araya getirmeliyiz. Haritamız sayesinde, bu sadece

s<bs>\n

Bu <bs>bir geri dönüş (ASCII 0x08) ve [doldurduğumuz için ona ihtiyacımız var .

Şimdiye kadar, girişi vim koduna çevirdik ve sadece çalıştırmamız gerekiyor. Yani biz:

S           " Delete this whole line and enter insert mode
 <C-r>"     " Insert the keystrokes of register '"' as if they were typed by the user

<C-r>Belge ekleme modu etkisi nerede ?
Neil

1
@Neil Genel olarak, adresindeki belirli bir mod için bir anahtar bulabilirsiniz :h mode_keystroke. Bu durumda, olurdu:h i_ctrl-r
DJMcMayhem

@Loovjo Oh üzgünüm, söylemeyi unuttum. Girişin birden fazla satırda olması bekleniyor; böylece virgül veya /gbayrak konusunda endişelenmeme gerek kalmıyor . Bu detayları ekleyeceğim.
DJMcMayhem

2
Ayrıca, ne yapar 0ii<esc>D@"?
Loovjo

1
Eşlemeler, ha? :) detaylı açıklama için teşekkürler, her zaman yeni bir şeyler öğrenirim!
Christian Rondeau,

9

CJam , 33 bayt

q~{_[`';"];""L~""]:L~"]\1>3b=}%s~

Çevrimiçi deneyin!

açıklama

q~                                  Read an evaluate input list.
  {                          }%     Map over each string in it:
   _                                 Duplicate the string, say S.
    [`';"];""L~""]:L~"]              Replace it the following list:
                                      [repr(S) '; "];" "L~" "]:L~"]
                       \             Bring S on top of the stack.
                        1>           Chop off the first char.
                          3b         Base-3 conversion.
                            =        Modular index into the list.
                               s~   Concatenate and run as CJam code.

“Karma fonksiyonu” 1>3bharitaları

  • tek karakterli dizgeler 0'a (= 0 mod 5),
  • [B]ila 291 (= 1 mod 5),
  • [D]ila 297 (= 2 mod 5),
  • [P]ila 333 (= 3 mod 5),
  • [C]ila 294 (= 4 mod 5).

Bu değer (mod 5), CJam kod parçacıklarının bir listesine dizin olarak kullanılır:

  • Tek karakterli dizgiler için, örneğin h, "h"tek karakterli bir dizgeyi yığına iten pasajı döndürülür.
  • Çünkü [B], ;bir öğeyi açan snippet döndürülür.
  • Çünkü yığını temizleyen [D]pasajı ];geri döndü.
  • Çünkü [P], yığına L~değişken ekleyen pasaj döndürülür L.
  • Çünkü geçerli yığını değişkende saklayan [C]pasajı ]:L~döndürülür L.

Bu snippet'ler birleştirildi ve yürütüldü; son yığın, örtük olarak CJam tarafından basılır. Lbaşlangıçta boş liste olduğundan, kopyalama arabelleği başlangıçta "boş" olur.


8

Python 2, 96 95 93 bayt

r=c=""
for o in input():c=[c,r][x=="[C]"];r=[r+c,r[:-1],r,"",r+o][ord(o[1:2]or"E")%5]
print r

Bir yer kazanmak or"E"için tanımına geçebilir misin x?
xnor

@ xnor Buna inanıyorum.
orlp

1
Aslında, tanımlamaya xdeğmez gibi görünüyor . x=="C"Sadece olabilir o=="[C]".
xnor

7

Jöle , 50 51 48 bayt

Ṿ”;;µṭ“Ṗ“ø©“ḣ0“;®”
L>1a2ị$i@“BCDP0”ịÇ
Ç€“⁶Ṗ©”;FV

TryItOnline
Veya tüm test durumları

Nasıl?

Ṿ”;;µṭ“Ṗ“ø©“ḣ0“;®” - Link 1, CreateCodeLookupValueList: keystroke
      “Ṗ“ø©“ḣ0“;®” - list of strings, ["Ṗ","ø©","ḣ0"";®"] - these are Jelly code for:
                         Ṗ  : pop (i.e. delete last entry)
                         ø© : niladic separation and copy to register (i.e. copy)
                         ḣ0 : head to 0 (i.e. delete all entries)
                         ;® : concatenate with value of register (i.e. paste)
    µ              - monadic chain separation
Ṿ                  - uneval - make a Jelly code version of the keystroke
                                               e.g. "I" -> "“I”"
 ”;                - string literal ";"                      |
   ;               - concatenate e.g. ";I"                   v
     ṭ             - tack, to make the list ["Ṗ","ø©",";®","“I”"] 
                             a keystroke - a command will evaluate to a string like
                             "“[C]”" but wont be accessed)

L>1a2ị$i@“BCDP0”ịÇ - Link 2, ConvertAKeystokeToJellyCodeString: keystroke
L>1                - length greater than 1? (i.e. isCommand?)
      $            - last two links as a monad
   a               - and
    2ị             - index 2 of the keystroke (0 due to and for a passive keystroke)
         “BCDP0”   - Literal string "BCP0"
       i@          - find first matching index of, with reversed arguments
                ị  - index into
                 Ç - call last link (1) as a monad (get code to replace this keystroke)

Ç€“⁶Ṗ©”;FV - Main link: list of keystrokes
Ç€         - call last link (2) as a monad (convert to Jelly code)
  “⁶Ṗ©”    - literal string "⁶Ṗ©" - setup the register with an empty string:
                 ⁶ :literal " ";
                 Ṗ : pop the space to give an empty string;
                 © : places it into the register
       ;   - concatenate (put that at the front)
        F  - flatten list (lists and strings are equivalent in Jelly)
         V - evaluate the string

Örneğin

The input:
    ['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'B', '[P]', '[P]', 's', '!']
Becomes the Jelly code:
    "⁶Ṗ©;“e”ø©Ṗ;“I”;“ ”;“l”;“i”;“k”;®;“ ”;“B”;®;®;“s”;“!”"
Which then evaluates to
    "I like Bees!"

- 'B'bir test davası olarak bir sermaye ile , bir hatayı düzelttim önce geri döndü olurdu"I likeees!"


1
Emin geçerli bir test durumu var değilim, ancak bir aşırı karmaşık dize ile çalıştı ve bu başarısız görünmektedir: ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!'].
Dom Hastings,

Ah - evet bu kenardaki davayı özledim, tüm dizgiyi silmeden önce bir kopyası var ve yazdığım kod yok sayar. Biraz sonra bakacağım, haber verdiğiniz için teşekkürler.
Jonathan Allan,

Tamam bunu düzelttim ve aslında baytları da kurtarıyor!
Jonathan Allan,

7

JavaScript (ES6), 84 80 77 76 bayt

@Neil sayesinde 3 byte kurtarıldı, @ edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,t="")

.map iki bayt daha uzun:

x=>x.map(([c,z])=>s=z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,s=t="")&&s

Test pasajı


Aradaki fark, reducesürümde 3 bayt kullanarak kaydedebilmenizdir (s,[c,z]).
Neil

@Neil Güzel! Bu da .mapsürümde bir bayt kaydeder .
ETHProductions 10:16

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')1 bayt daha az. Merakla tanımsız <herhangi bir karakter yanlıştır
edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")bir karakter daha kaydeder. Z, truthy ise yapıştır, aksi takdirde çıktıya char ekleyin.
Grax32

Yapıştırırken @Grax geçerli çıktıya eklemek zorunda, bu yüzden z?s+t:s+c1 byte daha fazlas+=z?t:c
edc65

5

Perl, 53 50 bayt

İçin +1 içerir -p

Yeni satırlarla sonlandırılan STDIN'e giriş verin (son satırsonu bırakılabilir, bu nedenle satırsonları ile ayrılmış bir dize olarak sayılır):

keystrokes.pl
H
e
[C]
[D]
a
b
[B]
[P]
z
^D

verir

aHez

keystrokes.pl:

#!/usr/bin/perl -p
$\.=/^.$/?$&:/P/?$a:(/C/?$a=$\:chop($\x=/B/))x0}{

Jelly yanıtını neredeyse yakaladı ama arkadaş 48 bayta kaçtı ...


4

Python 120 119 116 bayt

f=lambda s,r='',c='':f(s[1:],*{'B':(r[:-1],c),'C':(r,r),'D':('',c),'P':(r+c,c),'':(r+s[0],c)}[s[0][1:2]])if s else r

Ideone

Girdili tekrarlamalı bir fonksiyon s, tuş vuruşlarının bir listesi.

Her özyinelemeli çağrı, dönüş metnini günceller ve ra durumunda [C], pano boşalıncaya ckadar s.

'Nın yeni değerleri rve cbir sözlükte indekslenerek bulunur {...}ve paketten çıkarılarak *,. Pasif tuş vuruşları s[0][1:2]için boş bir dize döndürecek ve ''bunun yerine anahtar kullanılacaktır.


Lambda'yı neden lambda s,r='',c=''yerine tanımladığını sorabilir miyim lambda s,r,c=''?
L. Steer

Spesifikasyon, bir karakter girişi (burada s) aldığımızdan dolayı fonksiyonun başka bir giriş olmadan çalışması gerekir.
Jonathan Allan,

Özür dilerim, okuduğunu anlama hatası.
L. Steer

4

Haskell, 136 133 130 127 bayt

k c b(('[':m:_):i)|m<'C'=k c[q|b>"",q<-init b]i|m<'D'=k b b i|m<'P'=k c""i|1<3=k c(b++c)i
k c b(s:i)=k c(b++s)i
k c b[]=b
k""""

Ideone'da dene.

Açıklama: k bir komut listesi üzerinde kuyruk özyinelemesi gerçekleştirir. bdizenin yapıldığı tampon cise kopyalanan kısmı kaydeder.

k c b ("[B]":i) = k c (take(length b - 1)b) i -- remove last element of buffer
k c b ("[C]":i) = k b b i                     -- set copy to buffer
k c b ("[D]":i) = k c "" i                    -- clear the buffer
k c b ("[P]":i) = k c (b++c) i                -- append content of copy to the buffer
k c b (s:i)     = k c (b++s) i                -- append char to the buffer
k c b []        = b                           -- command list is empty, return buffer
f = k "" ""                                   -- initialise copy and buffer with empty strings

Düzenleme: Bazı baytları kaydetmek için komutlar [B][C][D][P]artık tam olarak eşleşmiyor ama karşılaştırılıyor: daha az 'C'? -> Bvb. 3 byte tasarruf için @ nimi teşekkürler .


Boş liste init bise @ nimi bir istisna atar b.
Laikoni

@nimi Bu zekice, teşekkürler! Anonim işlev için bir şekilde anonim işlevlerin yalnızca tek ifade olduklarında ve başka hiçbir yardımcı işlev olmadığında kabul edilebilir olduğunu aklımdaydı. Ancak Meta aramaktan hiçbir şey çıkmadı, o yüzden sanırım tamam.
Laikoni

2
İşte burada . İşlevleri değerlendiren ifadeler için yardımcı işlevleri bildirmesine izin verilir.
nimi

3

Mathematica, 100 bayt

""<>Fold[Switch[#2,"[B]",Most@#~Check~{},"[C]",a=#,"[D]",{},"[P]",#~Join~a,_,Append@##]&,a={};{},#]&

Anonim işlev Dizelerin listesini girdi olarak alır ve çıktı olarak bir dizge döndürür. Oluşturulan mesajları yoksay.


2

Java 7, 207 203 bayt

String c(String[]a){String r="",c=r;for(String s:a){int k=s.length(),l=r.length(),z;if(k>1){z=s.charAt(1);r=z<67?l>0?r.substring(0,l-1):"":z<68?r:z<69?"":z<81?r+c:r+s;c=z==67?r:c;}r+=k<2?s:"";}return r;}

Bu kesinlikle biraz daha golf oynayabilir, ancak bu benim ilk cevabım. O- equalsçekleri kaldırmak için bir şey bulduktan sonra düzenleyeceğim .. ile değiştirildi charAt, ancak muhtemelen hala golf olabilir ..

Ungolfed ve test kodu:

Burada dene.

class M{
  static String c(final String[] a) {
    String r = "",
           c = r;
    for(String s : a){
      int k = s.length(),
          l = r.length(),
          z;
      if(k > 1){
        z = s.charAt(1);
        r = z < 67
             ? l > 0
                ? r.substring(0, l-1)
                : ""
             : z < 68
                ? r
                : z < 69
                   ? ""
                   : z < 81
                      ? r + c
                      : r + s;
        c = z == 67
             ? r
             : c;
      }
      r += k < 2
            ? s
            : "";
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o" }));
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o", " ", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "[D]", "D", "[B]" }));
    System.out.println(c(new String[]{ "H", "[C]", "i", "[P]", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "e", "[C]", "[B]", "I", " ", "l", "i", "k", "[P]", " ", "b", "[P]", "[P]", "s", "!" }));
    System.out.println(c(new String[]{ "N", "[P]" }));
    System.out.println(c(new String[]{ "#", "5", "0", "K", "0", "0", "1", "[D]", "#", "n", "o", "t" }));
    System.out.println(c(new String[]{ "H", "o", "w", " ", "[D]", "H", "e", "y" }));
    System.out.println(c(new String[]{ "s", "u", "d", "[B]", "p", "[C]", "[D]", "I", " ", "h", "a", "v", "e", " ", "[P]", "p", "e", "r", "!" }));
  }
}

Çıktı:

Hello
Hello Hello 

HiHHiH
I like bees!
N
#not
Hey
I have supper!

2

PHP, 131 Bayt

17 Bayt tasarruf @IsmaelMiguel üçlü operatör

<?$c=[];foreach($_GET[a]as$v)($t=$v[1])!=P?$t!=C?$t!=B?$t!=D?$o[]=$v:$o=[]:array_pop($o):$c=$o:$o=array_merge($o,$c);echo join($o);

1
147 bayt: <?$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);. (tüm if()zincirinizi bir zerre operasyonları zinciri ile değiştirdi ).
Ismael Miguel,

@ IsmaelMiguel Teşekkür Ederiz. Operatörü kullanma arzum yoktu
Jörg Hülsermann 9:16

Nedenini anlayabiliyorum. Çok çirkin görünüyor ve ... gerçekten göze zarar veren bir şey.
Ismael Miguel,

1

PHP, 108 bayt

for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;

Bir dizi tabanlı yerine bir dize tabanlı yaklaşım kullanır.

Gibi kullanın:

php -r "for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;" a b "[C]" "[B]" "[P]" "[C]" "[D]" j "[P]"

düzenleme:?: s sırasını kuran ve çok fazla parantez kullanmak zorunda kalmaktan kaçınmak için onları negatif yaparak kaydedilen 8 bayt;


$s=$argv[++$i]yerine null!==$s=$argv[++$i]PHP> 7 kullanıyorsanız yazabilirsiniz $s=$argv[++$i]??0haber atlamak
Jörg Hülsermann

1
Bildirimi atlamak için değil '0', nasıl '0'yanlış olduğunu görerek girmenize izin vermek için orada değil . Bunu atlamanın, özellikle de zaman kaybı gibi göründüğünü söyleyen çok fazla bildirim var.
user59178,

1

SpecBAS - 216 bayt

1 s$,t$="": INPUT a$: DIM b$(SPLIT a$,NOT ",")
2 FOR EACH l$ IN b$()
3 CASE l$
4 WHEN "[B]": s$=s$( TO LEN s$-1)
5 WHEN "[C]": t$=s$
6 WHEN "[D]": s$=""
7 WHEN "[P]": s$=s$+t$
8 OTHERWISE : s$=s$+l$
9 END CASE
10 NEXT l$: ?s$

Girdi, daha sonra diziye dönüştürülen virgül içeren bir dize olarak verilir.

görüntü tanımını buraya girin


1

V , 49 bayt

íÛBÝ/
íÛCÝ/0y$A
íÛDÝ/"_S
íÛPÝ/"
íî
0éiD@"

Çevrimiçi deneyin!

Bu yazdırılamayan karakterler içerdiğinden, burada bir hexdump:

0000000: eddb 42dd 2f16 080a eddb 43dd 2f16 1b30  ..B./.....C./..0
0000010: 7924 410a eddb 44dd 2f16 1b22 5f53 0aed  y$A...D./.."_S..
0000020: db50 dd2f 1612 220a edee 0a30 e969 4440  .P./.."....0.iD@
0000030: 22

Bu sadece vim cevabımın direkt bir çevirisidir, böylece Jelly ile rekabet edebiliyorum. Ne yazık ki, hala bir bayt bitti ama hala sonuncusu üzerinde çalışıyorum. :)

Yine de bu cevapla daha çok gurur duyuyorum, bu yüzden çok ayrıntılı bir açıklama istiyorsanız, bunun yerine bir tane okuyun.


1

Aslında, 56 bayt

''j"'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ''+ƒkΣR

Çevrimiçi deneyin!

Açıklama:

''j"'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ''+ƒkΣR
''j                                                       insert an apostrophe between every pair of commands
   "'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ         replace:
   "'[B]"'XaÆ                                               "'[B]" with "X"
             "'[C]""k;╗i"aÆ                                 "'[C]" with "k;╗i"
                           "'[P]""╜i"aÆ                     "'[P]" with "╜i"
                                       "'[D]"'éaÆ           "'[D]" with "é"
                                                 ''+      prepend an apostrophe
                                                          now the input has been converted to the equivalent Actually program ("'<character>" pushes the character, "X" removes the last character, "k;╗i" saves the current stack state to a register, and "╜i" pushes the saved stack state)
                                                    ƒ     execute the code
                                                     kΣ   concatenate the characters
                                                       R  reverse the string

1

Java, 181

String v(String[]a){String r="",c=r;for(String s:a){try{int p=s.charAt(1)%5;r=p<1?r+c:p>2?"":p==1?r.length()<2?"":r.split(".$")[0]:r;c=p==2?r:c;}catch(Exception e){r+=s;}}return r;}

Daha okunabilir sürüm:

String v(String[]a){
    String r="",c=r;
    for(String s:a){
        try{
            int p=s.charAt(1)%5;
            r= p<1
                 ? r+c
                 : p>2
                    ? ""
                    :p==1
                        ? r.length()<2
                                     ?""
                                     :r.split(".$")[0]
                        :r;
            c=p==2?r:c;
        }catch(Exception e){
            r+=s;
        }
    }return r;
}

Bir içine deneyin catch değiştirerek bazı byte (1 veya 2) kaydedebilirif(s.length()>1){...}else
AxelH

ve p==1içine değiştirinp<2
AxelH 11:16,

1

MATL , 46 bayt

vXKx"@gtnq?2)XJ66=?3L)}J67=?XK}J68=?vx}K]]]]&h

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

v                % Push empty array
XK               % Copy to clipboard K. This initiallizes it as empty
x                % Delete
"                % Implicitly input cell array. For each
  @g             % Push current cell's contents
  t              % Duplicate elements
  n              % Number of elements
  q?             % If more then 1
    2)           % Get second char. Copy to clipboard J
    66=?         % If it ss 'B'
      3L)        % Remove last element from string built up to now
    }            % Else
      J67=?      % If it was a 'C'
        XK       % Copy string built up to now into clipboard K
      }          % Else
        J68=?    % If was a 'D'
          vx     % Delete stack. This deletes string built up to now, if any
        }        % Else: it was a 'P'
          K      % Paste from clipboard K
        ]        % End if
      ]          % End if
    ]            % End if
  ]              % End if
  &h             % Horizontally concatenate stack
                 % Implicitly end for
                 % Implicitly display

1

TCL, 186 bayt

proc t w {foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;foreach g $w {eval "set c \$[string index ${g}N 1]";eval "set r \"$c\""};return $r}

Güzel biçimlendirilmiş:

proc t w {
    foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;
    foreach g $w {
        eval "set c \$[string index ${g}N 1]"
        eval "set r \"$c\""
    }
    return $r
}

Sadece bunu TCL’de yapabileceğimi kanıtlamak istedim.


Sen bayt kaydedebilirsiniz: yerine foreachgöre lmap; returntarafından set x. Hızlıca bir bakışta söyleyebileceğim bu.
sergiol,

1

Scala, 158 bayt

(i:Seq[String])=>(("","")/:i){case((a,c),k)=>if(k.size<2)(a+k,c)else
if(k=="[B]")(a dropRight 1,c)else
if(k=="[C]")(a,a)else
if(k=="[D]")("",c)else(a+c,c)}._1

Ungolfed:

(i:Seq[String]) => i.foldLeft(("", "")){
  case ((res,clipboard),key) =>
    if (k.size == 1) (res+key,clipboard)
    else if (k=="[B]") (res dropRight 1, clipboard)
    else if (k=="[C]") (res, res)
    else if (k=="[D]") ("", clipboard)else(acc+clipboard,clipboard)
}._1

Bu sorunu sonuçla birlikte bir kat olarak ve panoya akümülatör olarak çözer. Ne yazık ki, scala üçlü bir koşullu işlecine sahip değil, bunun yerine if elseifade olarak kullanılıyor.


1

PHP 7.1, 95 92 bayt

Not: Negatif string ofset için PHP 7.1 gerektirir.

for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;

Negatif dize ofsetleri olmadan (101 bayt):

php -r 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o=substr($o,0,-1):$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s ! 2>/dev/null;echo

Bu şekilde koş:

php -nr 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s !;echo
> I like bees!

açıklama

for(
  ;
  n|$i=$argv[++$x];   # Iterates over the input until null.
)
  ($l=$i[1])?         # Check if this item is a command, if so set to $l
    $l^r?             # If the command is not B
      $l^s?           # If the command is not C
        $l^t?         # If the command is not D
          $o.=$c      # Then it's P, so paste the clipboard ($c)
        :$o=""        #      It's D, so delete output
      :$c=$o          #      It's C, so copy output to clipboard
    :$o[-1]=""        #      It's B, so remove the last output char
  :$o.=$i;            # No command, add the current item to the output.

echo$o;               # Print the output.

Düzenlemeler

  • Çıktı işleme ile komut işleme birleştirilerek 3 bayt kurtarıldı

Bir PHP girişini ayrıntılı olarak açıkladığını görmek güzel :)
Emigna 10:16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.