성급히 입력을 기다립니다


39

오늘 귀하의 임무는 입력을 받기위한 시간 제한을 구현하는 것입니다. 대부분의 언어에서 달성하기가 다소 성가신 작업이었습니다.

사용자에게 입력을 요구하는 프로그램 기능을 작성합니다. 사용자가 입력 한 후 즉시 메시지를 인쇄하고 input received실행 / 반환을 종료합니다. 그러나 사용자가 입력을 제공하기 위해 10 초 이상 기다리면 메시지를 출력하고 no input received실행 / 반환을 종료하십시오.

입력은 stdin(콘솔) 또는 동등한 함수 또는 프로그램 인수가 아니 어야 하지만, 출력은 stdout, 함수의 반환 값 또는 기타 허용되는 출력 방법 중 하나 일 수 있습니다 .

입력량을 요구할 수 있습니다. 단일 문자, 줄, 단어 또는 하나 이상의 문자를 기다리는 한 언어에서 가장 짧은 방법 일 수 있습니다.

10 초가 지난 후가 아니라 입력을받는 즉시 출력해야합니다.

10 초가 지난 후에 종료 해야하며no input received 인쇄 된 후에도 입력을 계속 기다릴 수 없습니다 .

10 초가 지나고 화면에 텍스트가 인쇄되는 시간이 지나면 입력이 전달되지 않는다고 가정 할 수 있습니다. 이는 매우 작은 창입니다. 언어의 내장 언어 sleep가 일관되고 완벽하게 완벽 하다고 가정 할 수도 있습니다 .

이것은 이며 가장 적은 바이트 수입니다!


6
골프 언어가 사전을 사용하는 것을 막기 위해 멋진 터치를 위해 +1하십시오. 아, 그리고 큰 도전도.
Adám

1
@ Adám 귀하의 언어에 시간 제한이있는 읽기 기능이 내장되어 있지 않는 한, 이것을하는 유일한 방법은 대부분의 골프 언어가 할 수없는 OS / 스레드 마법이라고 생각합니다.
Pavel

이제 프로그램을 다시 작성해야합니다. 거의 게시 할 준비가되었습니다 ... ;-)
Adám

1
@TheLethalCoder 당신은 당신의 언어와 동등한 sleep기능을 100 % 완벽하게 가정 할 수 있습니다 .
Pavel

1
@Lembik Python 응답이 있습니다.
Pavel

답변:


24

bash, 38 바이트

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

-t(timeout) 옵션을 사용하여 bash 's을 read지정하면 지정된 시간 (초) 동안 입력이 없으면 실패하고 0이 아닌 종료 코드를 반환합니다.


6
"(없음) 입력 녹화 말을 생각하지 않습니다 즉, 중요한 것은 사전과 언어를 골프 방해 VED".
Adám

8
@ Adám 실제로 그것은 오타입니다
Pavel

7
@Phoenix Noooo!
Adám

1
왜 a = no 그리고 $ a를합니까? 목적이 있습니까? 수정 질문을 제대로 읽지 못했습니다
Felix Guo

12

하스켈, 97 89 바이트

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

경우 timeout그 시간이 초과 반환 Nothing하고 Just Char( Char우리가 사용하고 있기 때문에 getChar, 그렇지 않으면). 이 반환 값은로 "no "또는 ""함수에 의해 변환됩니다 maybe "no " mempty. 추가 "input received"및 인쇄

편집 : @ BMO는 maybe일부 바이트를 제안 하고 저장했습니다.


ghci에서 제대로 실행되지 않는 것 같습니다.
maple_shaft

@maple_shaft : 당신이 바인드 할 필요가 ghci 내 glet: let g Nothing="no ";g _=""다음 함수 호출은 timeout....나를 위해 잘 작동합니다.
nimi

1
당신은 대체 할 수 있습니다 g에 의해 maybe"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_FILENO이다 0, POLLIN입니다 1교체 pfd와 함께 int pfd[] = {0,1}(C99이 허용하는) 우리는 마침내 복합 litteral을한다.


