Espere impacientemente la entrada

39

Su tarea hoy es implementar un límite de tiempo para obtener información, una tarea que he encontrado bastante molesta en la mayoría de los idiomas.

Creará una función de programa que solicita al usuario que ingrese. Inmediatamente después de que el usuario proporcione la entrada, imprima el mensaje input receivedy finalice la ejecución / devolución. Sin embargo, si el usuario espera más de 10 segundos para proporcionar información, envíe el mensaje no input receivedy finalice la ejecución / devolución.

La entrada debe ser de stdin(la consola) o equivalente, no argumentos de función o programa, sin embargo, la salida puede ser stdoutel valor de retorno de su función o cualquier otro método de salida aceptado.

Puede solicitar cualquier cantidad de entrada, puede ser un solo carácter, una línea, una palabra o cualquier método que sea más corto en su idioma siempre que espere al menos un carácter.

Debe emitir tan pronto como se reciba la entrada, no después de que hayan pasado los 10 segundos.

Después de que hayan pasado 10 segundos, debe finalizar, no puede continuar esperando la entrada después de que no input receivedse haya impreso.

Puede suponer que la entrada no se pasa en el tiempo transcurrido entre 10 segundos y el texto que se imprime en la pantalla, ya que esta es una ventana extremadamente pequeña. También puede suponer que el equivalente sleepintegrado de su idioma es consistentemente, absolutamente perfecto.

Este es el , ¡la menor cantidad de bytes gana!

Pavel
fuente
66
+1 solo por el toque agradable para evitar que los idiomas de golf usen su diccionario. Ah, y gran desafío también.
Adám
1
@ Adám a menos que su idioma tenga una lectura incorporada con tiempo de espera, creo que la única buena manera de hacerlo es la magia OS / Thread, que la mayoría de los idiomas de golf no pueden hacer de todos modos.
Pavel
Ahora tengo que reescribir mi programa. Estaba casi listo para publicar ... ;-)
Adám
1
@TheLethalCoder Puede asumir el equivalente de las sleepfunciones de su idioma perfectamente el 100% del tiempo.
Pavel
1
@Lembik Ahí tienes, una respuesta de Python.
Pavel

Respuestas:

24

bash, 38 bytes

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

Esto utiliza la -topción (tiempo de espera) para bash read, lo que hace que falle y devuelva un código de salida distinto de cero si no se proporciona ninguna entrada en el número de segundos especificado.

Pomo de la puerta
fuente
66
Se supone que dice "(no) input rec ie ved" que obstruye de manera importante los idiomas de golf con los diccionarios.
Adám
8
@ Adám En realidad es un error tipográfico
Pavel
77
@ Phoenix Noooo!
Adám
1
¿Por qué a = no entonces $ a? ¿hay un propósito? EDITAR Lo tengo No leí la pregunta correctamente
Felix Guo
12

Haskell, 97 89 bytes

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

Si el timeouttiempo de espera regresa Nothingy Just Char( Charporque estamos usando getChar) de lo contrario. Este valor de retorno se convierte "no "ao ""por función maybe "no " mempty. Anexar "input received"e imprimir.

Editar: @BMO sugirió maybey guardó algunos bytes.

nimi
fuente
No parece funcionar correctamente en ghci.
maple_shaft
@maple_shaft: dentro de ghci tienes que vincular gcon let:, let g Nothing="no ";g _=""entonces la llamada a la función timeout....funciona bien para mí.
nimi
1
Puede reemplazarlo gpor uno maybe"no "(pure"")más corto e incluso puede incluirlo en línea, ahorrándole 6 bytes.
ბიმო
@BMO: ¡Qué bien! memptyen lugar de (pure"")es aún más corto.
nimi
Muy bien, eso es realmente inteligente!
ბიმო
11

POSIX C99, 71 63 bytes

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

Sin golf:

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

Como polldevolverá 1 en caso de éxito, multiplicamos el resultado por 3 y desplazamos la cadena en consecuencia. Luego, usamos el hecho de que struct pollfdtiene el siguiente diseño:

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

