Klavyemi simüle et


15

Klavyemle ilgili bir sorunum var (büyük olasılıkla tarayıcımla ilgili bir sorun). Yeni bir metin alanına tıklayıp yazmaya başladığım zamanlar tüm metinlerim geriye doğru çıkıyor. Çok kısa bir süre sonra (meydan okuma amacıyla, bunun 10 milisaniye olduğunu söyleyeceğiz), tekrar yazmaya devam eder. Yazmaya başladığımda imlecimin ilk başta hareket etmediği anlaşılıyor, böylece tüm harfler metin alanının başında ekleniyor.

Örneğin, yazıyor pythonolsaydım pytve ilk 10 milisaniyeyi yazsaydım sonuç

hontyp

Görev

İşiniz bu davranışı mümkün olduğunca az baytla simüle etmektir.

Giriş

Herhangi bir makul yöntemle girdi alabilirsiniz. Ancak girdiyi iki ayrı alan olarak alamazsınız. Program girişe izin vermeye başladığında 10 milisaniye gecikme başlamalıdır. Yani, girişe izin verilmeden önce, 10 milisaniyeye kadar sayılmaması gereken ön işleme sahip olabilirsiniz.

Zamanlamada, 10 milisaniyeyi ortalama aldığı ve makul bir şekilde belirlenen bir bilgisayarda zamanın% 1'inden daha fazla olmayan 1 milisaniyeden daha fazla kapalı olduğu sürece, bazı toleranslara izin verilir.

Çıktı

Uygun gördüğünüz yöntemde dizeyi çıktı olarak verebilirsiniz. Kullanıcı yazarken canlı olarak güncelleyebilir veya girdiyi bitirdikten sonra sonucu çıkarabilirsiniz (bir satırsonu veya dosya sonu ile ^D).

Test senaryoları

Bunlardan bazıları bu CMC tarafından On dokuzuncu Bayt'ta üretildi

First 10  | after   | result
bra         in-flak   in-flakarb
ap          ple       plepa
code-       golf      golf-edoc
no          ne        neon
we          st        stew
ai          med       media
draw        back      backward

3
@ Luka 1) Evet. 2) Girdileri almanın tek yolu buysa, o zaman rekabet edemezler.
Post Rock Garf Hunter

3
^ Bu muhtemelen birçok dili
ekarte eder

2
Bu şanssızlık. Bu zorluğun dillerimizi yönetmesini istemiyorum, ancak gerçekten önemsiz bir dize manipülasyon zorluğu olmasını istemiyorum.
Rock Garf Hunter Post

2
10 milisaniye bir çok kısa bir süre. Gerçekten bunu mu demek istediniz?
Neil

1
@Neil Muhtemelen haklısın, ama olan şey bu, onu bu noktada değiştirebilecek durumda değilim.
Rock Garf Hunter Post

Yanıtlar:


7

VimScript, 48 47 bayt

Vim'de bunun için bazı güzel yerleşimler var. Vim 8 gerektirir.

se ri|cal timer_start(10,{->execute("se ri&")})

VimScript için çok makul bir girdi olan ekleme moduna girilen metni bekler. Açıklama:

se ri " short for 'set revins', or 'reverse insert'
cal timer_start(10, " Start a timer that fires after 10ms
                 {->execute("se ri&")}) " Give it a lambda that unsets ri

İlk yaklaşımım, se ri|sl10m|se ri&çalışmaz çünkü metin uyku komutunun sonuna kadar arabelleğe alınır ve bunun için bir yol bulamadım.


5

HTML (JS), 96 bayt

<input id=i oninput=i.d=i.d||Date.now()+1e3;Date.now()<i.d&&(i.selectionEnd=i.selectionStart=0)>

Hareket halindeyken görmenizi sağlamak için ilk tuşa basıldığında 1 saniyelik zamanlamayı başlatır.


4

JavaScript (ES6), 88 bayt

p=s='',t=+new Date,document.onkeyup=k=>console.log(+new Date-t>9?(s+=k.key)+p:p=k.key+p)

gösteri

Snippet'in çalışma şekli, Çalıştır düğmesine tıkladıktan sonra ve yazmaya başlamadan önce odaklanabilmesi için çerçevesinin içine tıklamanız gerekir .

Bunu 10 ms'den daha az bir sürede yapmanın bir yolu yok. Yani, bu demoda gecikmeyi 1 saniyeye ayarladım - ve buna rağmen acele etsen iyi olur.


3

, İşlenmesi 167 165 146 bayt

String a="",b="";long m=0;void setup(){size(9,9);}void draw(){m=m<1?millis():m;println(b+a);}void keyTyped(){if(millis()-m>9)b+=key;else a=key+a;}

Girişi tuş vuruşları olarak alır ve konsola çıktılar. Her kareyi günceller.

açıklama

String a="",b="";                // a contains the reversed (in the 10 milliseconds) string, b contains the text that is typed after the 10 milliseconds.
long m=0;                        // Store the start milliseconds in variable m
void setup() {
  size(9,9);                     // set the dimensions of the window
}

void draw() {                    // loop forever
  m=m<1?millis():m;              // update m
  println(b+a);                  // print the string b+a
}

void keyTyped() {                // this function gets called whenever a key is typed
  if(millis() - m) >9)           // if over 9 milliseconds have elapsed then
    b+=key;                      //   add the key to the end of b
  else                           // else (if less than 10 milliseconds have elapsed)
    a=key+a;                     //   prepend the key to a
}

1
@WheatWizard Girişin asdf+ olduğunu söyleyin ghjk. Her şey tek bir değişkente olsaydı, o zaman 10 milisaniyeden sonra, fdsao dize olurdu . Bundan sonra g, yazıldığında, dize başa gelecek gve haline gelecektir gfdsa. Sonra hyazıldığında, hdeğişkeni ( ben daha sonra giriş hala ters olduğu için) başlayamam, substrings kullanmanız ve lengthbu String değişkenini hesaplamak zorunda kalacak . Bu çok fazla bayta mal olacak.
Kritixi Lithos

bayt azaltmak için üçlü kullanın
Bay Alien

@ Mr.Alien Bir üçlü kullanmak için aynı değişkenle uğraşmam gerekecekti, ama burada iki farklı değişken kullanıyorum (yani ave b). Sonucu bir geçici değişkene atasam bile, sonuçta elde edilen bayt hala daha büyük olur.
Kritixi Lithos

Ben senin cevap türü çevrim görünce Benim hatam, ... ..) o bir JavaScript cevap x olduğunu fark düşündük
Sayın Alien

1

C - 169 bayt

C, bunun için platformdan bağımsız bir yolu olmadığından bunun için en iyisi değildir. MSVC altında çalışır.

#include<time.h>
#include<conio.h>
l,k,b[9];main(a){for(a=clock();clock()-a<100;(k=_getch())?b[l++]=k:0);for(;(k=_getch())-13;k?putchar(k):0);for(;l;putchar(b[--l]));}

Biraz hacky bir yaklaşım, 10 ms'de 9'dan fazla karakter yazabilirseniz, bu çökecektir. Yeni satır karakterinden sonra güncellenir.


1
10
ms'de

1

Piton 2 , 112 106

import msvcrt as m,time
a=b=''
T=time.time
t=T()
while 1:c=m.getch();exec'ba=+c=+cb'[T()-t>1::2];print a+b

Çıktının çizgilerle taşmadan aynı hizada olmasını istiyorsanız, print'\r'+a+b,bunun yerine

İşlemi durdurmak için öldürmeniz gerekecek

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.