出力キーストローク


14

任意のプログラミング言語で、入力を受け取り、キーボードで入力されるテキストをアニメーション化するプログラムを作成します。

キーボードでの真のタイピングをシミュレートするには、各文字間の遅延を変化させる必要があります。遅延は0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...、最後の文字が印刷されるまでの秒数です。最終出力は画面に残されます。

テキストを新しい行に印刷できないようにするには、現在のテキスト行を上書きする必要があります。

例、入力 "Hello、PPCG!Goodbye Earth!" 次のアニメーションが生成されます(gif-makerのサンプリングレートが低かったため、実際の結果はわずかに異なります)。

ここに画像の説明を入力してください

これはコードゴルフであるため、バイトの最小量が勝ちます。


「テキストを新しい行に印刷することはできません。現在のテキスト行を上書きする必要があります。」-これは、プログラムが入力をクリアし、その場所で出力を生成する必要があることを意味していますか?(注:アニメーションは指定よりも高速に見えます。)
ジョナサンアラン

常に入力があると仮定できますか?
メトニエム

1
遅延はランダムであると想定されていますか、それとも0.1、0.1、0.5の繰り返しパターンですか?
12Me21

2
最初の文字を印刷する前に遅延が必要ですか?
KritixiのLithos

1
そのパターンはい@ 12Me21
Metoniem

回答:


8

C 108 93 89 78 73 80バイト

f(char *s){for(int i=0;s[i];fflush(0),usleep(100000*(i++%3?1:5)))putchar(s[i]);}

ゴルフされていないバージョン:

 void f(char *s)
 {
  for( int i=0;s[i];)
  {
    putchar(s[i]);
    fflush(0);
    usleep(100000*(i++%3?1:5));
 }
}

@Kritixi Lithos @Metoniemご意見ありがとうございます!いくつかのバイトを節約しました。

どういうわけか、int i実行時にセグメンテーションエラーが発生したため、0で初期化しました。


1
あなたが私の改善を使用するかどうか:あなたの遅延はその逆でなければなりません。i%3遅延を5にする必要がある場合
Metoniem

置換1000001e5て3バイトを削る
アルバートレンショー

@AlbertRenshawヒントをありがとう、更新しました。私は他のいくつかのソリューションでもそれを使用しましたが、なぜここで忘れたのか分かりません。
アベルトム

@AbelTom何らかの理由で、1e5私のデバイス上の仕事をしません
KritixiのLithos

@KritixiLithosどうですか?Linuxを使用していますか?
アベルトム

6

ゼリー、13バイト

115D÷⁵ṁȮœS¥@"

これは単項リンク/関数です。暗黙的な出力のため、完全なプログラムとしては機能しません。

検証

使い方

115D÷⁵ṁȮœS¥@"  Monadic link. Argument: s (string)

115            Set the return value to 115.
   D           Decimal; yield [1, 1, 5].
    ÷⁵         Divide all three integers by 10.
      ṁ        Mold; repeat the items of [0.1, 0.1, 0.5] as many times as
               necessary to match the length of s.
          ¥@"  Combine the two links to the left into a dyadic chain and apply it
               to each element in s and the corr. element of the last return value.
       Ȯ         Print the left argument of the chain (a character of s) and sleep
                 as many seconds as the right argument indicates (0.1 or 0.5).

6

MATLAB、74バイト

c=input('');p=[1,1,5]/10;for i=c;fprintf('%s',i);p=p([2,3,1]);pause(p);end

説明:

私は作るためにかなり時間が使用さfprintfよりもバージョンが短いdisp()clc。ブレークスルーは、pause引数としてベクトルを取ることができることを発見/記憶したときでした。その場合、最初の値を選択するだけです。これにより、カウンターを省くことができます。

c=input('');    % Take input as 'Hello'
p=[.1,.1,.5];   % The various pause times

