イライラして入力を待つ


39

今日のタスクは、入力を取得するための時間制限を実装することです。これは、ほとんどの言語で達成するのがかなり面倒だと感じたタスクです。

ユーザーに入力を求めるプログラム関数を作成します。ユーザーが入力を提供した直後に、メッセージinput receivedを出力して実行/リターンを終了します。ただし、ユーザーが入力を提供するために10秒以上待機する場合は、メッセージno input receivedを出力して実行/リターンを終了します。

入力はstdin(コンソール)または同等であり、関数またはプログラムの引数ではありませんが、出力はto stdout、関数の戻り値、またはその他の受け入れられる出力メソッドのいずれかです。

任意の量の入力を要求できます。1文字、行、単語、または少なくとも1文字を待つ限り、言語で最も短い方法を入力できます。

10秒が経過した後ではなく、入力を受信したらすぐに出力する必要があります。

10秒が経過したら、終了する必要がありますno input received。印刷後、入力を待つことはできません。

これは非常に小さなウィンドウであるため、入力が10秒経過してからテキストが画面に出力されるまでの間に渡されないと想定することができます。また、あなたの言語の組み込みの同等物sleepが一貫して、完全に完璧であると仮定するかもしれません。

これは、最少バイトが勝ちます!


6
ゴルフ言語が辞書を使用するのを防ぐための素敵なタッチのために+1。ああ、また大きな挑戦。
アダム

1
@Adámは、タイムアウトが組み込まれた読み取りを言語に持たない限り、これを行うための唯一の良い方法はOS /スレッドマジックであると思います。
パベル

次に、プログラムを書き直さなければなりません。ほとんど投稿する準備ができていました...
;

1
@TheLethalCoderあなたはあなたの言語のsleep機能と同等の機能を完全に100%と仮定することができます。
パベル

1
@Lembikさあ、Pythonの答えです。
パベル

回答:


24

bash、38バイト

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

これは、-tbashの(タイムアウト)オプションを使用しますread。これにより、指定された秒数内に入力が与えられなかった場合に失敗し、ゼロ以外の終了コードが返されます。


6
「(なし)入力REC言うことになっていないつまり重要なの辞書と言語をゴルフ妨害VED」。
アダム

8
@Adám実際にはそれはタイプミスです
パベル

7
@Phoenix Noooo!
アダム

1
なぜa = no then $ aなのですか?目的はありますか?編集私はそれを手に入れました質問を正しく読みませんでした
フェリックス郭

12

Haskell、97 89バイト

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

もしtimeoutそれが返すタイムアウトNothingJust CharChar私たちが使用しているので、getCharそうでない場合)。この戻り値は、関数によって、"no "または""関数によって変換されますmaybe "no " mempty。追加"input received"して印刷します。

編集:@BMOはmaybeいくつかのバイトを提案して保存しました。


Doesntはghciで正しく実行されているようです。
maple_shaft

@maple_shaft:GHCiの内であなたがバインドする必要があるgletlet 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_FILENO0POLLINある1交換するpfdint pfd[] = {0,1}(C99によって許可され)、我々は最終的に化合物litteralを作るています、。


3
poll.hヘッダーはC99言語標準の一部ではないため、これがPOSIXをターゲットとするように指定する必要があります。
コーディグレー

8

Applescript、113

Applescriptは、実際にはSTDINからの読み取りを行いません。display dialogここでa が受け入れられることを願っています:

({"","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 esponse T IME Lの 10秒にimitを

3*⍨ その数(10)を3の累乗に増やします(1000は「すべて」を意味します)

:: それらの例外(すべて)に対して、

  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
パベル

3
PPCGへようこそ!
パベル

実際には必要ありません-M5.10.1。あなたは置き換えることができ-e-E。(必要な-M5.10.1場合は、スコアにペナルティを追加する必要があります)
ブラッドギルバートb2gills

@Phoenix、はの動作の\nために存在しdieます:「LISTの最後の要素が改行で終わらない場合、現在のスクリプト行番号と入力行番号(もしあれば)も印刷され、改行が提供されます。」そのため、「-e行1で入力が受信されていません」と表示されます。しかし、もちろん、それは文字列のリテラルの改行でもかまいません。それに加えて、dieand sayとそのパラメーターの間のスペースは必要ありません。finalでも同じです;。そして<>、標準入力から読み取るのに十分です。
マナトワーク

1
あなたの場合はevalSTDINから読み取り、あなたが必要とする避けることができdie、メッセージを。実際、ランタイムエラーも同様に機能します$SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'
プリモ

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は入力受け取っている-そして言う『いいえESS』と出るか、発言権を得る10における約束は『ESS』」

startとの間のスペースを削除できます{か?
パベル

@Phoenixそれはstart、という名前の無印の変数の連想インデックスとして解析されるので、いいえ。
ブラッドギルバートb2gills

TIOリンクが機能しなくなったようです。
パベル

@Pavel、修正済み、ダミーのテストクラスをIO :: Handleのサブタイプに.newして、呼び出す必要がありました
Brad Gilbert 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

重要な部分をアクションとして保存し、後で実行したのはなぜですか?私はこれを特定する質問を本当に見ることができません。
スノーファイア

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行を短縮すると、実際には私のバイト数と同じバイト数になります。しかし、私はあなたの方法が好きです。
スコットミルナー

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()。これで2つ少なくなりました。
ジャスティンマリナー

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
  • 私が愚かだと指摘するapsillerのおかげで2バイト節約されました!

それを試してみてください

スニペットで作業する>には、inputで閉じる必要があります。

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


1e5は100,000または100秒、1e4は10秒
PunPun1000

おっとっと!よく見つけました、ありがとう、@ PunPun1000
シャギー

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
テイラースコット

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、ユーザーが偽の値を入力すると失敗します。
答えのほぼ半分は、コマンド名と固定テキストだけです。


1
すべてのコンマは何のためですか?
パベル

@PhoenixはおそらくInputBox関数に引数をeliding
アダム・

@PhoenixはTimeoutほとんど最後のパラメータである:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
エンジニアトースト

短い2文字: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

SmileBASIC 3、74バイト

ボタンが押されるのを待つことで「入力を受け付ける」(入力としてカウントする必要があります。)

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

出力は"(なし)入力を受信"、 "INPUT RECEIVED(NOT)"ではないでなければなりません
パベル

2

スクラッチ2 / 3.x、41ポイント(説明

せっかちなタイマー

1:GFがクリックされたとき

1:[]に聞いて待つ

1 + 14文字:[入力を受信]と言います

1:停止[すべてv](注:「すべて」がデフォルト設定であったため、ブロックを1としてカウントしました)

1 + 2桁:待機(10)秒

1 + 17文字:[入力が受信されていません]と言います

1:停止[すべてv]


PCGへようこそ!
ラーフルバラドワジ

1

> <>、43 + 6 = 49バイト

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

オンラインでお試しください!

-t.08フラグの場合は+5。ティックを0.08秒に設定し、aフラグの場合は+1 。空白およびスキップされた命令をティックとしてカウントします。

プログラムは約1秒に1回入力をチェックし、入力が検出されるとループを終了します。入力が受信されない場合、ループの最後から出てno、文字列の先頭に追加されます。最初/は、入力の最後のチェックが正確に10秒のマークになるようにすることです。

その後、文字列自体を印刷するには約5〜6秒かかります。


単一のフラグを使用して-at.08、バイトを保存できます。
パベル

@Pavel、ありがとう!
ジョーキング

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環境(1.4以降)で機能する一般的なJavaの回答です。


非常に奇妙な言葉遣い...キャッチが必要です、それを投げることはできません。システムインポートは5バイトのように削ります...オーバーロードも冗長であるため、結果として、ゴルフのように見栄えの悪い冗長な混乱になります。


それはそうである必要が10000Lあり10000ますか?intはlongに自動的にキャストされると思いました。
パベル

1

ジュリア0.6、78バイト

思ったより長い。「入力なし」TIOリンクのコメントを参照してください。

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

オンラインでお試しください!


1
TIOはファイルからの読み取りであるため、TIOをブロックしません。EOFに達し、すぐに終了します。あなたは、パイプTIO上のプログラムに改行を発することはありませんプロセスをした場合、それはブロックします:tio.run/##JcqxDoIwEIDhvU9x6ULPCNXFxejk4uIiowvaSzgDLekVReO7V4Pb/...
パベル

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.