Bekle… tekrar ne diyecektim?


10

Öğretmen beni konuşmaya çağırdığında ne söylemek istediğimi sık sık unutuyorum. Bunu çözmem için bana bir araç yapabilir misin?

Gereksinimler:

  • Program aşağıdaki gibi döngü yapmalıdır:
    • İlk olarak, girişi alın
    • Giriş boşsa, son saklanan soruyu yazdırın.
    • Aksi takdirde, girişi soru olarak saklayın.

Notlar:

  • Kayıtlı soru yoksa giriş asla boş olmaz.

Açıklama: Programın birden fazla soru saklaması gerekmez. Başlangıçta birden fazla depolamasını istedim, ancak birçok kişi soruyu yanlış anladıktan sonra değiştirdim.

Unutmayın, bu , bu nedenle en az bayt içeren kod kazanır.


Şunu mu demek istediniz: "önceden depolanmış soru"? Birden fazla soru saklayabileceğinizi düşündüren "son saklanan soru" kafa karıştırıcı buluyorum.
Neil

1
@Neil Birden fazla soru saklaması gerekiyordu, ancak birçok cevap soruyu yanlış anladığından, sadece bırakacağım.
Oliver Ni

Yanıtlar:


10

Perl, 13 17 14 +1 = 15 bayt

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

-nBayrak için +1 (@Dada sayesinde 4 bayt kaydedildi)

Giriş, satır başına eşit olmadığı sürece, girişi saklar $;. Taşıyıcı dönüşüne eşitse, içinde olanı yazdırır $;.

Bu, tüm girdilerin dilbilgisel olarak olsalar bile soru olarak nitelendirilebileceğini varsayar.


Muhtemelen nebunun yerine yazmak istediniz eq(şu anda bu işe yaramıyor).
Dada

1
Sen yaparak üç byte kaydedebilirsiniz /./yerine $/ne$_;-)
Dada

8

05AB1E, 12 11 10 bayt

@DaHugLenny ve @Adnan'a 1 bayt için teşekkürler!
@Emigna'ya 1 bayt için teşekkürler!

[IDõQiX,ëU

1
Şimdi test edemiyorum, ama son karakteri kaldırabileceğini düşünüyorum.
acrolith

1
Evet, son braketi kaldırabilirsiniz (otomatik olarak tamamlanacaktır).
Adnan

2
Eğer değiştirirseniz ®ve ©ile Xve U, ters eğik çizgi gerekmez.
Emigna

4

Haskell, 49 bayt

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

Nasıl çalışır: ile başlayın g "". sFonksiyonun parametresi gmağazadaki sorudur. gstdin'den sonraki satırı okur ve (ve ayrıca) 'a iletir #. Hat boşsa, #depoyu yazdırır ve gtekrar arar . Hat boş değilse, hat gyeni mağaza olarak çağrılır.


3

JavaScript, 36 34 31 bayt

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

Sonsuz bir döngü sürekli giriş ister ve bunu saklar b. Giriş boş değilse depolanır a, aksi takdirde değeri ayazdırılır.

@ETHproductions sayesinde 2 bayt tasarruf edildi


Güzel cevap. Bir bayt'ı for-loop (yani ) içindeki son bölüme geçerek 1ve diğerini kaldırarak kaydedebilirsinizb?a=b:alert(a)for(a=0;;b?a=b:alert(a))b=prompt()
ETHproductions

Aslında a=0ne de gerekli değil. Giriş yalnızca depolanmış sorular varsa boş olabileceğinden, aatanmamışsa referans alınmaz.
Oriol

Ayrıca firefox-49.0.2 ile tarayıcıyı birkaç saniye durdurur
bunyaCloven

1
Sorunuzdaki tek gereksinim, boş girişin son saklanan soruyu yazdırmasıdır. Neden daha önce saklanan sorulara referans vermemi istiyorsun?
Oriol

1
@bunyaCloven Benim için tarayıcıyı yalnızca diyalogları engellemesini söylediğimde durdurur. Sonsuz döngü nedeniyle bu bekleniyor. Birkaç saniye sonra tarayıcı sorunu algılar ve JS'yi öldürür.
Oriol

2

Mathematica, 44 bayt

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

Tam program. Unicode karakteri U + 221E INFINITY'dir \[Infinity].



1

retiküler, 12 bayt

id""E[$dp]~*

Çevrimiçi deneyin!

açıklama

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 bayt

s=""
while 1:
 b=input()
 if b:s=b
 else:print(s)

1
NameError: name 'b' is not defined
shooqie

@shooqie Ah, bunu telefonumla yazdım, bu yüzden yanlışlıkla dışarıda kaldım b=input(). Teşekkürler!
Yytsi

1

Python 3, 34 bayt

s=""
while[print(s)]:s=input()or s

Öyle değil mi? Benim için iyi çalışıyor
Blue

3
Teknik özellik birden fazla soru saklamak istemiyor mu?
Blue

1

Python 3, 60 bayt

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

0

CMD, 37 bayt

Ne yazık ki setboş girdi almıyor :(

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

dosya adlarında c.cmdveya

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

herhangi bir dosyada. Çalışma ( -Boş olarak kullanın ):

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

set/pbir değişkeni asla boş yapmaz, bu yüzden en azından set a=ilk satırda ihtiyacınız vardır ; ayrıca demek istediğini düşünüyorum set b=%a%.
Neil

0

APLX, 19 bayt

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

Açıklama:

⍝ 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 bayt

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

Mantığı işlemek için yalnızca 1 tampon ve tek bir karakter kullanır. Kullanıcı hiçbir şey girmezse, yalnızca arabellekteki ilk karakterin üzerine yazılır '\0', bu durumda geri yüklenir xve yazdırılır, aksi takdirde ilk harfi xdaha sonra kullanmak üzere kopyalayın .

Önceki kod:

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

0

Java 7, 189 187 178 bayt ..

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

@Cliffrootnew java.util.Scanner sayesinde -9 bayt doğrudan kullanarak .

Muhtemelen ilk kez bir do-while bir codegolf meydan okuma kullandım ..

Programlar yerine işlevlere izin verildiğinde, 135 bayttır (diğer yanıtların çoğundan hala çok daha fazla ..)


Bu biraz daha kısa ve çalışıyor gibi görünüyor -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 .. Bir yerde forya da bir whileyerde eksik değil misin ? .. Nedir (x=new java.util.Scanner(System.in).nextLine())!=null;)?
Kevin Cruijssen

1
Evet, bir şekilde daha önce kaçırmayı başardım :) olması gerekiyordu 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;}ve aslında 1 bayt daha uzun olan sürüm 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 elbette .. teşekkürler!
Kevin Cruijssen

0

sed, 10 bayt

/./{x;d};g

Açıklama:

      (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

Bazı golf dilleri ile ekzoterik (yani "ezoterik değil") bir dil bağlama görmek güzel!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.