3
poll.h헤더가 C99 언어 표준의 일부가 아니므 로 POSIX를 대상으로 지정해야합니다 .
코디 그레이

8

애플 스크립트, 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 설정 R 저 응답 T IME L의 십초에 IMIT을

3*⍨ 그 수 (10)를 3의 거듭 제곱으로 올리십시오 (천은 "모두"를 의미합니다)

:: 그 예외들 (모두)에

  0 0을 반환

 시험:

   입력 받기

  3⊣ 그것을 버리고 대신 3을 반환하십시오.

}기능 종료 (인수 는 언급되지 않았습니다)


6

, 74 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에 오신 것을 환영합니다!
Pavel

실제로는 필요하지 않습니다 -M5.10.1. 당신은 대체 할 수 있습니다 -e-E. (필요한 경우 -M5.10.1점수에 페널티를 추가해야합니다)
Brad Gilbert b2gills

@Phoenix는이 \n때문에의 존재 die의 행동 : "목록의 마지막 요소는 개행 문자로 끝나지 않는 경우, 현재 스크립트 행 번호와 입력 라인 수 (있는 경우)도 인쇄되며, 개행 문자가 제공됩니다." 따라서“-e line 1에서 입력을받지 못했습니다”라고 표시되지 않습니다. 물론 문자열에서 줄 바꿈이 될 수 있습니다. 그 옆에, 사이의 공간 diesay자신의 매개 변수가 필요하지 않습니다. 마지막도 마찬가지 ;입니다. 그리고 <>표준 입력에서 읽기에 충분합니다.
manatwork

1
evalSTDIN에서 읽은 경우 die메시지 가 필요하지 않습니다. 실제로 런타임 오류도 다음과 같이 작동합니다 $SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'.
primo

6

펄 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
"내 에센스는 입력을 받았습니다. 10시에 약속하고 '아니 에스'라고 말하고 종료하거나 '에스'라고 말하십시오."
cat

