不耐烦地等待输入


39

今天的任务是实现获取输入的时间限制,这是我发现在大多数语言中很难实现的任务。

您将创建一个程序功能,提示用户输入。用户提供输入后,立即打印消息input received并结束执行/返回。但是,如果用户等待10秒钟以上以提供输入,则输出消息no input received并结束执行/返回。

输入必须来自stdin(控制台)或等效项,而不是函数或程序参数,但是输出可以是stdout,函数的返回值或任何其他可接受的输出方法。

您可以要求任何数量的输入,它可以是单个字符,一行,一个单词,或者是您语言中最短的方法,只要它等待至少一个字符即可。

您必须在收到输入后立即输出,而不是在10秒钟之后输出。

10秒钟后,您必须结束,no input received打印后无法继续等待输入。

您可能会认为在经过10秒钟到将文本打印到屏幕之间的时间内没有通过输入,因为这是一个非常小的窗口。您可能还假设您的语言的内置等效项sleep是绝对完美的。

这是,最少字节获胜!


6
+1只是为了保持良好的触感,以防止高尔夫语言使用其词典。哦,也是巨大的挑战。
亚当

1
@Adám除非您的语言具有内置的超时读取功能,否则我认为唯一的好方法是OS / Thread魔术,大多数高尔夫语言都无法做到这一点。
帕维尔

现在,我必须重写我的程序。几乎准备后... ;-)
亚当

1
@TheLethalCoder您可以完全假设您的语言等效于sleep功能的100%。
Pavel

1
@Lembik你去了,一个Python答案。
Pavel

Answers:


24

bash,38个字节

read -t10||a=no;echo $a input received

-t对bash 使用(timeout)选项read,导致bash 失败,并且如果在指定的秒数内未给出任何输入,则返回非零退出代码。


6
它应该说“(无)输入REC VED”的重要阻碍使用词典高尔夫球语言。
亚当

8
@Adám实际上这是一个错字
Pavel

7
@凤凰努!
亚当

1
为什么a = no然后$ a?有目的吗?编辑我明白了我没有正确阅读问题
Felix Guo

12

Haskell,97 89字节

import System.Timeout
timeout(10^7)getChar>>=putStr.(++"input received").maybe"no "mempty

如果timeout超时,则返回Nothing,否则返回Just CharChar,因为我们正在使用getChar)。此返回值将转换为"no """通过函数转换maybe "no " mempty。追加"input received"并打印。

编辑:@BMO建议maybe并保存一些字节。


似乎在ghci中无法正确运行。
maple_shaft17年

@maple_shaft:在ghci中,您必须glet:绑定let g Nothing="no ";g _="",然后函数调用timeout....对我来说很好用。
nimi

1
您可以用较短的替换gmaybe"no "(pure"")甚至可以内联-节省6个字节。
ბიმო

@BMO:太好了!mempty而不是(pure"")更短。
nimi

非常好,那真的很聪明!
ბიმო

11

POSIX C99,71 63个字节

main(){puts("no input received"+3*poll((int[]){0,1},1,10000));}

取消高尔夫:

#include <unistd.h>
#include <poll.h>
#include <stdio.h>
int main()
{
  struct pollfd pfd; 
  pfd.fd = STDIN_FILENO; 
  pfd.events = POLLIN;  
  puts("no input received"+3*poll(&pfd,1,10000));
}

由于poll在成功的情况下将返回1,因此我们将结果乘以3并相应地移动字符串。然后,我们使用struct pollfd具有以下布局的事实:

     struct pollfd {
     int    fd;       /* file descriptor */
     short  events;   /* events to look for */
     short  revents;  /* events returned */
 };

并且STDIN_FILENO0POLLIN1替换pfdint pfd[] = {0,1},我们终于使化合物litteral(所允许的C99)。


3
您需要指定此对象为POSIX,因为poll.h标头不是C99语言标准的一部分。
科迪·格雷

8

Applescript,113

Applescript并没有真正从STDIN中读取内容。希望display dialog这里可以接受:

({"","no "}'s item((display dialog""default answer""giving up after 10)'s gave up as integer+1))&"input received"

6

APL(Dyalog)41 40字节

'no input received'↓⍨{3*⍨⎕RTL10::03⊣⍞}

这是一个匿名默认函数,需要一个伪参数来运行

'no input received' 完整的字符串

