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!


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.


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.


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


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"

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


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


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」

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

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


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


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


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


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

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.


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.


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]

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.


2
Bienvenido a 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

"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

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]


¡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í.


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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.