start와 사이의 공백을 제거 할 수 있습니까 {?
Pavel

@Phoenix 그것은라는 sigilless 변수에 대한 연관 인덱싱으로 해석 될 것 start입니다.
브래드 길버트 b2gills

TIO 링크가 더 이상 작동하지 않는 것 같습니다.
Pavel

@Pavel, Fixed는 더미 테스트 클래스를 IO :: Handle의 하위 유형으로 .new
만들어야

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지침?
Pavel

@Phoenix 그들은 어쨌든 네임 스페이스가 필요하기 때문에 모든 바이트를 절약 할 수 있습니다.using
LiefdeWen

중요한 부분을 액션으로 저장하고 나중에 실행 한 이유는 무엇입니까? 나는 이것을 지정하는 질문을 실제로 볼 수 없습니다.
Snowfire

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 바이트

@ kamoroso94 감사합니다 -7

: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 2016 년

21 또는 31이 아닌 키를 확인할 수 있습니다.
bb94

or: 당신의 반복 문 대신에 대한 -7 바이트 이것을 사용abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94

4

NodeJS, 105 (103) 101 바이트

-2 @apsillers 덕분 바이트
-2 이동하여 바이트 console.log()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

자바 스크립트 (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
  • 내가 바보라고 지적하는 apsillers 덕분에 2 바이트가 절약되었습니다 !

시도 해봐

닫는 필요 >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

내일 코볼 버전 ;-)


3
줄을와 결합하여 어떤 이점이 있는지 잘 모르겠습니다 :. 줄 바꿈과 동일한 바이트 수를 사용하므로 골프 점수를 높이 지 않고 가독성을 떨어 뜨립니다.
코디 그레이

@CodyGray :줄 바꿈 대체가 트레드 호출을 반복하지 않고 인라인으로 선언 할 수 있다고 생각합니다. 그러나 긍정적이지 않다고 말하면, 내 주요 언어는 VBA이며 <strike> console < / strike> 함수 정의 또는 호출시를 제외하고 즉시 창 : P
Taylor Scott

3

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

AHK , 67 65 바이트

Blauhirn에 의해 2 바이트 절약

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

AHK에는 입력 상자에 대한 시간 제한이 내장되어 있습니다.
나는 영리하고 !o대신에 사용하려고했지만 ErrorLevel사용자가 잘못된 값을 입력하면 실패합니다.
답의 거의 절반은 명령 이름과 고정 텍스트입니다.


1
쉼표는 무엇입니까?
Pavel

@Phoenix 아마도 InputBox에 인수를 제기
Adám

@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()옵니다 .ptyselect


"no input received"문자열을 잘라서 일부 바이트를 잘라낼 수 있습니다 "no input received"[3*bool(...):].
user2357112

any(...)대신에 사용할 수도 있습니다 bool(...[0]).
user2357112

-새 사용자 : "Windows에서 ModuleNotFoundError가 발생 함 : 이름이 'termios'인 모듈 없음"
FantaC

pty모듈은 리눅스 플랫폼에서만 사용할 수 있지만 그 이름이 짧은하고 만들기 때문에 난 단지 그것을 사용하고 select가능합니다. 버전 2는 아마도 Windows에서 더 잘 작동합니다.
세스

3

PowerShell, 110 바이트

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

3

파이썬 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

"INPUT (NOT) RECEIVED"가 아니라 "(no) input received"출력이어야합니다.
Pavel

2

스크래치 2 / 3.x, 41 포인트 ( 설명 )

참을성이없는 타이머

1 : GF 클릭시

1 : []에게 묻고 기다립니다

1 + 14 자 : [입력 접수]

1 : [all v] 중지 (참고 : "all"이 기본 설정이므로 블록을 1로 계산했습니다.)

1 + 2 자리 : 대기 (10) 초

1 + 17 자 : 입력하지 않음

1 : 중지 [all v]


PCG에 오신 것을 환영합니다!
Rahul Bharadwaj

1

> <> , 43 + 6 = 49 바이트

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

온라인으로 사용해보십시오!

-t.08틱을 0.08 초로 설정 하는 플래그의 경우 +5 a, 공백 및 건너 뛴 명령어를 틱으로 계산 하는 플래그의 경우 +1 .

프로그램은 약 1 초마다 입력을 확인하고 입력이 감지되면 루프를 종료합니다. 입력이 수신되지 않으면 하단에서 루프를 빠져 나와 no문자열의 시작 부분에 추가 됩니다. 초기 값 /은 마지막 입력 확인이 정확히 10 초 표시인지 확인하는 것입니다.

그런 다음 문자열 자체를 인쇄하는 데 약 5-6 초가 걸립니다.


단일 플래그 -at.08를 사용하여 바이트를 저장할 수 있습니다 .
Pavel

@Pavel, 감사합니다!
Jo King

1

자바 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 환경 (1.4 이상)에서 작동하는 일반적인 Java 답변입니다.


매우 기발한 말 ... 잡기가 필요합니다. 던질 수 없습니다. 시스템 가져 오기는 5 바이트처럼 줄어 듭니다 ... 오버로딩도 번거롭기 때문에 골치 아픈 골치 거리가됩니다.


그럴 필요합니까 10000L하지 10000? 나는 ints가 자동으로 long으로 캐스팅되었다고 생각했습니다.
Pavel

1

줄리아 0.6 , 78 바이트

내가 예상했던 것보다 길다. "입력을받지 않은"TIO 링크에 대한 주석을 참조하십시오.

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

온라인으로 사용해보십시오!


1
파일에서 읽기 때문에 TIO에서 차단되지 않습니다. EOF에 도달하면 즉시 완료됩니다. TIO의 프로그램에 개행 문자를 절대로 방출하지 않는 프로세스를 파이프하면 tio.run/##JcqxDoIwEIDhvU9x6ULPCNXFxejk4uIiowvaSzgDLekVReO7V4Pb/…
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.