Sabırsızlıkla giriş için bekleyin


39

Bugün sizin göreviniz çoğu dilde ulaşmak için can sıkıcı bulduğum bir görev olan girdi almak için bir zaman sınırı uygulamak.

Kullanıcının giriş yapmasını isteyen bir program fonksiyonu oluşturacaksınız. Kullanıcı giriş yaptıktan hemen sonra mesajı yazdırın input receivedve işlemi / geri dönüşü sonlandırın. Bununla birlikte, kullanıcı giriş sağlamak için 10 saniyeden fazla beklerse mesajı no input receivedçıkarıp işlemi / dönüşü sonlandırın.

Giriş stdin(konsol) veya eşdeğeri olmalı , işlev veya program argümanları değil, çıktı stdoutişlevinizin dönüş değeri veya kabul edilen herhangi bir çıkış yönteminden olabilir.

Herhangi bir miktarda giriş isteyebilirsiniz, tek bir karakter, bir satır, bir kelime veya en az bir karakter beklediği sürece dilinizde en kısa olan yöntem olabilir.

Giriş alındıktan hemen sonra, 10 saniye geçtikten sonra çıkış yapmanız gerekir.

10 saniye geçtikten sonra, gereken sonra giriş için beklemeye devam edemez, son no input receivedbasılmıştır.

Girişin 10 saniye geçme süresi ile ekrana yazdırılan metin arasında geçmediğini, çünkü bu oldukça küçük bir penceredir. Dilinizin yerleşik eşdeğerinin sleeptutarlı ve kesinlikle mükemmel olduğunu da varsayabilirsiniz .

Bu , en az bayt kazanıyor!


6
+1 golf dillerinin sözlüklerini kullanmasını önlemek için hoş bir dokunuş için. Oh, hem de büyük zorluk.
Adem

1
@ Adám, eğer dilinizde yerleşik bir zaman aşımı olan bir dilekçe yoksa, bunu yapmanın en iyi yolunun çoğu golf dilinin yapamayacağı OS / Thread magic olduğunu düşünüyorum.
Pavel

Şimdi programımı yeniden yazmak zorundayım. Neredeyse göndermeye hazırdı ... ;-)
Adám

1
@TheLethalCoder Dilinizin sleepfonksiyonların eşdeğeri zamanın% 100'ünü mükemmel olarak kabul edebilirsiniz .
Pavel

1
@ Lembik İşte, bir Python cevabı.
Pavel,

Yanıtlar:


24

bash, 38 bayt

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

Bu, -tbash için (timeout) seçeneğini kullanır; readbu, belirtilen saniye içinde hiçbir girdi girilmezse başarısız olmasına ve sıfırdan farklı bir çıkış kodu döndürmesine neden olur.


6
Sözlüklerle golf dilini önemli ölçüde engelleyen "(no) input rec yani vd" yazması gerekiyordu .
Adem

8
@ Adám Aslında bu bir yazım hatası
Pavel

7
@Phoenix Noooo!
Adám

1
Neden a = hayır sonra $ a? bir amaç var mı? EDIT Anladım doğru soruyu okumamıştım
Felix Guo

12

Haskell, 97 89 bayt

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

Eğer timeoutzaman aşımına uğrarsa geri döner Nothingve Just Char( Char, çünkü biz kullanıyoruz getChar). Bu dönüş değeri işleve "no "veya ""işleve dönüştürülür maybe "no " mempty. Ekle "input received"ve yazdır.

Düzenleme: @BMO maybebazı baytları önerdi ve kaydetti.


Ghci'de doğru şekilde çalışmıyor gibi görünüyor.
maple_shaft

@maple_shaft: Eğer bağlama zorunda GHCi içinde golan let: let g Nothing="no ";g _=""daha sonra işlev çağrısı timeout....için beni para cezası çalışır.
nimi

1
Sen yerini alabilir gtarafından maybe"no "(pure"")kısa olduğu ve hatta bunu satır içine alabilirsiniz - size 6 bayt tasarrufu.
59'da

@ BMO: Güzel! memptyyerine (pure"")daha kısadır.
nimi

Çok güzel, bu gerçekten zekice!
ბიმო

11

POSIX C99, 71 63 bayt

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

Ungolfed:

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

