Настаивайте на ответе

31

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

Псевдокод 1

myform = new form("GUI")
myform.mytxt = new editfield("")
myform.ok = new button("OK")
repeat
  waitfor(myform.ok,"click")
until myform.mytxt.content <> ""

Псевдокод 2

LET TEXT = ""
WHILE TEXT = "" DO
  TEXT = PROMPT("")
ENDWHILE

Пример 1

Программа запускается и сразу же всплывает форма с одним текстовым полем и OKкнопкой.
Пользователь нажимает OKкнопку.
Ничего не произошло.
Пользователь вставляет «Hello World» в текстовое поле и нажимает OKкнопку.
Программа заканчивается.

Пример 2

Функция вызывается и сразу отображает пустую строку и мигающий курсор.
Пользователь нажимает Enter.
Курсор перемещается вниз на одну строку.
Пользователь нажимает Enter.
Курсор перемещается вниз на одну строку.
Пользователь нажимает PPCGEnter
Функция возвращается.

Адам
источник
Можно ли считать пустые строки только пробелами?
12431234123412341234123
@ 12431234123412341234123 Нет.
Адам
Нужно ли ждать полной строки, как только пользователь начнет вводить данные?
Маттео Италия
Хорошо, из комментария в удаленном ответе @ CodyGray кажется, что это не разрешено.
Matteo Italia
@MatteoItalia Да, правильно; строка ввода .
Адам

Ответы:

16

TI-BASIC, 2 байта

:Prompt X

TI-BASIC делает это автоматически. Как только ввод дан, он выйдет.

Вот GIF:

введите описание изображения здесь

Посмотрите счет на enterключ в истории нажатия клавиш. Создано с помощью TI-SmartView CE и ezgif.com .

Скотт Милнер
источник
1
Хм .. это 2 байта?
Geeky я
9
TI-BASIC основан на токене .
Скотт Милнер
И это не примет Enter для ответа? Есть ли где-нибудь, чтобы проверить это онлайн?
Адам
@ Adám Для ответа не потребуется ввод. Насколько мне известно, нет места, куда вы могли бы зайти в Интернет, не имея уже образа TI ROM. Я могу опубликовать GIF, когда я вернусь домой, хотя.
Скотт Милнер
1
@ Adám Запрещено тестировать TI-BASIC онлайн, не имея собственного ПЗУ.
Эрик Outgolfer
15

Сед, 4

/./q

Ожидает строку ввода, содержащую 1 или более символов, затем завершается.

Попробуйте онлайн . Но лучше работает на живой оболочке:

sed '/./q'
Цифровая травма
источник
15

JavaScript, 37 22 17 байт

while(!prompt());

while(!prompt());

объяснение

whileКлючевое слово начинает whileцикл. В состоянии цикла !prompt()запрашивает ввод и проверяет, задан он или нет. Если он не задан, выполняется тело цикла, которое в нашем случае пусто, тогда интерпретатор возвращается к состоянию цикла. Один и тот же процесс происходит снова и снова, пока пользователь не введет данные.

Арджун
источник
while(""==prompt(""));
Адам
@ Адам Вау. Я просто думал о том, как сделать решение меньше, а вы придумали ответ, спасибо!
Арджун,
Это казалось очевидным. Тем не менее, моя консоль браузера отказывается выполнять без завершающего ;, в то время как ваше первоначальное выражение работало нормально без ;. Есть идеи почему?
Адам
Нет, Хром. Поэтому, если какой-либо движок JavaScript может справиться с пропуском текущего выражения ;, вы можете сохранить этот байт :-)
Adám
1
@ Adám Просто выяснил реальную причину ошибки, возникшей после удаления точки с запятой из исходного кода. Причина, по которой это происходит, заключается в том, что цикл while ожидает оператор (или группу операторов) в качестве тела цикла после условия цикла. Добавление точки с запятой заставляет думать, что тело цикла закончено. Однако удаление точки с запятой заставляет ожидать следующего оператора в качестве тела цикла. Но в нашем случае после условия цикла новые операторы не появляются. Итак, выдает ошибку. Надеюсь теперь понятно. Я ужасен в объяснении вещей !! : p
Арджун
9

Java, 55 байт

void f()throws Exception{while(System.in.read()==10);}}

Если я правильно помню (я давно работал с PPCG), моя программа может быть просто функцией.

Это зависит от системы; он работает только в системах, где символ конца строки представляет собой один символ новой строки. Если в конце-линии символ вместо возврата каретки, замените 10с 13. В Windows это не работает, как в конце строки в Windows \r\n.

Это использует тот факт, что я могу читать прямо с System.in.

