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


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



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)

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.