Подождите ... что я собирался сказать снова?

10

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

Требования:

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

Ноты:

  • Ввод никогда не будет пустым, если нет сохраненных вопросов.

Пояснение: программе не нужно хранить несколько вопросов. Первоначально я хотел, чтобы он хранился несколько раз, но я изменил его после того, как многие люди неправильно поняли вопрос.

Помните, это , поэтому выигрывает код с наименьшим количеством байтов.

Оливер Ни
источник
Вы имели в виду «ранее сохраненный вопрос»? Я нахожу «последний сохраненный вопрос» запутанным, поскольку он предполагает, что вы можете хранить более одного вопроса.
Нил
1
@Neil Предполагается, что в нем будет храниться более одного вопроса, но поскольку многие ответы уже неправильно поняли вопрос, я просто оставлю это так.
Оливер Ни

Ответы:

10

Perl 13 17 14 +1 = 15 байт

/./?$;=$_:say$

+1 за -nфлаг (сэкономлено 4 байта благодаря @Dada)

Пока ввод не равен возврату каретки, он сохраняет вход в $;. Если он равен возврату каретки, он печатает то, что уже есть $;.

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

Габриэль Бенами
источник
Вы, вероятно, хотели написать neвместо eq(сейчас это не работает).
Дада
1
Вы можете сохранить три байта, выполнив /./вместо $/ne$_;-)
Dada
8

05AB1E, 12 11 10 байт

Спасибо @daHugLenny и @Adnan за 1 байт!
Спасибо @Emigna за 1 байт!