Yana pollbaşarı durumunda 1 dönecektir, biz çarpın 3 ile sonuç ve buna göre dizesini vardiya. Sonra, struct pollfdaşağıdaki düzende olan gerçeği kullanıyoruz :

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

ve STDIN_FILENOolduğu 0, POLLINbir 1yerine pfdile int pfd[] = {0,1}(C99 izin gibi) son olarak, bir bileşik edebî hale getiren.


3
poll.hBaşlık C99 dil standardının bir parçası olmadığından, bunun POSIX'i hedeflediğini belirtmeniz gerekir .
Cody Gray,

8

Elmalar, 113

Applescript gerçekten STDIN'den okuma yapmıyor. Umarım a display dialogburada kabul edilebilir:

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

6

APL (Dyalog) , 41 40 bayt

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

Bu, çalışması için sahte bir argüman gerektiren anonim bir taciz işlevidir .

'no input received' tam dize

↓⍨ önünden, karakterleri tarafından döndürülen sayı kadar

{ adsız açık işlev ( argümanı gösterir)

⎕RTL←10 ayarlamak R esponse T ime L , on saniyeye IMIT

3*⍨ bu sayıyı (on) üçe yükseltin (bin "hepsi" anlamına gelir)

:: bu istisnalar dışında (tümü),

  0 0 döndür

 Deneyin:

   girdi almak

  3⊣ Bunu atın ve yerine 3

}fonksiyonun sonu (argümanın hiç belirtilmediğine dikkat edin )


6

Perl , 74 67 bayt

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

Eski versiyon

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

(Perl -M5.10.1 ... ile çalıştırın)


Çıktıda takip eden bir yeni satır gerekmez, böylece kesebilirsiniz \n.
Pavel

3
PPCG'ye Hoşgeldiniz!
Pavel

