Tidak sabar menunggu input

39

Tugas Anda hari ini adalah menerapkan batas waktu untuk mendapatkan input, tugas yang menurut saya agak menyebalkan untuk dicapai dalam kebanyakan bahasa.

Anda akan membuat fungsi program yang meminta input dari pengguna. Segera setelah input persediaan pengguna, cetak pesan input receiveddan akhiri eksekusi / kembali. Namun, jika pengguna menunggu lebih dari 10 detik untuk memberikan input, output pesan no input receiveddan akhiri eksekusi / kembali.

Input harus dari stdin(konsol) atau yang setara, bukan argumen fungsi atau program, namun output dapat berupa stdoutnilai pengembalian fungsi Anda, atau metode output lain yang diterima.

Anda dapat meminta input dalam jumlah berapa pun, dapat berupa satu karakter, satu baris, satu kata, atau metode apa pun yang terpendek dalam bahasa Anda selama menunggu setidaknya satu karakter.

Anda harus mengeluarkan segera setelah input diterima, tidak setelah 10 detik berlalu.

Setelah 10 detik berlalu, Anda harus mengakhiri, Anda tidak dapat terus menunggu input setelah no input receiveddicetak.

Anda dapat berasumsi bahwa input tidak lulus dalam waktu antara 10 detik berlalu dan teks dicetak ke layar, karena ini adalah jendela yang sangat kecil. Anda juga dapat mengasumsikan bahwa bahasa Anda setara dengan sleepkonsisten, benar-benar sempurna.

Ini adalah , byte terkecil menang!

Pavel
sumber
6
+1 hanya untuk sentuhan yang bagus agar golf tidak menggunakan kamus mereka. Oh, dan tantangan besar juga.
Adm
1
@ Adam kecuali bahasa Anda memiliki builtin yang dibaca dengan batas waktu, saya pikir satu-satunya cara yang baik untuk melakukan ini adalah OS / Thread magic, yang sebagian besar bahasa golf tidak dapat melakukannya.
Pavel
Sekarang saya harus menulis ulang program saya. Sudah hampir siap untuk mengirim ... ;-)
Adám
1
@TheLethalCoder Anda dapat mengasumsikan sleepfungsi bahasa Anda setara dengan sempurna 100% dari waktu.
Pavel
1
@ Lembik Ini dia, jawaban Python.
Pavel

Jawaban:

24

bash, 38 byte

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

Ini menggunakan opsi -t(batas waktu) untuk bash read, yang menyebabkannya gagal dan mengembalikan kode keluar yang tidak nol jika tidak ada input yang diberikan dalam jumlah detik yang ditentukan.

Gagang pintu
sumber
6
Seharusnya mengatakan "(tidak) input rec yaitu ved" yang penting menghambat bahasa golf dengan kamus.
Adm
8
@ Adám Sebenarnya itu salah ketik
Pavel
7
@Phoenix Noooo!
Adm
1
Mengapa a = tidak, maka $ a? apakah ada tujuan? EDIT Saya mengerti saya tidak membaca pertanyaan dengan benar
Felix Guo
12

Haskell, 97 89 byte

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

Jika timeoutwaktu habis, ia kembali Nothingdan Just Char( Char, karena kami menggunakan getChar) sebaliknya. Nilai pengembalian ini dikonversi ke "no "atau ""oleh fungsi maybe "no " mempty. Tambah "input received"dan cetak.

Sunting: @BMO menyarankan maybedan menyimpan beberapa byte.

nimi
sumber
Tampaknya tidak berjalan dengan benar dalam ghci.
maple_shaft
@maple_shaft: Dalam ghci Anda harus mengikat gdengan let: let g Nothing="no ";g _="", maka fungsi panggilan timeout....bekerja dengan baik bagi saya.
nimi
1
Anda dapat menggantinya gdengan maybe"no "(pure"")yang lebih pendek dan Anda bahkan bisa menyejajarkannya - menghemat 6 byte.
ბიმო
@BMO: Bagus! memptybukannya (pure"")lebih pendek.
nimi
Bagus sekali, itu benar-benar pintar!
ბიმო
11

POSIX C99, 71 63 byte

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

Tidak Disatukan:

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

Karena pollakan mengembalikan 1 jika berhasil, kami mengalikan hasilnya dengan 3 dan menggeser string yang sesuai. Kemudian, kami menggunakan fakta yang struct pollfdmemiliki tata letak berikut:

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

