Tunggu ... apa yang akan saya katakan lagi?

10

Saya sering lupa apa yang ingin saya katakan ketika guru memanggil saya untuk berbicara. Bisakah Anda menjadikan saya alat untuk menyelesaikan ini?

Persyaratan:

  • Program harus mengulang sebagai berikut:
    • Pertama, ambil input
    • Jika input kosong, cetak pertanyaan terakhir yang disimpan.
    • Jika tidak, simpan input sebagai pertanyaan.

Catatan:

  • Masukan tidak akan pernah kosong jika tidak ada pertanyaan yang disimpan.

Klarifikasi: Program tidak perlu menyimpan banyak pertanyaan. Saya awalnya ingin menyimpan lebih dari satu, tetapi saya mengubahnya setelah banyak orang salah mengerti pertanyaan itu.

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.

Oliver Ni
sumber
Apakah maksud Anda "pertanyaan yang disimpan sebelumnya"? Saya menemukan "pertanyaan tersimpan terakhir" membingungkan karena menunjukkan Anda mungkin menyimpan lebih dari satu pertanyaan.
Neil
1
@Neil Seharusnya menyimpan lebih dari satu pertanyaan, tetapi karena banyak jawaban sudah salah paham, saya akan membiarkannya.
Oliver Ni

Jawaban:

10

Perl, 13 17 14 +1 = 15 byte

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

+1 untuk -nbendera (disimpan 4 byte berkat @Dada)

Selama input tidak sama dengan carriage return, ia menyimpan input $;. Jika sama dengan carriage return, ia mencetak apa yang sudah ada $;.

Ini mengasumsikan bahwa semua input dapat dicirikan sebagai pertanyaan, bahkan jika secara tata bahasa, mereka tidak seperti itu.

Gabriel Benamy
sumber
Anda mungkin ingin menulis, nebukan eq(sekarang ini tidak berfungsi).
Dada
1
Anda dapat menghemat tiga byte dengan melakukan /./alih - alih $/ne$_;-)
Dada
8

05AB1E, 12 11 10 byte

Terima kasih @daHugLenny dan @Adnan untuk 1 byte!
Terima kasih @Emigna untuk 1 byte!

