Aguarde impacientemente pela entrada


39

Sua tarefa hoje é implementar um limite de tempo para obter informações, uma tarefa que achei bastante irritante de ser alcançada na maioria dos idiomas.

Você criará uma função de programa que solicita entrada ao usuário. Imediatamente após o usuário fornecer a entrada, imprima a mensagem input receivede finalize a execução / retorno. No entanto, se o usuário aguardar mais de 10 segundos para fornecer entrada, no input receivedenvie a mensagem e finalize a execução / retorno.

A entrada deve ser de stdin(o console) ou equivalente, não os argumentos da função ou do programa; no entanto, a saída pode ser para stdout, o valor de retorno da sua função ou qualquer outro método de saída aceito.

Você pode solicitar qualquer quantidade de entrada, pode ser um único caractere, uma linha, uma palavra ou qualquer método que seja mais curto no seu idioma, desde que espere pelo menos um caractere.

Você deve produzir assim que a entrada for recebida, não após os 10 segundos.

Após 10 segundos, você deve terminar, não poderá continuar aguardando a entrada após a no input receivedimpressão.

Você pode supor que a entrada não seja transmitida no tempo decorrido entre 10 segundos e o texto sendo impresso na tela, pois essa é uma janela extremamente pequena. Você também pode assumir que o equivalente interno do seu idioma sleepé consistente e absolutamente perfeito.

Isso é , o menor número de bytes vence!


6
+1 apenas pelo toque agradável para impedir que os idiomas do golfe usem o dicionário. Ah, e um grande desafio também.
Adám

11
@ Adám, a menos que seu idioma tenha uma leitura interna com tempo limite, acho que a única maneira de fazer isso é a magia do OS / Thread, que a maioria dos idiomas de golfe não pode fazer de qualquer maneira.
Pavel

Agora eu tenho que reescrever meu programa. Estava quase pronto para postar ... ;-)
Adám 8/17/17

11
@TheLethalCoder Você pode assumir as sleepfunções equivalentes do seu idioma perfeitamente 100% do tempo.
Pavel

11
@Lembik Lá vai você, uma resposta em Python.
Pavel

Respostas:


24

bash, 38 bytes

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

Isso usa a -topção (timeout) no bash read, o que faz com que ela falhe e retorne um código de saída diferente de zero se nenhuma entrada for fornecida no número especificado de segundos.


6
Supõe-se que "(não) registro de entrada ie vedado" que obstrua de maneira importante os idiomas dos dicionários de golfe.
Adám 8/06

8
@ Adám Na verdade isso é um erro de digitação
Pavel

7
@Phoenix Noooo!
Adám 8/06

11
Por que a = no então $ a? existe um propósito? EDIT eu consegui Eu não li a pergunta corretamente
Felix Guo

12

Haskell, 97 89 bytes

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

Se o timeouttempo limite expirar, ele retornará Nothinge Just Char( Charporque estamos usando getChar) o contrário. Este valor de retorno é convertido para "no "ou ""por função maybe "no " mempty. Anexar "input received"e imprimir.

Edit: @BMO sugerido maybee salvou alguns bytes.


Não parece funcionar corretamente no ghci.
Maple_shaft

@maple_shaft: Dentro ghci você tem que se ligam gcom let: let g Nothing="no ";g _="", em seguida, a chamada de função timeout....funciona bem para mim.
N

11
Você pode substituir gpelo maybe"no "(pure"")que for mais curto e até inline - economizando 6 bytes.
ბიმო

@BMO: Legal! memptyem vez de (pure"")é ainda mais curto.
nimi 21/02

Muito bom, isso é realmente inteligente!
ბიმო

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

Como pollretornará 1 em caso de sucesso, multiplicamos o resultado por 3 e alteramos a sequência de acordo. Em seguida, usamos o fato de que struct pollfdpossui o seguinte layout:

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

e isto STDIN_FILENOé 0, POLLINé 1substituir pfdpor int pfd[] = {0,1}, que finalmente transformamos um composto em lixo (conforme permitido por C99).


3
Você precisa especificar que isso tem como destino o POSIX, pois o poll.hcabeçalho não faz parte do padrão de idioma C99.
Cody Grey

8

Applescript, 113

O Applescript realmente não lê o STDIN. Espero que um display dialogseja aceitável aqui:

({"","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 é uma função tácita anônima que precisa de um argumento fictício para ser executada .

'no input received' a sequência completa

↓⍨ solte tantos caracteres na frente como o número retornado pelo

{ função explícita anônima ( denota o argumento)

⎕RTL←10 definir R esposto T ime L imit a dez segundos

3*⍨ elevar esse número (dez) ao poder de três (mil significa "todos")

:: sobre essas exceções (todas),

  0 retornar 0

 experimentar:

   obter entrada

  3⊣ descartar isso e retornar 3

}fim da função (observe que o argumento nunca foi mencionado)


6

Perl , 74 67 bytes

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

Versão antiga

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

(Execute via perl -M5.10.1 ...)


Nenhuma nova linha final é necessária na saída, para que você possa cortar \n.
Pavel

3
Bem-vindo ao PPCG!
Pavel

Na verdade você não precisa -M5.10.1. Você pode simplesmente substituir -epor -E. (se necessário -M5.10.1, você teria que adicionar uma penalidade para a sua pontuação)
Brad Gilbert b2gills

@ Phoenix, \nexiste por causa do diecomportamento: "Se o último elemento da LIST não terminar em uma nova linha, o número da linha de script atual e o número da linha de entrada (se houver) também serão impressos e uma nova linha será fornecida." Portanto, sem ele seria exibido "nenhuma entrada recebida na linha -e 1.". Mas é claro, poderia ser uma quebra de linha literal na string. Além disso, os espaços entre diee saye seus parâmetros não são necessários. O mesmo para a final ;. E <>é o suficiente para ler da entrada padrão.
manatwork

11
Se você evaller o STDIN, poderá evitar a necessidade de uma diemensagem. Na verdade, um erro de execução funciona tão bem: $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

Experimente sem entrada
Experimente com entrada

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

Experimente sem entrada
Experimente com 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」

11
"minha ess é recebida entrada - prometa em 10, em seguida, diga 'no ess' e saia ou diga 'ess'"
cat

Você pode remover o espaço entre starte {?
Pavel

@ Phoenix Isso seria analisado como indexação associativa em uma variável sem nome chamada start, então não.
Brad Gilbert b2gills

Seus links TIO parecem não funcionar mais.
Pavel

@Pavel, fixo, apenas tive que fazer a classe de teste simulado um subtipo de IO :: Handle e chamada .newsobre ele
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";}

Economizou 17 bytes graças a @VisualMelon.

Versão completa / formatada:

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 que namespacee não uma usingdiretiva?
Pavel

@Phoenix que seria necessário um espaço de nomes de qualquer maneira para que eles salvar todos os bytes dousing
LiefdeWen

Por que você salvou a parte crucial como uma ação e a executou depois? Eu realmente não consigo ver a pergunta especificando isso.
Snowfire

11
Pode guardar um pouco usando o valor de retorno Thread.Join(int), (livrar de c, chaves perder, etc. etc.): var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(VB.NET já parece fazer isso)
VisualMelon

11
@TaylorScott que posso fazer 1e4, mas que é um doublee que eu precisaria de um int, então eu teria que fazer (int)1e4:( Boa idéia embora
TheLethalCoder

5

TI-BASIC, 84 77 bytes

-7 graças 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

Aguarda até que um número seja pressionado.

Estou tentando descobrir como jogar golfe na sequência {72,73,74,82,83,84,92,93,94}. Está ocupando muito espaço.


Se você quiser esperar por qualquer tecla, Repeat K or 10=checkTmr(Tseria necessário.
Bb9

Além disso, as últimas 4 linhas poderia ser reduzido para:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
BB94

11
@ bb94 Eu realmente não quero esperar por nenhuma tecla, pois nem todas elas realmente inserem um caractere. Seria como esperar pela Shiftchave em um computador. Além disso, encurtar as últimas 4 linhas com seu método fornece a mesma contagem de bytes que a minha. Eu gosto do seu método, no entanto.
Scott Milner

Você pode verificar para qualquer chave que não é 21 ou 31.
BB94

Depois de orrepetir a instrução, use-o para -7 bytes:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94

4

NodeJS, 105 103 101 bytes

-2 bytes graças a @apsillers
-2 bytes, movendo console.log()- se paraexit()

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

Execute salvando em um arquivo e executando-o com o nó ou execute-o diretamente da linha de comando, executando node -e "<code>"


@apsillers Sim, boa captura.
Justin Mariner

@apsillers Eu estava prestes a editar novamente para realmente mover a console.log()chamada para o parâmetro de exit(). São dois a menos agora.
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 salvos graças a apsillers apontando que eu sou burro!

Tente

Requer um fechamento >no inputpara trabalhar em um snippet.

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


1e5 é de 100.000 ou 100 segundos, 1E4 é de 10 segundos
PunPun1000

Opa! Bem manchado, obrigado, @ PunPun1000
Shaggy

Não seria mais curto escrever em 10vez de 1e4?
musicman523

@ musicman523, 10seria 10 milissegundos, o desafio do desafio diz especificamente 10 segundos , ou seja, 10000 milissegundos 1e4.
Shaggy

Meu mau, se esqueceu de que 10 != 1e4porque eu sou um tolo
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

Versão COBOL disponível amanhã ;-)


3
Não sei ao certo qual é a vantagem de combinar linhas :. Isso requer o mesmo número de bytes que uma quebra de linha, diminuindo a legibilidade sem melhorar a pontuação do golfe.
Cody Grey

@CodyGray Acredito que a :substituição de quebra de linha possa ser declarada em linha sem repetir - mas isso disse que não sou positivo, meu idioma principal é o VBA, que não suporta encadeamento ou leitura no console <strike> < / strike> asside janela imediata de no momento da definição de função ou chamar: P
Taylor Scott

3

Vá, 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 salvos por Blauhirn

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

O AHK possui um tempo limite interno para caixas de entrada.
Tentei ser inteligente e usar em !ovez de, ErrorLevelmas isso falhará se o usuário inserir um valor falsey.
Quase metade da resposta são apenas os nomes dos comandos e o texto fixo.


11
Para que servem todas as vírgulas?
Pavel

@Phoenix Provavelmente eliding argumentos para InputBox
Adám

@Phoenix Timeouté quase o último parâmetro:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Engineer Toast

dois caracteres mais curtos:s:=errorLevel?"no ":
phil294

@Blauhirn Gah! Eu sou um idiota. Obrigado.
Engenheiro Toast

3

Python3, 100 89 83 71 bytes

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

Primeira tentativa de golfe.

-4 por any(), -7 por fatia, obrigado @ user2357112!

-6, vá select()em ptyvez de select.


Você pode cortar alguns bytes fora por corte de uma "no input received"string: "no input received"[3*bool(...):].
User2357112 suporta Monica

Você também pode usar em any(...)vez de bool(...[0]).
User2357112 suporta Monica

-Novo usuário: "no Windows, lança ModuleNotFoundError: Nenhum módulo chamado 'termios'"
FantaC

O ptymódulo está disponível apenas em plataformas Linux, mas eu o uso apenas porque seu nome é curto e está selectdisponível. A versão 2 provavelmente funciona melhor no 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)

Tentei executar a resposta Python 3 de Seth, mas no Windows ela lança ModuleNotFoundError: No module named 'termios'e, como não posso comentar sua resposta, decidi criar uma solução que deveria ser independente de plataforma.

É a minha primeira vez jogando golfe, então tenho certeza de que poderia ser melhorado.


2
Bem-vindo ao PPCG!
Steadybox 10/01

2

Tcl, 99 bytes

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

2

SmileBASIC 3, 74 bytes

"Aceita entrada", aguardando qualquer pressão no botão (que deve contar como entrada).

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

A saída deve ser "(nenhuma) entrada recebida", não "ENTRADA (NÃO) RECEBIDA"
Pavel

2

Raspadinha 2 / 3.x, 41 pontos ( Explicação )

Temporizador impaciente

1: Quando GF clicou

1: pergunte [] e aguarde

1 + 14 caracteres: diga [entrada recebida]

1: stop [all v] (nota: como "all" era a configuração padrão, contei o bloco como 1)

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

1 + 17 caracteres: diga [nenhuma entrada recebida]

1: parar [todos v]


Bem-vindo ao PCG!
Rahul Bharadwaj

1

> <> , 43 + 6 = 49 bytes

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

Experimente online!

+5 para o -t.08sinalizador, que define o tick para 0,08 segundos, e +1 para o asinalizador, que conta espaços em branco e instruções ignoradas como ticks.

O programa verifica a entrada cerca de uma vez a cada segundo e sai do loop se a entrada for detectada. Se a entrada não for recebida, ela sai do loop da parte inferior, acrescentando noao início da string. A inicial /é garantir que a última verificação de entrada esteja exatamente na marca de 10 segundos.

Em seguida, leva de 5 a 6 segundos para imprimir a própria string.


Você pode usar um único sinalizador -at.08para salvar um byte.
Pavel

@ Pavel, Obrigado!
Jo rei

1

Java 1.4 ou superior, 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");
    }
}

Por favor, não sugira melhorias Java específicas da versão; esta é uma resposta Java genérica que funciona em todos os ambientes Java atualmente estáveis ​​(1.4 e acima).


Muito enlouquecido prolixo ... A captura é necessária, não pode ser lançada. A importação do sistema é cortada como 5 bytes ... A sobrecarga também é prolixo, por isso acaba com uma bagunça de aparência pobre.


Tem que ser 10000Le não 10000? Eu pensei que ints convertidos em longos automaticamente.
Pavel

1

Julia 0.6 , 78 bytes

Mais do que eu esperava. Veja os comentários para o link TIO "nenhuma entrada recebida".

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

Experimente online!


11
Ele não bloqueia no TIO porque está lendo de um arquivo. Atinge EOF e termina instantaneamente. Se você canalizar um processo que nunca emite novas linhas no programa no TIO, ele bloqueará: tio.run/##JcqxDoIwEIDhvU9x6ULPCNXFxejk4uIiowvaSzgDLekVReO7V4Pb/…
Pavel

0

SmileBASIC, 74 73 bytes

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

Leva 1 caractere de entrada.

E uma solução de 39 bytes que provavelmente não é válida (na verdade não aceita entrada de texto, apenas possui um OK botão que você pode pressionar)

?"no "*!DIALOG("",,,10);"input received
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.