পাইথন স্ট্রিং আক্ষরিক পার্স করুন


9

চ্যালেঞ্জটি হল পাইথনের মতো স্ট্রিংকে পার্স করা এবং স্ট্রিংয়ের বিষয়বস্তু মুদ্রণ করা।

  • ইনপুট (কমান্ড-লাইন আর্গুমেন্ট বা স্টিডিন) : একটি স্ট্রিং আক্ষরিক (উদাহরণস্বরূপ "hello") (বা একাধিক আক্ষরিক , নীচে স্ট্রিং আক্ষরিক কাঠামো দেখুন)
  • আউটপুট (স্টাডআউট) : স্ট্রিংয়ের সামগ্রী (যেমন hello)

স্ট্রিং পার্স করার নিয়ম:

  • একটি স্ট্রিং আক্ষরিক মিল একক উদ্ধৃতি ( 'a'), ডাবল উদ্ধৃতি ( "a"), ট্রিপল একক উদ্ধৃতি ( '''a''') বা ট্রিপল ডাবল উদ্ধৃতি ( """a""") এর সাথে মিলছে pairs স্ট্রিংটি খোলার ধরণের কোটগুলির প্রথম পুনঃবিবর্তন স্ট্রিংটি শেষ করে।
  • ব্যাকস্ল্যাশ পালাতে: \' মধ্যে একটি স্ট্রিং হয়ে ', \"হয়ে "এবং \\হয়ে \। আপনার অন্য কোনও ব্যাকস্ল্যাশ পলায়নের বাস্তবায়ন করার দরকার নেই। একটি ব্যাকস্ল্যাশ যা একটি পালানোর ক্রমের অংশ নয় এটি একটি ব্যাকস্ল্যাশ থাকে stay
  • স্ট্রিং লিটারেল কনটেন্টেশন: সংলগ্ন স্ট্রিং লিটারালগুলির বিষয়বস্তু সংক্ষিপ্ত হয়। উদাহরণস্বরূপ, "hello" 'world'হয়ে যায় helloworld
  • ইনপুটটিতে এমন শূন্যস্থান থাকতে পারে যা কোনও আক্ষরিক অংশ নয়।
  • আপনার অন্য কোনও ধরণের সাদা জায়গার সমর্থন করার দরকার নেই, ভিতরে বা বাইরের ক্ষেত্রেও নয় neither

অতিরিক্ত নিয়ম:

  • eval, execএবং অনুরূপ জিনিসগুলিকে আক্ষরিক বা এর অংশগুলি পার্স করার অনুমতি নেই
  • আপনি ধরে নিতে পারেন যে ইনপুটটি বৈধ।
  • আপনি 1023 অক্ষরের সর্বাধিক ইনপুট দৈর্ঘ্য ধরে নিতে পারেন।

উদাহরণ:

  • "hello" ' world' -> hello world
  • """\"""'\\\A""" -> """'\\A
  • ( '''"""'''"""'''""" ) (প্রথম বন্ধনী ছাড়া, তবে ফাঁকা স্থান সহ) -> """'''

সংক্ষিপ্ততম কোড জিতেছে।


আউটপুটটি কী এমন কোনও ফর্ম হতে হবে যা সংরক্ষণ করা যায়, বা এটি মুদ্রণ করার জন্য এবং এটি দিয়ে সম্পন্ন করার পক্ষে যথেষ্ট?
ডেভিডসি

@ ডেভিড মুদ্রণ এটি আপনার যা করতে হবে তা কেবল।
ফ্লর্নকোকে

সুতরাং (উদাঃ) "\ z" এ, কোডটি বিশেষত ব্যাকস্ল্যাশ এবং জেড আউটপুট করার জন্য প্রয়োজনীয়? তবে double 'কেবলমাত্র একটি প্রেরণীয় হয়ে ওঠে, এমনকি যদি এটি ডাবল-কোটাস বা ট্রিপল-কোটের ভিতরে উপস্থিত হয়? এটা কি ঠিক?
ব্রেডবক্স

নিখুঁতভাবে
ফ্লর্নকোয়াক

কোডটি কাঁচা স্ট্রিং সমর্থন করা উচিত? এবং অ কাঁচা এবং কাঁচা স্ট্রিং সংমিশ্রণ সম্পর্কে কি?
বাকুরিউ

উত্তর:


4

পার্ল, 54 টি অক্ষর

#!/usr/bin/perl -p
s/ |("""|'''|"|')((\\?.)*?)\1/$2/g;s/\\(["'\\])/$1/g

