Golf a Compute interpreter


9

บทนำ

การคำนวณเป็นภาษาตลกที่ลึกลับ

จากรายการ esolangs:

การคำนวณไม่มีไวยากรณ์ที่จำเป็นและมีอำนาจในการแก้ปัญหาใด ๆ และทั้งหมด มันฉลาดพอที่จะตีความภาษามนุษย์ใด ๆ (อังกฤษ, สเปน, ละติน, ฯลฯ ), ภาษาการเขียนโปรแกรมใด ๆ (C ++, Java, brainfuck, ฯลฯ ) หรือข้อมูลประเภทใด ๆ ที่คุณนึกออก ข้อเสียเพียงอย่างเดียวคือไม่มี I / O อย่างแน่นอน

ตัวอย่างโปรแกรมบางโปรแกรม

Hello World

โปรแกรม Hello World พื้นฐาน

What is love?

กำหนดว่ารักคืออะไร (ที่รักอย่าทำร้ายฉัน)

When will we ever graduate?

กำหนดวันที่แน่นอนของเว็บไซต์นี้เพื่อให้พ้นเบต้า

ความท้าทาย

งานของคุณคือการเขียนล่ามคำนวณแบบเต็ม ฟังดูค่อนข้างยาก แต่โปรดจำไว้ว่า Compute ไม่มี I / O อย่างสมบูรณ์ ดังนั้นล่ามของคุณจะนอนหนึ่งวินาทีสำหรับทุกบรรทัดในโปรแกรมอินพุตและเอาต์พุต\n\nDone.หลังจากนี้ (นี่เป็นข้อยกเว้นเพียงอย่างเดียวสำหรับสิ่งที่ไม่มี I / O)

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

กฎระเบียบ

  • \nการป้อนข้อมูลที่อาจมีหลายบรรทัดแยกโดย จะต้องมีอย่างน้อยหนึ่งบรรทัด
  • ไม่เหมือนกับการนำไปใช้อย่างเป็นทางการคุณไม่จำเป็นต้องใช้ไฟล์เป็นอินพุต คุณสามารถใช้โปรแกรมคำนวณในรูปแบบอินพุตที่คุณต้องการ
  • \n\nDone.เอาท์พุทได้รับอนุญาตเท่านั้นคือ อนุญาตการขึ้นบรรทัดใหม่
  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • กฎเริ่มต้นสำหรับอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • นี่คือ ดังนั้นการนับไบต์ต่ำสุดจึงชนะ Tiebreaker เป็นการส่งก่อนหน้า

1
ทำให้ฉันนึกถึงสิ่งนี้
หลุยส์เมนโด

14
เราไม่จำเป็นต้องมีโปรแกรมที่จะบอกเราเมื่อเรากำลังจะสำเร็จการศึกษา เรารู้อยู่แล้วว่ามันเป็นวันที่ 26
Doorknob

7
@ Doorknob ของศตวรรษอะไร
msh210

1
@DenkerAffe ฉันคิดว่าคุณควรทำให้ชัดเจนว่าความท้าทายไม่ตรงกับภาษา
PurkkaKoodari

9
@ msh210 ไม่นั่นคือศตวรรษ
Peter Taylor

คำตอบ:


5

05AB1E , 16 15 14 13 ไบต์

รหัส:

[Ig>#w’

D€µ.

คำอธิบาย:

[        # Starts an infinite loop
 I       # Input string
  g>     # Length + 1
    #    # If equal to 1, break out of the loop
     w   # Wait 1 second

ส่วนนี้เทียบเท่ากับ"\n\nDone.":

      ’  # Push "\n\nDone." on top of the stack

D€µ.     # The compressed string is ended implicitly
         # Implicit, print top of the stack

ลองออนไลน์!

ใช้การเข้ารหัสCP-1252


4

ปราศรัย 117 ไบต์

I need time!
To iterate, input().
Inhale.
Now sleep(1).
Backtracking.
Boring,
boring.
Listen!
Capture Done.
Carry on!

มาอธิบายเรื่องนี้กันดีกว่า ก่อนอื่น transpiles นี้ไปที่:

import time
while input():
    time.sleep(1)
print("\n")
print("\n")
print("Done")

ยังสับสนอยู่ใช่ไหม มาพูดกันว่า:

I need time!

timeนำเข้าโมดูล

To iterate, input().

input()นี้เป็นห่วงขณะที่มีสภาพเป็น

Inhale.

โปรแกรมของเราต้องหายใจตอนนี้และinhaleในขณะที่มีสุขภาพดีน้อยกว่าคือนักกอล์ฟ

Now sleep(1).

Nowใช้โมดูลล่าสุดนำเข้าและผนวก.sleep(1)กับมัน

Backtracking.

ลองออกจากลูปในขณะที่

Boring,
boring.

พิมพ์สองบรรทัดใหม่

Listen!

เริ่มต้นการจับภาพสตริง

Capture Done.

เพิ่มDone.ไปยังสตริงที่จับ

Carry on!

เสร็จสิ้นการจับภาพสตริง


3
ดูเหมือนภาษาที่สนุก คุณจะเพิ่มลิงค์ไปยังล่าม + เอกสารหรือไม่?
Denker

@DenkerAffe เอกสารและล่ามทั้งสองสามารถพบได้ในหัวฉันเพียงแค่การแก้ไขใน.
Conor โอไบรอัน

@Conor ขอบคุณจะได้ดูมัน :)
Denker

4

JavaScript Shell REPL ขนาด 38 ไบต์

ในฐานะที่เป็นฟังก์ชั่นที่ยอมรับโปรแกรมเป็นอาร์กิวเมนต์สตริงและส่งคืนผลลัพธ์:

s=>sleep(s.split`
`.length)||`

Done.`

29 ไบต์ถ้าฟังก์ชันสามารถรับอินพุตในรูปแบบของอาร์เรย์ของบรรทัดหรือถ้ามันควรจะนอน 1 วินาทีต่อตัวอักษร:

s=>sleep(s.length)||`

Done.`

34 ไบต์ถ้าควรเป็นเหมือนโปรแกรมมากขึ้นและพิมพ์เสร็จสิ้น:

s=>sleep(s.length)||print`

Done.`

สิ่งนี้ใช้ได้กับฉันในล่าม Spidermonkey แบบสแตนด์อโลน


4

Javascript ES6, 46 45 ไบต์

a=>setTimeout(x=>alert`

Done.`,a.length*1e3)

ขอบคุณӍѲꝆΛҐӍΛПҒЦꝆสำหรับการบันทึกหนึ่งไบต์

ถือว่าอาร์เรย์เป็นอินพุต

เนื่องจากทั้งӍѲꝆΛҐӍΛПҒЦꝆและedc65ได้ชี้ให้เห็นคุณสามารถเขียนสิ่งต่อไปนี้ได้ แต่มันจะไม่บันทึกไบต์ใด ๆ :

a=>setTimeout("alert`\n\nDone`",a.length*1e3)

1
1e310e2จะดีกว่า
Mama Fun Roll

นอกจากนี้ยังแปลงฟังก์ชันลูกศรเป็นสตริง ดูcodegolf.stackexchange.com/a/60960/41247
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆฉันไม่แน่ใจว่าจะทำงานได้ เนื่องจากเขามีสตริงแม่แบบอยู่แล้วคุณจะต้องหลบหนี
Cyoce

@ ӍѲꝆΛҐӍΛПҒЦꝆ 1e3 is better than 10e2ไม่น่าเชื่อว่าฉันจะพลาด
andlrc

@ edc65 คุณไม่ใช่คนแรกที่พูดถึงมันӍѲꝆΛҐӍΛПҒЦꝆพูดถึงมันด้วย :-)
andlrc

4

Bash + coreutils, 28

sleep `wc -l`
echo "

Done."

นอน 1 วินาทีสำหรับทุกบรรทัด ใช้wc -cแทนทุกไบต์หรือwc -mแทนอักขระทุกตัว


1
ไม่ควรมีการขึ้นบรรทัดใหม่พิเศษ?
user253751

@immibis ใช่ - ถูกต้อง - แก้ไขแล้ว
Digital Trauma

3

Pyth, 15 14 ไบต์

.dcl.z1b"Done.

(คุณสามารถลองออนไลน์ได้ แต่ไม่มีประโยชน์ที่จะทำเช่นนั้น)


คุณหายไปหลังจากนั้นDone(ซึ่งค่อนข้างตลกเพราะคุณบอกใครแบบเดียวกันกับคำตอบอื่น): P
Denker

@DenkerAffe ขอบคุณ (นับจำนวนไบต์ถูกต้องแล้ว)
PurkkaKoodari