dan itu STDIN_FILENOadalah 0, POLLINadalah 1untuk menggantikan pfddengan int pfd[] = {0,1}, yang akhirnya kami membuat senyawa litteral (sebagaimana diizinkan oleh C99).

yoann
sumber
3
Anda perlu menentukan bahwa ini menargetkan POSIX, karena poll.hheader bukan bagian dari standar bahasa C99.
Cody Gray
8

Applescript, 113

Applescript tidak benar-benar membaca dari STDIN. Semoga a display dialogditerima di sini:

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

APL (Dyalog) , 41 40 byte

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

Ini adalah fungsi diam anonim yang membutuhkan argumen dummy untuk dijalankan .

'no input received' string penuh

↓⍨ drop sebanyak karakter dari depan sebagai jumlah yang dikembalikan oleh

{ fungsi eksplisit anonim ( menunjukkan argumen)

⎕RTL←10 atur R esponse T ime L imit ke sepuluh detik

3*⍨ naikkan angka itu (sepuluh) menjadi tiga (seribu berarti "semua")

:: atas pengecualian tersebut (semua),

  0 kembali 0

 mencoba:

   dapatkan input

  3⊣ buang itu dan sebaliknya kembalikan 3

}akhir fungsi (perhatikan bahwa argumen tidak pernah disebutkan)

Adm
sumber
6

Perl , 74 67 byte

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

Versi lama

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

(Jalankan via perl -M5.10.1 ...)

pengguna1711878
sumber
Tidak ada garis akhir baris diperlukan dalam output, sehingga Anda dapat memotong \n.
Pavel
3
Selamat datang di PPCG!
Pavel
Sebenarnya kamu tidak perlu -M5.10.1. Anda bisa menggantinya -edengan -E. (jika Anda perlu -M5.10.1, Anda harus menambahkan penalti ke skor Anda)
Brad Gilbert b2gills
@Phoenix, \napakah ada karena dieperilaku: "Jika elemen terakhir dari LIST tidak berakhir pada baris baru, nomor baris skrip saat ini dan nomor baris input (jika ada) juga dicetak, dan baris baru diberikan." Jadi tanpa itu akan menampilkan "tidak ada input yang diterima di -e line 1.". Tapi tentu saja, itu bisa menjadi garis putus-putus dalam string. Selain itu, ruang antara diedan saydan parameternya tidak diperlukan. Sama untuk final ;. Dan <>cukup untuk membaca dari input standar.
manatwork
1
Jika Anda evalmembaca dari STDIN, Anda dapat menghindari kebutuhan diepesan. Bahkan, kesalahan runtime bekerja sama dengan baik: $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

Cobalah tanpa input.
Coba dengan input

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

