एक स्टैक-आधारित भाषा को टोकन करें


15

मैं Stackgoat नामक एक अन्य स्टैक-आधारित गोल्फिंग भाषा पर काम कर रहा हूं । इस चुनौती में आप 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"
  • ' हमेशा इसके बाद एक चरित्र होगा
  • समापन उद्धरण ऑटो-डाला जाना चाहिए

नियम:

  • किसी भी प्रकार की evalअनुमति नहीं है

इनपुट आउटपुट:

  • इनपुट STDIN, फंक्शन पैरामीटर्स या आपकी भाषा के समकक्ष के माध्यम से लिया जा सकता है।
  • आउटपुट एक सरणी या आपकी भाषा के निकटतम समकक्ष होना चाहिए।

5
@Doorknob, गंभीरता से?
लीजियनममाल 978

4
@ LegionMammal978 हाँ, गंभीरता से।
एलेक्स ए।

1
क्या आउटपुट STDOUT में हो सकता है?
दरवाज़े

2
@ZachGates ठीक है, ज्यादातर भाषाएं एक भागने के चरित्र के रूप में भी संभालती हैं, इसलिए हां, आपको बचना होगा कि अगर आपकी भाषा को स्पष्ट रूप से इसकी आवश्यकता है।
डाउनगेट

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 होता है सिवाय इसके कि रेग्जैक्स दूसरे तरीके से काम नहीं करता है (बहुत सारे किनारे मामले)।
नील

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

पायथन 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())],[]))))))

यहाँ एक अच्छा, लंबा, दो-लाइनर है।


अजगर 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
' ""
['" "', '""']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.