เดี๋ยวก่อน…ฉันจะพูดอะไรอีก


10

ฉันมักจะลืมสิ่งที่ฉันต้องการจะพูดเมื่อครูเรียกร้องให้ฉันพูด คุณทำให้ฉันเป็นเครื่องมือในการแก้ปัญหานี้ได้หรือไม่?

ที่ต้องการ:

  • โปรแกรมต้องวนซ้ำดังนี้:
    • ก่อนอื่นให้ป้อนข้อมูล
    • หากอินพุตว่างให้พิมพ์คำถามที่เก็บไว้ล่าสุด
    • มิฉะนั้นให้เก็บอินพุตเป็นคำถาม

หมายเหตุ:

  • อินพุตจะไม่ว่างเปล่าหากไม่มีการจัดเก็บคำถาม

การชี้แจง: โปรแกรมไม่จำเป็นต้องเก็บคำถามหลายข้อ ตอนแรกฉันต้องการให้เก็บหลาย ๆ อัน แต่ฉันเปลี่ยนมันหลังจากหลาย ๆ คนเข้าใจผิดคำถาม

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


คุณหมายถึง "คำถามที่เก็บไว้ก่อนหน้า" หรือไม่ ฉันพบว่า "คำถามสุดท้ายที่เก็บไว้" ทำให้สับสนเพราะมันอาจแนะนำให้คุณเก็บคำถามมากกว่าหนึ่งคำถาม
Neil

1
@ Neil มันควรจะเก็บคำถามมากกว่าหนึ่งคำถาม แต่เนื่องจากมีคำตอบมากมายที่ทำให้เข้าใจผิดคำถามฉันจะปล่อยมันไป
Oliver Ni

คำตอบ:


10

Perl, 13 17 14 +1 = 15 ไบต์

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

+1 สำหรับ-nธง (บันทึกไว้ 4 ไบต์ด้วย @Dada)

ตราบใดที่อินพุตไม่เท่ากับการรับคืนรถมันจะเก็บอินพุต$;ไว้ $;ถ้ามันจะมีค่าเท่ากับกลับสายการบินจะพิมพ์สิ่งที่มีอยู่แล้วใน

สิ่งนี้อนุมานว่าข้อมูลทั้งหมดสามารถกำหนดให้เป็นคำถามได้แม้ว่าจะไม่มีทางไวยากรณ์ก็ตาม


คุณอาจต้องการเขียนneแทนeq(ตอนนี้ไม่ทำงาน)
Dada

1
คุณสามารถบันทึกสามไบต์ด้วยการทำ/./แทน$/ne$_;-)
Dada

8

05AB1E, 12 11 10 ไบต์

ขอบคุณ @daHugLenny และ @Adnan สำหรับ 1 ไบต์!
ขอบคุณ @Emigna สำหรับ 1 ไบต์!

[IDõQiX,ëU

1
ฉันไม่สามารถทดสอบได้ในตอนนี้ แต่ฉันคิดว่าคุณสามารถลบอักขระตัวสุดท้ายได้
acrolith

1
ใช่คุณสามารถลบวงเล็บสุดท้าย (มันจะถูกทำให้สมบูรณ์โดยอัตโนมัติ)
Adnan

2
หากคุณแทนที่®และ©ด้วยXและUคุณไม่จำเป็นต้องใช้แบ็กสแลช
Emigna

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


คำตอบที่ดี คุณสามารถบันทึก byte โดยการลบ1, และอื่น ๆ โดยการย้ายb?a=b:alert(a)เข้าไปในส่วนสุดท้ายภายใน for-loop (เช่น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, 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%ยังฉันคิดว่าคุณหมายถึง
Neil

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

Java 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 Ummm .. คุณไม่หายไปforหรือwhileบาง? .. คืออะไร(x=new java.util.Scanner(System.in).nextLine())!=null;)?
Kevin Cruijssen

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-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 อ่าแน่นอน .. ขอบคุณ!
Kevin Cruijssen

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

ยินดีที่ได้เห็นภาษาที่ไม่ซับซ้อน (เช่น "ไม่ใช่ความลับ") ที่คาดเดาได้กับภาษากอล์ฟ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.