[IDõQiX,ëU
Oliver Ni
sumber
1
Saya tidak dapat menguji sekarang, tetapi saya pikir Anda dapat menghapus karakter terakhir.
acrolith
1
Ya, Anda dapat menghapus braket terakhir (ini akan dilengkapi secara otomatis).
Adnan
2
Jika Anda mengganti ®dan ©dengan Xdan U, Anda tidak perlu garis miring terbalik.
Emigna
4

Haskell, 49 byte

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

Cara kerjanya: mulai dengan g "". Parameter sfungsi gadalah pertanyaan di toko. gmembaca baris berikutnya dari stdin dan meneruskannya (dan juga s) ke #. Jika saluran kosong, #cetak toko dan panggil glagi. Jika garis tidak kosong, gdisebut dengan garis sebagai toko baru.

nimi
sumber
3

JavaScript, 36 34 31 byte

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

Infinite loop terus meminta input dan menyimpannya di b. Jika inputnya tidak kosong, kemudian disimpan a, jika tidak, nilai adicetak.

Disimpan 2 byte berkat produk @ETH

Oriol
sumber
Jawaban bagus. Anda dapat menyimpan byte dengan menghapus 1, dan yang lain dengan pindah b?a=b:alert(a)ke bagian terakhir dalam for-loop (yaitu for(a=0;;b?a=b:alert(a))b=prompt())
ETHproduk
Bahkan a=0tidak perlu juga. Karena input hanya dapat kosong jika ada pertanyaan yang disimpan, atidak akan dirujuk jika belum ditetapkan.
Oriol
juga menghentikan browser selama beberapa detik dengan firefox-49.0.2
bunyaCloven
1
Satu-satunya persyaratan dalam pertanyaan Anda adalah input kosong mencetak pertanyaan terakhir yang disimpan. Mengapa Anda ingin saya menyimpan referensi untuk pertanyaan yang tersimpan sebelumnya?
Oriol
1
@bunyaCloven Bagi saya itu hanya menghentikan browser ketika saya mengatakannya untuk memblokir dialog. Itu diharapkan karena loop tak terbatas. Setelah beberapa detik browser mendeteksi masalah dan membunuh JS.
Oriol
2

Mathematica, 44 byte

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

Program lengkap. Karakter Unicode adalah U + 221E INFINITY untuk \[Infinity].

LegionMammal978
sumber
2

Python 3, 31 byte

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

Cobalah!

-1 byte terima kasih kepada Flp.Tkc

GamrCorps
sumber
1
Anda dapat menulisnya sambil loop pada 1 baris
FlipTack
1

reticular, 12 byte

id""E[$dp]~*

Cobalah online!

Penjelasan

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
Conor O'Brien
sumber
1

Pyke, 6 byte

z=z~zr

Coba di sini!

     r - while 1:
z      -   input() or z.contents
 =z    -  z.contents = ^
   ~z  -  z.contents
Biru
sumber
1

Python3 - 49 byte

s=""
while 1:
 b=input()
 if b:s=b
 else:print(s)
Yytsi
sumber
1
NameError: name 'b' is not defined
shooqie
@shooqie Ah, saya mengetik ini dengan ponsel saya jadi saya tidak sengaja meninggalkannya b=input(). Terima kasih!
Yytsi
1

Python 3, 34 byte

s=""
while[print(s)]:s=input()or s
Biru
sumber
Tidak? Ini berfungsi dengan baik untuk saya
Biru
3
Spek tidak meminta untuk menyimpan beberapa pertanyaan?
Biru
1

Python 3, 60 byte

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

sumber
0

CMD, 37 byte

Sayangnya settidak mengambil input kosong :(

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

dalam nama file c.cmdatau

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

dalam file apa pun. Bekerja (Gunakan -sebagai kosong):

set/p a=
if %a%.=-. echo b
set b=%a%
c
Roman Gräf
sumber
set/ptidak akan pernah membuat variabel kosong, jadi paling tidak Anda perlu set a=di baris pertama; juga saya pikir maksud Anda set b=%a%.
Neil
0

APLX, 19 byte

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

Penjelasan:

⍝ 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)
ren
sumber
0

C, 73 63 byte

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

Hanya menggunakan 1 buffer dan satu karakter untuk menangani logika. Jika pengguna tidak memasukkan apa pun, hanya karakter pertama dalam buffer yang ditimpa '\0', dalam hal ini akan dipulihkan xdan dicetak, jika tidak, salin huruf pertama ke dalam xuntuk digunakan nanti.

Kode sebelumnya:

main(){char a[99],b[99];for(;;){gets(a);if(*a)strcpy(b,a);else puts(b);}}
Karl Napf
sumber
0

Java 7, 189 187 178 byte ..

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 byte dengan menggunakan new java.util.Scannersecara langsung, terima kasih kepada @cliffroot .

Mungkin pertama kali saya menggunakan do-whiletantangan codegolf ..

Ketika fungsi diizinkan alih-alih program, 135 byte (masih banyak kali lebih banyak daripada sebagian besar jawaban lainnya ..)

Kevin Cruijssen
sumber
ini sedikit lebih pendek dan tampaknya berfungsi -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 Ummm .. bukankah kamu melewatkan foratau di whilesuatu tempat? .. Apa itu (x=new java.util.Scanner(System.in).nextLine())!=null;)?
Kevin Cruijssen
1
Ya, saya berhasil melewatkan sebelum itu entah bagaimana :) itu seharusnya 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;}dan itu sebenarnya 1 byte lebih lama dari versi dengan do-while-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 Ah tentu saja .. terima kasih!
Kevin Cruijssen
0

sed, 10 byte

/./{x;d};g

Penjelasan:

      (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

Senang melihat bahasa eksoteris (yaitu "bukan esoterik") yang mengikat dengan beberapa bahasa golf!


sumber