Attendre impatiemment l'entrée


39

Votre tâche aujourd'hui consiste à mettre en place une limite de temps pour obtenir des commentaires, tâche que j'ai trouvé plutôt pénible à accomplir dans la plupart des langues.

Vous allez créer une fonction de programme qui invite l'utilisateur à entrer. Immédiatement après que l'utilisateur ait saisi les données, imprimez le message input receivedet terminez l'exécution / le retour. Cependant, si l'utilisateur attend plus de 10 secondes pour fournir une entrée, envoie le message no input receivedet termine l'exécution / le retour.

L'entrée doit provenir de stdin(la console) ou équivalente, et non des arguments de fonction ou de programme. Toutefois, la sortie peut être soit vers stdout, la valeur de retour de votre fonction ou toute autre méthode de sortie acceptée.

Vous pouvez demander n'importe quelle quantité d'entrée. Il peut s'agir d'un seul caractère, d'une ligne, d'un mot ou de la méthode la plus courte dans votre langue, à condition d'attendre au moins un caractère.

Vous devez sortir dès que l'entrée est reçue, pas après les 10 secondes.

Après 10 secondes, vous devez terminer, vous ne pouvez plus attendre les entrées après leur no input receivedimpression.

Vous pouvez supposer que la saisie n’est pas transmise dans le délai compris entre 10 secondes et l’impression de texte à l’écran car il s’agit d’une fenêtre extrêmement petite. Vous pouvez également supposer que l’équivalent intégré de votre langue sleepest constamment parfait.

C'est du , le moins d'octets gagne!


6
+1 juste pour la gentillesse d'empêcher les langues de golf d'utiliser leur dictionnaire. Oh, et un grand défi aussi.
Adám

1
@ Adám, à moins que votre langue ait une lecture intégrée avec timeout, je pense que le seul bon moyen de le faire est la magie OS / Thread, ce que la plupart des langues de golf ne peuvent faire de toute façon.
Pavel

Maintenant, je dois réécrire mon programme. Était presque prêt à poster ... ;-)
Adám

1
@TheLethalCoder Vous pouvez supposer que l'équivalent de votre langage est sleepparfaitement fonctionnel à 100% du temps.
Pavel

1
@Lembik Voilà, une réponse en Python.
Pavel

Réponses:


24

bash, 38 octets

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

Ceci utilise l' -toption (timeout) de bash read, ce qui provoque son échec et renvoie un code de sortie différent de zéro si aucune entrée n'est donnée dans le nombre de secondes spécifié.


6
Il est censé dire « (non) entrée rec -à- dire ved » qui obstrue surtout langues golf avec des dictionnaires.
Adám

8
@ Adám En fait c'est une faute de frappe
Pavel

7
@Phoenix Noooo!
Adám

1
Pourquoi un = non alors $ a? y a-t-il un but? EDIT Je l'ai eu je n'ai pas lu la question correctement
Felix Guo Le

12

Haskell, 97 89 octets

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

Si le timeouttemps est écoulé, il retourne Nothinget Just Char( Char, parce que nous utilisons getChar) sinon. Cette valeur de retour est convertie en "no "ou ""par fonction maybe "no " mempty. Ajouter "input received"et imprimer.

Edit: @BMO a suggéré maybeet enregistré des octets.


Ne semble pas fonctionner correctement dans ghci.
maple_shaft

@maple_shaft: Dans ghci vous devez lier gavec let: let g Nothing="no ";g _="", puis l'appel de fonction timeout....fonctionne très bien pour moi.
nimi

1
Vous pouvez remplacer gpar maybe"no "(pure"")ce qui est plus court et vous pouvez même l’aligner - en vous épargnant 6 octets.
ბიმო

@BMO: Nice! memptyau lieu de (pure"")est encore plus court.
nimi

Très sympa, c'est vraiment malin!
ბიმო

11

POSIX C99, 71 63 octets

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

Puisque pollretournera 1 en cas de succès, nous multiplions le résultat par 3 et décalons la chaîne en conséquence. Ensuite, nous utilisons le fait qui struct pollfda la disposition suivante:

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

