Zaraz… co miałbym powiedzieć jeszcze raz?

10

Często zapominam, co chciałem powiedzieć, gdy nauczyciel wzywa mnie do zabrania głosu. Czy możesz zrobić ze mnie narzędzie do rozwiązania tego?

Wymagania:

  • Program musi wykonać pętlę w następujący sposób:
    • Najpierw weź udział
    • Jeśli dane wejściowe są puste, wydrukuj ostatnie zapisane pytanie.
    • W przeciwnym razie zapisz dane wejściowe jako pytanie.

Uwagi:

  • Dane wejściowe nigdy nie będą puste, jeśli nie zostaną zapisane żadne pytania.

Wyjaśnienie: Program nie musi przechowywać wielu pytań. Początkowo chciałem, aby przechowywał wiele, ale zmieniłem to, gdy wiele osób źle zrozumiało pytanie.

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło
Miałeś na myśli „wcześniej zapisane pytanie”? Uważam, że „ostatnio przechowywane pytanie” jest mylące, ponieważ sugeruje, że możesz przechowywać więcej niż jedno pytanie.
Neil,
1
@Neil To powinno przechowywać więcej niż jedno pytanie, ale ponieważ wiele odpowiedzi już źle zrozumiało pytanie, zostawię je.
Oliver Ni

Odpowiedzi:

10

Perl, 13 17 14 +1 = 15 bajtów

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

+1 za -nflagę (zapisane 4 bajty dzięki @Dada)

Dopóki dane wejściowe nie są równe znakowi powrotu karetki, zapisuje dane wejściowe w $;. Jeśli jest równy zwrotowi karetki, drukuje to, co już jest $;.

Zakłada się, że wszystkie dane wejściowe można scharakteryzować jako pytania, nawet jeśli gramatycznie nie są takie.

Gabriel Benamy
źródło
Prawdopodobnie chciałeś pisać nezamiast eq(teraz to nie działa).
Dada,
1
Możesz zaoszczędzić trzy bajty, robiąc /./zamiast $/ne$_;-)
Dada
8

05AB1E, 12 11 10 bajtów

Dzięki @daHugLenny i @Adnan za 1 bajt!
Dzięki @Emigna za 1 bajt!

