С нетерпением жду ввода


39

Ваша задача сегодня состоит в том, чтобы установить ограничение по времени для получения входных данных - задача, которую я нашел довольно раздражающей для большинства языков.

Вы создадите функцию программы, которая запрашивает ввод данных пользователем. Сразу после ввода данных пользователем, напечатайте сообщение input receivedи завершите выполнение / возврат. Однако, если пользователь ожидает ввода более 10 секунд, выведите сообщение no input receivedи завершите выполнение / возврат.

Входные данные должны быть из stdin(консоли) или эквивалентными, а не аргументами функции или программы, однако выходные данные могут быть либо для stdoutвозвращаемого значения вашей функции, либо для любого другого принятого метода вывода.

Вы можете запросить любой объем ввода, это может быть один символ, строка, слово или любой другой метод, самый короткий на вашем языке, если он ожидает хотя бы один символ.

Вы должны выводить, как только вход получен, а не через 10 секунд.

По истечении 10 секунд вы должны закончить, вы не можете продолжать ждать ввода послеno input received как был напечатан.

Вы можете предположить, что ввод не прошел за 10 секунд до того, как текст был напечатан на экране, так как это очень маленькое окно. Вы также можете предположить, что встроенный эквивалент вашего языка sleepпоследовательно, абсолютно совершенен.

Это , побеждает меньше байтов!


6
+1 только за приятное прикосновение, чтобы не дать языкам игры в гольф использовать их словарь. О, и большой вызов тоже.
Адам

1
@ Adám, если у вашего языка нет встроенного чтения с тайм-аутом, я думаю, что единственный хороший способ сделать это - магия OS / Thread, которую большинство языков игры в гольф все равно не могут сделать.
Павел

Теперь я должен переписать свою программу. Был почти готов к публикации ... ;-)
Adám

1
@TheLethalCoder Вы можете предположить, что sleepфункции вашего языка полностью соответствуют 100% времени.
Павел

1
@Lembik Ну вот, ответ Python.
Павел

Ответы:


24

Баш, 38 байт

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

При этом используется -tопция (timeout) для bash read, что приводит к сбою и возврату ненулевого кода выхода, если в течение указанного количества секунд не было введено никаких данных.


6
Предполагается сказать «(нет) input rec ie ved», что существенно затрудняет языки игры в гольф с помощью словарей.
Адам

8
@ Adám На самом деле это опечатка
Павел

7
@ Феникс Нееееет!
Адам

1
Почему a = нет, то $ a? есть ли цель? РЕДАКТИРОВАТЬ Я получил это, я не прочитал вопрос должным образом
Феликс Го

12

Haskell, 97 89 байт

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

Если timeoutвремя ожидания возвращается, Nothingи Just Char( Charпотому что мы используем getChar) в противном случае. Это возвращаемое значение преобразуется в "no "или ""функцией maybe "no " mempty. Добавить "input received"и распечатать.

Редактировать: @BMO предложил maybeи сохранил несколько байтов.


Кажется, не работает правильно в GHCI.
maple_shaft

@maple_shaft: В ghci вы должны связать gс let:, let g Nothing="no ";g _=""тогда вызов функции timeout....у меня работает нормально.
Ними

1
Вы можете заменить его gна maybe"no "(pure"")более короткий и даже встроенный - сэкономив вам 6 байт.
მოიმო

@BMO: Хорошо! memptyа (pure"")не еще короче.
Ними

Очень мило, это действительно умно!
მოიმო

11

POSIX C99, 71 63 байта

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

Так pollкак в случае успеха вернет 1, мы умножим результат на 3 и переместим строку соответственно. Затем мы используем тот факт, что struct pollfdимеет следующий макет:

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

и что STDIN_FILENOэто 0, POLLINявляется1 заменить pfdс int pfd[] = {0,1}, что мы , наконец , сделать соединение litteral (как разрешено C99).


