Warten Sie ungeduldig auf die Eingabe


39

Ihre heutige Aufgabe ist es, ein Zeitlimit für das Einholen von Eingaben festzulegen, eine Aufgabe, die ich in den meisten Sprachen als ärgerlich empfunden habe.

Sie erstellen eine Programmfunktion, die den Benutzer zur Eingabe auffordert. Drucken Sie die Nachricht sofort aus, nachdem der Benutzer Eingaben eingegeben hat, input receivedund beenden Sie die Ausführung / Rückkehr. Wenn der Benutzer jedoch länger als 10 Sekunden auf die Eingabe wartet, geben Sie die Nachricht aus no input receivedund beenden Sie die Ausführung / Rückkehr.

Die Eingabe muss von stdin(der Konsole) oder einer gleichwertigen Quelle erfolgen , nicht von Funktions- oder Programmargumenten. Die Ausgabe kann jedoch entweder auf stdoutden Rückgabewert Ihrer Funktion oder auf eine andere akzeptierte Ausgabemethode erfolgen.

Sie können nach einer beliebigen Anzahl von Eingaben fragen. Dies kann ein einzelnes Zeichen, eine Zeile, ein Wort oder eine beliebige Methode sein, die in Ihrer Sprache am kürzesten ist, solange auf mindestens ein Zeichen gewartet wird.

Sie müssen sofort nach Eingang der Eingabe ausgeben, nicht nach Ablauf der 10 Sekunden.

Nach 10 Sekunden vergangen sind, Sie müssen beenden, können Sie nicht weiter auf eine Eingabe wartet , nachdem no input receivedgedruckt wurde.

Sie können davon ausgehen, dass die Eingabe nicht in der Zeit zwischen 10 Sekunden und dem Ausdruck von Text auf dem Bildschirm übergeben wird, da dies ein äußerst kleines Fenster ist. Sie können auch davon ausgehen, dass das eingebaute Äquivalent Ihrer Sprache sleepdurchweg absolut perfekt ist.

Das ist , die wenigsten Bytes gewinnen!


6
+1 nur für die nette Geste, um zu verhindern, dass Golfsprachen ihr Wörterbuch verwenden. Oh, und auch eine große Herausforderung.
Adám

1
@Adám, es sei denn, Ihre Sprache hat eine eingebaute Lesezeit mit Zeitüberschreitung, ich denke, der einzige gute Weg, dies zu tun, ist OS / Thread-Magie, was die meisten Golfsprachen sowieso nicht können.
Pavel

Jetzt muss ich mein Programm umschreiben. War fast fertig zum Posten ... ;-)
Adám

1
@TheLethalCoder Sie können davon ausgehen, dass die sleepFunktionen Ihrer Sprache zu 100% perfekt sind.
Pavel

1
@Lembik Los geht's, eine Python-Antwort.
Pavel

Antworten:


24

Bash, 38 Bytes

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

Hierbei wird die -tOption (timeout) zum Bashing verwendet read, wodurch ein Fehler auftritt und ein Beendigungscode ungleich Null zurückgegeben wird, wenn in der angegebenen Anzahl von Sekunden keine Eingabe erfolgt.


6
Es soll "(no) input rec ie ved" heißen, was Golfsprachen mit Wörterbüchern erheblich behindert.
Adám

8
@ Adám Eigentlich ist das ein Tippfehler
Pavel

7
@Phoenix Noooo!
Adám

1
Warum ist a = nein dann $ a? gibt es einen zweck BEARBEITEN Ich habe verstanden, dass ich die Frage nicht richtig gelesen habe
Felix Guo

12

Haskell, 97-89 Bytes

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

Wenn die timeoutZeit abgelaufen ist, wird es zurückgegeben Nothingund Just Char( Charweil wir es verwenden getChar) anders. Dieser Rückgabewert wird in "no "oder ""nach Funktion konvertiert maybe "no " mempty. Anhängen "input received"und ausdrucken.

Edit: @BMO vorgeschlagen maybeund einige Bytes gespeichert.


Scheint in ghci nicht korrekt zu laufen.
maple_shaft

@maple_shaft: Innerhalb von GHCI Sie zu binden gmit let: let g Nothing="no ";g _="", dann wird der Funktionsaufruf timeout....funktioniert gut für mich.
Nimi

1
Sie können ersetzen gdurch maybe"no "(pure"")welche kürzer ist und Sie können es sogar Inline - Sie 6 Bytes speichern.
ბიმო

@BMO: Schön! memptystatt (pure"")ist noch kürzer.
nimi