y STDIN_FILENOes 0, POLLINes 1reemplazar pfdcon int pfd[] = {0,1}, que finalmente hacemos un compuesto literal (según lo permitido por C99).

yoann
fuente
3
Debe especificar que esto se dirige a POSIX, ya que el poll.hencabezado no es parte del estándar de lenguaje C99.
Cody Gray
8

Apéndice, 113

Applescript realmente no lee de STDIN. Esperemos que a display dialogsea ​​aceptable aquí:

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

APL (Dyalog) , 41 40 bytes

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

Esta es una función tácita anónima que necesita un argumento ficticio para ejecutarse .

'no input received' la cadena completa

↓⍨ suelte tantos caracteres desde el frente como el número devuelto por el

{ función explícita anónima ( denota el argumento)

⎕RTL←10 establecer R espuesta T ime L IMIT a segundos diez

3*⍨ elevar ese número (diez) a la potencia de tres (mil significa "todos")

:: con esas excepciones (todas),

  0 volver 0

 tratar:

   obtener entrada

  3⊣ descartar eso y en su lugar devolver 3

}fin de la función (tenga en cuenta que el argumento nunca se mencionó)

Adán
fuente
6

Perl , 74 67 bytes

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

Versión antigua

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

(Ejecutar a través de perl -M5.10.1 ...)

usuario1711878
fuente
No se necesita una nueva línea final en la salida, por lo que puede cortar \n.
Pavel
3
Bienvenido a PPCG!
Pavel
En realidad no lo necesitas -M5.10.1. Puedes simplemente sustituirlo -epor -E. (si fuera necesario -M5.10.1, tendría que agregar una penalización a su puntaje)
Brad Gilbert b2gills
@ Phoenix, \nestá ahí debido al diecomportamiento de: "Si el último elemento de LIST no termina en una nueva línea, también se imprime el número de línea de script actual y el número de línea de entrada (si corresponde), y se proporciona una nueva línea". Por lo tanto, sin él se mostrará "no se recibió ninguna entrada en la línea 1.". Pero, por supuesto, podría ser un salto de línea literal en la cadena. Además de eso, los espacios entre diey sayy sus parámetros no son necesarios. Lo mismo para la final ;. Y <>es suficiente para leer desde la entrada estándar.
manatwork
1
Si evallees desde STDIN, puedes evitar necesitar un diemensaje. De hecho, un error de ejecución funciona igual de bien: $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

Pruébalo sin entrada
Pruébalo con entrada

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

