Không kiên nhẫn chờ đợi đầu vào


39

Nhiệm vụ của bạn hôm nay là thực hiện giới hạn thời gian để nhận đầu vào, một nhiệm vụ mà tôi thấy khá khó chịu để đạt được trong hầu hết các ngôn ngữ.

Bạn sẽ tạo một chức năng chương trình nhắc người dùng nhập liệu. Ngay sau khi người dùng cung cấp đầu vào, hãy in thông báo input receivedvà kết thúc thực hiện / trả lại. Tuy nhiên, nếu người dùng đợi hơn 10 giây để cung cấp đầu vào, hãy xuất thông báo no input receivedvà kết thúc thực hiện / trả lại.

Đầu vào phải từ stdin(bàn điều khiển) hoặc tương đương, không phải là đối số chức năng hoặc chương trình, tuy nhiên đầu ra có thể là stdout, giá trị trả về của hàm hoặc bất kỳ phương thức đầu ra được chấp nhận nào khác.

Bạn có thể yêu cầu bất kỳ số lượng đầu vào, nó có thể là một ký tự, một dòng, một từ hoặc bất kỳ phương thức nào ngắn nhất trong ngôn ngữ của bạn miễn là nó chờ ít nhất một ký tự.

Bạn phải xuất ngay khi nhận được đầu vào, không phải sau 10 giây đã trôi qua.

Sau 10 giây trôi qua, bạn phải kết thúc, bạn không thể tiếp tục chờ nhập liệu sau khi no input receivedđã được in.

Bạn có thể cho rằng đầu vào không được chuyển trong khoảng thời gian giữa 10 giây và văn bản được in ra màn hình, vì đây là một cửa sổ cực kỳ nhỏ. Bạn cũng có thể cho rằng tương đương với ngôn ngữ của bạn sleeplà hoàn toàn nhất quán, hoàn hảo.

Đây là , ít byte thắng nhất!


6
+1 chỉ cho cảm ứng đẹp mắt để ngăn ngôn ngữ chơi gôn sử dụng từ điển của họ. Oh, và thách thức lớn quá.
Adám

1
@ Adám trừ khi ngôn ngữ của bạn có nội dung được đọc với thời gian chờ, tôi nghĩ cách tốt nhất để làm điều này là ma thuật OS / Thread, điều mà hầu hết các ngôn ngữ chơi gôn không thể làm được.
Pavel

Bây giờ tôi phải viết lại chương trình của tôi. Đã gần như sẵn sàng để đăng ... ;-)
Adám

1
@TheLethalCoder Bạn có thể đảm nhận sleepchức năng tương đương với ngôn ngữ của mình hoàn toàn 100%.
Pavel

1
@Lembik Có bạn đi, một câu trả lời Python.
Pavel

Câu trả lời:


24

bash, 38 byte

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

Điều này sử dụng -ttùy chọn (thời gian chờ) để bash's read, khiến nó bị lỗi và trả về mã thoát không khác nếu không có đầu vào nào được đưa ra trong số giây đã chỉ định.


6
Nó được cho là nói "(không) đầu vào rec tức là ved", điều này quan trọng cản trở các ngôn ngữ chơi gôn với từ điển.
Adám

8
@ Adám Thật ra đó là một lỗi đánh máy
Pavel

7
@Phoenix Noooo!
Adám

1
Tại sao a = không thì $ a? Có mục đích gì không? EDIT Tôi hiểu rồi Tôi đã không đọc đúng câu hỏi
Felix Guo

12

Haskell, 97 89 byte

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

Nếu timeouthết thời gian, nó sẽ trả về NothingJust Char( Charvì chúng tôi đang sử dụng getChar) nếu không. Giá trị trả về này được chuyển đổi thành "no "hoặc ""theo chức năng maybe "no " mempty. Nối "input received"và in.

Chỉnh sửa: @BMO đề xuất maybevà lưu một số byte.


Dường như không chạy chính xác trong ghci.
maple_shaft

@maple_shaft: Trong ghci bạn phải liên kết gvới let: let g Nothing="no ";g _="", sau đó chức năng gọi timeout....hoạt động tốt với tôi.
nimi

1
Bạn có thể thay thế gbằng maybe"no "(pure"")cái ngắn hơn và thậm chí bạn có thể nội tuyến nó - tiết kiệm cho bạn 6 byte.
ბიმო

@BMO: Hay đấy! memptythay vì (pure"")thậm chí còn ngắn hơn.
nimi

Rất đẹp, điều đó thực sự thông minh!
ბიმო

11

POSIX C99, 71 63 byte

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

Ung dung:

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

pollsẽ trả về 1 trong trường hợp thành công, chúng tôi nhân kết quả với 3 và dịch chuyển chuỗi cho phù hợp. Sau đó, chúng tôi sử dụng thực tế struct pollfdcó bố cục sau:

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