↓⍨ 从该字符的前面删除与该字符返回的数字一样多的字符

{ 匿名显式函数(表示参数)

⎕RTL←10 设置ř esponse Ť IME 大号 IMIT到十秒

3*⍨ 将那个数字(十)提高到三的幂(一千代表“全部”)

:: 在所有这些例外情况下,

  0 返回0

 尝试:

   得到输入

  3⊣ 丢弃它,而是返回3

}函数结束(请注意,从未提及该参数)


6

Perl74 67字节

$m="input received";$SIG{ALRM}=sub{die"no $m\n"};alarm 10;<>;say$m

旧版本

$m="input received";$SIG{ALRM}=sub{die "no $m\n"};alarm 10;<stdin>;say $m;

(通过perl -M5.10.1 ...运行)


输出中无需尾随换行符,因此可以进行切割\n
Pavel

3
欢迎来到PPCG!
帕维尔

实际上,您不需要-M5.10.1。您可以刚刚替补-e使用-E。(如果需要-M5.10.1,您必须在分数上加罚分)
Brad Gilbert b2gills

@Phoenix,\n之所以在这里是因为die的行为:“如果LIST的最后一个元素未以换行符结尾,那么还将打印当前脚本行号和输入行号(如果有),并提供换行符。”因此,如果没有它,将显示“在-e第1行没有收到输入”。但是,当然,这可能是字符串中的文字换行符。在那旁边,之间的空间diesay和不需要它们的参数。决赛一样;。并且<>足以从标准输入中读取。
manatwork

1
如果您eval是从STDIN读取的,则可以避免出现die消息。事实上,运行时错误的作品一样好:$SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'
primo

6

Perl 6的 72  66个字节

my $s='input received';Promise.in(10).then:{say "no $s";exit};get;say $s

无输入即可尝试有输入即可
尝试

my$s='input received';start {sleep 10;say "no $s";exit};get;say $s

无输入即可尝试有输入即可
尝试

my $s = 'input received'; # base message

start {         # create a Promise with a code block
                # that is run in parallel
  sleep 10;     # delay for 10 seconds
  say "no $s";  # say 「no input received」
  exit          # exit from the process
}

get;            # get a line from the input
say $s          # say 「input received」

1
“我的ESS输入收到-承诺在10然后说‘不ESS’并退出或获得发言权‘ESS’”