3
Необходимо указать, что это предназначается для POSIX, поскольку poll.hзаголовок не является частью языкового стандарта C99.
Коди Грей

8

Applescript, 113

Applescript на самом деле не читает из STDIN. Надеюсь, что display dialogприемлемо здесь:

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

6

APL (Дьялог) , 41 40 байт

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

Это анонимная молчаливая функция, для запуска которой требуется фиктивный аргумент .

'no input received' полная строка

↓⍨ отбросить столько символов с начала, сколько было возвращено

{ явная анонимная функция ( обозначает аргумент)

⎕RTL←10 установить R esponse T IME L IMIT до десяти секунд

3*⍨ возведите это число (десять) до степени три (тысяча означает «все»)

:: за этими исключениями (все),

  0 вернуть 0

 пытаться:

   получить вход

  3⊣ откажитесь от этого и вместо этого верните 3

}конец функции (обратите внимание, что аргумент никогда не упоминался)


6

Perl , 74 67 байт

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

Старая версия

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

(Запустить через perl -M5.10.1 ...)


Конечный перевод строки не требуется, поэтому вы можете сократить \n.
Павел

3
Добро пожаловать в PPCG!
Павел

На самом деле вам не нужно -M5.10.1. Вы можете просто заменить -eна -E. (если вам нужно -M5.10.1, вам придется добавить штраф к вашему счету)
Брэд Гилберт b2gills

@Phoenix, \nэто происходит из-за dieповедения: «Если последний элемент LIST не заканчивается новой строкой, текущий номер скрипта и номер строки ввода (если есть) также выводятся на печать, и предоставляется новая строка». Таким образом, без него будет отображаться «вход не получен в строке -e 1». Но, конечно, это может быть буквальный разрыв строки в строке. Кроме того, пространство междуdie и sayи их параметры не нужны. То же самое для финала ;. И <>достаточно прочитать со стандартного ввода.
Манатворк

1
Если вы evalчитаете из STDIN, вы можете избежать необходимости dieсообщения. На самом деле, ошибка во время выполнения работ точно так же: $SIG{ALRM}=sub{&0};alarm 10;say'no 'x!eval'<>','input received'.
прима

6

Perl 6 ,  72  66 байт

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

Попробуй без ввода
Попробуй с вводом

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

Попробуй без ввода
Попробуй с вводом

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
«мой ess - вход получен - обещайте через 10, затем скажите« нет ess »и выйдите или получите« ess »»
кошка,