Pruébalo sin entrada
Pruébalo con entrada

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
fuente
1
"recibo mi entrada - prometo en 10, luego diga 'no ess' y salga u obtenga 'ess'"
gato
¿Puedes eliminar el espacio entre starty {?
Pavel
@ Phoenix Eso se analizaría como indexación asociativa en una variable sin sigilo llamada start, así que no.
Brad Gilbert b2gills
Sus enlaces TIO parecen no funcionar más.
Pavel
@Pavel, Fixed, solo tenía que hacer de la clase de prueba ficticia un subtipo de IO :: Handle y recurrir .newa ella
Brad Gilbert b2gills
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";}

Guardado 17 bytes gracias a @VisualMelon.

Versión completa / formateada:

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
fuente
¿Por qué namespacey no una usingdirectiva?
Pavel
@ Phoenix necesitarían un espacio de nombres de todos modos, así que guardan todos los bytes de lausing
LiefdeWen
¿Por qué guardó la parte crucial como Acción y luego la ejecutó? Realmente no puedo ver la pregunta que especifica esto.
Snowfire
1
Puede ahorrar bastante usando el valor de retorno de Thread.Join(int), (deshacerse de c, perder llaves, etc., etc.): var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(VB.NET ya parece hacer esto)
VisualMelon
1
@TaylorScott que puedo hacer, 1e4pero eso es una doubley necesitaría una, intasí que tendría que hacer (int)1e4:( Buena idea, aunque
TheLethalCoder
5

TI-BASIC, 84 77 bytes

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

Espera hasta que se presione un número.

Estoy tratando de descubrir cómo jugar golf en la secuencia {72,73,74,82,83,84,92,93,94}. Está ocupando mucho espacio.

Scott Milner
fuente
Si desea esperar cualquier tecla, entonces Repeat K or 10=checkTmr(Tlo haría.
bb94
Además, las últimas 4 líneas podrían acortarse a:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94
1
@ bb94 Realmente no quiero esperar ninguna tecla, ya que no todas ellas ingresarían un carácter. Sería como esperar la Shiftllave en una computadora. Además, acortar las últimas 4 líneas con su método en realidad da el mismo número de bytes que el mío. Sin embargo, me gusta tu método.
Scott Milner
Puede verificar cualquier clave que no sea 21 o 31.
bb94
Después oren su declaración de repetición, use esto en su lugar para -7 bytes:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94
4

Nodejs, 105 103 101 bytes

-2 bytes gracias a @apsillers
-2 bytes moviéndose console.log()aexit()

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

Ejecútelo guardando en un archivo y ejecútelo con el nodo o ejecútelo directamente desde la línea de comandos haciendo node -e "<code>"

Justin Mariner
fuente
@apsillers Sí, buena captura.
Justin Mariner
@apsillers estaba a punto de editar nuevamente para mover la console.log()llamada al parámetro de exit(). Eso son dos menos, ahora.
Justin Mariner
4

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

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i
  • ¡2 bytes guardados gracias a los apsillers que señalan que soy tonto!

Intentalo

Requiere un cierre >en el inputpara trabajar en un fragmento.

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

Lanudo
fuente
1e5 es 100,000 o 100 segundos, 1e4 es 10 segundos
PunPun1000
¡Uy! Bien visto, gracias, @ PunPun1000
Shaggy
¿No sería más corto escribir en 10lugar de 1e4?
musicman523
@ musicman523, 10sería de 10 milisegundos, el desafío de desafío dice específicamente 10 segundos , que es de 10000 milisegundos, por lo tanto 1e4.
Shaggy
Mi mal, lo olvidé 10 != 1e4porque soy un tonto
musicman523
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

La versión de COBOL llegará mañana ;-)

FastAl
fuente
3
No estoy seguro de cuál es la ventaja de combinar líneas con :. Eso toma el mismo número de bytes que un salto de línea, por lo que solo disminuye la legibilidad sin mejorar el puntaje de golf.
Cody Gray
@CodyGray Creo que la :sustitución de salto de línea puede ser para que la llamada de pisadas pueda declararse en línea sin repetir, pero dicho esto no soy positivo, mi idioma principal es VBA que no admite subprocesos o lectura desde la consola <strike> < / strike> asistente de ventana inmediata desde el momento de la definición de la función o llamada: P
Taylor Scott
3

Go, 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)}
vroomfondel
fuente
3

AHK , 67 65 bytes

2 bytes guardados por Blauhirn

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

AHK tiene un tiempo de espera incorporado para cuadros de entrada.
Intenté ser inteligente y usar en !olugar de, ErrorLevelpero eso falla si el usuario ingresa un valor falso.
Casi la mitad de la respuesta son solo los nombres de los comandos y el texto fijo.

Tostadas de ingeniero
fuente
1
¿Para qué son todas las comas?
Pavel
@ Phoenix Probablemente eluyendo argumentos a InputBox
Adám
@ Phoenix Timeoutes casi el último parámetro:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Engineer Toast
dos caracteres más corta:s:=errorLevel?"no ":
phil294
@Blauhirn Gah! Soy un idiota. Gracias.
Engineer Toast
3

Python3, 100 89 83 71 bytes

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

Primero intente jugar al golf.

-4 para any() , -7 por rebanar, gracias @ user2357112!

-6, obtener select()de en ptylugar de select.