Sehr schön, das ist wirklich schlau!
ბიმო

11

POSIX C99, 71 63 Bytes

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

Da pollbei Erfolg 1 zurückgegeben wird, multiplizieren wir das Ergebnis mit 3 und verschieben den String entsprechend. Dann verwenden wir die Tatsache, dass struct pollfddas folgende Layout hat:

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

Und das STDIN_FILENOist 0, POLLINist 1zu ersetzen , pfdmit der int pfd[] = {0,1}, die wir schließlich eine Verbindung Litteral machen (wie von C99 erlaubt).


3
Sie müssen angeben, dass dies POSIX als Ziel hat, da der poll.hHeader nicht Teil des C99-Sprachstandards ist.
Cody Grey

8

Applescript, 113

Applescript liest nicht wirklich aus STDIN. Hoffentlich display dialogist a hier akzeptabel:

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

6

APL (Dyalog) , 41 bis 40 Bytes

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

Dies ist eine anonyme implizite Funktion, für deren Ausführung ein Dummy-Argument erforderlich ist .

'no input received' die ganze Saite

↓⍨ lassen Sie so viele Zeichen von vorne fallen, wie die Zahl vom zurückgegeben wurde

{ anonyme explizite Funktion ( bezeichnet das Argument)

⎕RTL←10 Set R esponse T ime L imit bis zehn Sekunden

3*⍨ Erhöhe diese Zahl (zehn) auf die Potenz von drei (tausend bedeutet "alle")

:: bei diesen Ausnahmen (alle),

  0 0 zurückgeben

 Versuchen:

   Eingabe abrufen

  3⊣ verwerfe das und gib stattdessen 3 zurück

}Ende der Funktion (beachten Sie, dass das Argument nie erwähnt wurde)


6

Perl , 74 67 Bytes

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

Alte Version

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

(Ausführen über Perl -M5.10.1 ...)


In der Ausgabe ist kein abschließender Zeilenumbruch erforderlich, sodass Sie schneiden können \n.
Pavel

3
Willkommen bei PPCG!
Pavel

Eigentlich brauchst du nicht -M5.10.1. Sie können einfach ersetzen -emit -E. (wenn nötig -M5.10.1, müssten Sie eine Strafe zu Ihrer Punktzahl hinzufügen)
Brad Gilbert b2gills

@Phoenix, das \nliegt am dieVerhalten von: "Wenn das letzte Element von LIST nicht in einer neuen Zeile endet, werden auch die aktuelle Skriptzeilennummer und die Eingabezeilennummer (falls vorhanden) gedruckt und eine neue Zeile angegeben." Wenn dies nicht der Fall ist, wird in Zeile 1 "keine Eingabe empfangen" angezeigt. Aber es könnte natürlich ein buchstäblicher Zeilenumbruch in der Zeichenfolge sein. Außerdem werden die Leerzeichen zwischen dieund sayund ihren Parametern nicht benötigt. Gleiches gilt für das Finale ;. Und <>es reicht aus, von der Standardeingabe zu lesen.
Manatwork

1
Wenn Sie evalvon STDIN lesen, können Sie vermeiden, eine dieNachricht zu benötigen . Tatsächlich funktioniert ein Laufzeitfehler genauso gut: $SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'.
Primo

6

Perl 6 ,  72  66 Bytes

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

Versuchen Sie es ohne Eingabe
Versuchen Sie es mit Eingabe

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

Versuchen Sie es ohne Eingabe
Versuchen Sie es mit Eingabe

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
"mein ess ist eingegangen - verspreche es in 10, dann sag 'no ess' und beende es oder sag 'ess'"
cat