Джастин
источник
2
Добро пожаловать, если бы только этот ответ! : D
Конор О'Брайен
3
С возвращением @Justin!
Цифровая травма
1
Не планирую быть активным; просто заскочил за вопросом тут и там
Джастин
Чтобы избежать проблемы «не работает в Windows», не могли бы вы просто протестировать первый символ и посмотреть, если это так \r, в отличие от тестирования всей строки, а затем столкнуться с проблемами с наличием 2 символов EOL?
Коди Грей,
@CodyGray Нет. Я читаю 1 символ за раз; это все, что System.inвы сделаете напрямую (ну, вы можете читать массив символов одновременно). Мое тело цикла (пустое) запускается для каждого символа на входе
Джастин,
9

HTML5, 33 22 байта

<form><input required>

<form><input required>

объяснение

requiredАтрибут на <input>заставляет браузер , чтобы сообщить пользователю «это поле требуется» -sort-оф-сообщений, если они не входят в стоимость. Однако, когда они вводят значение, оно отправляется на URL-адрес actionатрибута <form>(который в нашем случае является самим текущим файлом, поскольку мы не указали никакого значения явно).

Это было проверено на последней версии Google Chrome (версия 55.0). Может работать в других браузерах и версиях.

Арджун
источник
action=/может работать в некоторых браузерах.
Нил
1
Вы, вероятно, могли бы полностью отказаться от этого actionатрибута.
Лохматый
1
@Arjun action=y.pне является необходимым, так как большинство пользователей Агенты будут представлять в том же месте , если не actionбудет specificed
MayorMonty
@Arjun Я попробовал <form><input required>последнюю версию Google Chrome и работает как задумано. И если вы настроены скептически, просто используйте action=#. Это экономит 2 байта.
Исмаэль Мигель
3
@Arjun Это ужасная идея для игры в гольф кода. Я не могу сказать о каждом браузере, так как у меня нет Android 1.0, 1.6, 2.0, 2.1, 3.0, 3.1, 4.xx, 5.x, 6.x, ..., iPhone 2 - 7, каждый выпуск Google Chrome, Firefox 3.0+ и т. д. и т. д. На самом деле, не все браузеры HTML5 реализуют этот requiredатрибут! Кроме того, #путь доступен с HTML 1.0, если я правильно. И добавление «нет» actionк вашей форме аналогично добавлению action="."самого файла.
Исмаэль Мигель
8

Желе , 3 байта

ɠṆ¿

Боюсь, на TIO особо не на что смотреть.

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

Как это работает

Это ниладная программа, то есть она не принимает входных аргументов. В этом случае неявный аргумент и возвращаемое значение равны 0 .

¿(while) - это быстрое, которое извлекает две ссылки из стека ссылок: условие ( ) и тело.

является монадическим атомом: плоское логическое НЕ. Если предыдущим возвращаемым значением является ложь (здесь 0 или пустая строка), возвращается 1 и вызывается тело.

ɠявляется ниладическим атомом; он читает необработанную строку из STDIN и возвращает результат.

Как только ɠчитает непустую строку, возвращает 0 и мы вырываемся из цикла.

Деннис
источник
Так быстро, а? Ах хорошо.
Адам
6

брейкфук , 26 байт

+[>,----------[[-]<[-]>]<]

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

Дрянная Монахиня
источник
1
Эта ссылка TIO хороша и хороша, но немного сложно сказать, что происходит при запуске… ;-)
Adám
1
@ Adám вы можете добавить ,.до конца, чтобы проверить.
Утренняя монахиня
5

Perl 5, 8 + 1 (-p или -n flag) байт

/./&&die

Принимает ввод из stdin и умирает, как только регулярное выражение соответствует чему-либо, кроме новой строки.

Крис
источник
5

C, 52 байта , 33 байта , 29 байтов

-19 байт благодаря Джастину

-4 байта благодаря Кристофу

main(){while(getchar()==10);}

10 равно '\ n' - если это не очевидно.

Skynet
источник
1
Вы можете ;{}
Джастин
1
Хотя это и не соответствует стандартам, вы можете удалить , #include<stdio.h>если вы переключитесь на while(getchar()==10): int main(){while(getchar()==10);}.
Джастин
2
@Justin main(){while(getchar()==10);}достаточно без необходимости по умолчанию int.
Кристоф
1
main(){scanf("%s");}также будет работать, если только пробелы будут считаться пустыми.
12431234123412341234123
1
@DanielEarwicker Вы правы. Это не казалось мне ясным в первый раз, когда я прочитал вопрос, но теперь я понимаю, что вы говорите. В этом случае есть много несоответствующих ответов на этот вопрос.
Джастин
5

