Z niecierpliwością czekaj na dane wejściowe

39

Twoim dzisiejszym zadaniem jest wprowadzenie limitu czasowego na uzyskanie danych wejściowych, co w większości języków wydaje mi się irytujące.

Utworzysz funkcję programu, która monituje użytkownika o wprowadzenie danych. Natychmiast po tym, jak użytkownik poda dane wejściowe, wydrukuj wiadomość input receivedi zakończ wykonywanie / zwrot. Jeśli jednak użytkownik czeka dłużej niż 10 sekund na wprowadzenie danych, wyślij komunikat no input receivedi zakończ wykonywanie / powrót.

Dane wejściowe muszą pochodzić z stdin(konsoli) lub równoważne, a nie argumenty funkcji lub programu, jednak dane wyjściowe mogą być albo do stdoutwartości zwracanej przez funkcję, albo innej przyjętej metody wyjściowej.

Możesz poprosić o dowolną ilość danych wejściowych, może to być pojedynczy znak, wiersz, słowo lub dowolna metoda najkrótsza w twoim języku, o ile czeka na co najmniej jeden znak.

Musisz wyprowadzać dane natychmiast po otrzymaniu danych wejściowych, a nie po upływie 10 sekund.

Po upływie 10 sekund musisz zakończyć, nie możesz kontynuować oczekiwania na dane wejściowe po no input receivedwydrukowaniu.

Możesz założyć, że dane wejściowe nie są przekazywane w czasie między upływem 10 sekund a drukowaniem tekstu na ekranie, ponieważ jest to wyjątkowo małe okno. Możesz również założyć, że wbudowany odpowiednik twojego języka sleepjest konsekwentnie, absolutnie doskonały.

To jest , wygrywa najmniej bajtów!

Pavel
źródło
6
+1 tylko za miły akcent, aby uniemożliwić golfistom korzystanie ze słownika. Aha, i wielkie wyzwanie.
Adám
1
@ Adám, chyba że twój język ma wbudowane czytanie z limitem czasu, myślę, że jedynym dobrym sposobem na to jest magia OS / Thread, której większość języków golfowych i tak nie potrafi.
Pavel
Teraz muszę przepisać mój program. Był prawie gotowy do wysłania ... ;-)
Adám
1
@TheLethalCoder Możesz w sleep100% założyć, że twój język odpowiada funkcjom.
Pavel
1
@Lembik Proszę bardzo, odpowiedź w języku Python.
Pavel

Odpowiedzi:

24

bash, 38 bajtów

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

Używa opcji -t(timeout) do bash'u read, co powoduje, że kończy się ona niepowodzeniem i zwraca niezerowy kod wyjścia, jeśli nie podano danych wejściowych w określonej liczbie sekund.

Klamka
źródło
6
Przypuszcza się, aby powiedzieć „(brak) Wejście rec tj ved”, co ważniejsze utrudnia golfa języków ze słownikami.
Adám
8
@ Adám Właściwie to literówka
Pavel
7
@Phoenix Noooo!
Adám
1
Dlaczego a = nie, a $ a? czy jest jakiś cel? EDYTUJ Mam to, że nie przeczytałem poprawnie pytania
Felix Guo
12

Haskell, 97 89 bajtów

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

Jeśli timeoutupłynie limit czasu, zwraca Nothingi Just Char( Charponieważ używamy getChar) inaczej. Ta zwracana wartość jest konwertowana na funkcję "no "lub ""według funkcji maybe "no " mempty. Dołącz "input received"i wydrukuj.

Edycja: @BMO zasugerował maybei zapisał niektóre bajty.

nimi
źródło
Nie działa poprawnie w Ghci.
maple_shaft
@maple_shaft: W ghci trzeba wiążą się gz let: let g Nothing="no ";g _="", a następnie wywołanie funkcji timeout....działa dobrze dla mnie.
nimi
1
Możesz zastąpić g, maybe"no "(pure"")który jest krótszy, a nawet wstawić go - oszczędzając Ci 6 bajtów.
ბიმო
@BMO: Fajnie! memptyzamiast (pure"")jest jeszcze krótszy.
nimi
Bardzo fajnie, to naprawdę sprytne!
ბიმო
11

POSIX C99, 71 63 bajtów

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

Nie golfowany:

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

Ponieważ pollw przypadku sukcesu zwróci 1, mnożymy wynik przez 3 i odpowiednio przesuwamy ciąg. Następnie wykorzystujemy fakt, który struct pollfdma następujący układ:

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

i to STDIN_FILENOznaczy 0, że POLLINnależy 1go zastąpić, pfdz int pfd[] = {0,1}którego w końcu wykonujemy złożoną ściółkę (na co pozwala C99).