Aslında ihtiyacın yok -M5.10.1. Sadece ikame edebilir -eile -E. (Eğer gerekirse -M5.10.1, puanınıza bir ceza eklemek zorunda
kalacaksınız

@Phoenix, davranışlarından \ndolayı orada die: “ LIST'in son elemanı yeni bir satırda bitmiyorsa, mevcut script satırı numarası ve giriş satırı numarası (varsa) da yazdırılır ve yeni bir satır verilir.” Bu yüzden onsuz “-e satır 1'de hiçbir giriş alınmadı” gösterilecektir. Fakat elbette, dizgede değişmez bir satır sonu olabilir. Bunun yanında, dieve sayile parametreleri arasındaki boşluklara ihtiyaç duyulmaz. Final için aynı ;. Ve <>standart girdiden okumak için yeterli.
Manatwork

1
Eğer varsa evalSTDIN'den okuma, bir ihtiyacı önleyebilirsiniz diemesajı. Aslında, bir çalışma zamanı hatası da iyi çalışır: $SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'.
primo

6

Perl 6 ,  72  66 bayt

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

Giriş yapmadan deneyin Giriş yapmadan
deneyin

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

Giriş yapmadan deneyin Giriş yapmadan
deneyin

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
"özüm girdi alındı ​​- 10'da söz verin, o zaman 'öz' deyin ve çıkın ya da 'öz' söyleyin"
kedi

startVe arasındaki boşluğu kaldırabilir misiniz {?
Pavel

@Phoenix Bu adlandırılmış bir değişkenlik değişkeninde ilişkisel indeksleme olarak ayrıştırılır start, yani hayır.
Brad Gilbert b2gills'de

TIO bağlantılarınız artık çalışmıyor gibi görünüyor.
Pavel

@Pavel, Sabit, sadece kukla test sınıfı IO bir alt tipi :: tanıtıcısı ve arama yapmak zorunda .newüzerinde
Brad Gilbert b2gills

5

C #, 180 171 148 131 bayt

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

@VisualMelon sayesinde 17 bayt kaydedildi.

Tam / Biçimli sürüm:

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

Neden namespaceve bir usingyönerge değil ?
Pavel

@Phoenix zaten bir isim alanına ihtiyaç duyuyorlardı, böylece bütün baytları using
kurtarıyorlar

Niçin önemli kısmı bir Eylem olarak kaydettiniz ve daha sonra uyguladınız? Bunu belirten soruyu gerçekten göremiyorum.
Snowfire

1
Dönüş değerini kullanarak Thread.Join(int), ( cparantez, parantez, vb. Kaybettikten sonra) oldukça fazla tasarruf sağlayabilir: var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(VB.NET zaten bunu yapıyor gibi görünüyor)
VisualMelon

1
@TaylorScott Yapabilirim 1e4ama bu bir doubleve ihtiyacım olan bir intşey yapmalıyım (int)1e4:( Güzel bir fikir olsa da
TheLethalCoder

5

TI-BASIC, 84 77 bayt

-7 @ kamoroso94 sayesinde

: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

Bir numaraya basılana kadar bekler.

Dizinin nasıl oynanacağını bulmaya çalışıyorum {72,73,74,82,83,84,92,93,94}. Çok fazla alan kaplıyor.


Sadece herhangi bir anahtar için beklemek istiyorsanız, o Repeat K or 10=checkTmr(Tzaman yapardı.
bb94

Ayrıca, son 4 satır kısaltılabilir:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94

1
@ bb94 Gerçekten sadece herhangi bir tuş için beklemek istemiyorum, çünkü bunlar aslında bir karakter girmeyecek. ShiftBir bilgisayardaki anahtarı beklemek gibi olur . Ayrıca, yönteminizle son 4 satırı kısaltmak aslında benimkiyle aynı bayt sayısını verir. Yine de yöntemini beğendim.
Scott Milner

21 veya 31 olmayan bir anahtar olup olmadığını kontrol edebilirsiniz.
bb94

orTekrarlama abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
ifadenizden

4

DüğümJS, 105 103 101 bayt

-2 @apsillers sayesinde bayt
-2 taşıyarak bayt console.log()içineexit()

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

Bir dosyaya kaydederek ve düğümü kullanarak çalıştırarak çalıştırın veya yaparak komut satırından doğrudan çalıştırın node -e "<code>"


@ apsillers Yup, iyi yakalamak.
Justin Mariner

@ apsillers console.log()Aramayı aslında parametresine taşımak için yeniden düzenlemek üzereydim exit(). Şimdi iki tane daha az.
Justin Mariner,

4

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

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i
  • Aptal olduğumu belirten avcılar sayesinde 2 bayt kurtarıldı !

Dene

Bir kapanmasını gerektirir >üzerinde inputbir Snippet'ine iş için.

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


1e5 100,000 veya 100 saniye, 1e4 10 saniyedir
PunPun1000

Hata! Benekli, teşekkürler, PunPun1000
Shaggy

10Bunun yerine yazmak daha kısa olmaz mıydı 1e4?
musicman523

@ musicman523, 1010 milisaniye olacaktır, meydan okuma mücadelesi özellikle 10000 milisaniye olan 10 saniyeyi belirtir 1e4.
Shaggy,

Kötü, bunu unuttum 10 != 1e4çünkü ben bir aptalım
musicman523

3

VB.Net - 174 bayt

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 sürümü yarın geliyor ;-)


3
Satırları birleştirmenin avantajının ne olduğundan emin değilim :. Bu, satır sonu ile aynı sayıda bayt alır, bu nedenle golf puanını iyileştirmeden okunabilirliği azaltır.
Cody Gray,

@CodyGray :Satır sonu ikamesinin yineleme yapılmadan satır içi olarak ilan edilebilecek şekilde olabileceğine inanıyorum - ancak olumlu değilim, ana dilim <strike> konsolundan okuma ya da okuma desteği olmayan VBA. / strike> ani pencere, işlev tanımı veya arama anında yan yana: P
Taylor Scott

3

Git, 149 bayt

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 bayt

Blauhirn tarafından kaydedilen 2 bayt

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

AHK, giriş kutuları için yerleşik bir zaman aşımına sahiptir.
Akıllıca kullanmaya ve !oyerine kullanmaya çalıştım ErrorLevelama kullanıcı bir falsey değeri girerse başarısız oluyor.
Cevabın neredeyse yarısı sadece komut isimleri ve sabit metinlerdir.


1
Bütün virgüller ne için?
Pavel

@Phoenix Muhtemelen InputBox argümanlarını
duyuruyor

@Phoenix Timeoutneredeyse son parametredir:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Engineer Toast

iki karakter daha kısa:s:=errorLevel?"no ":
phil294 9:17

@Blauhirn Gah! Ben bir aptalım. Teşekkürler.
Mühendis Tost,

3

Python3, 100 89 83 71 bayt

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

İlk önce golf oynamayı deneyin.

-4 için any(), -7 dilimleme için, teşekkürler @ user2357112!

-6, get select()dan ptyyerine select.


Bazı bir dilimleme tarafından bayt kesebilir "no input received"dize: "no input received"[3*bool(...):].
user2357112

Bunun any(...)yerine de kullanabilirsiniz bool(...[0]).
user2357112

-Yeni Kullanıcı: "Windows'ta ModuleNotFoundError Atıyor: 'termios' adında bir modül yok"
FantaC

ptyModül Linux platformlarında kullanılabilir, fakat isminin kısa ve yapar çünkü sadece kullanıyorum selectkullanılabilir. Sürüm 2 muhtemelen Windows'ta daha iyi çalışıyor.
Seth

3

PowerShell, 110 bayt

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

3

Python 3, 158 bayt

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'in Python 3 cevabını çalıştırmayı denedim ama Windows'ta fırlattı ModuleNotFoundError: No module named 'termios've bu konudaki cevabı hakkında yorum yapamadığım için bunun yerine platformdan bağımsız olması gereken bir çözüm bulmaya karar verdim.

Bu benim ilk defa golf oynamak, daha iyi olabileceğinden eminim.


2
PPCG'ye Hoşgeldiniz!
Steadybox,

2

Tcl, 99 bayt

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

2

SmileBASIC 3, 74 bayt

Herhangi bir tuşa basılmasını bekleyerek "girişi kabul eder" (giriş olarak sayılmalıdır).

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

Çıktı "(no) girdi alındı" olmalı, "INPUT (NOT) RECEIVED" değil
Pavel

2

Çizik 2 / 3.x, 41 puan ( Açıklama )

Sabırsız zamanlayıcı

1: GF tıklandığında

1: [] sor ve bekle

1 + 14 karakter: [giriş alındı]

1: [all v] 'ı durdur (not: "tümü" varsayılan ayar olduğundan, bloğu 1 olarak saydım)

1 + 2 hane: bekle (10) saniye

1 + 17 karakter: [giriş yok] deyin

1: [tümü v] durdur


PCG'ye Hoşgeldiniz!
Rahul Bharadwaj

1

> <> , 43 + 6 = 49 bayt

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

Çevrimiçi deneyin!

Keneyi -t.080,08 saniyeye ayarlayan bayrak için +5 ve abeyaz alanı sayan ve talimatları keneler olarak atlayan bayrak için +1 .

Program girişi saniyede bir kez kontrol eder ve giriş algılanırsa döngüden çıkar. Giriş alınmazsa no, dize başlangıcına ek olarak, döngüden alttan çıkar . İlk /giriş için son kontrolün tam olarak 10 saniye işaretinde olmasını sağlamaktır.

Daha sonra dizenin kendisini yazdırması yaklaşık 5-6 saniye sürer.


-at.08Bir bayt kaydetmek için tek bir bayrak kullanabilirsiniz .
Pavel

@Pavel, Teşekkürler!
Jo King,

1

Java 1.4+, 284 bayt

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

Ungolfed:

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

Lütfen Sürüme özgü Java geliştirmeleri önermeyin, bu şu anda tüm kararlı Java Ortamlarında (1.4 ve üstü) çalışan genel bir Java cevabıdır.


Çok hilkat garibesi ... yakalamak gerekir, atmak olamaz. Sistem ithal 5 bayt gibi tıraş olur ... Aşırı yükleme de endişe, bu yüzden kötü golf görünümlü bir karmaşa sona erer.


Olmak zorunda 10000Ldeğil 10000mi? Sanırım otomatik olarak bitlerin uzun sürdüğünü düşünüyorum.
Pavel,

1

Julia 0.6 , 78 bayt

Beklediğimden daha uzun. "Giriş alınmadı" TIO bağlantısı için yorumları görün.

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

Çevrimiçi deneyin!


1
TIO'yu engellemiyor çünkü bir dosyadan okuyor. EOF'ye çarpar ve anında bitirir. TIO'da
Pavel

0

SmileBASIC, 74 73 bayt

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

Girişin 1 karakterini alır.

Ve muhtemelen geçerli olmayan 39 baytlık bir çözüm (aslında metin girişini kabul etmiyor, sadece basabileceğiniz bir OKdüğmeye sahip)

?"no "*!DIALOG("",,,10);"input received
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.