Bash, 51 байт (39 без "#! / Bin / bash")

Я впервые участвую в PPCG, так что не хамите; D

#!/bin/bash
read a
while [ -z "$a" ]
do
read a
done
Николя Фишер
источник
1
Добро пожаловать в PPCG.
Адам
3
Добро пожаловать в PPCG !, если вы планируете использовать Bash в качестве языка игры в гольф, вы можете найти это сообщение Интересно, у него есть несколько советов по созданию программ bash настолько маленьких, насколько это возможно, есть также более общая версия, которую вы, возможно, захотите проскользнуть тоже.
Colsw
@ConnorLSW Ух, спасибо, что Post очень мне поможет. Я постараюсь отредактировать свой ответ с помощью этих новых советов как можно скорее.
Николас Фишер
4
вам не нужно#!/bin/bash
12431234123412341234123
Ну, и в первый раз для меня :) Но вы могли бы , возможно , использовать рекурсию: [ -z `line` ] && $0или если осуждается lineне на вашей системе: [ -z `head -n1` ] && $0. Это должно быть 20 или 24 байта.
Йети
4

Java , 128 126 байт

2 байта благодаря Кевину Круйссену.

import java.util.*;class a{public static void main(String[]a){for(Scanner s=new Scanner(System.in);s.nextLine().isEmpty(););}}

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

Дрянная Монахиня
источник
1
Вы можете сыграть в гольф двумя байтами: измените на whilea forи поместите в Scanner s=new Scanner(System.in);него. И изменить .equals("")к .isEmpty().
Кевин Круйссен
Я почти уверен, что вы можете удалить импорт, если вы используете сканер; почти наверняка утечка сканера работает просто отлично:while(new java.util.Scanner(System.in).nextLine().isEmpty());
Джастин,
4

C # (.NET Core) , 66 байт

class C{static void Main(){for(;System.Console.ReadLine()!="";);}}

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

-6 байт благодаря разнагул.

Павел
источник
1
Вы можете сохранить 6 байтов, написав System.Console.ReadLIneнапрямую и usingсбросив -Statement.
Разнагул
whileПетля будет таким же количеством байт, но мне кажется более идиоматическим способом написания кода , чем forцикл.
Коди Грей,
Вы можете сэкономить 24 байта, записав его в виде лямбды в виде () => {}
Цешион,
или, альтернативно, 7, сделав его методом экземпляра
Ceshion
4

QBasic 4.5, 15 байт

INPUT a$:IF a$=""THEN RUN

Запрашивает ввод, а затем проверяет, если таковые были даны. Если нет, RUNперезапускает программу.

steenbergh
источник
2
Не знал о RUN. +1. (Это тоже рифмуется; беги и плюс один :))
Арджун,
4

Рубин, 13 байт

gets until/./

Я хотел getsбы принять аргумент Regexp.

histocrat
источник
4

R, 27 24 23 22 байта

while(!sum(scan()^0))t

Принимает ввод от stdin и повторяется до тех пор, пока ввод имеет длину 0. Отрежьте несколько байтов из-за Jarko Dubbeldam и MickyT. Заменено {}с , tчтобы сохранить другие байты.

rturnbull
источник
Я думаю, что вы можете опустить ,'', поскольку ни вход (строковый или числовой), ни способ завершения не был указан в вызове.
JAD
@JarkoDubbeldam: хороший улов! Я не осознавал, что ошибки были действительным завершением.
rturnbull
будет while(!sum(scan()^0)){}работать так же?
MickyT
@MickyT Кажется, работает. Видимо даже Inf ^ 0 равен 1. Отличный улов с sum(). Жаль, что ^0это необходимо обрабатывать 0как входные данные.
JAD
@ MickyT Это отличная находка с использованием sum, спасибо! Я обновил ответ.
rturnbull
3

PHP, 18 байт

while(!readline())
Skynet
источник
Проверяет ли это, что строка текста не пуста?
Дэниел Эрвикер
1
Да, как только строка не пуста, readline()возвращается что-то еще, кроме пустой строки. Непустые строки оцениваются trueв php - по крайней мере, большинство из них. «0» кажется исключением, как я только что прочитал в документации. Ну, я думаю, мой ответ сейчас неправильный.
Skynet,
3

AWK , 8 11 байт

NF{exit}

Ждите ввода. Если количество полей на входе больше 0, выйдите.

РЕДАКТИРОВАТЬ:

Я только что понял, что это не работает для ввода, содержащего только пробельные символы. IFS должен быть установлен на пустую строку, используя параметр -F ""командной строки. Поэтому +3 байта.

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