আমি যেমন এটি পোস্ট করছিলাম তখন আমি লক্ষ্য করেছি যে এটি জ্যান ডিভোরাকের রুবি সমাধানের সাথে প্রায় একই। আসলে এটি কতটা সাদৃশ্যপূর্ণ তা থেকে আমি কিছুটা বাইরে আছি, তবে আমি বলতে যাচ্ছি "গ্রেট মাইন্ডস একই রকম চিন্তা করে" এবং এটিকে চলতে দিন।

এই প্রোগ্রামটি পার্ল স্ক্রিপ্টগুলিতে অক্ষর গণনা করার ক্ষেত্রে একটি অদ্ভুত কোণার বিষয়টিকে হাইলাইট করেছে: আমার পাঠ দ্বারা, স্ক্রিপ্টে একক-উদ্ধৃতি উপস্থিতি মানে -pআমার মোটের দিকে দুটি অক্ষর হিসাবে বিকল্পটি গণনা করা দরকার । সাধারণত, পার্ল স্ক্রিপ্টের আকারগুলি গণনা করার সময়, বিকল্পগুলির প্রাথমিক ড্যাশ অক্ষরটিকে বিনামূল্যে হিসাবে বিবেচনা করা হয়, ন্যায়সঙ্গতভাবে যে এটি -eপ্রোগ্রামটি যথাযথভাবে উপস্থাপন করে এটি দিয়ে বান্ডেল করা যায় ... তবে তারপরে আপনাকে কোনও অতিরিক্ত পলায়নের জন্য অ্যাকাউন্টও করতে হবে আপনাকে কমান্ড-লাইনে স্ক্রিপ্টটি প্রবেশ করতে হবে। একক-কোটায় প্রচুর পলায়ন প্রয়োজন, সুতরাং শাস্তি এড়াতে আমাকে এটিকে কোনও ফাইল থেকে চালানো স্ক্রিপ্ট হিসাবে গণনা করতে হবে, এবং তাই আমি #!/usr/bin/perlবিনামূল্যে পেয়েছি , তবে কোনও বিকল্প অক্ষর নয়। এটি কিছুটা বিভ্রান্তিকর।


