Mã hóa ngôn ngữ dựa trên ngăn xếp


15

Tôi đã làm việc trên một ngôn ngữ chơi gôn dựa trên ngăn xếp khác gọi là Stackgoat . Trong thử thách này, bạn sẽ viết Tokenizer cho Stackgoat (hoặc thực sự là bất kỳ ngôn ngữ dựa trên ngăn xếp chung nào).

Ví dụ

"PPCG"23+
["PPCG", '23', '+']

'a "bc" +
['"a"', '"bc"', '+']

12 34+-"abc\"de'fg\\"
['12', '34', '+', '-', '"abc\"de'fg\\"']

"foo
['"foo"']

(empty input)
[]

' ""
['" "', '""']

Sự chỉ rõ

Ba loại bạn sẽ cần xử lý là:

  • Chuỗi, bất cứ điều gì trong""
  • Số, bất kỳ dãy số
  • Toán tử, bất kỳ ký tự đơn nào khác ngoài khoảng trắng

Khoảng trắng về cơ bản bị bỏ qua trừ khi nó nằm trong một chuỗi hoặc tách hai số.

Chuỗi / char spec:

  • Các chuỗi được phân định bởi a "và khi \gặp a, ký tự tiếp theo sẽ được thoát.
  • Chars được thêm vào bởi a 'và ký tự sau 'nên được chuyển đổi thành một chuỗi ký tự. 'a->"a"
  • ' sẽ luôn có một nhân vật sau nó
  • Báo giá kết thúc phải được tự động chèn

Quy tắc:

  • Không có hình thức nào evalđược cho phép

Đầu ra đầu vào:

  • Đầu vào có thể được thực hiện thông qua STDIN, tham số chức năng hoặc tương đương với ngôn ngữ của bạn.
  • Đầu ra phải là một mảng hoặc tương đương gần nhất với ngôn ngữ của bạn.

5
@Doorknob, nghiêm túc chứ?
LegionMammal978

4
@ LegionMammal978 Vâng, nghiêm túc.
Alex A.

1
Đầu ra có thể là STDOUT?
Doorknob

2
@ZachGates Vâng, hầu hết các ngôn ngữ cũng xử lý \ như một ký tự thoát, vì vậy, bạn sẽ cần phải thoát khỏi điều đó nếu ngôn ngữ của bạn cần nó rõ ràng.
Hạ cấp

1
Ngoài ra, trong ví dụ đầu tiên, phần tử đầu tiên của kết quả có nên '"PPCG"'thay vì chỉ "PPCG"không?
Vụ kiện của Quỹ Monica

Câu trả lời:


8

Võng mạc , 68 64 63 byte

M!s`"(\\.|[^"])*"?|'.|\d+|\S
ms`^'(.)|^"(([^\\"]|\\.)*$)
"$1$2"

hoặc là

s`\s*((")(\\.|[^"])*(?<-2>")?|'.|\d+|.)\s*
$1$2¶
\ms`^'(.)
"$1"

Tôi nghĩ rằng điều này bao gồm tất cả các trường hợp cạnh vui nhộn, ngay cả những trường hợp không được bao gồm trong các trường hợp thử nghiệm trong thử thách.

Hãy thử trực tuyến!


Dang, đây là ngắn. Làm tốt lắm!
Vụ kiện của Quỹ Monica

Tôi đã có thể dịch cái này thành hàm ES6 95 byte. Nó sẽ là 80 ngoại trừ các biểu thức chính quy không hoạt động theo cách khác (quá nhiều trường hợp cạnh).
Neil

2

Ruby, 234 byte

puts"[#{$stdin.read.scan(/("(?:(?<!\\)\\"|[^"])+(?:"|$))|'(.)|(\d+)|(.)/).map{|m|(m[0]?(m[0].end_with?('"')?m[0]: m[0]+'"'): m[1]?"\"#{m[1]}\"": m.compact[0]).strip}.reject(&:empty?).map{|i|"'#{/\d+|./=~i ?i: i.inspect}'"}.join', '}]"

Tôi đã thử sử dụng find(&:itself)mánh mà tôi thấy ... ở đâu đó, nhưng rõ ràng .itselfđây không phải là một phương pháp. Ngoài ra, tôi đang làm việc trên sân golf, nhưng nó không thể đọc được.

Nếu chúng ta không phải xuất ra theo bất kỳ cách ưa thích nào (nghĩa là các chuỗi không phải được trích dẫn trong mảng) Tôi có thể lưu toàn bộ byte lotta:

Vẫn là Ruby, 194 byte:

p$stdin.read.scan(/("(?:(?<!\\)\\"|[^"])+(?:"|$))|'(.)|(\d+)|(.)/).map{|m|(m[0]?(m[0].end_with?('"')?m[0]: m[0]+'"').gsub(/\\(.)/,'\1'): m[1]?"\"#{m[1]}\"": m.compact[0]).strip}.reject(&:empty?)

Tôi chắc chắn rằng tôi có thể chơi gôn nhiều hơn, nhưng tôi không chắc lắm.


Ungolfed đến sớm. Tôi bắt đầu nghịch ngợm với việc đánh golf trực tiếp tại một số điểm và tôi sẽ phải trêu chọc nó.


0

Python 3, 228 byte

import re;L=list
print(L(map(lambda i:i+'"'if i[0]=='"'and not i[-1]=='"'else i,map(lambda i:'"%s"'%i[1]if i[0]=="'"else i,filter(None,sum([L(i)for i in re.findall('(\'.)|(".*")|(\d+)|([^\w\"\'\s\\\])|(".*"?)',input())],[]))))))

Đây là một hai lớp lót dài, đẹp.


Kiểm tra nó trong Python 3. Dưới đây là một số ví dụ:

$ python3 test.py
"PPCG"23+
['"PPCG"', '23', '+']

$ python3 test.py
'a "bc" +
['"a"', '"bc"', '+']

$ python3 test.py
12 34+-"abc"de'fg\"
['12', '34', '+', '-', '"abc"de\'fg\\"']

$ python3 test.py
"foo
['"foo"']

$ python3 test.py

[]

$ python3 test.py
' ""
['" "', '""']
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.