yoann
źródło
3
Musisz określić, że jest to cel POSIX, ponieważ poll.hnagłówek nie jest częścią standardu językowego C99.
Cody Gray,
8

Jabłkowy, 113

Applescript tak naprawdę nie czyta ze STDIN. Mam nadzieję, że tutaj display dialogjest do przyjęcia:

({"","no "}'s item((display dialog""default answer""giving up after 10)'s gave up as integer+1))&"input received"
Cyfrowa trauma
źródło
6

APL (Dyalog) , 41 40 bajtów

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

Jest to anonimowa ukryta funkcja, której uruchomienie wymaga fałszywego argumentu .

'no input received' pełny ciąg

↓⍨ upuść tyle znaków z przodu, ile liczba zwrócona przez

{ anonimowa funkcja jawna ( oznacza argument)

⎕RTL←10 ustaw R esponse T ime L imit na dziesięć sekund

3*⍨ podnieś tę liczbę (dziesięć) do potęgi trzech (tysiąc oznacza „wszyscy”)

:: na tych wyjątkach (wszystkie),

  0 zwróć 0

 próbować:

   uzyskać dane wejściowe

  3⊣ odrzuć to i zamiast tego zwróć 3

}koniec funkcji (zauważ, że argument nigdy nie został wymieniony)

Adám
źródło
6

Perl , 74 67 bajtów

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

Stara wersja

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

(Uruchom przez perl -M5.10.1 ...)

użytkownik1711878
źródło
Nie kończący znak nowej linii jest niezbędne w produkcji, więc można wyciąć \n.
Pavel
3
Witamy w PPCG!
Pavel
Właściwie nie potrzebujesz -M5.10.1. Można po prostu zastąpić -ez -E. (jeśli potrzebujesz -M5.10.1, musisz dodać karę do swojego wyniku)
Brad Gilbert b2gills
@Phoenix, \njest tam z powodu diezachowania: „Jeśli ostatni element LISTY nie kończy się nową linią, drukowany jest również numer bieżącej linii skryptu i numer linii wejściowej (jeśli istnieje) i dostarczana jest nowa linia.” Bez tego wyświetliłby się „brak danych wejściowych w -e linii 1.”. Ale oczywiście może to być dosłowne przerwanie linii w łańcuchu. Poza tym, przestrzenie pomiędzy diea sayi nie potrzebne są ich parametry. To samo dotyczy finału ;. I <>wystarczy odczytać ze standardowego wejścia.
manatwork
1
Jeśli evalczytasz ze STDIN, możesz uniknąć potrzeby diewiadomości. W rzeczywistości, błąd wykonania działa równie dobrze: $SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'.
primo
6

Perl 6 ,  72  66 bajtów

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

Wypróbuj bez wprowadzania
Wypróbuj z wprowadzaniem

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

