โทเค็นภาษาสแต็กตาม


15

ฉันได้รับการทำงานในอีกภาษากอล์ฟสแต็คที่เรียกว่าStackgoat ในการท้าทายนี้คุณจะต้องเขียน Tokenizer สำหรับ Stackgoat (หรือภาษาที่ใช้กองซ้อนทั่วไป)

ตัวอย่าง

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

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

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

"foo
['"foo"']

(empty input)
[]

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

สเปค

สามประเภทที่คุณต้องจัดการคือ:

  • เงื่อนไขอะไรภายใน""
  • ตัวเลขลำดับของตัวเลขใด ๆ
  • ผู้ประกอบการตัวละครอื่น ๆ นอกเหนือจากช่องว่าง

ช่องว่างจะถูกละเว้นเป็นหลักเว้นแต่ว่ามันจะอยู่ในสตริงหรือแยกตัวเลขสองตัว

สตริง / อักขระถ่าน:

  • สตริงถูกคั่นด้วย a "และเมื่อ\พบa อักขระตัวถัดไปควรถูกหลีกเลี่ยง
  • ตัวอักษรจะถูกเติมหน้าโดย a 'และตัวอักษรหลังจากที่'ควรจะถูกแปลงเป็นตัวอักษรสตริง 'a->"a"
  • ' จะมีตัวละครอยู่เสมอ
  • ควรปิดการเสนอราคาปิดอัตโนมัติ

กฎ:

  • ไม่evalอนุญาตให้ใช้รูปแบบ

อินพุต / เอาต์พุต:

  • สามารถป้อนข้อมูลผ่าน STDIN พารามิเตอร์ฟังก์ชันหรือเทียบเท่าภาษาของคุณ
  • ผลลัพธ์ควรเป็นอาร์เรย์หรือภาษาที่ใกล้เคียงที่สุดของคุณ

5
@ Doorknob อย่างจริงจัง?
LegionMammal978

4
@ LegionMammal978 ใช่อย่างจริงจัง
Alex A.

1
เอาต์พุตสามารถเป็น STDOUT ได้หรือไม่?
Doorknob

2
@ ZachGates ใช่แล้วภาษาส่วนใหญ่จะจัดการ \ เป็นตัวละครในการหลบหนีด้วยใช่คุณจะต้องหลบหนีถ้าภาษาของคุณต้องการอย่างชัดเจน
Downgoat

1
ในตัวอย่างแรกองค์ประกอบแรกของผลลัพธ์ควร'"PPCG"'แทนที่จะเป็นเพียงแค่"PPCG"?
คดีของกองทุนโมนิกา

คำตอบ:


8

เรติน่า , 68 64 63 ไบต์

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

หรือ

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

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

ลองออนไลน์!


แดงนี่สั้น ทำได้ดีมาก!
คดีของกองทุนโมนิกา

ฉันสามารถแปลมันเป็นฟังก์ชั่น 95 ไบต์ ES6 มันจะเป็น 80 ยกเว้นว่า regexps ไม่ทำงานในทางอื่น ๆ (กรณีขอบมากเกินไป)
Neil

2

ทับทิมขนาด 234 ไบต์

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', '}]"

ฉันลองใช้find(&:itself)เคล็ดลับที่ฉันเห็น ... ที่ไหนสักแห่ง แต่.itselfจริงๆแล้วไม่ใช่วิธีการ นอกจากนี้ฉันกำลังเล่นกอล์ฟ regex ลง แต่มันอ่านไม่ได้แล้ว

ถ้าเราไม่จำเป็นต้องเอาท์พุทด้วยวิธีแฟนซีใด ๆ (เช่นสตริงไม่จำเป็นต้องอ้างถึงในอาเรย์) ฉันสามารถบันทึกไบต์ทั้งหมดได้:

ยังเป็นทับทิม, 194 ไบต์:

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?)

ฉันแน่ใจว่าฉันสามารถตีกอล์ฟได้มากกว่านี้ แต่ฉันก็ไม่แน่ใจเหมือนกัน


Ungolfed เร็ว ๆ นี้ ฉันเริ่มเล่นซอกับกอล์ฟโดยตรงในบางจุดและฉันจะต้องแซวมันออกมา


0

Python 3, 228 ไบต์

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())],[]))))))

นี่คือสองยาวที่ดี


ทดสอบใน Python 3 นี่คือตัวอย่างบางส่วน:

$ 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
' ""
['" "', '""']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.