et c’est STDIN_FILENO0- POLLINdire qu’il 1faut remplacer pfdpar int pfd[] = {0,1}ce que nous avons finalement créé une littérature composée (comme le permet le C99).


3
Vous devez spécifier que cela cible POSIX, car l'en- poll.htête ne fait pas partie de la norme de langage C99.
Cody Grey

8

Applescript, 113

Applescript ne lit pas vraiment de STDIN. J'espère que display dialogc'est acceptable ici:

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

6

APL (Dyalog) , 41 à 40 octets

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

C'est une fonction tacite anonyme qui nécessite un argument factice pour s'exécuter .

'no input received' la chaîne complète

↓⍨ déposez autant de caractères de l'avant que le nombre retourné par le

{ fonction explicite anonyme ( dénote l'argument)

⎕RTL←10 définir R ÉPONSE T ime L imit à dix secondes

3*⍨ élever ce nombre (dix) à la puissance de trois (mille signifie "tous")

:: sur ces exceptions (toutes),

  0 retourne 0

 essayer:

   obtenir des commentaires

  3⊣ Jeter cela et retourner à la place 3

}fin de fonction (notez que l'argument n'a jamais été mentionné)


6

Perl , 74 67 octets

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

Ancienne version

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

(Exécutez via perl -M5.10.1 ...)


Aucun retour à la ligne final n'est nécessaire en sortie, vous pouvez donc couper \n.
Pavel

3
Bienvenue chez PPCG!
Pavel

En fait, vous n'en avez pas besoin -M5.10.1. Vous pouvez simplement remplacer -epar -E. (si vous en aviez besoin -M5.10.1, vous devrez ajouter une pénalité à votre score)
Brad Gilbert b2gills

@Phoenix, le comportement \nexiste die: 'Si le dernier élément de LIST ne se termine pas par une nouvelle ligne, le numéro de ligne du script actuel et le numéro de la ligne d'entrée (le cas échéant) sont également imprimés et une nouvelle ligne est fournie. " Donc, sans cette option, «aucune entrée ne serait reçue à la ligne 1». Mais bien sûr, cela pourrait être un saut de ligne littéral dans la chaîne. De plus, les espaces entre dieet sayet leurs paramètres ne sont pas nécessaires. Même chose pour la finale ;. Et <>est suffisant pour lire à partir de l'entrée standard.
Manatwork

1
Si vous evallisez à partir de STDIN, vous pouvez éviter d'avoir besoin d'un diemessage. En fait, une erreur d'exécution fonctionne tout aussi bien: $SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'.
dimanche

6

Perl 6 ,  72  66 octets

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

Essayez-le sans entrée
Essayez-le avec entrée

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

Essayez-le sans entrée
Essayez-le avec entrée

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
"mon ess est reçu - promis dans 10 puis dites" non ess "et quittez ou obtenez" ess ""
cat

Pouvez-vous supprimer l'espace entre startet {?
Pavel

@Phoenix Cela serait analysé comme une indexation associative sur une variable sigilless nommée start, donc non.
Brad Gilbert b2gills

Vos liens TIO semblent ne plus fonctionner.
Pavel

@Pavel, Corrigé, je devais juste faire de la classe de tests fictifs un sous-type de IO :: Manipuler et appeler .newdessus
Brad Gilbert b2gills

5

C #, 180 171 148 131 octets

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

Sauvegardé 17 octets grâce à @VisualMelon.

Version complète / formatée:

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

Pourquoi namespaceet pas une usingdirective?
Pavel

@Phoenix ils auraient quand même besoin d'un espace de noms afin de sauvegarder tous les octets de lausing
LiefdeWen

Pourquoi avez-vous enregistré la partie cruciale en tant qu'Action et l'avez-vous exécuté par la suite? Je ne vois pas vraiment la question qui précise cela.
Snowfire

1
Peut économiser beaucoup en utilisant la valeur de retour de Thread.Join(int), (débarrasser de c, perdre des accolades, etc. etc.): var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(VB.NET semble déjà le faire)
VisualMelon

1
@TaylorScott je peux faire 1e4mais c'est un doubleet j'aurais besoin d'un intsi je devrais faire (int)1e4:( Belle idée cependant
TheLethalCoder

5

TI-BASIC, 84 77 octets

-7 grâce à @ 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

Attend qu'un chiffre soit appuyé.

J'essaie de comprendre comment jouer au golf la séquence {72,73,74,82,83,84,92,93,94}. Cela prend beaucoup de place.


Si vous voulez attendre n'importe quelle clé, Repeat K or 10=checkTmr(Tfaites-le.
bb94

En outre, les 4 dernières lignes pourraient être raccourcies à:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94

1
@ bb94 Je ne veux pas vraiment attendre n'importe quelle touche, car toutes ne saisiraient pas réellement un caractère. Ce serait comme attendre la Shiftclé sur un ordinateur. De plus, raccourcir les 4 dernières lignes avec votre méthode donne le même nombre d'octets que le mien. J'aime votre méthode, cependant.
Scott Milner

Vous pouvez rechercher des clés autres que 21 ou 31.
bb94

Après ordans votre instruction de répétition, utilisez ceci pour -7 octets:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94 le

4

NodeJS, 105 103 101 octets

-2 octets grâce à @apsillers
-2 octets en passant console.log()dansexit()

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

Exécuter en enregistrant dans un fichier et en l'exécutant avec node ou directement depuis la ligne de commande en exécutant node -e "<code>"


@apsillers Ouais, bonne prise.
Justin Mariner

@apsillers je m'apprêtais à éditer encore pour déplacer l' console.log()appel dans le paramètre de exit(). C'est deux de moins, maintenant.
Justin Mariner

4

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

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i
  • 2 octets économisés grâce à apsillers soulignant que je suis idiot!

L'essayer

Nécessite une fermeture >sur le inputpour travailler dans un Snippet.

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


1e5 est 100 000 ou 100 secondes, 1e4 est 10 secondes
PunPun1000

Oops! Bien vu, merci, @ PunPun1000
Shaggy le

Ne serait-il pas plus court d'écrire 10au lieu de 1e4?
musicman523

@ musicman523, ce 10serait 10 millisecondes, le défi dit spécifiquement 10 secondes , soit 10000 millisecondes 1e4.
Shaggy

My bad, j'ai oublié ça 10 != 1e4parce que je suis un imbécile
musicman523

3

VB.Net - 174 octets

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

Version COBOL à venir demain ;-)


