输出击键


14

用任何编程语言,创建一个程序,该程序接受输入并设置要在键盘上键入的文本的动画效果。

每个字符之间的延迟应有所不同,以模拟键盘上的真实键入。延迟应为0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...秒,直到最后一个字符被打印出来。最终输出应留在屏幕上。

您必须覆盖当前文本行,否则无法将文本打印在新行上。

例如,输入“您好,PPCG!再见,地球!” 应生成以下动画(请注意,gif制作工具的采样率较低,因此实际结果略有不同):

enter image description here

由于这是代码高尔夫,因此最少的字节数将获胜。


“您必须覆盖当前文本行,否则无法将文本打印在新行上。” -这是否意味着程序必须清除输入并在其位置产生输出?(旁注:您的动画看起来比指定的更快。)
Jonathan Allan

我们可以假设总有输入吗?
Metoniem

1
延迟是随机的还是重复模式为0.1、0.1、0.5?
17Me21年

2
打印第一个字符之前应该有一个延迟吗?
Kritixi Lithos

1
就是这种模式@ 12Me21
Metoniem

Answers:


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 '17

替换1000001e5以剃除3个字节
Albert Renshaw

@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工作(但它是Octave,而不是Matlab)
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中工作
Conor O'Brien

2
它在Chrome浏览器中对我有效,但是控制台说Blocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac我更改了代码段以使用其他事件。(我已经年纪大了,我实际上还记得在表单字段中按Enter键不会触发以下按钮,而是直接进行表单提交。)
Neil

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毫秒,因此您可以在其中保存一个字节。另外,请记住,您不需要第二个ò
詹姆斯

可以代替undo p吗?不确定是否有帮助
nmjcman101 '17

@DJMcMayhem我不知道为什么我错过默认值500,谢谢!但是我需要第二个,ò因为否则程序会由于最后的隐式换行符而提前终止,从而导致中断错误。
Kritixi Lithos

@ nmjcman101我也在考虑使用paste,但是可惜它将光标移动到行尾,然后返回,我需要类似的东西``只会进一步增加我的字节数
Kritixi Lithos

4

MATL,16字节

"@&htDTT5hX@)&Xx

在MATL在线上尝试一下!

说明

"        % 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。您似乎一直都有100毫秒的时间。
Ismael Miguel

@IsmaelMiguel好眼睛。浏览源代码后,有一个加法而不是一个乘法。我可能会保留这种方式,以防万一我需要它,因为我可以看到它可能有用的地方。为此非常感谢!
tkellehe '17

别客气。很抱歉您的字节数增加了。
Ismael Miguel

@IsmaelMiguel,这很好,因为当我提出的下一个版本Noodel我可以让一个11字节的解决方案(因为基本的我需要补充)。显然这将是非竞争性的,但这是一门新语言,要想与某些顶级高尔夫语言
相提并论

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

编辑

  • 通过iSleep()方法内部而不是for循环中移动增量来节省1个字节。(感谢Maliafo

1
我不是C#程序员,但是您不能做一些事Sleep(i++ [...])来在for循环中保存一个额外的字节吗?
Maliafo '17

@Maliafo你可能是对的!我将运行它以确保它仍然可以正常运行,然后更新我的帖子。谢谢!
Metoniem

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(+ utilities),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

$argschar数组的形式,按指定的方式循环进行休眠,Write-Host使用-NoNewline参数将char写入同一行。

有改善吗?

  • 采用 [0..99]而不是[char[]]节省1个字节,但不适用于超过100个字符的字符串。
  • 采用 100,500[(++$i%3)-gt1]使其以某种方式缩短。
  • 将其合并为一个字符串,并在输出之间进行清除,从而消除了冗长的时间 Write-Host

无法找到使后两个有效的任何方法,并且第一个无效于任何特定规则。


1
打破百分百节省两个字节sleep -m((1,1,5)[++$i%3]*100)
AdmBorkBork

@AdmBorkBork聪明的一位-谢谢!
colsw

0

Perl,63个字节

foreach(split//,pop){$|=++$i;print;select('','','',$i%3?.1:.5)}


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("")代替吗?
Kritixi Lithos

@KritixiLithos Argg ..我总是忘了那个。谢谢。
凯文·克鲁伊森

说到哪个,我也应该split在“处理答案”中使用...
Kritixi Lithos

0

处理中,133131字节

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.