Максим Михайлов
источник
На самом деле, вы можете заменить NFна 1. Тогда вам не нужно устанавливать IFS. И ворчать, ты избил меня и AWKрешил.
Роберт Бенсон,
1
@RobertBenson Я пытался заменить NFна 1. В этом случае программа завершает работу с любым вводом, включая пустой перевод строки.
Максим Михайлов
Я пропустил эту часть спецификации.
Роберт Бенсон
3

SpecBAS - 34 байта

1 DO : INPUT a$: LOOP UNTIL a$<>""

Просто циклы, пока не введена непустая строка.

Брайан
источник
3

Mathematica, 26 20 байтов

For[,Input[]==Null,]
Симмонс
источник
1
Сбрей шесть байт с For[,Input[]==Null,]. Работает так же хорошо.
Келли Лоудер
3

Haskell, 19 17 байт

f=do""<-getLine;f

Определяет функцию, fкоторая, если она читает пустую строку, снова вызывает себя. При чтении непустой строки возникает исключение и рекурсия останавливается.

Редактировать: @Laikoni заменил параметр на соответствие шаблону и сохранил 2 байта. Благодарность!

Ними
источник
Не думал, что код ввода-вывода на Haskell может быть таким коротким, как этот!
Гики я
17 байтов:f=do""<-getLine;f
Лайкони
@Laikoni: хороший улов. Благодарность!
Ними
3

Ацето , 9 5 4 байта

rпрочитайте значение, отмените его ( !; неявно приведите к логическому значению) и отразите по горизонтали, если значение - truey ( |).

!
r|
L3viathan
источник
Подождите, Aceto бежит ** вверх **‽ И они говорят, что APL странно для бега справа налево ...
Адам
3
@ Adám Aceto проходит по двумерной кривой Гильберта.
L3viathan
3

Java, 66 64 60 байт

int a(){return!System.console().readLine().isEmpty()?0:a();}

Мой первый ответ на Java, хотелось бы несколько советов!

OldBunny2800
источник
Вы можете удалить пробел между returnи !. .equals("")== .isEmpty(). Вы можете вернуть int вместо String. OTOH, вернуть недействительным, но либо while(System...)илиif(System...)a();
Джастин
можно сделать int a(){..?0:a();}, экономит 3 байта
Khaled.K
@ Khaled.K на самом деле 4!
OldBunny2800
@Justin и Khaled.K, спасибо за ваш совет!
OldBunny2800
2

Braingolf , 8 байт [не конкурирует]

1[{?:+|]

Не конкурирующий, потому что {, который читает входные данные из STDIN, был добавлен в braingolf после даты публикации этого испытания.

Объяснение:

1         Pushes 1 to the stack
 [        Begins while loop
  {       Reads from STDIN, returns -1 if no input given
   ?      Checks if last item in stack is > 0
    :     Else
     +    Adds the last 2 items together, however there is only 1 item, so add it to itself
      |   Endif
       ]  End While, decrement first item in stack, or exit if first item is 0
Skidsdev
источник
Ха - ха, вы реализуете ввод информации часа после того, как вызов был отправлен
ASCII-только
@ ASCII-только должен был сделать это в конце концов, ха-ха
Skidsdev
2

05AB1E , 5 байтов

[IõÊ#

Объяснение:

[     Start infinite loop
 I    One line of input
   Ê  Not equal to
  õ   Empty string
    # Break if true

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

Okx
источник
Это 5 кодовых точек Unicode, а не 5 байтов; они составляют 7 байтов в UTF-8, 10 байтов в UTF-16 или 20 байтов в UTF-32.
Matteo Italia
@MatteoItalia 05AB1E использует свою собственную кодировку , поэтому каждый из этих символов занимает 1 байт.
Okx
Извините, я исправлюсь!
Matteo Italia
2

PowerShell, 20 байт

for(;!(read-host)){}

запускает цикл,

read-host запрашивает ввод

если read-host ничего не возвращает, он превращается в false, поэтому мы инвертируем это !(...)и используем в качестве проверки окончания цикла.

намного короче, чем любое do{$a=read-host}while($a-eq"")решение типа с участием переменных.

colsw
источник
2

Swift, 22 байта

while readLine()==""{}
Калеб Клеветер
источник
2

CJam , 5 байтов

{l!}g

Попробуйте онлайн! (TIO на самом деле не показывает правильное поведение)

объяснение

{      e# Do:
 l     e#  Read next line of input
  !    e#  Boolean negate (empty strings are falsy)
   }g  e# Pop the top of stack, if truthy, repeat.
Бизнес Кот
источник