for i=c;            % For each of the characters in the input c
  fprintf('%s',i);  % Print the character i, without any trailing newline or whitespace
                    % No need to clear the screen, it will just append the new character 
                    % after the existing ones
  pause(p);         % pause for p(1) seconds. If the input to pause is a vector, 
                    % then it will choose the first value
  p=p([2,3,1]);     % Shift the pause times
end

私が使用しdispた最短は81バイトでした。

c=input('');p=[1,1,5]/10;for i=1:nnz(c),clc;disp(c(1:i));pause(p(mod(i,3)+1));end

printf代わりにできますfprintfか?octave-online.netで動作します(ただし、MatlabではなくOctaveです)
Kritixi Lithos

4

JavaScript(ES6)、67バイト

f=(i,o,n=0)=>i[n]&&(o.data+=i[n],setTimeout(f,++n%3?100:500,i,o,n))
<form><input id=i><button onclick=f(i.value,o.firstChild)>Go!</button><pre id=o>


スニペットが機能していないようです
Kritixi Lithos

@KritixiLithosうん、Chromeでは動作しないようです:
Metoniem

firefox thoで動作
コナーオブライエン

2
これは、Chromeで私のために動作しますが、コンソールは言うBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac別のイベントを使用するようにスニペットを変更しました。(フォームフィールドでEnterキーを押しても次のボタンがトリガーされなかったが、フォーム送信にまっすぐに進んだことを実際に覚えています。)
ニール

4

V20 19 18バイト

@DJMcMayhemのおかげで1バイト節約

ò最後に削除して1バイトを節約

òD1gÓulD1gÓulDgÓul

ひどくウンゴルフィ、私は知っている、それはちょうどuネストされたループを使用することを妨げるその厳密なndo です。

説明

カーソルは、入力の最初の文字であるバッファーの先頭から始まります。

ò                      " Start recursion
 D                     " Deletes everything from the cursor's position to the end of line
  1gÓ                  " Sleep for 100ms
     u                 " Undo (now the deletion is reverted)
      l                " Move cursor one to the right
       D1gÓul          " Do it again
             D         " Same as before but...
              gÓ       " Sleep for 500ms this time
                ul     " Then undo and move right
                       " Implicit ò

近日公開予定のGif ...


カウントなしのデフォルトは500ミリ秒なので、そこに1バイトを保存できます。また、2番目は必要ないことを忘れないでくださいò
DJMcMayhem

ndoの代わりにuただp味わうことができますか?わからない全てかかわらで場合に役立ちます
nmjcman101

@DJMcMayhemデフォルトの500を逃した理由がわからない、ありがとう!しかしò、最後の暗黙的な改行のためにプログラムが早期に終了し、エラーが発生するため、2番目が必要です。
Kritixi Lithos

@ nmjcman101私も使用して考えていたpASTEを、悲しいかな、それは、行の最後にカーソルを移動し、私は次のように何か必要があるだろう戻って``のみ、さらに私:バイトを増やすことになるが
KritixiのLithos

4

MATL、16バイト

"@&htDTT5hX@)&Xx

MATL Onlineでお試しください!

説明

"        % Implicitly input string. For each char of it
  @      %   Push current char
  &h     %   Concatenate everything so far into a string
  tD     %   Duplicate and display
  TT5h   %   Push array [1 1 5]
  X@)    %   Get the k-th element modularly, where k is current iteration.
         %   So this gives 1, 1, 5 cyclically
  &Xx    %   Pause for that many tenths of a second and clear screen
         % Implicit end. Implicitly display the final string, again (screen
         % was deleted at the end of the last iteration)

4

Noodel、18 バイト

ʋ115ṡḶƙÞṡạḌ100.ṡ€ß

それを試してみてください:)


使い方

                   # Input is automatically pushed to the stack.
