用任何编程语言,创建一个程序,该程序接受输入并设置要在键盘上键入的文本的动画效果。
每个字符之间的延迟应有所不同,以模拟键盘上的真实键入。延迟应为0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...
秒,直到最后一个字符被打印出来。最终输出应留在屏幕上。
您必须覆盖当前文本行,否则无法将文本打印在新行上。
例如,输入“您好,PPCG!再见,地球!” 应生成以下动画(请注意,gif制作工具的采样率较低,因此实际结果略有不同):
由于这是代码高尔夫,因此最少的字节数将获胜。
用任何编程语言,创建一个程序,该程序接受输入并设置要在键盘上键入的文本的动画效果。
每个字符之间的延迟应有所不同,以模拟键盘上的真实键入。延迟应为0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...
秒,直到最后一个字符被打印出来。最终输出应留在屏幕上。
您必须覆盖当前文本行,否则无法将文本打印在新行上。
例如,输入“您好,PPCG!再见,地球!” 应生成以下动画(请注意,gif制作工具的采样率较低,因此实际结果略有不同):
由于这是代码高尔夫,因此最少的字节数将获胜。
Answers:
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。
i%3
延迟应为5
100000
为1e5
以剃除3个字节
1e5
无法在我的设备上运行
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).
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
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>
Blocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
@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即将推出...
gÓ
不带计数的默认值是500毫秒,因此您可以在其中保存一个字节。另外,请记住,您不需要第二个ò
!
u
ndo p
吗?不确定是否有帮助
ò
因为否则程序会由于最后的隐式换行符而提前终止,从而导致中断错误。
p
aste,但是可惜它将光标移动到行尾,然后返回,我需要类似的东西``
只会进一步增加我的字节数
"@&htDTT5hX@)&Xx
" % 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)
ʋ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>
没有太多解释。它只需要一个字符串(用“”括起来)作为参数,并使用正确的延迟模式打印每个字符。动画之后,它会以退出,OutOfRangeException
因为循环遍历所有角色后不会停止。由于这是一个无限循环,所以这也意味着我可以使用int Main
void 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
在Sleep()
方法内部而不是for
循环中移动增量来节省1个字节。(感谢Maliafo)Sleep(i++ [...])
来在for循环中保存一个额外的字节吗?
#(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)))
[char[]]$args|%{sleep -m((1,1,5)[++$i%3]*100);Write-Host $_ -N}
-1删除后不需要的空白 -m
-2感谢AdmBorkBork-使用1,1,5
和*
最终结果,100
而不是使用100,100,500
以$args
char数组的形式,按指定的方式循环进行休眠,Write-Host
使用-N
oNewline参数将char写入同一行。
有改善吗?
[0..99]
而不是[char[]]
节省1个字节,但不适用于超过100个字符的字符串。100,500
和[(++$i%3)-gt1]
使其以某种方式缩短。Write-Host
无法找到使后两个有效的任何方法,并且第一个无效于任何特定规则。
sleep -m((1,1,5)[++$i%3]*100)
foreach(split//,pop){$|=++$i;print;select('','','',$i%3?.1:.5)}
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!"
a[0].split("")
代替吗?
split
在“处理答案”中使用...
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