Können Sie den Abstand zwischen startund entfernen {?
Pavel

@Phoenix Das würde als assoziative Indizierung für eine sigillose Variable namens analysiert start, also nein.
Brad Gilbert b2gills

Ihre TIO-Links scheinen nicht mehr zu funktionieren.
Pavel

@Pavel, Fixed, musste nur die Dummy-Testklasse zu einem Subtyp von IO :: Handle machen und .newdarauf
zugreifen

5

C #, 180 171 148 131 Bytes

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

17 Bytes dank @VisualMelon gespart.

Voll / Formatierte Version:

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

Warum namespaceund nicht eine usingRichtlinie?
Pavel

@Phoenix sie würden sowieso einen Namespace brauchen, damit sie alle Bytes desusing
LiefdeWen

Warum haben Sie den entscheidenden Teil als Aktion gespeichert und anschließend ausgeführt? Ich kann die Frage, die dies spezifiziert, nicht wirklich sehen.
Schneefeuer

1
Kann mit dem Rückgabewert von Thread.Join(int)( cKlammern var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";
entfernen

1
@ TaylorScott Ich kann tun, 1e4aber das ist ein doubleund ich würde ein brauchen, intalso müsste ich tun (int)1e4:(
Gute

5

TI-BASIC, 84 77 Bytes

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

Wartet, bis eine Nummer gedrückt wird.

Ich versuche herauszufinden, wie man die Sequenz spielt {72,73,74,82,83,84,92,93,94}. Es nimmt viel Platz ein.


Wenn Sie nur auf einen Schlüssel warten möchten, dann Repeat K or 10=checkTmr(Ttun würde.
BB94

Außerdem könnten die letzten 4 Zeilen :4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
Uhr

1
@bb94 Ich möchte nicht wirklich auf irgendeinen Schlüssel warten, da nicht alle von denen tatsächlich ein Zeichen eingeben würden. Es wäre, als würde man Shiftan einem Computer auf den Schlüssel warten . Wenn Sie die letzten 4 Zeilen mit Ihrer Methode kürzen, erhalten Sie die gleiche Bytezahl wie mit meiner. Ich mag deine Methode allerdings.
Scott Milner

Sie können nach Schlüsseln
suchen

Nach dem orin der repeat - Anweisung, verwenden Sie diese stattdessen für -7 Bytesabs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94

4

NodeJS, 105 103 101 Bytes

-2 dank @apsillers Bytes
-2 Bytes , die durch Bewegen console.log()inexit()

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

Führen Sie das Programm aus, indem Sie es in einer Datei speichern und mit node ausführen, oder führen Sie es direkt über die Befehlszeile aus node -e "<code>"


@apsillers Yup, guter Fang.
Justin Mariner

@apsillers Ich wollte gerade nochmal editieren, um den console.log()Aufruf tatsächlich in den Parameter von zu verschieben exit(). Das sind jetzt zwei weniger.
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 Bytes gespart dank Apsillers, die darauf hinweisen, dass ich dumm bin!

Versuch es

Erfordert ein Closing >am input, um in einem Snippet arbeiten zu können.

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


1e5 ist 100.000 oder 100 Sekunden, 1e4 ist 10 Sekunden
PunPun1000

Hoppla! Gut gesehen, danke, @ PunPun1000
Shaggy

Wäre es nicht kürzer zu schreiben 10statt 1e4?
musicman523

@ musicman523, 10wäre 10 Millisekunden, die Challenge Challenge sagt 10 Sekunden , das sind also 10000 Millisekunden 1e4.
Shaggy

Mein schlechtes, habe das vergessen, 10 != 1e4weil ich ein
Idiot

3

VB.Net - 174 Bytes

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-Version kommt morgen ;-)


3
Ich bin mir nicht sicher, was der Vorteil ist, wenn man Linien miteinander kombiniert :. Dies benötigt die gleiche Anzahl von Bytes wie ein Zeilenumbruch, verringert also nur die Lesbarkeit, ohne den Golf-Score zu verbessern.
Cody Grey

@CodyGray Ich glaube, dass die :Zeilenumbruch-Ersetzung so sein kann, dass der Treading-Aufruf ohne Wiederholung als inline deklariert wird - aber ich bin nicht positiv, meine Hauptsprache ist VBA, das Threading oder Lesen von der <strike> -Konsole <nicht unterstützt / strike> Unmittelbares Fenster zum Zeitpunkt der Funktionsdefinition oder des Aufrufs: P
Taylor Scott

3

Los, 149 Bytes

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 Bytes

2 Bytes von Blauhirn gespeichert

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

AHK hat eine eingebaute Zeitüberschreitung für Eingabefelder.
Ich habe versucht , schlau zu bekommen und verwenden !ostatt , ErrorLevelaber das schlägt fehl , wenn die Benutzereingaben einen Falsey Wert.
Fast die Hälfte der Antwort sind nur die Befehlsnamen und der feste Text.


1
Wofür sind alle Kommas?
Pavel

@Phoenix Wahrscheinlich die Argumente für InputBox zu beseitigen
Adám

@Phoenix Timeoutist fast der letzte Parameter:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Engineer Toast

zwei Zeichen kürzer:s:=errorLevel?"no ":
phil294

@Blauhirn Gah! Ich bin ein Idiot. Vielen Dank.
Ingenieur Toast

3

Python3, 100 89 83 71 Bytes

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

Versuchen Sie zuerst, Golf zu spielen.

-4 für any(), -7 für das Schneiden, danke @ user2357112!

-6, komme select()von ptystatt select.


Sie können schneiden einige Bytes aus durch eine Slicing "no input received"string: "no input received"[3*bool(...):].
user2357112

Sie können auch any(...)anstelle von verwenden bool(...[0]).
user2357112

-New User: "unter Windows wird ModuleNotFoundError ausgelöst: Kein Modul mit dem Namen 'termios'"
FantaC

Das ptyModul ist nur auf Linux-Plattformen verfügbar, aber ich benutze es nur, weil sein Name kurz ist und es selectverfügbar macht . Version 2 funktioniert wahrscheinlich besser unter Windows.
Seth

3

PowerShell, 110 Byte

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

3

Python 3, 158 Bytes

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)

Ich habe versucht, Seths Python 3-Antwort auszuführen, aber unter Windows wird sie ausgelöst ModuleNotFoundError: No module named 'termios'. Da ich seine Antwort nicht kommentieren kann, habe ich mich stattdessen für eine Lösung entschieden, die plattformunabhängig sein sollte.

Es ist mein erstes Mal, dass ich Golf spiele, also bin ich sicher, dass es verbessert werden könnte.


2
Willkommen bei PPCG!
Steadybox

2

Tcl, 99 Bytes

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

2

SmileBASIC 3, 74 Bytes

"Akzeptiert Eingaben", indem auf einen beliebigen Tastendruck gewartet wird (dies sollte als Eingabe gelten.)

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

Die Ausgabe sollte "(keine) Eingabe empfangen" sein, nicht "EINGABE (NICHT) EMPFANGEN"
Pavel

2

Scratch 2 / 3.x, 41 Punkte ( Erklärung )

Ungeduldiger Timer

1: Wenn GF geklickt hat

1: frag [] und warte

1 + 14 Zeichen: Sagen Sie [Eingang erhalten]

1: stop [all v] (Anmerkung: da "all" die Standardeinstellung war, habe ich den Block als 1 gezählt)

1 + 2 Ziffern: Warten Sie (10) Sekunden

1 + 17 Zeichen: say [keine Eingabe erhalten]

1: stop [all v]


Willkommen bei PCG!
Rahul Bharadwaj

1

> <> , 43 + 6 = 49 Bytes

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

Probieren Sie es online!

+5 für das -t.08Flag, das das Häkchen auf 0,08 Sekunden setzt, und +1 für das aFlag, das Leerzeichen und übersprungene Anweisungen als Häkchen zählt.

Das Programm prüft etwa jede Sekunde auf Eingaben und verlässt die Schleife, wenn Eingaben erkannt werden. Wenn keine Eingabe empfangen wird, wird die Schleife von unten verlassen und noan den Anfang der Zeichenfolge angehängt. Zunächst /soll sichergestellt werden, dass die letzte Überprüfung für die Eingabe genau auf der 10-Sekunden-Marke liegt.

Es dauert dann ungefähr 5-6 Sekunden, um die Zeichenfolge selbst zu drucken.


Sie können ein einzelnes Flag verwenden, -at.08um ein Byte zu speichern.
Pavel

@Pavel, danke!
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");}}

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

Bitte schlagen Sie keine versionsspezifischen Java-Verbesserungen vor. Dies ist eine generische Java-Antwort, die in allen derzeit stabilen Java-Umgebungen (1.4 und höher) funktioniert.


Sehr verdammt wortreich ... Der Fang ist erforderlich, ich kann ihn nicht werfen. Der Systemimport nimmt ab wie 5 Bytes ... Überladen ist auch wortreich, so dass es zu einem wortreichen, schlecht aussehenden Durcheinander kommt.


Muss es sein 10000Lund nicht 10000? Ich dachte, Ints würden automatisch in Sehnsüchte umgewandelt.
Pavel

1

Julia 0,6 , 78 Bytes

Länger als ich erwartet hatte. Siehe Kommentare für den TIO-Link "Keine Eingabe erhalten".

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

Probieren Sie es online!


1
Es blockiert TIO nicht, weil es aus einer Datei liest. Es trifft EOF und endet sofort. Wenn Sie einen Prozess weiterleiten, der niemals Zeilenumbrüche in das Programm auf TIO ausgibt
Pavel

0

SmileBASIC, 74 73 Bytes

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

Nimmt 1 Zeichen der Eingabe auf.

Und eine 39-Byte-Lösung, die wahrscheinlich nicht gültig ist (akzeptiert keine Texteingabe, hat nur einen OKKnopf, den Sie drücken können)

?"no "*!DIALOG("",,,10);"input received
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.