3
Je ne suis pas sûr de l’avantage de combiner des lignes :. Cela prend le même nombre d'octets qu'un saut de ligne, ce qui diminue donc la lisibilité sans améliorer le score de golf.
Cody Gray

@CodyGray Je pense que la :substitution de saut de ligne peut être telle que l'appel de treading peut être déclaré en ligne sans se répéter - mais cela dit, je ne suis pas positif, ma langue principale est VBA qui ne prend pas en charge les threads ni les lectures à partir de la console <strike>. < / strike> fenêtre immédiate au moment de la définition de la fonction ou de l'appel: P
Taylor Scott

3

Go, 149 octets

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 octets

2 octets enregistrés par Blauhirn

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

AHK a un délai d'expiration intégré pour les zones de saisie.
J'ai essayé d'être intelligent et d'utiliser !oau lieu de, ErrorLevelmais cela échoue si l'utilisateur entre une valeur Falsey.
Près de la moitié de la réponse se résume aux noms de commande et au texte fixe.


1
A quoi servent toutes les virgules?
Pavel

@Phoenix probablement des arguments éludants à InputBox
Adám

@Phoenix Timeoutest presque le dernier paramètre:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Ingénieur Toast

deux caractères plus courts:s:=errorLevel?"no ":
phil294

@Blauhirn Gah! Je suis un idiot. Merci.
Ingénieur Toast

3

Python3, 100 89 83 71 octets

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

Essayez d'abord de jouer au golf.

-4 pour any(), -7 pour le découpage, merci @ user2357112!

-6, obtenir select()de ptyau lieu de select.


Vous pouvez couper quelques octets par couper une "no input received"chaîne: "no input received"[3*bool(...):].
user2357112 prend en charge Monica le