[IDõQiX,ëU
Оливер Ни
источник
1
Я не могу проверить сейчас, но я думаю, что вы можете удалить последний символ.
Акролит
1
Да, вы можете удалить последнюю скобку (она будет заполнена автоматически).
Аднан
2
Если вы замените ®и ©на Xи U, вам не понадобится обратный слеш.
Эминья
4

Haskell, 49 байтов

g s=getLine>>=(#s)
""#s=putStr s>>g s
l#s=g l
g""

Как это работает: начните с g "". Параметром sфункции gявляется вопрос в магазине. gчитает следующую строку из stdin и передает ее (а также s) в #. Если строка пуста, #печатает магазин и gснова звонит . Если строка не пустая, gвызывается со строкой в ​​качестве нового хранилища.

Ними
источник
3

JavaScript, 36 34 31 байт

for(;;b?a=b:alert(a))b=prompt()

Бесконечный цикл постоянно запрашивает ввод и сохраняет его в b. Если входное значение не пустое, оно затем сохраняется, в aпротивном случае aпечатается значение.

Сохранено 2 байта благодаря @ETHproductions

Ориоль
источник
Хороший ответ. Вы можете сохранить байт, удалив 1, и другой, перейдя b?a=b:alert(a)в последний раздел цикла for (то есть for(a=0;;b?a=b:alert(a))b=prompt())
ETHproductions
На самом деле a=0не нужно ни. Поскольку входные данные могут быть пустыми только при наличии сохраненных вопросов, на них aне будут ссылаться, если они не были назначены.
Oriol
также останавливает браузер на несколько секунд с помощью firefox-49.0.2
bunyaCloven
1
Единственное требование в вашем вопросе - пустой ввод печатает последний сохраненный вопрос. Почему вы хотите, чтобы я держал ссылки на ранее сохраненные вопросы?
Oriol
1
@bunyaCloven Для меня это только останавливает браузер, когда я говорю ему блокировать диалоги. Это ожидается из-за бесконечного цикла. Через несколько секунд браузер обнаруживает проблему и убивает JS.
Oriol
2

Mathematica, 44 байта

If[(b=InputString[])=="",Print@a,a=b]~Do~∞

Полная программа. Символ Unicode имеет значение U + 221E INFINITY для \[Infinity].

LegionMammal978
источник
2

Python 3, 31 байт

while 1: I=input()or I;print(I)

Попробуйте!

-1 байт благодаря Flp.Tkc

GamrCorps
источник
1
Вы можете написать это в то время как цикл в 1 строке
FlipTack
1

сетчатый, 12 байтов

id""E[$dp]~*

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

объяснение

id""E[$dp]~*
i             take a line of input     [input]
 d""E         push equality with ""    [input, input == ""]
     [$dp]    push that func           [input, input == "", [$p]]
         ~*   execute it iff equal
              on equal:
      $       drop empty input
       dp     duplicate then print the TOS
              this wraps around to the beginning, taking another line of input
Конор О'Брайен
источник
1

Python3 - 49 байт

s=""
while 1:
 b=input()
 if b:s=b
 else:print(s)
Yytsi
источник
1
NameError: name 'b' is not defined
shooqie
@shooqie Ах, я набрал это с моим телефоном, поэтому я случайно пропустил b=input(). Спасибо!
Yytsi
1

Python 3, 34 байта

s=""
while[print(s)]:s=input()or s
синий
источник
Это не так? У меня это отлично работает
Blue
3
Спецификация не просит хранить несколько вопросов?
Синий
1

Python 3, 60 байт

q=[]
while 1:
 s=input()
 if''<s:q+=[s]
 else:print(q.pop())

источник
0

CMD, 37 байт

К сожалению set, не принимает пустой ввод :(

set/p a=
if %a%.=. echo b
set b=%a%
c

в именах файлов c.cmdили

set/p a=
if %a%.=. echo b
set b=%a%
%0

в любом файле. Рабочая (используйте -как пустую):

set/p a=
if %a%.=-. echo b
set b=%a%
c
Роман Греф
источник
set/pникогда не будет делать переменную пустой, поэтому по крайней мере вам нужно set a=в первой строке; Также я думаю, что вы имеете в виду set b=%a%.
Нил
0

APLX, 19 байт

a←⍞⋄→(0=⍴a)/1⋄a⋄→1

Объяснение:

⍝ Note: the ⋄ symbols are statement separators, so I've replaced them here with newlines

a←⍞           ⍝ get an input string (⍞) and store it in variable a
→(0=⍴a)/1     ⍝ if the length of a (⍴a) is 0, goto (→) the start of this program (1)
a             ⍝ else, print a
→1            ⍝ goto the start of the program (1)
жэнь
источник
0

C 73 63 байта

g(){char a[99],x;for(;;){gets(a);if(*a)x=*a;else*a=x,puts(a);}}

Только использует 1 буфер и один символ для обработки логики. Если пользователь ничего не вводит, только первый символ в буфере перезаписывается '\0', в этом случае он восстанавливается xи печатается, в противном случае скопируйте первую букву xдля последующего использования.

Предыдущий код:

main(){char a[99],b[99];for(;;){gets(a);if(*a)strcpy(b,a);else puts(b);}}
Карл Напф
источник
0

Ява 7, 189 187 178 байт ..

class M{public static void main(String[]a){String s="",x;do{x=new java.util.Scanner(System.in).nextLine();if(x.isEmpty())Syste‌​m.out.println(s);els‌​e s=x;}while(1>0);}}

-9 байтов, используя new java.util.Scannerнапрямую, благодаря @cliffroot .

Вероятно, в первый раз я использовал do-while в соревновании по Codegolf ..

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

Кевин Круйссен
источник
это немного короче и, кажется, работает -void c(){for(String s="",x;(x=new java.util.Scanner(System.in).nextLine())!=null;)if(x.isEmpty())System.out.println(s);else s=x;}
Cliffroot
@cliffroot Уммм .. ты не пропустил forили whileгде-нибудь? .. Что (x=new java.util.Scanner(System.in).nextLine())!=null;)?
Кевин Круйссен
1
Да, мне удалось как-то пропустить до этого :) Это должно было быть, void c(){for(String s="",x;for(x=new java.util.Scanner(System.in).nextLine())!=null;)if(x.isEmpty())System.out.println(s);else s=x;}и это на самом деле на 1 байт больше, чем версия с do-whileis -void c(){String s="",x;do{x=new java.util.Scanner(System.in).nextLine();if(x.isEmpty())System.out.println(s);else s=x;}while(1>0);}
cliffroot
@cliffroot Ну конечно .. спасибо!
Кевин Круйссен
0

sed, 10 байт

/./{x;d};g

Объяснение:

      (implicit at start of program) read input, overwriting old input
/./{  If the input is nonempty
  x;  swap the input with the hold space
  d   then restart, without any implicit printing of input
};    end if statement
g     Append the hold space to the [empty] input
      (implicit at end of program) print the input, then restart

Приятно видеть экзотерический (то есть "не эзотерический") язык, связанный с некоторыми языками игры в гольф!


источник