একটি স্ট্যাক-ভিত্তিক ভাষা টোকেনাইজ করুন


15

আমি স্ট্যাকবোট নামে আরেকটি স্ট্যাক-ভিত্তিক গল্ফিং ভাষা নিয়ে কাজ করছি । এই চ্যালেঞ্জটিতে আপনি স্ট্যাকবোটের জন্য একটি টোকেনাইজার লিখবেন (বা সত্যিই কোনও সাধারণ স্ট্যাক-ভিত্তিক ভাষা)।

উদাহরণ

"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"
  • ' এর পরে সর্বদা একটি চরিত্র থাকবে
  • সমাপ্ত কোটগুলি স্বয়ংক্রিয়ভাবে inোকানো উচিত

নিয়মাবলী:

  • কোনও রূপের evalঅনুমতি নেই

ইনপুট আউটপুট:

  • এসটিডিআইএন, ফাংশন পরামিতি বা আপনার ভাষার সমতুল্যের মাধ্যমে ইনপুট নেওয়া যেতে পারে।
  • আউটপুটটি একটি অ্যারে বা আপনার ভাষার নিকটতম সমতুল্য হওয়া উচিত।

5
@ ডুরকনব, সিরিয়াসলি?
LegionMammal978

4
@ লেজিওনম্যামাল978 হ্যাঁ, গুরুতরভাবে।
অ্যালেক্স এ।

1
আউটপুট STDOUT হতে পারে?
ডোরকনবব

2
@ জ্যাচগেটস আচ্ছা হ্যাঁ, বেশিরভাগ ভাষাগুলি হ'ল একটি পালানোর চরিত্র হিসাবে, তাই হ্যাঁ, আপনার পালাতে হবে যে যদি আপনার ভাষাটির স্পষ্টতই প্রয়োজন হয়।
ডাউনগোট

1
এছাড়াও, প্রথম উদাহরণে, ফলাফলের প্রথম উপাদানটি কি ন্যায়বিচারের '"PPCG"'পরিবর্তে হওয়া উচিত "PPCG"?
ফান্ড মনিকার লসুইট

উত্তর:


8

রেটিনা , 68 64 63 বাইট

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

অথবা

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

আমি মনে করি এটি চ্যালেঞ্জের পরীক্ষার কেসগুলিতে আচ্ছাদিত নয় এমন সমস্ত ছদ্মবেশী প্রান্তের বিষয়গুলিও coversেকে রাখে।

এটি অনলাইন চেষ্টা করুন!


ডাং, এটি সংক্ষিপ্ত। সুন্দরভাবে সম্পন্ন!
তহবিল মনিকার লসুইট

আমি এটি একটি 95 বাইট ইএস 6 ফাংশনে অনুবাদ করতে সক্ষম হয়েছি। এটি ৮০ হয়ে যেত যদি রেজেক্সপগুলি অন্যভাবে কাজ করে না (অনেকগুলি প্রান্তের কেস)।
নীল

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আসলে কোনও পদ্ধতি নয়। এছাড়াও, আমি রেজেক্সকে নীচে গল্ফ করার কাজ করছি, তবে এটি ইতিমধ্যে অপঠনযোগ্য।

যদি আমাদের কোনও অভিনব উপায়ে আউটপুট না নিতে হয় (যেমন স্ট্রিংগুলিকে অ্যারেতে উদ্ধৃতি দিতে হয় না) আমি একটি সম্পূর্ণ লোটা বাইট সংরক্ষণ করতে পারি:

এখনও রুবি, 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?)

আমি নিশ্চিত যে আমি এটি আরও গল্ফ করতে পারি, তবে কীভাবে করব তা আমি নিশ্চিত নই।


অসমাপ্ত শীঘ্রই আসছে। আমি সরাসরি কোনও সময়ে গল্ফদের সাথে ফিড করতে শুরু করি এবং আমাকে এটি ছড়িয়ে দিতে হবে।


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
' ""
['" "', '""']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.