[IDõQiX,ëU
Oliver Ni
źródło
1
Nie mogę teraz testować, ale myślę, że możesz usunąć ostatnią postać.
acrolith
1
Tak, możesz usunąć ostatni nawias (zostanie on automatycznie uzupełniony).
Adnan
2
W przypadku wymiany ®i ©z Xa U, nie trzeba backslash.
Emigna,
4

Haskell, 49 bajtów

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

Jak to działa: zacznij od g "". Parametrem sfunkcji gjest pytanie w sklepie. godczytuje następny wiersz ze standardowego wejścia i przekazuje go (a także s) do #. Jeśli linia jest pusta, #drukuje sklep i dzwoni gponownie. Jeśli linia nie jest pusta, gjest wywoływana z linią jako nowy sklep.

nimi
źródło
3

JavaScript, 36 34 31 bajtów

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

Nieskończona pętla nieustannie prosi o dane wejściowe i zapisuje je b. Jeśli dane wejściowe nie są puste, są one następnie przechowywane, w aprzeciwnym razie adrukowana jest wartość parametru .

Zaoszczędź 2 bajty dzięki @ETHproductions

Oriol
źródło
Niezła odpowiedź. Możesz zapisać bajt, usuwając 1, a drugi, przechodząc b?a=b:alert(a)do ostatniej sekcji w pętli for (tj. for(a=0;;b?a=b:alert(a))b=prompt())
ETHproductions
W rzeczywistości a=0nie jest to konieczne. Ponieważ dane wejściowe mogą być puste tylko wtedy, gdy zapisane są pytania, anie można się do nich odwoływać, jeśli nie zostały przypisane.
Oriol,
zatrzymuje także przeglądarkę na kilka sekund z firefox-49.0.2
bunyaCloven
1
Jedynym wymaganiem w twoim pytaniu jest to, że puste dane wejściowe drukują ostatnio zapisane pytanie. Dlaczego chcesz, żebym przechowywał odniesienia do wcześniej zapisanych pytań?
Oriol
1
@bunyaCloven Dla mnie zatrzymuje przeglądarkę tylko wtedy, gdy każę jej blokować okna dialogowe. Jest to oczekiwane z powodu nieskończonej pętli. Po kilku sekundach przeglądarka wykrywa problem i zabija JS.
Oriol,
2

Mathematica, 44 bajty

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

Pełny program Znak Unicode to U + 221E INFINITY dla \[Infinity].

LegionMammal978
źródło
2

Python 3, 31 bajtów

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

Wypróbuj to!

-1 bajt dzięki Flp.Tkc

GamrCorps
źródło
1
możesz to napisać podczas pętli na 1 linii
FlipTack
1

siatka, 12 bajtów

id""E[$dp]~*

Wypróbuj online!

Wyjaśnienie

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
źródło
1

Pyke, 6 bajtów

z=z~zr

Wypróbuj tutaj!

     r - while 1:
z      -   input() or z.contents
 =z    -  z.contents = ^
   ~z  -  z.contents
niebieski
źródło
1

Python3 - 49 bajtów

s=""
while 1:
 b=input()
 if b:s=b
 else:print(s)
Yytsi
źródło
1
NameError: name 'b' is not defined
shooqie,
@shooqie Ah, wpisałem to na telefonie, więc przypadkowo pominąłem b=input(). Dzięki!
Yytsi,
1

Python 3, 34 bajty

s=""
while[print(s)]:s=input()or s
niebieski
źródło
Nie? Działa dla mnie dobrze
Blue,
3
Specyfikacja nie prosi o przechowywanie wielu pytań?
Niebieski,
1

Python 3, 60 bajtów

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

źródło
0

CMD, 37 bajtów

Niestety setnie przyjmuje pustych danych wejściowych :(

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

w nazwach plików c.cmdlub

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

w dowolnym pliku. Działający (użyj -jako pusty):

set/p a=
if %a%.=-. echo b
set b=%a%
c
Roman Gräf
źródło
set/pnigdy nie spowoduje, że zmienna będzie pusta, więc przynajmniej potrzebujesz set a=w pierwszym wierszu; też myślę, że masz na myśli set b=%a%.
Neil,
0

APLX, 19 bajtów

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

Wyjaśnienie:

⍝ 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
źródło
0

C, 73 63 bajtów

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

Do obsługi logiki używa tylko 1 bufora i jednego znaku. Jeśli użytkownik nic nie wprowadzi, tylko pierwszy znak w buforze zostanie zastąpiony przez '\0', w takim przypadku zostanie przywrócony xi wydrukowany, w przeciwnym razie skopiuj pierwszą literę dox późniejszego użycia.

Poprzedni kod:

main(){char a[99],b[99];for(;;){gets(a);if(*a)strcpy(b,a);else puts(b);}}
Karl Napf
źródło
0

Java 7, 189 187 178 bajtów ..

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 bajtów przy użyciu new java.util.Scanner bezpośrednio, dzięki @cliffroot .

Prawdopodobnie po raz pierwszy użyłem do-whilew zawodach codegolf.

Gdy funkcje są dozwolone zamiast programów, jest to 135 bajtów (wciąż wiele razy więcej niż większość innych odpowiedzi ..)

Kevin Cruijssen
źródło
jest to nieco krótsze i wydaje się, że działa -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 Hmmm .. nie brakuje foralbo whilegdzieś? .. Co to jest (x=new java.util.Scanner(System.in).nextLine())!=null;)?
Kevin Cruijssen
1
Tak, udało mi się jakoś wcześniej to przegapić :) tak miało być 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;}i jest tak naprawdę 1 bajt dłużej niż wersja z 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 oczywiście .. dzięki!
Kevin Cruijssen
0

sed, 10 bajtów

/./{x;d};g

Wyjaśnienie:

      (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

Miło widzieć egzoteryczny (tzn. „Nie ezoteryczny”) język łączący się z niektórymi językami golfa!


źródło