@muddyfish นั่นคือสิ่งที่ความท้าทายบอกไว้ ล่ามอย่างเป็นทางการเป็นคนฉลาด แต่ฉันเปลี่ยนเป็นบรรทัดเพื่อหลีกเลี่ยงเวลารอ
Denker

@DenkerAffe ตกลงตอนนี้รายการของเราเหมือนกันทุกประการ ใครที่จะรักษา? ฉันจะสมมติว่า Pietu1998 เพราะมันถูกต้องก่อน
บลู

จำเป็นหรือไม่
busukxuan



2

MATL , 17 ไบต์

10c'Done.'`jt?1Y.

บรรทัดว่างต่อท้าย (ตามด้วยบรรทัดใหม่) ถูกใช้เพื่อทำเครื่องหมายจุดสิ้นสุดของอินพุต จำเป็นต้องมีใน MATL เนื่องจากอินพุตนั้นเป็นแบบอินเทอร์แอคทีฟและแต่ละอินพุตลงท้ายด้วย newline

ลองออนไลน์!

10c           % push newline character
'Done.'       % push string
`             % do...while
  j           % input string
  t           % duplicate
  ?           % if non-empty
    1Y.       % pause for 1 second
              % loop condition is the current string. If non-empty: next iteration
              % If empty: exit loop and print stack contents. There are two strings
              % and a newline is printed after each, so the desired output is obtained

คุณหายไปหลังจากช่วงเวลานี้Doneหรือไม่?
PurkkaKoodari

@ Pietu1998 อ๊ะ การแก้ไข ขอบคุณ!
Luis Mendo

2

QBasic, 54 ไบต์

LINE INPUT x$
IF x$=""GOTO 1
SLEEP 1
RUN
1?
?
?"Done."

รับบรรทัดโปรแกรมโดยบรรทัดจากอินพุตของผู้ใช้ยกเลิกโดยบรรทัดว่าง ปฏิบัติตามตัวบทกฎหมายแม้ว่าจะไม่ใช่วิญญาณโดยหยุด 1 วินาทีหลังจากอ่านแต่ละบรรทัด (สเปคไม่ได้บอกทางเทคนิคว่าการหยุดทั้งหมดต้องมาหลังจากอินพุตเสร็จสมบูรณ์) ถ้าสิ่งนี้ถือว่าร่มรื่นเกินไปนี่เป็นรุ่น 64- ไบต์ที่หยุดชั่วคราวหลังจากโปรแกรมทั้งหมดได้รับอินพุต:

DO
LINE INPUT x$
IF x$=""GOTO 1
t=t+1
LOOP
1SLEEP t
?
?
?"Done."

รุ่นโบนัสพร้อมไฟล์ I / O (87 ไบต์):

INPUT f$
OPEN f$FOR INPUT AS 1
1LINE INPUT #1,x$
SLEEP 1
IF 0=EOF(1)GOTO 1
?
?
?"Done."


1

OCaml, 61 ไบต์

fun a->List.iter(fun _->Unix.sleep 1)a;print_string"\n\nDone"

ถือว่าอินพุตเป็นรายการ


0

เยลลี่ 12 ไบต์ (ไม่แข่งขัน)

ỴLœS@⁷⁷“ẋḲp»

ลองออนไลน์!

หมายเหตุ: โปรดอย่าแนะนำให้ใส่⁷⁷ในสตริงที่บีบอัดมันจะทำให้มันยาวขึ้น ( “¡OÑL[Ṁ»)

คำอธิบาย:

ỴLœS@⁷⁷“ẋḲp» Main link. Arguments: z.
ỴL           The number of lines in z. (x)
     ⁷       Newline ("\n") (y)
  œS@        After sleeping for x seconds, return y.
      ⁷      Newline ("\n")
       “ẋḲp» Compressed string ("Done.")

œSนี่คือที่ไม่ใช่การแข่งขันเพราะ
Erik the Outgolfer

0

awk, 34 ไบต์

END{print"\nDone."|"cat;sleep "NR}

เนื่องจากไม่มี I / O และผลลัพธ์สุดท้ายจึงหลีกเลี่ยงไม่ได้Done.ส่วนจะถูกส่งออกไปในตอนเริ่มต้น

$ awk 'END{print"\nDone."|"cat;sleep "NR}' file

วิธีเดียวที่จะนอนใน awk sleepคือการใช้ระบบ วิธีที่สั้นที่สุดในการเรียกใช้คือprint|"sleep "NRและเราอาจใช้การละเมิดที่ไร้ประโยชน์printเช่นกัน

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