Cobalah tanpa input.
Coba dengan input

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」
Brad Gilbert b2gills
sumber
1
"ess saya adalah input yang diterima - janji di 10 lalu ucapkan 'no ess' dan keluar atau katakan 'ess'"
cat
Bisakah Anda menghapus ruang antara startdan {?
Pavel
@Phoenix Itu akan diuraikan sebagai pengindeksan asosiatif pada variabel sigilless bernama start, jadi tidak.
Brad Gilbert b2gills
TIO Tautan Anda tampaknya tidak berfungsi lagi.
Pavel
@Pavel, Fixed, baru saja membuat kelas tes boneka subtipe IO :: Tangani dan panggil .newitu
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";}

Disimpan 17 byte berkat @VisualMelon.

Versi Lengkap / Terformat:

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();
    }
}
TheLethalCoder
sumber
Mengapa namespacedan bukan usingarahan?
Pavel
@Phoenix mereka tetap membutuhkan namespace sehingga mereka menyimpan semua byteusing
LiefdeWen
Mengapa Anda menyimpan bagian penting sebagai Aksi dan melaksanakannya setelah itu? Saya tidak bisa melihat pertanyaan yang menjelaskan hal ini.
Snowfire
1
Dapat menyimpan sedikit dengan menggunakan nilai kembali dari Thread.Join(int), (menghilangkan c, kehilangan kawat gigi, dll.): var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(VB.NET tampaknya sudah melakukan ini)
VisualMelon
1
@TaylorScott bisa saya lakukan 1e4tetapi itu adalah doubledan saya perlu intjadi saya harus melakukan (int)1e4:( Ide bagus
TheLethalCoder
5

TI-BASIC, 84 77 byte

-7 terima kasih kepada @ 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

Tunggu hingga nomor ditekan.

Saya mencoba mencari cara untuk bermain golf urutan {72,73,74,82,83,84,92,93,94}. Ini memakan banyak ruang.

Scott Milner
sumber
Jika Anda ingin menunggu sembarang kunci, maka Repeat K or 10=checkTmr(Tlakukan.
bb94
Juga, 4 baris terakhir dapat disingkat menjadi:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94
1
@ bb94 Saya tidak benar-benar ingin menunggu sembarang tombol, karena tidak semua dari mereka benar-benar akan memasukkan karakter. Ini seperti menunggu Shiftkunci di komputer. Juga, memperpendek 4 baris terakhir dengan metode Anda sebenarnya memberikan jumlah byte yang sama dengan saya. Saya suka metode Anda.
Scott Milner
Anda dapat memeriksa kunci apa pun yang bukan 21 atau 31.
bb94
Setelah ordalam pernyataan berulang Anda, gunakan ini untuk -7 byte:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94
4

NodeJS, 105 103 101 byte

-2 bytes berkat @apsillers
-2 bytes dengan pindah console.log()keexit()

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

Jalankan dengan menyimpan ke file dan menjalankannya dengan node atau menjalankannya langsung dari baris perintah dengan melakukan node -e "<code>"

Justin Mariner
sumber
@apsillers Yup, tangkapan yang bagus.
Justin Mariner
@apsillers Saya akan mengedit lagi untuk benar-benar memindahkan console.log()panggilan ke parameter exit(). Itu kurang dua, sekarang.
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 disimpan berkat aplikasi yang menunjukkan bahwa saya bodoh!

Cobalah

Memerlukan penutupan >pada inputagar dapat bekerja di Cuplikan.

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

Shaggy
sumber
1e5 adalah 100.000 atau 100 detik, 1e4 adalah 10 detik
PunPun1000
Ups! Terlihat dengan baik, terima kasih, @ PunPun1000
Shaggy
Bukankah lebih pendek untuk menulis 10daripada menulis 1e4?
musicman523
@ musicman523, 10akan menjadi 10 milidetik, tantangan tantangan secara khusus mengatakan 10 detik , yaitu 10.000 milidetik, karenanya 1e4.
Shaggy
Sayang saya, lupa itu 10 != 1e4karena saya bodoh
musicman523
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

Versi COBOL akan datang besok ;-)

FastAl
sumber
3
Saya tidak yakin apa keuntungan menggabungkan garis :. Itu membutuhkan jumlah byte yang sama sebagai penghentian baris, sehingga hanya mengurangi keterbacaan tanpa meningkatkan skor golf.
Cody Grey
@CodyGray Saya percaya bahwa :penggantian baris mungkin dilakukan sehingga panggilan treading dapat dinyatakan sebaris tanpa diulang - tetapi yang mengatakan saya tidak positif, bahasa utama saya adalah VBA yang tidak mendukung threading atau membaca dari konsol <strike> < / strike> jendela langsung pada saat definisi fungsi atau panggilan: P
Taylor Scott
3

Pergi, 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)}
vroomfondel
sumber
3

AHK , 67 65 byte

2 byte disimpan oleh Blauhirn

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

AHK memiliki batas waktu bawaan untuk kotak input.
Saya mencoba untuk mendapatkan pintar dan menggunakan !obukannya ErrorLeveltetapi gagal jika input pengguna nilai falsey.
Hampir setengah dari jawabannya hanya nama perintah dan teks tetap.

Toast insinyur
sumber
1
Untuk apa semua koma?
Pavel
@Phoenix Mungkin menghilangkan argumen ke InputBox
Adm
@Phoenix Timeouthampir menjadi parameter terakhir:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Engineer Toast
dua karakter lebih pendek:s:=errorLevel?"no ":
phil294
@Blauhirn Gah! Saya seorang idiot. Terima kasih.
Engineer Toast
3

Python3, 100 89 83 71 byte

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

Pertama kali mencoba bermain golf.

-4 untuk any(), -7 untuk memotong, terima kasih @ user2357112!

-6, dapatkan select()dari ptybukan select.

Seth
sumber
Anda dapat memotong beberapa byte oleh mengiris "no input received"tali: "no input received"[3*bool(...):].
user2357112 mendukung Monica
Anda juga dapat menggunakan any(...)bukan bool(...[0]).
user2357112 mendukung Monica
-New Pengguna: "pada Windows itu melempar ModuleNotFoundError: Tidak ada modul bernama 'termios'"
FantaC
The ptyModul ini hanya tersedia pada platform linux, tapi aku hanya menggunakannya karena namanya pendek dan itu membuat selecttersedia. Versi 2 mungkin bekerja lebih baik di Windows.
Seth
3