và đó STDIN_FILENO0, POLLIN1để thay thế pfdvới int pfd[] = {0,1}, mà chúng tôi cuối cùng đã làm cho một litteral hợp chất (như cho phép C99).


3
Bạn cần xác định rằng mục tiêu này là POSIX, vì poll.htiêu đề không phải là một phần của tiêu chuẩn ngôn ngữ C99.
Cody Grey

8

Bản thảo, 113

Applescript không thực sự đọc từ STDIN. Hy vọng rằng a display dialogđược chấp nhận ở đây:

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

6

APL (Dyalog) , 41 40 byte

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

Đây là một hàm ẩn danh cần một đối số giả để chạy .

'no input received' chuỗi đầy đủ

↓⍨ thả càng nhiều ký tự từ phía trước số đó càng nhiều

{ hàm rõ ràng ẩn danh ( biểu thị đối số)

⎕RTL←10 đặt R đặc biệt T ime L bắt chước đến mười giây

3*⍨ nâng con số đó (mười) lên sức mạnh của ba (một nghìn nghĩa là "tất cả")

:: theo những ngoại lệ đó (tất cả),

  0 trả về 0

 thử:

   nhận đầu vào

  3⊣ loại bỏ điều đó và thay vào đó trả lại 3

}kết thúc chức năng (lưu ý rằng đối số không bao giờ được đề cập)


6

Perl , 74 67 byte

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

Phiên bản cũ

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

(Chạy qua perl -M5.10.1 ...)


Không có dòng mới nào là cần thiết trong đầu ra, vì vậy bạn có thể cắt \n.
Pavel

3
Chào mừng đến với PPCG!
Pavel

Thật ra bạn không cần -M5.10.1. Bạn chỉ có thể thay thế -ebằng -E. (nếu bạn cần -M5.10.1, bạn sẽ phải thêm một hình phạt vào điểm số của mình)
Brad Gilbert b2gills

@Phoenix, \ncó vì diehành vi của nó: Thời gian Nếu phần tử cuối cùng của LIST không kết thúc trong một dòng mới, số dòng kịch bản hiện tại và số dòng đầu vào (nếu có) cũng được in và một dòng mới được cung cấp. Vì vậy, nếu không có nó sẽ hiển thị, không có đầu vào nào nhận được ở dòng -e 1.. Nhưng tất nhiên, nó có thể là một ngắt dòng theo nghĩa đen trong chuỗi. Bên cạnh đó, không gian giữa diesayvà các tham số của chúng là không cần thiết. Tương tự cho trận chung kết ;. Và <>là đủ để đọc từ đầu vào tiêu chuẩn.
manatwork

1
Nếu bạn evalđọc từ STDIN, bạn có thể tránh cần một dietin nhắn. Trong thực tế, một lỗi thời gian chạy cũng hoạt động tốt : $SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'.
Primo

6

Perl 6 ,  72  66 byte

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

Thử không có đầu vào
Hãy thử với đầu vào

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

Thử không có đầu vào
Hãy thử với đầu vào

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
"Bài luận của tôi được nhận đầu vào - hứa trong 10 rồi nói 'không có bài luận' và thoát hoặc nhận câu nói 'bài luận'"
chú mèo

