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!


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.


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.


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).


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"

6

APL (Dyalog) , 41 40 bajtów

'no input received'↓⍨{3*⍨⎕RTL←10::0⋄3⊣⍞}

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)


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 ...)


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」

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ć .newją
— 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();
    }
}

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.


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>"


@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>


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


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

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.


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.


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]

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ć.


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]

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

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]


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.


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.


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!


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.