Wypróbuj bez wprowadzania
Wypróbuj z wprowadzaniem

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
źródło
1
„otrzymałem mój esej - obiecaj w 10, a następnie powiedz„ nie ess ”i wyjdź lub powiedz„ ess ””
kot,
Czy możesz usunąć odstęp między starti {?
Pavel
@Phoenix To byłoby analizowane jako indeksowanie asocjacyjne na zmiennej sigilless o nazwie start, więc nie.
Brad Gilbert b2gills
Twoje linki TIO wydają się już nie działać.
Pavel
@Pavel, Naprawiono, właśnie musiałem uczynić atrapę klasy testowej podtypem IO :: Handle i wywołać .new
Brad Gilbert b2gills
5

C #, 180 171 148 131 bajtów

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

Zaoszczędź 17 bajtów dzięki @VisualMelon.

Wersja pełna / sformatowana:

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
źródło
Dlaczego namespacenie usingdyrektywa?
Pavel
@Phoenix i tak potrzebowaliby przestrzeń nazw, aby oszczędzić wszystkie bajtyusing
LiefdeWen
Dlaczego zapisałeś kluczową część jako Akcję i wykonałeś ją później? Naprawdę nie widzę pytania, które to określa.
Snowfire,
1
Można sporo zaoszczędzić, używając wartości zwracanej z Thread.Join(int)(pozbyć się c, stracić nawiasy klamrowe itp.): var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(Wydaje się, że VB.NET już to robi)
VisualMelon
1
@TaylorScott Mogę zrobić, 1e4ale to jest doublei potrzebowałbym, intwięc musiałbym zrobić (int)1e4:( Niezły pomysł
TheLethalCoder
5

TI-BASIC, 84 77 bajtów

-7 dzięki @ 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

Czeka na naciśnięcie numeru.

Próbuję wymyślić, jak zagrać w golfa w tej sekwencji {72,73,74,82,83,84,92,93,94}. Zajmuje dużo miejsca.

Scott Milner
źródło
Jeśli chcesz poczekać na dowolny klucz, to Repeat K or 10=checkTmr(Tzrobisz.
bb94
Ostatnie 4 wiersze można również skrócić do:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94
1
@ bb94 Naprawdę nie chcę czekać na żaden klucz, ponieważ nie wszystkie z nich wprowadziłyby znak. To byłoby jak czekanie na Shiftklucz na komputerze. Również skrócenie ostatnich 4 wierszy za pomocą metody daje w rzeczywistości tę samą liczbę bajtów, co moja. Jednak podoba mi się twoja metoda.
Scott Milner,
Możesz sprawdzić dowolny klucz, który nie jest 21 lub 31.
bb94
Po orw swoim powtórzeniu użyj tego zamiast -7 bajtów:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94 21.02.18
4

NodeJS, 105 103 101 bajtów

-2 bajty dzięki @apsillers
-2 bajty poprzez przejście console.log()doexit()

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

Uruchom, zapisując plik i uruchamiając go z węzłem lub uruchom bezpośrednio z wiersza poleceń, wykonując node -e "<code>"

Justin Mariner
źródło
@apsillers Tak, dobry połów.
Justin Mariner
@apsillers miałem zamiar ponownie edytować, aby faktycznie przenieść console.log()wywołanie do parametru exit(). To teraz dwa mniej.
Justin Mariner
4

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

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i
  • 2 bajty zapisane dzięki apsillerom wskazującym, że jestem głupi!

Spróbuj

Wymaga zamknięcia >na inputw celu podjęcia pracy w urywek.

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

Kudłaty
źródło
1e5 to 100 000 lub 100 sekund, 1e4 to 10 sekund
PunPun1000
Ups! Dobrze zauważony, dziękuję, @ ​​PunPun1000
Shaggy
Czy nie byłoby krócej napisać 10zamiast 1e4?
musicman523
@ musicman523, 10będzie to 10 milisekund, wyzwanie wyzwanie mówi konkretnie 10 sekund , czyli 10000 milisekund 1e4.
Kudłaty
Mój zły, zapomniałem o tym, 10 != 1e4ponieważ jestem głupcem
musicman523
3

VB.Net - 174 bajty

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

Wersja COBOL już jutro ;-)

FastAl
źródło
3
Nie jestem pewna, co jest zaletą łączenia linii :. To zajmuje tyle samo bajtów co podział linii, więc po prostu zmniejsza czytelność bez poprawiania wyniku golfowego.
Cody Gray,
@CodyGray Uważam, że :podstawienie podziału linii może być tak, że wywołanie kroczące może zostać zadeklarowane w linii bez powtarzania - ale to powiedziawszy, nie jestem pozytywny, moim głównym językiem jest VBA, który nie obsługuje wątkowania lub czytania z <strike> konsoli < / strike> natychmiastowe okno pomocy przy definicji funkcji lub wywołaniu: P
Taylor Scott
3

Idź, 149 bajtów

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
źródło
3

AHK , 67 65 bajtów

2 bajty zapisane przez Blauhirna

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

AHK ma wbudowany limit czasu dla pól wejściowych.
Starałem się być sprytny i używać !ozamiast, ErrorLevelale to się nie udaje, jeśli użytkownik wprowadzi wartość falsey.
Prawie połowa odpowiedzi to tylko nazwy poleceń i stały tekst.

Inżynier Toast
źródło
1
Po co są wszystkie przecinki?
Pavel
@Phoenix Prawdopodobnie wnosi argumenty do InputBox
Adám
@Phoenix Timeoutjest prawie ostatnim parametrem:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Engineer Toast
dwa znaki krótsze:s:=errorLevel?"no ":
phil294
@Blauhirn Gah! Jestem idiotą. Dzięki.
Inżynier Toast
3

Python3, 100 89 83 71 bajtów

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

Najpierw spróbuj golfa.

-4 za any(), -7 za krojenie, dzięki @ user2357112!

-6, pobierz select()z ptyzamiast select.

Seth
źródło
Można wyciąć kilka bajtów przez krojenie "no input received"ciąg: "no input received"[3*bool(...):].
user2357112 obsługuje Monikę
Możesz także użyć any(...)zamiast bool(...[0]).
user2357112 obsługuje Monikę
-Nowy użytkownik: „w systemie Windows zgłasza ModuleNotFoundError: Brak modułu o nazwie„ termios ””
FantaC 10.01.2018
ptyModuł jest dostępny tylko na platformach Linux, ale ja tylko go używać, ponieważ jego nazwa jest krótka, a to sprawia, że selectjest dostępna. Wersja 2 prawdopodobnie działa lepiej w systemie Windows.
Seth
3

PowerShell, 110 bajtów

$s1=date;while(![console]::KeyAvailable-and($i=((date)-$s1).seconds-lt10)){}
"{0}input received"-f(,'no ')[$i]
TessellatingHeckler
źródło
3

Python 3, 158 bajtów

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)

Próbowałem uruchomić odpowiedź Pythona 3 dla Setha, ale w Windowsie to rzuca ModuleNotFoundError: No module named 'termios', a ponieważ nie mogę skomentować jego odpowiedzi na ten temat, postanowiłem zamiast tego znaleźć rozwiązanie, które powinno być niezależne od platformy.

Po raz pierwszy gram w golfa, więc jestem pewien, że można to poprawić.

Kapelusz
źródło
2
Witamy w PPCG!
Steadybox
2

Tcl, 99 bajtów

after 10000 {set () no}
vwait [fileevent stdin r {gets stdin (x)}]
puts [lappend () input received]
Donal Fellows
źródło
2

SmileBASIC 3, 74 bajty

„Akceptuje wprowadzanie”, czekając na naciśnięcie dowolnego przycisku (które powinno się liczyć jako wejście)

M=MAINCNT@L
N=MAINCNT-M>599CLS?"NO "*N;"INPUT RECEIVED
ON N+BUTTON()GOTO@L
ślimak_
źródło
Wyjście powinno brzmieć „(nie) wejście odebrane”, a nie „WEJŚCIE (NIE) ODBIÓR”)
Pavel
2