Вы можете удалить пространство между startи {?
Павел

@Phoenix Это было бы проанализировано как ассоциативное индексирование для переменной без имени start, так что нет.
Брэд Гилберт b2gills

Ваши ссылки TIO, кажется, больше не работают.
Павел

@Pavel, Исправлено, просто нужно было сделать фиктивный тестовый класс подтипом IO :: Handle и вызвать .newего
Брэд Гилберт b2gills

5

C #, 180 171 148 131 байт

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

Сохранено 17 байт благодаря @VisualMelon.

Полная / Отформатированная версия:

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

Почему namespaceи не usingдиректива?
Павел

@Phoenix им в любом случае понадобится пространство имен, чтобы они сохранили все байтыusing
LiefdeWen

Почему вы сохранили важную часть как Действие и выполнили ее впоследствии? Я не могу видеть вопрос, определяющий это.
Снежный огонь

1
Можно сэкономить немного, используя возвращаемое значение из Thread.Join(int)(избавиться от cпотерянных скобок и т. Д. И т. Д.): var t=new System.Threading.Thread(()=>System.Console.ReadKey());t.Start();return(t.Join(10000)?"":"no ")+"input recieved";(Похоже, VB.NET уже делает это)
VisualMelon

1
@TaylorScott Я могу сделать, 1e4но это doubleи мне нужно, intпоэтому мне нужно сделать (int)1e4:( Хорошая идея, хотя
TheLethalCoder

5

TI-BASIC, 84 77 байтов

-7 благодаря @ 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

Ожидание, пока не будет нажата цифра.

Я пытаюсь понять, как играть в гольф {72,73,74,82,83,84,92,93,94}. Это занимает много места.


Если вы хотите подождать только любую клавишу, то Repeat K or 10=checkTmr(Tсделайте.
BB94

Кроме того, последние 4 строки могут быть сокращены до:4-3not(K:sub("NO INPUT RECEIVED",Ans,18-Ans
bb94

1
@ bb94 Я действительно не хочу ждать какой-либо клавиши, поскольку не все из них на самом деле вводят символ. Это все равно что ждать Shiftключ на компьютере. Кроме того, сокращение последних 4 строк с помощью вашего метода фактически дает тот же счетчик байтов, что и мой. Мне нравится ваш метод, хотя.
Скотт Милнер

Вы можете проверить любой ключ, который не является 21 или 31.
bb94

После orв вашем повторном утверждении используйте это вместо -7 байтов:abs(int(.1K)-8)≤1 and 1≥abs(3-10fPart(.1K
kamoroso94

4

NodeJS, 105 103 101 байт

-2 байта благодаря @apsillers
-2 байта при переходе console.log()вexit()

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

Запустите, сохранив файл и запустив его с узлом, или запустите его прямо из командной строки, выполнив node -e "<code>"


@apsillers Да, хороший улов.
Джастин Маринер

@apsillers Я собирался снова редактировать, чтобы переместить console.log()вызов в параметр exit(). Сейчас на два меньше.
Джастин Маринер

4

JavaScript (ES6) + HTML, 86 84 82 79 + 11 = 97 95 93 90 байт

setTimeout(oninput=_=>i.remove(alert(`${i.value?"":"no "}input received`)),1e4)
<input id=i
  • 2 байта сохранены благодаря апсиллерам, указывающим, что я тупой!

Попытайся

Требуется закрытие >на inputдля работы в сниппет.

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


1e5 - 100 000 или 100 секунд, 1e4 - 10 секунд
PunPun1000

К сожалению! Хорошо заметили, спасибо, @ PunPun1000
Shaggy

Не было бы короче, чтобы написать 10вместо 1e4?
musicman523

@ musicman523, 10было бы 10 миллисекунд, задача вызова конкретно говорит 10 секунд , что составляет 10000 миллисекунд, следовательно 1e4.
Лохматый

Мой плохой, забыл это, 10 != 1e4потому что я дурак
musicman523

3

VB.Net - 174 байта

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


3
Я не уверен, в чем преимущество объединения линий :. Это занимает то же количество байтов, что и разрыв строки, так что это только снижает читаемость без улучшения результата игры в гольф.
Коди Грей

@CodyGray Я полагаю, что :подстановка разрыва строки может быть такой, что шаговый вызов может быть объявлен встроенным без повторения - но, тем не менее, я не уверен, мой основной язык - VBA, который не поддерживает многопоточность или чтение из консоли <strike> < / strike> непосредственное вспомогательное окно во время определения функции или вызова: P
Тейлор Скотт

3

Go, 149 байт

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 байт

Blauhirn спас 2 байта

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

AHK имеет встроенный тайм-аут для полей ввода.
Я попытался стать умным и использовать !oвместо, ErrorLevelно это не получится, если пользователь введет значение Фальси.
Почти половина ответа - это только названия команд и фиксированный текст.


1
Для чего все запятые?
Павел

@Phoenix Вероятно, исключение аргументов для InputBox
Adám

@Phoenix Timeout- почти последний параметр:InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]
Инженер Тост

на две буквы короче:s:=errorLevel?"no ":
phil294

@Blauhirn Gah! Я идиот. Спасибо.
Тост инженера

3

Python3, 100 89 83 71 байт

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

Сначала попробуйте в гольф.

-4 за any(), -7 за нарезку, спасибо @ user2357112!

-6, получить select()от ptyвместо select.


Вы можете вырезать некоторые байты пути нарезки "no input received"строки: "no input received"[3*bool(...):].
user2357112 поддерживает Monica

Вы также можете использовать any(...)вместо bool(...[0]).
user2357112 поддерживает Monica

-Новый пользователь: «в Windows выдает ModuleNotFoundError: нет модуля с именем« termios »»
FantaC

ptyМодуль доступен только на платформах Линукса, но я только использовать его , потому что его имя коротко , и это делает selectдоступно. Версия 2, вероятно, лучше работает на Windows.
Сет


3

Python 3, 158 байт

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)

Я попытался запустить ответ Сета на Python 3, но в Windows он выдаетModuleNotFoundError: No module named 'termios' , и, поскольку я не могу прокомментировать его ответ об этом, я решил вместо этого найти решение, которое должно быть независимым от платформы.

Я впервые играю в гольф, поэтому уверен, что это можно улучшить.


2
Добро пожаловать в PPCG!
Steadybox


2

SmileBASIC 3, 74 байта

«Принимает ввод», ожидая любого нажатия кнопки (которое должно учитываться как ввод).

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

Вывод должен быть «(нет) вход получен», а не «ВХОД (НЕ) ПОЛУЧЕН»
Павел

2

Царапина 2 / 3.х, 41 балл ( Пояснение )

Нетерпеливый таймер

1: когда GF нажал

1: спросите [] и подождите

1 + 14 символов: скажем [вход получен]

1: остановка [все v] (примечание: так как «все» было настройкой по умолчанию, я посчитал блок как 1)

1 + 2 цифры: ждать (10) секунд

1 + 17 символов: говорят [вход не получен]

1: остановить [все v]


Добро пожаловать в PCG!
Рахул Бхарадвад

1

> <> , 43 + 6 = 49 байт

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

Попробуйте онлайн!

+5 для -t.08флага, который устанавливает отметку в 0,08 секунды, и +1 дляa флага, который считает пробелы и пропущенные инструкции в виде отметок.

Программа проверяет ввод примерно раз в секунду и выходит из цикла, если вход обнаружен. Если вход не получен, он выходит из цикла снизу, добавляя noк началу строки. Начальный/ необходимо убедиться, что последняя проверка на вход точно находится на отметке 10 секунд.

Затем на печать самой строки уходит около 5-6 секунд.


Вы можете использовать один флаг, -at.08чтобы сохранить байт.
Павел

@Pavel, спасибо!
Джо Кинг

1

Java 1.4+, 284 байта

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

Пожалуйста, не предлагайте улучшения Java для конкретной версии, это общий ответ Java, который работает во всех в настоящее время стабильных средах Java (1.4 и выше).


Очень чертовски многословно ... Требуется улов, не могу его бросить. Системный импорт сбрасывает, как 5 байт ... Перегрузка также многословна, так что в итоге получается грязный, плохо выглядящий гольф.


Должно ли это быть 10000Lи нет 10000? Я думал, что целые автоматически преобразуются в длинные.
Павел

1

Юлия 0,6 , 78 байт

Дольше, чем я ожидал. См. Комментарии для ссылки "TIO не получен".

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

Попробуйте онлайн!


1
Он не блокируется на TIO, потому что он читает из файла. Это поражает EOF и заканчивается немедленно. Если вы передадите процесс, который никогда не генерирует символы новой строки, в программу на TIO, он заблокирует: tio.run/##JcqxDoIwEIDhvU9x6ULPCNXFxejk4uIiowvaSzgDLekVReO7V4Pb/…
Павел

0

SmileBASIC, 74 73 байта

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

Принимает 1 символ ввода.

И 39-байтовое решение, которое, вероятно, недопустимо (на самом деле не принимает ввод текста, просто есть OKкнопка, которую вы можете нажать)

?"no "*!DIALOG("",,,10);"input received
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.