ʋ                  # Vectorize the string into an array of characters.
 115               # Push on the string literal "115" to be used to create the delays.
    ṡ              # Swap the two items on the stack.

     ḶƙÞṡạḌ100.ṡ€  # The main loop for the animation.
     Ḷ             # Loops the following code based off of the length of the string.
      ƙ            # Push on the current iteration's element of the character array (essentially a foreach).
       Þ           # Pop off of the stack and push to the screen.
        ṡ          # Swap the string "115" and he array of characters (this is done because need array of characters on the top for the loop to know how many times to loop)
         ạ         # Grab the next character in the string "115" (essentially a natural animation cmd that every time called on the same object will access the next item looping)
                   # Also, turns the string into an array of characters.
          Ḍ100.    # Pop the character off and convert to a number then multiply by 100 to get the correct delay. Then delay for that many ms.
               ṡ   # Swap the items again to compensate for the one earlier.
                €  # The end of the loop.

                 ß # Clears the screen such that when implicit popping of the stack occurs it will display the correct output.

無限にループする19バイトのコードスニペット。

<div id="noodel" cols="30" rows="2" code="ʋ115ṡḷḶƙÞṡạḌ100.ṡ€ß" input='"Hello, PPCG! Goodbye Earth!"'/>
<script src="https://tkellehe.github.io/noodel/release/noodel-2.5.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


1
何らかの理由で、遅延がオフになっているようです。遅延は100ms、100ms、500msです。常に100msあるようです。
イスマエルミゲル

@IsmaelMiguel良い目。ソースを調べた後、乗算の代わりに加算があります。私はそれが必要かもしれませんが、それが役に立つかもしれない場所を見ることができるので、私はそれをそのように保つかもしれません。どうもありがとう!
tkellehe

どういたしまして。そして、バイト数が増えて申し訳ありません。
イスマエルミゲル

@IsmaelMiguel、次のバージョンのNoodelを作成するとき、11バイトのソリューションを作成できるので(追加する必要がある基本事項のため)、それは問題ありません。それは明らかに競合しませんが、これは新しい言語であり、トップのゴルフ言語のいくつかと同じようになるまでに長い道のりがあります:)
tkellehe

3

APL、23バイト

⊢{⍞←⍺⊣⎕DL⍵÷10}¨1 1 5⍴⍨⍴

説明:

               1 1 5⍴⍨⍴  ⍝ repeat the values [1,1,5] to match the input length
⊢                        ⍝ the input itself
 {           }¨          ⍝ pairwise map
      ⎕DL⍵÷10            ⍝ wait ⍵÷10 seconds, where ⍵ is the number
     ⊣                   ⍝ ignore that value, and
  ⍞←⍺                    ⍝ output the character   

3

C#、131バイト

あまり説明しません。引数として文字列( ""でラップ)を受け取り、正しい遅延パターンを使用して各文字を出力します。アニメーションが終了すると、OutOfRangeExceptionすべてのキャラクターをループした後にループが停止しないため、で終了します。無限ループなので、これint Mainvoid Main;-)の代わりに使用できることも意味します

ゴルフ

class C{static int Main(string[]a){for(int i=0;){System.Console.Write(a[0][i]);System.Threading.Thread.Sleep(i++%3<1?500:100);}}}

非ゴルフ

class C
{
    static int Main(string[] a)
    {
        for (int i = 0; ;)
        {
            System.Console.Write(a[0][i]);
            System.Threading.Thread.Sleep(i++ % 3 < 1 ? 500 : 100);
        }
    }
}

編集

  • ループではなくメソッドi内でインクリメントを移動することで1バイトを節約しSleep()ましたfor。(Maliafoに感謝)

1
私はC#プログラマーではありませんがSleep(i++ [...])、forループに余分なバイトを保存するようなことはできませんか?
マリアフォ

@Maliafoあなたは正しいかもしれません!実行して、正常に実行されるかどうかを確認してから、投稿を更新します。ありがとう!
メトニエム

2

SmileBASIC、61バイト

LINPUT S$FOR I=0TO LEN(S$)-1?S$[I];
WAIT 6+24*(I MOD 3>1)NEXT

遅延計算はもっと短くなると思います。