Bạn có thể loại bỏ không gian giữa start{?
Pavel

@Phoenix Điều đó sẽ được phân tích cú pháp như là lập chỉ mục kết hợp trên một biến không có tên start, vì vậy không.
Brad Gilbert b2gills

Liên kết TIO của bạn dường như không hoạt động nữa.
Pavel

@Pavel, Đã sửa, chỉ cần biến lớp kiểm tra giả thành một kiểu con của IO :: Xử lý và gọi .new
Brad Gilbert b2gills

5

C #, 180 171 148 131 byte

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

Đã lưu 17 byte nhờ @VisualMelon.

Phiên bản đầy đủ / được định dạng:

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

Tại sao namespacevà không phải là một usingchỉ thị?
Pavel

@Phoenix dù sao họ cũng sẽ cần một không gian tên để họ lưu tất cả các byte củausing
LiefdeWen

Tại sao bạn lưu phần quan trọng dưới dạng Hành động và thực hiện sau đó? Tôi thực sự không thể nhìn thấy câu hỏi chỉ rõ điều này.
Trận tuyết rơi

1
Có thể tiết kiệm khá nhiều bằng cách sử dụng giá trị trả về từ Thread.Join(int), (loại bỏ c, mất dấu ngoặc, v.v.): var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(VB.NET dường như đã làm điều này)
VisualMelon

1
@TaylorScott Tôi có thể làm 1e4nhưng đó là một doublevà tôi cần một điều intnên tôi phải làm (int)1e4:( Mặc dù vậy, ý tưởng tuyệt vời
TheLethalCoder

5

TI-BASIC, 84 77 byte

-7 cảm ơn @ 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

Chờ cho đến khi một số được nhấn.

Tôi đang cố gắng tìm ra cách đánh golf trình tự {72,73,74,82,83,84,92,93,94}. Nó đang chiếm rất nhiều không gian.


Nếu bạn muốn đợi bất kỳ phím nào, thì Repeat K or 10=checkTmr(Tsẽ làm.
bb94

Ngoài ra, 4 dòng cuối cùng có thể được rút ngắn thành:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94

1
@ bb94 Tôi không thực sự muốn đợi bất kỳ khóa nào, vì không phải tất cả những người đó thực sự sẽ nhập một ký tự. Nó sẽ giống như chờ đợi Shiftchìa khóa trên máy tính. Ngoài ra, rút ​​ngắn 4 dòng cuối cùng với phương thức của bạn thực sự cho cùng số byte như của tôi. Tôi thích phương pháp của bạn, mặc dù.
Scott Milner

Bạn có thể kiểm tra bất kỳ khóa nào không phải là 21 hoặc 31.
bb94

Sau khi ortrong câu lệnh lặp lại của bạn, hãy sử dụng câu lệnh này thay cho -7 byte:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94

4

NodeJS, 105 103 101 byte

-2 byte nhờ @apsillers
-2 byte bằng cách di chuyển console.log()vàoexit()

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

Chạy bằng cách lưu vào một tệp và chạy nó bằng nút hoặc chạy thẳng từ dòng lệnh bằng cách thực hiện node -e "<code>"


@apsillers Yup, bắt tốt.
Justin Mariner

@apsillers Tôi chuẩn bị chỉnh sửa một lần nữa để thực sự chuyển console.log()cuộc gọi vào tham số của exit(). Đó là hai ít hơn, bây giờ.
Justin Mariner

4

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

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i
  • 2 byte được lưu nhờ các apsillers chỉ ra rằng tôi thật ngu ngốc!

Thử nó

Đòi hỏi một kết thúc >trên inputđể làm việc trong một số câu liên quan.

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


1e5 là 100.000 hoặc 100 giây, 1e4 là 10 giây
PunPun1000

Rất tiếc! Được phát hiện rõ, cảm ơn, @ PunPun1000
Shaggy

Nó sẽ không ngắn hơn để viết 10thay vì 1e4?
sĩ523

@ musicman523, 10sẽ là 10 mili giây, thử thách thách thức cụ thể là 10 giây , tức là 10000 mili giây, do đó 1e4.
Xù xì

10 != 1e4Thật tệ, tôi đã quên điều đó bởi vì tôi là một kẻ ngốc
sĩ523

3

VB.Net - 174 byte

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

Phiên bản COBOL sắp ra mắt vào ngày mai ;-)


3
Tôi không chắc lợi thế của việc kết hợp các dòng với :. Điều đó có cùng số byte như ngắt dòng, vì vậy nó chỉ làm giảm khả năng đọc mà không cải thiện điểm golf.
Cody Grey

@CodyGray Tôi tin rằng sự :thay thế ngắt dòng có thể để cuộc gọi bước đi có thể được khai báo nội tuyến mà không lặp lại - nhưng điều đó nói rằng tôi không tích cực, ngôn ngữ chính của tôi là VBA không hỗ trợ luồng hoặc đọc từ bảng điều khiển <strike> / strike> cửa sổ ngay lập tức hỗ trợ tại thời điểm xác định chức năng hoặc gọi: P
Taylor Scott

3

Đi, 149 byte

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

AHK , 67 65 byte

2 byte được lưu bởi Blauhirn

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

AHK có thời gian chờ tích hợp cho các hộp đầu vào.
Tôi đã cố gắng để có được thông minh và sử dụng !othay vì ErrorLevelnhưng điều đó không thành công nếu người dùng nhập một giá trị falsey.
Gần một nửa câu trả lời chỉ là tên lệnh và văn bản cố định.


1
Tất cả các dấu phẩy để làm gì?
Pavel

@Phoenix Có lẽ đang tranh luận về InputBox
Adám

@Phoenix Timeoutgần như là tham số cuối cùng:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Kỹ sư Toast

hai ký tự ngắn hơn:s:=errorLevel?"no ":
phil294

@Blauhirn Gah! Tôi là một thằng ngốc. Cảm ơn.
Kỹ sư Toast

3

Python3, 100 89 83 71 byte

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

Đầu tiên hãy thử chơi golf.

-4 cho any(), -7 để cắt, cảm ơn @ user2357112!

-6, nhận select()từ ptythay vì select.


Bạn có thể cắt một số byte bằng cách cắt một "no input received"chuỗi : "no input received"[3*bool(...):].
user2357112 hỗ trợ Monica

Bạn cũng có thể sử dụng any(...)thay vì bool(...[0]).
user2357112 hỗ trợ Monica

-Người dùng mới: "trên Windows, nó ném ModuleNotFoundError: Không có mô-đun nào có tên 'termios'"
FantaC

Các ptymô-đun chỉ có sẵn trên nền tảng Linux, nhưng tôi chỉ sử dụng nó bởi vì tên của nó là ngắn và nó làm cho selectcó sẵn. Phiên bản 2 có thể hoạt động tốt hơn trên Windows.
Seth

3

PowerShell, 110 byte

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

3

Python 3, 158 byte

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)

Tôi đã thử chạy câu trả lời Python 3 của Seth nhưng trên Windows thì nó bị ném ModuleNotFoundError: No module named 'termios'và vì tôi không thể nhận xét về câu trả lời của anh ấy về nó, nên tôi quyết định đưa ra một giải pháp độc lập với nền tảng.

Đây là lần đầu tiên tôi chơi golf nên tôi chắc chắn nó có thể được cải thiện.


2
Chào mừng đến với PPCG!
Steadybox

2

Tcl, 99 byte

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

2

SmileBASIC 3, 74 byte

"Chấp nhận đầu vào" bằng cách đợi bất kỳ nút bấm nào (nên được tính là đầu vào.)

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

Đầu ra phải là "(không) đầu vào nhận được", không phải "VÀO (KHÔNG) NHẬN"
Pavel

2

Cào 2 / 3.x, 41 điểm ( Giải thích )

Hẹn giờ thiếu kiên nhẫn

1: Khi nhấp vào GF

1: hỏi [] và đợi

1 + 14 ký tự: nói [nhận đầu vào]

1: stop [all v] (lưu ý: vì "all" là cài đặt mặc định của nó, tôi đã đếm khối là 1)

1 + 2 chữ số: chờ (10) giây

1 + 17 ký tự: nói [không nhận được đầu vào]

1: dừng lại [tất cả v]


Chào mừng đến với PCG!
Rahul Bharadwaj

1

> <> , 43 + 6 = 49 byte

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

Hãy thử trực tuyến!

+5 cho -t.08cờ, đặt dấu tick thành 0,08 giây và +1 cho acờ, tính khoảng trắng và bỏ qua các hướng dẫn dưới dạng dấu tick.

Chương trình kiểm tra đầu vào khoảng một lần mỗi giây và thoát khỏi vòng lặp nếu đầu vào được phát hiện. Nếu đầu vào không được nhận, nó sẽ thoát khỏi vòng lặp từ dưới lên, nối novào đầu chuỗi. Việc ban đầu /là để đảm bảo rằng lần kiểm tra cuối cùng cho đầu vào chính xác trên dấu 10 giây.

Sau đó mất khoảng 5-6 giây để tự in chuỗi.


Bạn có thể sử dụng một cờ duy nhất, -at.08để lưu một byte.
Pavel

@Pavel, Cảm ơn!
Jo King

1

Java 1.4+, 284 byte

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

Ung dung:

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

Vui lòng không đề xuất các cải tiến Java dành riêng cho Phiên bản, đây là câu trả lời Java chung hoạt động trong tất cả các Môi trường Java hiện đang ổn định (1.4 trở lên).


Lời nói rất quái đản ... Bắt là bắt buộc, không thể ném nó. Nhập khẩu hệ thống tắt như 5 byte ... Quá tải cũng dài dòng, do đó, nó kết thúc một mớ hỗn độn trông như chơi golf kém.


Có phải có 10000Lvà không 10000? Tôi nghĩ ints cast để dài tự động.
Pavel

1

Julia 0,6 , 78 byte

Lâu hơn tôi mong đợi. Xem bình luận cho liên kết TIO "không nhận được đầu vào".

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

Hãy thử trực tuyến!


1
Nó không chặn trên TIO vì nó đọc từ một tệp. Nó đạt EOF và kết thúc ngay lập tức. Nếu bạn ống một quá trình mà không bao giờ phát ra dòng mới vào chương trình trên TIO, nó sẽ chặn: tio.run/##JcqxDoIwEIDhvU9x6ULPCNXFxejk4uIiowvaSzgDLekVReO7V4Pb/...
Pavel

0

SmileBASIC, 74 73 byte

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

Có 1 ký tự đầu vào.

Và một giải pháp 39 byte có thể không hợp lệ (thực tế không chấp nhận nhập văn bản, chỉ có một OKnút mà bạn có thể nhấn)

?"no "*!DIALOG("",,,10);"input received
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.