キーボードをシミュレートする


15

キーボードに問題があります(ブラウザに問題がある可能性が高い)。新しいテキストフィールドをクリックして、すべてのテキストを入力し始めると、逆方向に出てくることがあります。非常に短い時間の後(チャレンジのために10ミリ秒と言います)、再び前方入力を再開します。入力を開始しても最初はカーソルが動かないため、すべての文字がテキストフィールドの先頭に挿入されます。

たとえば、python入力pyt中に最初の10ミリ秒で入力した場合、結果は次のようになります。

hontyp

仕事

あなたの仕事は、この動作をできるだけ少ないバイトでシミュレートすることです。

入力

合理的な方法で入力を行うことができます。ただし、入力を2つの別個のフィールドとして使用することはできません。プログラムが入力を許可し始めると、10ミリ秒の遅延が始まります。つまり、入力が許可される前に前処理を行う必要がある場合がありますが、10ミリ秒にはカウントされません。

平均的に10ミリ秒であり、合理的に指定されたコンピューターでは1ミリ秒以上の時間の1%以内でオフになっていれば、タイミングに多少の寛容さが認められます。

出力

適切な方法で文字列を出力できます。ユーザーが入力しているときにライブで更新するか、入力を終了した後に結果を出力することができます(改行またはファイルの終わり^D)。

テストケース

これらのいくつかは、このCMCによって19番目のバイトで生成されました

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
@ルーク1)はい。2)それが入力を受け入れる唯一の方法である場合、彼らは競争することができません。
ポストロックガーフハンター

3
^それはおそらく多くの言語を除外している
ルイス・メンドー

2
それは残念だ。このチャレンジが私たちの言語を支配することは望んでいませんが、些細な文字列操作のチャレンジになることは本当に望んでいません。
ポストロックガーフハンター

2
10 ミリ秒非常に短い時間です。あなたは本当にそれを意味しましたか?
ニール

1
@Neilあなたはおそらく正しいですが、それはそれが何であるか、私はこの時点でそれを変更する立場にありません。
ポストロックガーフハンター

回答:


7

VimScript、48 47バイト

Vimには、このための優れたビルトインがあります。Vim 8が必要です。

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

VimScriptの非常に合理的な入力である挿入モードで入力されたテキストを期待します。説明:

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

最初のアプローチであるse ri|sl10m|se ri&が機能しないのは、テキストがsleepコマンドの後までバッファリングされるためです。これを回避する方法が見つかりませんでした。


5

HTML(JS)、96バイト

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

最初のキーを押してから1秒間の計時を開始し、動作を確認する機会を与えます。


4

JavaScript(ES6)、88バイト

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

デモ

スニペットの動作方法は、フレーム内クリックして、[ 実行 ]ボタンをクリックした、入力を開始する前にフォーカス取得する必要があります。

10ms未満でそれを行う方法はありません。そのため、このデモでは遅延を1秒に設定しました。それでも、急いでください。


3

処理中、167 165 146バイト

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;}

入力をキーストロークとして受け取り、コンソールに出力します。すべてのフレームを更新します。

説明

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入力がasdf+だったとしghjkます。すべてが1つの変数にある場合、10ミリ秒後に、fdsaその1つの文字列になります。その後、gを入力すると、文字列が先頭に追加され、gになりgfdsaます。ときにh入力され、私が先頭に付加することができない、h(その後、入力がまだ逆転されているため)変数に、私が使用する必要がありますsubstringsで計算する必要がありlength、その文字列変数のを。これには多くのバイトがかかります。
KritixiのLithos

バイトを減らすために3進数を使用する
エイリアン氏

@ Mr.Alien 3項を使用するには、同じ変数を処理する必要がありますが、ここでは2つの異なる変数(つまりab)を使用しています。結果を一時変数に割り当てても、結果のバイトカウントはさらに大きくなります。
KritixiのLithos

私はあなたの答えに型キャストを見たとき、私の悪い、私は... ..)それは、JavaScriptの回答Xの実現と思った
ミスターエイリアン

1

C-169バイト

Cはプラットフォームに依存しない方法がないため、これには最適ではありません。MSVCで動作します。

#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]));}

ちょっと変わったアプローチですが、10ミリ秒で9文字以上入力できる場合、これはクラッシュします。改行文字の後に更新します。



1

パイソン2112 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

行をあふれさせずに出力をフラッシュする場合は、使用します print'\r'+a+b,代わります

プロセスを停止して停止する必要があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.