2

Clojure、81バイト

#(doseq[[c d](map vector %(cycle[100 100 500]))](Thread/sleep d)(print c)(flush))

の無限リストで圧縮された入力文字列をループします[100 100 500]

(defn typer [input]
  ; (map vector... is generally how you zip lists in Clojure 
  (doseq [[chr delay] (map vector input (cycle [100 100 500]))]
    (Thread/sleep delay)
    (print chr) (flush)))

2

Bash(+ユーティリティ)、32バイト

注意してください、これはプロセスでビープ音を鳴らしますが、提出物は派手な効果音を持つことができないと言った人!

ゴルフ

sed 's/.../&\a\a\a\a/g'|pv -qL10

デモ

enter image description here



1

Powershell、66 65 63バイト

[char[]]$args|%{sleep -m((1,1,5)[++$i%3]*100);Write-Host $_ -N}

enter image description here

-1は後に不要な空白を削除しました -m

-2 AdmBorkBorkに感謝-使用し1,1,5、使用*する100代わりに最終結果100,100,500

$args文字配列として受け取り、指定さWrite-Hostれた-Nとおりにスリープをループします。oNewline引数を使用して、同じ行に文字を書き込みます。

改善点?

  • 1バイトを節約する[0..99]代わりに使用[char[]]しますが、100文字を超える文字列では機能しません。
  • 使用100,500します[(++$i%3)-gt1]が、なんとか短くします。
  • 単一の文字列に結合し、出力間をクリアして、長い Write-Host

最後の2つを機能させる方法を見つけることができず、最初の2つは特定のルールによって有効ではありません。


1
100をsleep -m((1,1,5)[++$i%3]*100)
分割して

@AdmBorkBork smart one-ありがとう!
COLSW



0

Rebol、65バイト

s: input t:[.1 .1 .5]forall s[prin s/1 wait last append t take t]

ゴルフをしていない:

s: input
t: [.1 .1 .5]

forall s [
    prin s/1
    wait last append t take t
]


0

Java 7、151 149バイト

class M{public static void main(String[]a)throws Exception{int n=0;for(String c:a[0].split("")){System.out.print(c);Thread.sleep(n++%3>0?100:500);}}}

-2バイト、@ KritixiLithosに感謝します。

説明:

class M{
  public static void main(String[] a) throws Exception{ // throws Exception is required due to the Thread.sleep
    int n = 0;                                          // Initialize counter (and set to 0)
    for(String c : a[0].split("")){                     // Loop over the characters of the input
      System.out.print(c);                              // Print the character
      Thread.sleep(n++ % 3 > 0 ?                        // if (n modulo 3 != 0)
                                 100                    //   Use 100 ms
                               :                        // else (n modulo 3 == 0):
                                 500);                  //   Use 500 ms
    }
  }
}

使用法:

java -jar M.jar "Hello, PPCG! Goodbye Earth!"

1
私はそれをテストしていませんが、a[0].split("")代わりに何かすることができますか?
クリチキシリトス

@KritixiLithos Argg ..いつも忘れてます。ありがとう。
ケビンCruijssen

そういえばについては、私はまた、使用する必要がありますsplit...私の処理の答えに
KritixiのLithos

0

処理中、133 131バイト

int i;void setup(){for(String c:String.join("",args).split(""))p{try{Thread.sleep(i++%3<1?500:100);}catch(Exception e){}print(c);}}

代わりにargs[0]引数を実行してラップしようとしました""が、何らかの理由で機能しません。

とにかく...これは引数を取る処理プログラムを書いたのは初めてです。Javaとは異なり、を使用して引数を宣言する必要はありませんString[]argsが、変数argsは自動的に引数に初期化されます。

sketch_name.pdeというフォルダーの下にあるファイルに保存しますsketch_name(はい、フォルダーとスケッチの同じ名前)。次のように呼び出します:

processing-java --sketch=/full/path/to/sketch/folder --run input text here

cheese

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