Golf một thông dịch viên phiên dịch


8

Đây là một thử thách rất đơn giản.

Ngôn ngữ trò đùa InterpretMe bao gồm một lệnh; *, khiến chương trình lấy đầu vào của chương trình InterpretMe và thực thi nó.

Một chương trình InterpretMe sẽ diễn giải nhiều chương trình InterpretMe như có *trong đầu vào.


Mục tiêu của bạn là tạo ra một chương trình diễn giải InterpretMe bằng càng ít byte càng tốt.


Đầu vào

Đầu vào sẽ bao gồm một chuỗi ASCII một dòng, chuỗi unicode utf-8 nếu bạn thực sự muốn hoặc bất kỳ mã hóa ký tự nào mà ngôn ngữ của bạn sử dụng, nếu bạn muốn nó nhiều như vậy. Các chuỗi này có thể được nhập vào lúc bắt đầu hoặc khi bắt đầu mỗi lần chạy trình thông dịch InterpretMe. Nếu tất cả chúng được nhập vào lúc bắt đầu, chương trình phải xuất ra mọi dòng chương trình khi nó bắt đầu.

Đầu ra

Trong thử thách này, sẽ không có đầu ra trừ khi tùy chọn một đầu vào được chọn, nếu không thì chỉ chấm dứt và không kết thúc


Các trường hợp thử nghiệm không bao gồm đầu vào và đầu ra, mà là đầu vào và kết thúc. Một dòng mới biểu thị một đầu vào mới sẽ được hiểu là InterpretMe.

Nếu sử dụng một đầu vào khi bắt đầu, điều này có thể được coi là đầu ra khi các chương trình này được nhập, tiếp theo là các dòng không hoạt động (không làm gì).

1. *   (executes input as an interpret me program, finishes)
2. *   (^same)
3. **  (executes input as an interpret me program, then does this again after the first program is done, finishes)
4. hi  (nothing, first star of previous line finishes)
5. **  (same as the other two star line)
6. hi  (nothing, first star of previous line finishes)
7. hi  (nothing, second star of line 5 finishes, so second star of line 3 finishes, so line 2 finishes, so line one finishes)
[termination] (not outputted)

hi  (does nothing and finishes)
[termination]

*hi  (executes inputted program, finishes)
*yo  (executes inputted program, finishes)
hey  (nothing)
[termination]

Một lần nữa, đây là , nên càng ít byte thì càng tốt


1
Tôi thực sự không hiểu. Đây có phải là 0 byte trong hầu hết các ngôn ngữ không?
James

1
không, bởi vì bạn phải nhận đầu vào nhiều lần như có "*" trong một chương trình, sau đó nhắc lại tương tự với mỗi đầu vào
Lemon

Bạn có thể cho một ví dụ về một chương trình không chấm dứt?
Neil

17
Chờ giây lát? Gì?
Rohan Jhunjhunwala

3
Đây dường như không phải là một thách thức được xác định rõ ràng, vì dường như không có một tiêu chí rõ ràng nào cho việc chương trình "thực sự diễn giải" đầu vào của nó hay không.
user2357112 hỗ trợ Monica

Câu trả lời:


2

05AB1E , 11 byte

Mã số:

[¬'*QiIJ}¦Ž

Giải trình:

[            # Enter an infinite loop
 ¬           # Get the first character of the input string (leaves the input on the stack)
  '*Qi  }    # If equal to an asterisk...
      I      # Request another line of input and
       J     # Join it to the string that was left on the stack
         ¦   # Remove the first character
          Ž  # If everything is processed, terminate

Sử dụng mã hóa CP-1252 . Dùng thử trực tuyến? .


10

Python 3, 35 byte

i=1
while i:i+=input().count('*')-1

đặt i thành một, thêm số lượng '*' -1 cho i

Tôi nghĩ rằng tôi có thể giảm điều này bằng ~thủ thuật mà tôi không thể


9

Python 3, 39 38 byte

def f():[f()for c in input()if c=="*"]

Đã lưu 1 byte nhờ @atlasologist


2
35 byte trong CoffeeScript f=->f()for c in prompt()when c=='*'(Tôi không muốn đưa ra câu trả lời khác vì đây là bản sao trực tiếp của bạn)
Bojidar Marinov

2
Tôi nghĩ rằng bạn sẽ tiết kiệm một byte bằng cách sử dụng một hàm thông thường ( def f()thay vì f=lambda).
đồ học

8

Ruby, 29 byte

i=1
i+=gets.count ?*while$.<i

Biến ma thuật của Ruby $.theo dõi số lượng dòng được đọc từ stdin. Tiếp tục đọc đầu vào trong khi con số này thấp hơn số dấu hoa thị (cộng với 1 ban đầu).


6

JavaScript, 53 45 44 byte

f=_=>{for(i in prompt().match(/\*/g))f()}f()

Chương trình này khá khó chịu khi sử dụng do JavaScript thiếu I / O tốt.

Yêu cầu một chương trình, sau đó yêu cầu một chương trình khác cho mọi *chương trình đầu vào.


6

Java chỉ 45 60 101 100 99 byte

Đảo ngược mã-golf: D. Tôi nhận thấy rằng tôi đã đọc các thông số kỹ thuật (hai lần), nhưng bây giờ nó sẽ hoạt động. Có vẻ đủ đơn giản, có lẽ có một cách tốt hơn để viết này như là một biểu thức lamda.

void a(char[]a){for(char b:a)if(b==42)a(new java.util.Scanner(System.in).nextLine().toCharArray());}

Gian lận hơi nhếch nhác chỉ 17 byte!

void a(char[]a){}

Phiên bản này sẽ nhận đầu vào thông qua việc gõ rất nhanh


2
if(b=='*')có thể được đánh gôn tới if(b==42)-1 byte. Và new Java.util.Scanner(nên có một chữ thường j. +1 cho phần chơi gôn ngược mã. ;)
Kevin Cruijssen

1
Câu trả lời này đã làm cho ngày của tôi: D for(int b:a)tiết kiệm một byte bổ sung, vì vậy ít hơn 100 byte để không làm gì: D
Frozn

Cảm ơn! @Frozn (những nhân vật này giúp bình luận theo ppcg)
Rohan Jhunjhunwala


4

APL, 15 byte

{⍵='*':∇¨⍞⋄⍬}¨⍞

Kiểm tra:

      {⍵='*':∇¨⍞⋄⍬}¨⍞
*
*
**
hi
**
hi
hi
⍝ termination

Giải trình:

              ⍞  read a line from the keyboard
{           }¨   for each character:
 ⍵='*':          if it is *:
         ⍞         read another line from the keyboard
       ∇¨          do the same for each character
          ⋄⍬     otherwise, return empty list (which displays as nothing)

2

Perl, 33 byte

for(my$c;$c+=()=<>=~/\*/g;$c--){}

Đếm số lần * xảy ra trong đầu vào và thêm số lần đó vào số lần lặp. Tôi cảm thấy nên có một cách để làm giảm dần trong cùng một bước với tăng dần nhưng tôi không thể tìm ra nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.