Vous pouvez également utiliser any(...)au lieu de bool(...[0]).
user2357112 prend en charge Monica le

-Nouveau utilisateur: "sur Windows, il lève ModuleNotFoundError: aucun module nommé 'termios'"
FantaC

Le ptymodule est uniquement disponible sur les plateformes Linux, mais je ne l’utilise que parce que son nom est court et qu’il est selectdisponible. La version 2 fonctionne probablement mieux sous Windows.
Seth

3

PowerShell, 110 octets

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

3

Python 3, 158 octets

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)

J'ai essayé d'exécuter la réponse Python 3 de Seth, mais sous Windows, elle ne fonctionne pas ModuleNotFoundError: No module named 'termios', et comme je ne peux pas commenter sa réponse à ce sujet, j'ai décidé de proposer une solution qui devrait être indépendante de la plate-forme.

C'est la première fois que je joue au golf, alors je suis sûr que cela pourrait être amélioré.


2
Bienvenue chez PPCG!
Steadybox

2

Tcl, 99 octets

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

2

SmileBASIC 3, 74 octets

"Accepte les entrées" en attendant que vous appuyiez sur un bouton (qui devrait compter comme entrée).

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

La sortie doit être "(aucune) entrée reçue", pas "ENTREE (NON) REÇUE"
Pavel le

2

Scratch 2 / 3.x, 41 points ( Explication )

Minuterie impatient

1: Quand GF a cliqué

1: demander [] et attendre

1 + 14 caractères: dites [entrée reçue]

1: stop [all v] (note: comme "all" était son réglage par défaut, j'ai compté le bloc comme 1)

1 + 2 chiffres: attendez (10) secondes

1 + 17 caractères: dire [aucune entrée reçue]

1: arrêter [tous v]


Bienvenue chez PCG!
Rahul Bharadwaj

1

> <> , 43 + 6 = 49 octets

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

Essayez-le en ligne!

+5 pour le -t.08drapeau, qui définit le tick à 0,08 seconde, et +1 pour le adrapeau, qui compte les espaces blancs et les instructions ignorées sous forme de ticks.

Le programme vérifie les entrées environ une fois par seconde et quitte la boucle si une entrée est détectée. Si aucune entrée n'est reçue, la boucle sort de la fin, en ajoutant noau début de la chaîne. La première /est de s’assurer que le dernier contrôle de saisie se situe exactement dans les 10 secondes.

Il faut ensuite environ 5-6 secondes pour imprimer la chaîne elle-même.


Vous pouvez utiliser un seul drapeau -at.08pour enregistrer un octet.
Pavel

@Pavel, merci!
Jo King

1

Java 1.4+, 284 octets

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

Ne suggérez pas d'améliorations Java spécifiques à la version. Il s'agit d'une réponse Java générique qui fonctionne dans tous les environnements Java stables (1.4 et supérieurs).


Très freaking wordy ... La capture est nécessaire, ne peut pas le jeter. L'importation du système réduit la taille de 5 octets ... La surcharge est également verbeuse, elle finit donc par devenir un désordre monotone au golf.


Est-ce que ça doit être 10000Let non 10000? Je pensais que les acteurs lancaient des désirs automatiquement.
Pavel

1

Julia 0.6 , 78 octets

Plus long que prévu Voir les commentaires pour "aucune entrée reçue" lien TIO.

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

Essayez-le en ligne!


1
Il ne bloque pas sur TIO car il lit un fichier. Il frappe EOF et se termine instantanément. Si vous redirigez un processus qui émet jamais les nouvelles lignes dans le programme sur TIO, il va bloquer: tio.run/##JcqxDoIwEIDhvU9x6ULPCNXFxejk4uIiowvaSzgDLekVReO7V4Pb/...
Pavel

0

SmileBASIC, 74 73 octets

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

Prend 1 caractère de saisie.

Et une solution de 39 octets qui n'est probablement pas valide (n'accepte pas réellement la saisie de texte, a juste un OKbouton sur lequel vous pouvez appuyer)

?"no "*!DIALOG("",,,10);"input received
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.