Seth
fuente
Puede cortar algunos bytes a cabo por corte de una "no input received"cadena: "no input received"[3*bool(...):].
user2357112 es compatible con Monica
También puede usar en any(...)lugar de bool(...[0]).
user2357112 es compatible con Monica el
-Nuevo usuario: "en Windows arroja ModuleNotFoundError: Ningún módulo llamado 'termios'"
FantaC
El ptymódulo solo está disponible en plataformas Linux, pero solo lo estoy usando porque su nombre es corto y está selectdisponible. La versión 2 probablemente funciona mejor en Windows.
Seth
3

PowerShell, 110 bytes

$s1=date;while(![console]::KeyAvailable-and($i=((date)-$s1).seconds-lt10)){}
"{0}input received"-f(,'no ')[$i]
TessellatingHeckler
fuente
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)

Intenté ejecutar la respuesta de Seth Python 3 pero en Windows arrojaModuleNotFoundError: No module named 'termios' , y como no puedo comentar su respuesta al respecto, decidí encontrar una solución que debería ser independiente de la plataforma.

Es mi primera vez jugando al golf, así que estoy seguro de que podría mejorarse.

Sombrero
fuente
2
Bienvenido a PPCG!
Steadybox
2

Tcl, 99 bytes

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

SmileBASIC 3, 74 bytes

"Acepta la entrada" esperando que se presione cualquier botón (eso debería contar como entrada).

M=MAINCNT@L
N=MAINCNT-M>599CLS?"NO "*N;"INPUT RECEIVED
ON N+BUTTON()GOTO@L
caracol_
fuente
La salida debe ser "(no) entrada recibida", no "ENTRADA (NO) RECIBIDA"
Pavel
2

Scratch 2 / 3.x, 41 puntos ( Explicación )

Temporizador de impaciencia

1: cuando GF hizo clic

1: pregunta [] y espera

1 + 14 caracteres: decir [entrada recibida]

1: detener [todos v] (nota: dado que "todos" era su configuración predeterminada, conté el bloque como 1)

1 + 2 dígitos: espera (10) segundos

1 + 17 caracteres: decir [no se recibió entrada]

1: detener [todos v]

Error de sintaxis
fuente
¡Bienvenido a PCG!
Rahul Bharadwaj
1

> <> , 43 + 6 = 49 bytes

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

Pruébalo en línea!

+5 para la -t.08bandera, que establece el tick en 0.08 segundos, y +1 para la abandera, que cuenta los espacios en blanco y las instrucciones omitidas como ticks.

El programa verifica la entrada aproximadamente una vez por segundo y sale del bucle si se detecta una entrada. Si no se recibe la entrada, sale del bucle desde la parte inferior, agregando noal comienzo de la cadena. La inicial /es garantizar que la última verificación de entrada esté exactamente en la marca de 10 segundos.

Luego toma unos 5-6 segundos para imprimir la cadena en sí.

Jo King
fuente
Puede usar una sola bandera -at.08para guardar un byte.
Pavel
@Pavel, gracias!
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");}}

Sin golf:

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

No sugiera mejoras de Java específicas de la versión, esta es una respuesta genérica de Java que funciona en todos los entornos Java estables actualmente (1.4 y superiores).


Muy jodidamente prolijo ... Se requiere la captura, no se puede lanzar. La importación del sistema se reduce como 5 bytes ... La sobrecarga también es prolija, por lo que termina siendo un desastre desordenado y mal parecido al golf.

Urna de pulpo mágico
fuente
¿Tiene que ser 10000Ly no 10000? Pensé que los intérpretes se convierten en largos automáticamente.
Pavel
0

SmileBASIC, 74 73 bytes

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

Toma 1 carácter de entrada.

Y una solución de 39 bytes que probablemente no sea válida (en realidad no acepta ingreso de texto, solo tiene un OKbotón que puede presionar)

?"no "*!DIALOG("",,,10);"input received
12Me21
fuente