2
আপনি যদি আলাদা হতে চান (('|")\2{2}?)তবে একই দৈর্ঘ্যটি("""|'''|"|')
পিটার টেলর

3

সি, 178 টি অক্ষর

char*p,*q,b[1024];d;main(t){for(p=q=gets(b);*p=*q++;)
d?*p==92&!(*q-*p&&*q-34&&*q-39)?*p++=*q++:*p-d||t&&*q-d|q[1]-d?++p:
(d=0,q+=2*t):*p-32?d=*p,t=*q==d&q[1]==d,q+=2*t:0;puts(b);}

এটি সেই সি সমাধানগুলির মধ্যে একটি যেখানে সমস্ত কিছু একটি টেরিনারি-অপারেটর চেইন গ্যাংয়ের ভিতরে করা হয়।

প্রোগ্রামটি একই বাফারে অক্ষরগুলি অনুলিপি করে, মেটাচ্যাকারগুলিকে ওভাররাইট করে কাজ করে। dএকটি স্ট্রিংয়ের অভ্যন্তরে ডিলিমিটার ধারণ করে এবং ডিলিমিটারটি tট্রিপল-কোট হলে সত্য হয় is


আমি মনে করি আপনাকে লুপ নিয়ন্ত্রণ ভেরিয়েবলের শর্তযুক্ত অতিরিক্ত বর্ধন অন্তর্ভুক্ত করতে হবে। 'ফু' বারের জন্য এটি ফু-আরিকে দেয়, যা দেখে মনে হয় এটি la এর সাথে প্রতিস্থাপন করে then
manatwork

আসলে, সেই উদাহরণটি অবৈধ ইনপুট। 'foo\\'স্ট্রিং foo refers বোঝায় যা তারপরে এমন একটি চরিত্র দ্বারা অনুসরণ করা হয় যা না হয় হোয়াইটস্পেস বা স্ট্রিং ডিলিমিটার।
ব্রেডবক্স

উফ। আমি সেই নিয়মটি ভুল বুঝেছি। তাহলে অবশ্যই আপনার কোডটি সঠিক।
manatwork

3

রুবি, 74 73 অক্ষর

puts gets.gsub(/('''|"""|'|")((\\?.)*?)\1|./,'\2').gsub /\\([\\'"])/,'\1'

এখানে মূলটি দুটি রেজেক্স: প্রথমটি স্ট্রিংয়ের সীমানা নির্ধারণ করে এবং কেবলমাত্র সামগ্রীগুলি নির্বাচন করে। এই পরিবর্তনটি স্ট্রিংয়ের অভ্যন্তরে না থেকে সমস্ত কিছু সরিয়ে ফেলার জন্য রয়েছে এবং এটি অবিরত স্ট্রিংগুলিও ড্রপ করে।ব্যাকস্ল্যাশগুলি যেকোনো কিছু অনুসরণ করার পরে প্যাসিভ-alচ্ছিক হিসাবে বিবেচিত হয়। সুতরাং,যেহেতু রেজেক্স ইঞ্জিন (\\?.)বৈধ ইনপুটগুলির জন্য ব্যাকট্র্যাক করবে না (ধন্যবাদ @ ব্র্যাডবক্স), একক ব্যাকস্ল্যাশ সেখানে মেলাতে পারে না। অলস পুনরাবৃত্তির মাধ্যমে উদ্ধৃতিগুলি পরিচালনা করা হয়। দ্বিতীয় রেজেক্স তারপরে প্রতিটি পালাতে সক্ষম অক্ষরের আগে একটি ব্যাকস্ল্যাশ ফেলা করে। বামদিকের বিকল্পটি সর্বদা বাছাই করতে ইঞ্জিনের উপর রেজেক্স নির্ভর করে।

আমি একটি রাষ্ট্র-মেশিনের পদ্ধতির বিষয়টিও বিবেচনা করেছি, তবে এটি রেগেক্স সমাধানের তুলনায় বেশ বড় (19 টি রাজ্য x 4 চরিত্রের ক্লাস) পরিণত হয়েছে। কারও আগ্রহ থাকলে আমি এখনও স্টেট মেশিন পোস্ট করতে পারি।


এই পদ্ধতির সাথে একটি ছোটখাটো ত্রুটি: 'foo bar' বারের পরিবর্তে 'ফু' বার
manatwork

@ মান্যাট ওয়ার্ক এটি সঠিক, যদি না বিন্যাসে কিছু হারিয়ে যায়। প্রথম ব্যাকস্ল্যাশ দ্বিতীয়টি থেকে পালিয়ে যায়। 'foo\\'প্রথম স্ট্রিংটি এবং bar'ইনপুটটি যখন স্ট্রিং প্রসঙ্গে হয়'foo\\'bar'
জন ডিভোরাক

উফ। আমি আগে এটি কীভাবে গণনা করেছি তার কোনও ধারণা নেই। অবশ্যই এটি সঠিক। দুঃখিত।
manatwork

যখন আমি এটি চালানোর চেষ্টা করি তখন আমি একটি ত্রুটি বার্তা পাই: "নেস্টেড *? + ইন রিজেক্সেপ"। আমার দরকার এমন কোনও ন্যূনতম সংস্করণ বা রানটাইম পতাকা আছে?
ব্রেডবক্স

@ ব্র্যাডবক্স আমি অন্যান্য সংস্করণগুলি পরীক্ষা করে দেখিনি, তবে আমি রুবি ১.৯.৩ চালিয়ে যাচ্ছি (জেআরবি ১.২.২)। আমি কি কমপক্ষে 1.9.3 ধরে ধরে এটিকে সম্পাদনা করব?
জন ডিভোরাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.