সিনট্যাক্স-পরীক্ষককে উপস্থাপন করুন


10

প্রিলিওড হ'ল এক প্রগা .় প্রোগ্রামিং ল্যাঙ্গুয়েজ, যার খুব কম, তবে অস্বাভাবিক, কোনও বৈধ প্রোগ্রাম গঠনের ক্ষেত্রে বিধিনিষেধ রয়েছে। প্রিন্টযোগ্য এএসসিআইআই পাঠ্যের যে কোনও ব্লক ("ব্লক" যার অর্থ মুদ্রণযোগ্য এএসসিআইআইয়ের লাইনগুলি নিউলাইনগুলি - 0x0A দ্বারা পৃথক করা হয়েছে) বৈধ হয় তবে শর্ত থাকে:

  • পাঠ্যের প্রতিটি (উল্লম্ব) কলামে সর্বাধিক একটি (এবং থাকে )
  • তাদের উল্লম্ব অবস্থান উপেক্ষা করে, (এবং )ভারসাম্যযুক্ত, (অর্থাত প্রতিটি একে একে একে একে একে একে একে )ডানদিকে এবং তদ্বিপরীত।

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা প্রিন্টযোগ্য এএসসিআইআই এবং নিউলাইনগুলিকে ধারণ করে একটি স্ট্রিং প্রদান করে এটি নির্ধারণ করে যে এটি কোনও বৈধ প্রিলিওড প্রোগ্রাম গঠন করে। আপনি STDIN (বা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিতে পারেন। ফলাফলটি আপনার পছন্দের দুটি স্থায়ী সত্যবাদী / মিথ্যা মান ব্যবহার করে, STDOUT এ ফেরত বা মুদ্রণ করা যেতে পারে ।

আপনি অনুমান করবেন না যে ইনপুটটি আয়তক্ষেত্রাকার।

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম জমা (বাইটে) জিতেছে।

উদাহরণ

নিম্নলিখিতগুলি বৈধ প্রিলিওড প্রোগ্রামগুলি (বাস্তবে এগুলি এমনকি বাস্তব প্রিলিওড প্রোগ্রামগুলি):

?1-(v  #1)-             
1   0v ^(#    0)(1+0)#)!
    (#)  ^#1-(0 #       
1(#  1) v #  - 1+)
    vv (##^v^+
? v-(0 # ^   #)
?
  1+              1-!

এবং এখানে বেশ কয়েকটি ইনপুট রয়েছে, সেগুলি সমস্তই অবৈধ :

#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)

প্রিলিডে কি এমন মন্তব্য রয়েছে যা ঘনিষ্ঠ পেরেনকে আটকে দিতে পারে?
অ্যালেক্স এ

@ অ্যালেক্স নং উপরোক্ত নিয়মগুলি আসলে কোনও প্রোগ্রাম বৈধ কিনা তা সিদ্ধান্ত নেওয়ার পক্ষে রয়েছে।
মার্টিন এন্ডার

শীতল, স্পষ্ট করার জন্য ধন্যবাদ। শুধু নিশ্চিত করতে চেয়েছিলেন।
অ্যালেক্স এ।

বিধি 1 - "পাঠ্যের প্রতিটি কলামে সর্বাধিক একটি (এবং) থাকে"; উদাহরণ 1, লাইন 2: "1 0v ^ (# 0) (1 + 0) #)!" -> আমি 3 )এবং 2 দেখুন (। এটি প্রতি লাইনে 1 টি হওয়া উচিত নয়?
ইসমাইল মিগুয়েল

1
@ ইসমাইল মিগুয়েল "কলাম" সাধারণত উল্লম্ব রেখাগুলি (বিশেষত গ্রিডের প্রসঙ্গে) বোঝাতে বোঝা যায়। যদিও আমি তা স্পষ্ট করে দিয়েছি।
মার্টিন এন্ডার

উত্তর:


3

সিজেম, 57 56 বাইট

qN/z_{_"()"--W<},,\s:Q,{)Q/({_')/,\'(/,-}:T~\sT0e>+z+}/!

খুব দীর্ঘ, অনেক গল্ফ করা যেতে পারে। আমি একবার এটি গল্ফ করলে ব্যাখ্যা যুক্ত করা হবে।

সংক্ষিপ্ত বর্ণনা

কোডটিতে দুটি চেক রয়েছে:

  • প্রথম ফিল্টারটি প্রতিটি কলামে সর্বাধিক 1 টি বন্ধনী হিসাবে পরীক্ষা করে। ফিল্টারটির চূড়ান্ত আউটপুট হ'ল 1 টিরও বেশি বন্ধনী সহ কলামগুলির সংখ্যা।
  • দ্বিতীয় আমরা ইনপুটটিকে কলামের প্রধান বিন্যাসে রূপান্তর করি এবং তারপরে প্রতিটি সূচকে এটি দুটি ভাগে ভাগ করি।
    • এই দুটি অংশের প্রতিটিটিতে ( Number of "(" - Number of ")") একে অপরের প্রশংসা করা উচিত। সুতরাং আপনি যখন এগুলি যুক্ত করবেন তখন এর ফলাফল 0 টি হওয়া উচিত this এই সম্পত্তিটি ব্যর্থ করে এমন কোনও অংশ পুরো ইনপুটটির সাথে মেলানো বন্ধনী নেই।
    • আমাকে এটিও নিশ্চিত করতে হবে যে "(" "" এর বাম দিকে রয়েছে) "। এর অর্থ হ'ল Number of "(" - Number of ")"ডান দিকের ব্লকের জন্য মানটি নেতিবাচক হতে পারে না।

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


6

পাইথন 2, 128 119 105 বাইট

def F(p):
 v=n=1
 for r in map(None,*p.split("\n")):A,B=map(r.count,"()");n+=B-A;v*=n<2>A+B
 return n*v>0

আপনি কি জানেন যে আপনি পাইথন 2 এ কোনওটিই ম্যাপ করতে পারবেন না ?

ব্যাখ্যা

আমরা প্রিলিওড স্থানান্তর করে শুরু করতে চাই যাতে কলামগুলি সারি হয়ে যায়। সাধারণত আমরা এটি সহ করতাম zip, তবে যেহেতু zipসর্বাধিক স্বল্পতম দৈর্ঘ্যের দৈর্ঘ্য হয় এবং itertools.zip_longestকোড-গল্ফের পক্ষে অনেক দীর্ঘ হয়, তাই মনে হয় আমরা যা চাই তা করার কোনও ছোট উপায় নেই ...

ম্যাপিং ব্যতীত None:

>>> print map(None,*[[1,2,3],[4],[5,6]])
[(1, 4, 5), (2, None, 6), (3, None, None)]

দুর্ভাগ্যক্রমে (বা বরং, ভাগ্যক্রমে সমস্ত নন-গল্ফ উদ্দেশ্যে), এটি কেবল পাইথন 2 এ কাজ করে।

হিসাবে nএবং v:

  • nস্ট্যাকের মতো কাজ করে, গণনা করা 1 - <number of unmatched '(' remaining>। প্রত্যেক জন্য (আমরা দেখতে আমরা বিয়োগ 1, এবং প্রতি জন্য )আমরা দেখতে আমরা যোগ 1. অত: পর যদি n >= 2যেকোনো সময়ে, তাহলে আমরা অনেক দেখা করেছি )s এবং প্রোগ্রাম অবৈধ। যদি n1 এ শেষ না হয়, তবে আমাদের কমপক্ষে একটি তুলনামূলকভাবে (অবশিষ্ট রয়েছে।
  • vচেক বৈধতা এবং শুরু হয় 1. এ যদি প্রোগ্রাম কি কখনো অবৈধ (হয় n >= 2বা A+B >= 2), তারপর vচিহ্ন দুর্বলতা 0 হয়ে যায়।

সুতরাং প্রোগ্রামটি বৈধ হয়, তবে শেষ পর্যন্ত আমাদের অবশ্যই থাকতে হবে n = 1, v = 1। প্রোগ্রামটি যদি অবৈধ হয়, তবে শেষ অবধি আমাদের অবশ্যই হয় v = 0, বা উচিত v = 1, n <= 0। সুতরাং বৈধতা সংক্ষিপ্তভাবে হিসাবে প্রকাশ করা যেতে পারে n*v>0

(14 টি বাইট বন্ধ করে দেওয়া বেশ কয়েকটি ভাল পরামর্শের জন্য @ ফার্সামকে ধন্যবাদ!)

পূর্ববর্তী, আরও পঠনযোগ্য জমা:

def F(p):
 p=map(None,*p.split("\n"));v=n=0
 for r in p:R=r.count;A=R("(");B=R(")");n+=A-B;v|=A+B>1or n<0
 return n<1>v

এটি একটি উন্মাদ ব্যবহার map...
xnor

1
119 -> 106def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
feersum

@ ফেয়ারসাম ধন্যবাদ! আমি পরিবর্তন করার প্রয়াসে হয়েছে চাই orতুলনা chaining মধ্যে, কিন্তু আমি পরিবর্তন ভাবিনি |=মধ্যে *=। যদিও আরও বেশি পিছনের জিনিস তৈরি করে আরেকটি বাইট
ছুঁড়েছে

2

জে, 64 বাইট

ইনপুটটি একটি পেছনের নতুন লাইনের সাথে স্ট্রিং। আউটপুট 0 বা 1 হয়।

(0=(1<|s)s+[:(|@{:+(0>])s)[:+/\]s=.+/@:)@(1 _1 0{~[:'()'&i.];.2)

ব্যবহারের উদাহরণ

   ]in=.'#(#)##',LF,'###',LF,'###(#)',LF
#(#)##
###
###(#)

   ((0=(1<|s)s+[:(|@{:+(0>])s)[:+/\]s=.+/@:)@(1 _1 0{~[:'()'&i.];.2)) in
0

পদ্ধতিটি নিম্নরূপ:

  • নিউলাইনগুলিতে ইনপুট কেটে একটি ম্যাট্রিক্সে রাখুন ];.2
  • মানচিত্র (/ )/ anything elseমধ্যে 1/ -1/0 1 _1 0{~[:'()'&i.]
  • একটি s=.+/@:ক্রিয়া যুক্ত করে একটি ক্রিয়া সংজ্ঞা দেয় যা ক্রিয়া ক্রিয়া অ্যারে আউটপুট যোগ করে
  • কলামগুলিতে মান যুক্ত করুন ]s

    • ()প্রতিটি উপসর্গে ইতিবাচক ভারসাম্য পরীক্ষা করুন[:(0>])s)[:+/\]
    • ()পুরো তালিকায় সমান ভারসাম্য পরীক্ষা করুন (যেমন শেষ উপসাগরে) |@{:@]
  • কলামগুলিতে অ্যাবস (মান) যুক্ত করুন এবং প্রতিটি উপাদানকে সর্বোচ্চ 1 এর জন্য পরীক্ষা করুন (1<|s)s

  • পূর্ববর্তী সমস্ত চেকগুলি ব্যর্থতায় ইতিবাচক ফল পেয়েছে আমরা ইনপুটটির বৈধতা পেতে আমরা এগুলি যুক্ত করি এবং 0 এর সাথে তুলনা করি 0=]


2

জে, 56 বাইট

3 :'*/0<: ::0:(+/\*:b),-.|b=.+/+.^:_1]0|:''()''=/];.2 y'

এটি একটি অনামী ফাংশন যা একটি পিছনে থাকা নতুন লাইনের সাথে একটি স্ট্রিং গ্রহণ করে এবং 0 বা 1 ফিরে আসে right

  • ];.2 yঅন্যান্য জে জমা দেওয়ার মতো, yতার শেষ চরিত্রের সমস্ত উপস্থিতিতে স্ট্রিংটি কেটে দেয় (যার কারণে ইনপুটটিকে একটি অনুচ্ছেদে নতুন লাইনের প্রয়োজন হয়) এবং একটি আয়তক্ষেত্রাকার ম্যাট্রিক্স তৈরি করে যার সারিগুলি টুকরো টুকরো হয়, প্রয়োজনে স্পেস দিয়ে প্যাড করে।

  • '()'=/প্রথমে সেই ম্যাট্রিক্সের প্রতিটি চরিত্রের সাথে (এবং তারপরে )দুটি 0-1 ম্যাট্রিকের একটি তালিকা ফেরত দেওয়ার সাথে তুলনা করে ।

  • +.^:_1]0|:দুটি ম্যাট্রিকের তালিকাটিকে জটিল সংখ্যার একক ম্যাট্রিক্সে পরিণত করে। এখনও পর্যন্ত প্রোগ্রাম প্রতিটি ইনপুটটিতে (1 তে, প্রতিটি )আইতে এবং অন্য প্রতিটি চরিত্রকে 0 তে পরিণত করে।

  • b=.+/সেই জটিল ম্যাট্রিক্সের সারিগুলির যোগফল নির্ধারণ করে b

  • -.|b1- | z | এর একটি তালিকা তৈরি করে প্রতিটি z- র জন্য নির্মিত b। প্রতিটি কলামে সর্বাধিক একটি একক প্রথম বন্ধনীর এই শর্তটি 1- | z | এ সমস্ত সংখ্যায় অনুবাদ করে nonnegative হচ্ছে।

  • +/\*:bসংখ্যা বর্গের অঙ্কের চলমান ভেক্টর হয় b। যদি প্রতিটি কলামে সর্বাধিক একটি প্রথম বন্ধনী থাকে তবে এতে থাকা সংখ্যার স্কোয়ারগুলি bসমস্ত 0, 1 বা -1 হয়। ,যোগসূত্র এর 1- ভেক্টর দিয়ে এই ভেক্টরটি | z- র | 's।

  • এখন সব আমরা কি করতে পরীক্ষা আমাদের যোগসূত্র ভেক্টরের এন্ট্রি প্রয়োজন vনন-নেগেটিভ reals সংখ্যা এই প্রায় হয়, */0<:vযে এটি একটি ত্রুটি ঘটায় যদি কিছু এন্ট্রি ছাড়া v, বাস্তব নয় তাই আমরা প্রতিস্থাপন <:সঙ্গে <: ::0:যা শুধু ত্রুটির ক্ষেত্রে 0 ফেরৎ ।


জটিল সংখ্যাগুলির সাথে দুর্দান্ত ধারণা তবে আপনাকেও পরীক্ষা করে দেখতে হবে 0={:+/\*:bকারণ যেমন (বৈধ নয়।
এলোমেলো

ওহ, আপনি ঠিক বলেছেন, @ রেন্ডোমরা, আমি ভুলে গেছি!
ওমর

1
0=(-|)vঅ-নেতিবাচক বাস্তবগুলি পরীক্ষা করার জন্য এটি 2 বাইট কম sh (আসুন সিজেমকে পরাজিত করুন!: পি)
এলোমেলোভাবে

1
ওহ, এবং invপরিবর্তে ^:_1 অন্য একটি বাইট সংরক্ষণ করে।
এলোমেলোভাবে

1
56 ফিরে যান (ব্যালান্স পরীক্ষণ সহ): 3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'
এলোমেলোভাবে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.