PowerShell, 110 byte

$s1=date;while(![console]::KeyAvailable-and($i=((date)-$s1).seconds-lt10)){}
"{0}input received"-f(,'no ')[$i]
TessellatingHeckler
sumber
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)

Saya mencoba menjalankan jawaban Python 3 Seth tetapi pada Windows itu melempar ModuleNotFoundError: No module named 'termios', dan karena saya tidak dapat mengomentari jawabannya tentang hal itu, saya memutuskan untuk datang dengan solusi yang seharusnya menjadi platform independen.

Ini pertama kalinya saya bermain golf, jadi saya yakin ini bisa ditingkatkan.

Topi
sumber
2
Selamat datang di PPCG!
Steadybox
2

Tcl, 99 byte

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

SmileBASIC 3, 74 byte

"Terima input" dengan menunggu tombol apa saja ditekan (yang seharusnya dianggap sebagai input.)

M=MAINCNT@L
N=MAINCNT-M>599CLS?"NO "*N;"INPUT RECEIVED
ON N+BUTTON()GOTO@L
siput_
sumber
Keluaran harus "(tidak ada) input yang diterima", bukan "INPUT (TIDAK) DITERIMA"
Pavel
2

Gores 2 / 3.x, 41 poin ( Penjelasan )

Timer tidak sabar

1: Ketika GF diklik

1: tanyakan [] dan tunggu

1 + 14 karakter: katakan [input diterima]

1: berhenti [semua v] (catatan: karena "semua" adalah pengaturan standarnya, saya menghitung blok sebagai 1)

1 + 2 digit: tunggu (10) detik

1 + 17 karakter: katakan [tidak ada input yang diterima]

1: berhenti [semua v]

Kesalahan sintaks
sumber
Selamat datang di PCG!
Rahul Bharadwaj
1

> <> , 43 + 6 = 49 byte

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

Cobalah online!

+5 untuk -t.08bendera, yang menetapkan kutu ke 0,08 detik, dan +1 untuk abendera, yang menghitung spasi dan melompati instruksi sebagai kutu.

Program memeriksa input sekitar sekali setiap detik, dan keluar dari loop jika input terdeteksi. Jika input tidak diterima, maka keluar loop dari bawah, menambahkan noke awal string. Yang pertama /adalah untuk memastikan bahwa pemeriksaan terakhir untuk input tepat pada tanda 10 detik.

Kemudian dibutuhkan sekitar 5-6 detik untuk mencetak string itu sendiri.

Jo King
sumber
Anda dapat menggunakan satu flag, -at.08untuk menyimpan satu byte.
Pavel
@Pavel, Terima kasih!
Jo King
1

Java 1.4+, 284 bytes

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

Tidak Disatukan:

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

Tolong jangan menyarankan peningkatan Java khusus-Versi, ini adalah jawaban Java umum yang bekerja di semua Lingkungan Java yang saat ini stabil (1.4 dan lebih tinggi).


Sangat bertele-tele ... Menangkap diperlukan, tidak bisa membuangnya. Impor sistem berkurang seperti 5 byte ... Kelebihan beban juga bertele-tele, sehingga berakhir dengan kekacauan yang tampak buruk pada golf.

Guci Gurita Ajaib
sumber
Apakah harus 10000Ldan tidak 10000? Saya pikir ints untuk merindukan otomatis.
Pavel
1

Julia 0,6 , 78 byte

Lebih lama dari yang saya harapkan. Lihat komentar untuk tautan TIO "tidak ada masukan yang diterima".

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

Cobalah online!

gggg
sumber
1
Itu tidak memblokir TIO karena membaca dari file. Itu hits EOF dan selesai secara instan. Jika Anda menyalurkan proses yang tidak pernah memancarkan baris baru ke dalam program di TIO, itu akan memblokir: tio.run/##JcqxDoIwEIDhvU9x6ULPCNXFxejk4uIiowvaSzgDLekVReO7V4Pb/…
Pavel
0

SmileBASIC, 74 73 byte

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

Membawa 1 karakter input.

Dan solusi 39 byte yang mungkin tidak valid (sebenarnya tidak menerima input teks, hanya memiliki OKtombol yang dapat Anda tekan)

?"no "*!DIALOG("",,,10);"input received
12Me21
sumber