Scratch 2 / 3.x, 41 punktów ( objaśnienie )

Niecierpliwy zegar

1: Po kliknięciu GF

1: zapytaj [] i poczekaj

1 + 14 znaków: powiedz [otrzymane dane wejściowe]

1: stop [all v] (uwaga: ponieważ „all” było ustawieniem domyślnym, policzyłem blok jako 1)

1 + 2 cyfry: poczekaj (10) sekund

1 + 17 znaków: powiedz [nie otrzymano żadnych danych wejściowych]

1: stop [wszystkie v]

Błąd składni
źródło
Witamy w PCG!
Rahul Bharadwaj
1

> <> , 43 + 6 = 49 bajtów

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

Wypróbuj online!

+5 dla -t.08flagi, która ustawia tyknięcie na 0,08 sekundy, i +1 dla aflagi, która liczy białe spacje i pomija instrukcje jako tiki.

Program sprawdza wejście co około raz na sekundę i wychodzi z pętli, jeśli zostanie wykryty. Jeśli dane wejściowe nie zostaną odebrane, wyjdzie z pętli od dołu, dopisując nona początku łańcucha. Początkowa /polega na upewnieniu się, że ostatnia kontrola danych wejściowych znajduje się dokładnie na znaku 10 sekund.

Następnie wydrukowanie samego ciągu zajmuje około 5-6 sekund.

Jo King
źródło
Możesz użyć pojedynczej flagi, -at.08aby zapisać bajt.
Pavel
@Pavel, dzięki!
Jo King
1

Java 1.4+, 284 bajty

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

Nie golfowany:

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

Nie sugeruj ulepszeń Java specyficznych dla wersji, jest to ogólna odpowiedź Java, która działa we wszystkich obecnie stabilnych środowiskach Java (1.4 i nowszych).


Bardzo cholernie dziwny ... Połów jest wymagany, nie można go rzucić. Import systemu goli jak 5 bajtów ... Przeładowanie jest również trudne, więc kończy się bałaganem o kiepskim wyglądzie.

Urna Magicznej Ośmiornicy
źródło
Czy to musi być 10000Li nie 10000? Myślałem, że ints automatycznie rzucają długie.
Pavel
1

Julia 0.6 , 78 bajtów

Dłużej niż się spodziewałem. Zobacz komentarze do linku TIO „brak danych wejściowych”.

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

Wypróbuj online!

gggg
źródło
1
Nie blokuje TIO, ponieważ czyta z pliku. Uderza w EOF i kończy natychmiast. Jeśli potokujesz
Pavel
0

SmileBASIC, 74 73 bajty

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

Pobiera 1 znak wejściowy.

I 39 bajtowe rozwiązanie, które prawdopodobnie nie jest poprawne (w rzeczywistości nie akceptuje wprowadzania tekstu, ma tylko OKprzycisk, który można nacisnąć)

?"no "*!DIALOG("",,,10);"input received
12Me21
źródło