Yığın Tabanlı Bir Dil Belirleme


15

Stackgoat adında başka bir yığın tabanlı golf dili üzerinde çalışıyorum . Bu meydan okumada Stackgoat için bir Tokenizer (veya gerçekten herhangi bir yığın tabanlı dil) yazacaksınız.

Örnekler

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

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

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

"foo
['"foo"']

(empty input)
[]

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

Şartname

Ele almanız gereken üç tür:

  • Teller, içindeki her şey""
  • Sayılar, herhangi bir basamak dizisi
  • Operatörler, boşluk dışında başka herhangi bir karakter

Boşluk, bir dize içinde veya iki sayıyı ayırmadıkça yok sayılır.

Dize / karakter belirtimi:

  • Dizeler a ile sınırlandırılır "ve a \ile karşılaşıldığında bir sonraki karakter kaçmalıdır.
  • Karakterler a 'ile başlar ve karakterden sonraki karakter 'bir dize değişmezine dönüştürülmelidir. 'a->"a"
  • ' ondan sonra her zaman bir karakter olacak
  • Kapanış teklifleri otomatik olarak eklenmelidir

Kurallar:

  • Biçimine evalizin verilmez

Giriş çıkış:

  • Giriş STDIN, işlev parametreleri veya dilinizin eşdeğeri aracılığıyla alınabilir.
  • Çıktı bir dizi veya dilinizin en yakın eşdeğeri olmalıdır.

5
@ Doonono, cidden mi?
LegionMammal978

4
@ LegionMammal978 Evet, cidden.
Alex

1
Çıktı STDOUT'a olabilir mi?
Kapı tokmağı

2
@ZachGates Evet, çoğu dil \ bir kaçış karakteri olarak da işliyor, bu yüzden evet, dilinizin açıkça ihtiyacı varsa bundan kaçmanız gerekecek.
Downgoat

1
Ayrıca, ilk örnekte, sonucun ilk öğesi '"PPCG"'sadece yerine "PPCG"mi olmalıdır?
Monica'nın Davası

Yanıtlar:


8

Retina , 68 64 63 bayt

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

veya

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

Sanırım bu, zorlu test senaryolarında yer almayanlar da dahil olmak üzere tüm korkak vakaları kapsıyor.

Çevrimiçi deneyin!


Dang, bu kısa. Güzel yapılmış!
Monica'nın Davası

Bunu 95 bayt ES6 işlevine çevirebildim. Normal ifadelerin tersi şekilde çalışmaması dışında 80 olurdu (çok fazla kenar durumu).
Neil

2

Ruby, 234 bayt

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

Gördüğüm find(&:itself)hileyi kullanmayı denedim ... bir yerlerde, ama görünüşe göre .itselfaslında bir yöntem değil. Ayrıca, regex'i golf oynamaya çalışıyorum, ama zaten okunamıyor.

Eğer herhangi bir fantezi şekilde (yani dizeleri dizide alıntı yapmak zorunda değilsiniz) çıktı gerekmiyorsa bir sürü lot bayt kaydedebilirsiniz:

Hala Ruby, 194 bayt:

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

Eminim ben daha fazla golf olabilir, ama nasıl emin değilim.


Yakında gelmedi. Golf ile doğrudan bir noktada uğraşmaya başladım ve kızdırmak zorunda kalacağım.


0

Python 3, 228 bayt

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

İşte güzel, uzun, iki katlı.


Python 3'te test edin. İşte bazı örnekler:

$ 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
' ""
['" "', '""']
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.