您可以删除之间的空间start{
帕维尔

@Phoenix它将被解析为名为的start无符号变量的关联索引,所以没有。
布拉德·吉尔伯特b2gills

您的TIO链接似乎不再起作用。
帕维尔

@Pavel,固定,只是不得不做伪测试类IO的亚型::手柄和电话.new就可以了
吉尔伯特b2gills

5

C#,180个 171 148 131字节

()=>{var t=new System.Threading.Thread(()=>{System.Console.ReadKey();});t.Start();return(t.Join(10000)?"":"no ")+"input recieved";}

@VisualMelon节省了17个字节。

完整/格式化版本:

class P
{
    static void Main()
    {
        System.Func<string> f = () =>
        {
            var t = new System.Threading.Thread(() =>
            {
                System.Console.ReadKey();
            });
            t.Start();

            return (t.Join(10000) ? "" : "no ") + "input recieved";
        };

        System.Console.WriteLine(f());
        System.Console.ReadLine();
    }
}

为什么namespace而不是using指令?
帕维尔

@Phoenix他们仍然需要一个名称空间,因此它们保存了using
LiefdeWen

为什么将关键部分另存为动作并随后执行?我真的看不到指定这个问题。
Snowfire '17

1
通过使用来自的返回值Thread.Join(int),可以节省很多((除去c,丢失括号等)。var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(VB.NET似乎已经做到了)
VisualMelon

1
@TaylorScott我可以做到,1e4但是那是一个double,我需要一个,int所以我必须做(int)1e4:(好主意
TheLethalCoder

5

TI-BASIC,84 77字节

-7感谢@ kamoroso94

:startTmr→T         //Start Timer, 5 bytes
:Repeat checkTmr(T)=10 or abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K  //Loop until the timer is 10 seconds or a number key is pressed, 32 bytes
:getKey→K           //get key code, 4 bytes
:End                //end loop, 2 bytes
:"NO INPUT RECEIVED //Push string "NO INPUT RECEIVED" to Ans, 18 bytes
:If K               //If input was received, 3 bytes
:Disp sub(Ans,3,15  //Diplay "INPUT RECEIVED", 9 bytes
:If not(K           //If no input, 3 bytes
:Ans                //Display "NO INPUT RECEIVED", 1 byte

等待直到按下数字。

我试图弄清楚如何打高尔夫球{72,73,74,82,83,84,92,93,94}。它占用了大量空间。


如果您只想等待任何键,那就Repeat K or 10=checkTmr(T可以。
bb94

此外,最后4行可以缩短为:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94

1
@ bb94我真的不想只等待任何一个键,因为并不是所有键都可以输入一个字符。就像在等待Shift计算机上的密钥一样。另外,用您的方法缩短最后4行实际上得到的字节数与我的相同。不过,我喜欢您的方法。
Scott Milner

您可以检查不是21或31的任何密钥
。– bb94

or在您的重复语句之后,请改为使用-7个字节:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94 '18年

4

的NodeJS,105个 103 101字节

@apsillers
-2个字节-通过移动console.log()到-2个字节exit()

with(process)stdin.on('data',r=x=>exit(console.log((x?'':'no ')+'input received'))),setTimeout(r,1e4)

通过保存到文件并与节点一起运行来运行,或者通过直接从命令行运行它来执行 node -e "<code>"


@apsillers是的,很好。
贾斯汀·马里纳

@apsillers我将再次进行编辑,以将console.log()调用实际移到的参数中exit()。现在少两个。
贾斯汀·马里纳

4

JavaScript(ES6)+ HTML,86 84 82 79 + 11 = 97 95 93 90字节

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i

试试吧

需要关闭>input,以工作片段。

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i>


1e5是100,000或100秒,1e4是10秒
PunPun1000

糟糕!很好,谢谢@ PunPun1000
Shaggy

写起来10不是更短1e4吗?
musicman523

@ musicman523 10将是10毫秒,质询挑战特别指出10 ,即10000毫秒,因此1e4
毛茸茸的

我的坏,忘记了,10 != 1e4因为我是个傻瓜
musicman523

3

VB.Net-174字节

Module M
Sub Main()
Dim t=New Threading.Thread(Sub()Console.Read()):t.Start():Console.WriteLine(If(t.Join(10000),"","no ") & "input received"):End
End Sub
End Module

COBOL版本将于明天发布;-)


3
我不确定将结合使用的优点是什么:。这与换行符占用的字节数相同,因此只会降低可读性,而不会提高高尔夫球得分。
科迪·格雷

@CodyGray我相信:换行符可以使踩踏的调用可以在不重复的情况下被声明为内联-但是说我不是肯定的,我的主要语言是VBA,它不支持线程化或从<strike> console <读取/ strike>在定义函数或调用:P时立即关闭窗口
Taylor Scott

3

Go,149个字节

package main
import(
."fmt"
."time"
."os"
)
func main(){
o:="input received"
go func(){Sleep(1e10)
Print("no "+o)
Exit(0)}()
i:=""
Scan(&i)
Print(o)}

3

AHK67 65字节

Blauhirn保存了2个字节

InputBox,o,,,,,,,,,10
s:=ErrorLevel?"no ":
Send %s%input received

AHK具有输入框的内置超时。
我试图变得聪明并使用!o代替,ErrorLevel但是如果用户输入的是false值,那将失败。
答案的几乎一半只是命令名称和固定文本。


1
所有的逗号是做什么用的?
帕维尔

@Phoenix大概eliding参数的InputBox
亚当

@Phoenix Timeout几乎是最后一个参数:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Engineer Toast

缩短两个字符:s:=errorLevel?"no ":
phil294

@Blauhirn Gah!我是个白痴。谢谢。
工程师吐司

3

Python3,100个 89 83 71字节

import pty
print("no input received"[3*any(pty.select([0],[],[],10)):])

首先尝试打高尔夫球。

-4表示any()切片,-7表示切片,感谢@ user2357112!

-6,select()pty代替select


您可以通过切"no input received"字符串来切出一些字节:"no input received"[3*bool(...):]
user2357112

您也可以使用any(...)代替bool(...[0])
user2357112

-新用户:“在Windows上,它引发ModuleNotFoundError:没有名为'termios'的模块”
FantaC

pty模块仅在linux平台上可用,但是我只使用它,因为它的名称很短并且可以select使用。版本2在Windows上可能更好。
赛斯

3

PowerShell,110字节

$s1=date;while(![console]::KeyAvailable-and($i=((date)-$s1).seconds-lt10)){}
"{0}input received"-f(,'no ')[$i]

3

Python 3,158个字节

import os,threading as t,time
def k(t=10):time.sleep(t);print("No input received"[(10-t)//3:]);os.kill(os.getpid(),t)
t.Thread(None,k).start()
if input():k(0)

我尝试运行Seth的Python 3答案,但是在Windows上抛出该错误ModuleNotFoundError: No module named 'termios',并且由于我无法评论他的答案,因此我决定提出一种应独立于平台的解决方案。

这是我第一次打高尔夫球,所以我相信它会有所改善。


2
欢迎来到PPCG!
Steadybox

2

Tcl,99个字节

after 10000 {set () no}
vwait [fileevent stdin r {gets stdin (x)}]
puts [lappend () input received]

2

SmileBASIC 3,74个字节

等待任何按钮按下(接受输入),以“接受输入”。

M=MAINCNT@L
N=MAINCNT-M>599CLS?"NO "*N;"INPUT RECEIVED
ON N+BUTTON()GOTO@L

输出应为“(未收到)输入”,而不是“未接收到输入(输入)”
Pavel,

2

刮擦2 / 3.x,41点(说明

不耐烦的计时器

1:GF点击时

1:询问[]并等待

1 + 14个字符:说[收到输入]

1:停止[all v](注意:由于“ all”是其默认设置,因此我将该块计为1)

1 + 2位数字:等待(10)秒

1 + 17个字符:说[未收到输入]

1:停止[全部v]


欢迎来到PCG!
Rahul Bharadwaj

1

> <>,43 + 6 = 49字节

a/!/i0(?\~"input recieved"r>o<
o "\?:-1/r"n

在线尝试!

-t.08标志为+5 ,将刻度设置为0.08秒,a标志为+1 ,将空格和跳过的指令计数为刻度。

程序大约每秒检查一次输入,如果检测到输入,则退出循环。如果未收到输入,它将从底部退出循环,并追加no到字符串的开头。最初/是为了确保最后一次输入检查准确在10秒标记上。

然后大约需要5-6秒才能打印出字符串本身。


您可以使用单个标志-at.08来保存一个字节。
帕维尔

@Pavel,谢谢!
Jo King

1

Java 1.4 +,284个字节

import static java.lang.System.*;public class X{public static void main(String[]x){new Thread(){public void run(){try{Thread.sleep(10000L);}catch(Exception e){}out.print("no input recieved");exit(0);}}.start();new java.util.Scanner(System.in).nextLine();out.print("input recieved");}}

取消高尔夫:

import static java.lang.System.*;

public class InputAndWait {
    public static void main(String[] x) {
        new Thread() {
            public void run() {
                try {
                    Thread.sleep(10000L);
                } catch (Exception e) {
                }
                out.print("no input recieved");
                exit(0);
            }
        }.start();
        new java.util.Scanner(System.in).nextLine();
        out.print("input recieved");
    }
}

请不要建议对特定版本的Java进行改进,这是一个通用的Java答案,它可以在所有当前稳定的Java环境(1.4及更高版本)中使用。


极度令人word目结舌...捕获是必需的,不能扔掉。系统导入减少了大约5个字节...重载也很罗word,所以最终会出现一个看起来很糟糕的罗word。


它必须是10000L10000?我认为整数会自动转换为多头。
帕维尔

1

朱莉娅0.6,78字节

比我预期的更长。请参阅“没有收到输入” TIO链接的注释。

s="input recieved"
Timer(x->(show("no "*s);exit()),10)
readline(STDIN)
show(s)

在线尝试!


1
它不会在TIO上阻塞,因为它正在从文件读取。它达到EOF并立即完成。如果您将从未发出换行符的进程通过管道传输
Pavel

0

SmileBASIC,74 73字节

M=MAINCNT
WHILE!I*M>MAINCNT-600I=INKEY$()>"
WEND?"no "*!I;"input received

接受1个字符的输入。

还有一个39字节的解决方案,该解决方案可能无效(实际上不接受文本输入,只有一个OK可以按下的按钮)

?"no "*!DIALOG("",,,10);"input received
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.