এম এবং এস বর্ণগুলি দিয়ে তৈরি ASCII- আর্ট উইন্ডোগুলি সনাক্ত করুন


28

একটি উইন্ডো একটি ASCII- শিল্প বর্গ যা কমপক্ষে 3 এর বিজোড় পাশের দৈর্ঘ্য সহ প্রান্তের চারপাশে একক অক্ষরের সীমানা পাশাপাশি মাঝখানে উল্লম্ব এবং অনুভূমিক স্ট্রোক রয়েছে:

#######
#  #  #
#  #  #
#######
#  #  #
#  #  #
#######

একটি এমএস উইন্ডো একটি উইন্ডো যেখানে সীমানাটি কেবল অক্ষর Mএবং এর তৈরি করে S। আপনার কাজটি এমন একটি প্রোগ্রাম (বা ফাংশন) লিখুন যা স্ট্রিং নেয় এবং ইনপুটটি বৈধ এমএস উইন্ডো হলে সত্যবাদী মান এবং যদি তা না হয় তবে একটি মিথ্যা মান value

বিশেষ উল্লেখ

  • আপনি ইনপুটটিকে নতুন লাইন দ্বারা পৃথক স্ট্রিং বা প্রতিটি লাইনের প্রতিনিধিত্ব করে স্ট্রিংগুলির অ্যারে হিসাবে নিতে পারেন।
  • এমএস উইন্ডোয়ের সীমানায় এম এবং এস বর্ণগুলির মিশ্রণ থাকতে পারে তবে অভ্যন্তরীণটি সর্বদা ফাঁকা স্থানের সমন্বয়ে থাকবে।
  • আপনি কেবল নতুন লাইনের সাথে উইন্ডো, বা কেবল নতুন লাইনের পিছনে থাকা উইন্ডোগুলি সনাক্ত করতে বেছে নিতে পারেন, তবে উভয়ই নয়।

পরীক্ষার মামলা

Truthy:

MMM
MMM
MMM

SMSMS
M M S
SMSMM
S S M
SMSMS

MMMMMMM
M  S  M
M  S  M
MSSSSSM
M  S  M
M  S  M
MMMMMMM

Falsey:

Hello, World!

MMMM
MSSM
MS M
MMMM

MMSMM
M S.M
sSSSS
M S M
MMSMM

MMMMMMM
M  M  M
MMMMMMM
M  M  M
MMMMMMM

MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM

MMSSMSSMM
M   M   M
S   S   S
S   S  S
MMSSMSSMM
S   S   S
S   S   S
M   M   M
MMSSMSSMM

3
এটি ASCII আর্টসের দুর্দান্ত মোড়, একটি নির্দিষ্ট কাঠামো সনাক্ত করার সিদ্ধান্ত গ্রহণের সমস্যা।
xnor

4
@ এক্সনোর আমার মনে হচ্ছে আমরা যেমন বিপরীত এএসসিআইআই আর্টের জন্য আলাদা ট্যাগ চাই।
ফলটি Esolanging

2
আসকি শিল্পের সাথে নির্দিষ্ট না থাকলেও প্যাটার্ন মিলটি কোনও নতুন ট্যাগের জন্য ভাল পছন্দ হতে পারে
ধ্বংসাত্মক লেবু

আপনি কি দুটি বা দুটি টেস্ট কেস যুক্ত করতে পারেন যেখানে স্ট্রিংটি আয়তক্ষেত্রাকার অ্যারে গঠন করে না?
গ্রেগ মার্টিন

1
@ বিস্তৃত, আপনি ঠিক বলেছেন! সম্ভবত চ্যালেঞ্জটির স্পষ্টতা দরকার
ক্রিস এম

উত্তর:




7

গ্রিম , 39 38 বাইট

জগারবকে 1 বাইট বাঁচানোর জন্য ধন্যবাদ।

e`BB/BB/W+ W/+
B=W|B/W\ * W/\ /*
W=[MS

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

আমি নিশ্চিত নই যে পুনরাবৃত্তাকার নন-টার্মিনাল ব্যবহারের চেয়ে পৃথক উইন্ডো উপাদানগুলির বর্গক্ষেত্রের অনুপাতটি কার্যকর করার একটি সহজ উপায় আছে কিনা, তবে এটি বেশ ভালভাবে কাজ করছে বলে মনে হয়।

ব্যাখ্যা

নীচ থেকে প্রোগ্রামটি পড়া ভাল।

W=[MS

এটি কেবল একটি অযৌক্তিক সংজ্ঞা দেয় (যা আপনি আয়তক্ষেত্রের সাথে মেলে এমন একটি সাবরুটিন হিসাবে ভাবতে পারেন) Wযা কোনও Mবা একটি S( ]লাইনটির শেষে একটি অন্তর্নিহিত ) এর সাথে মেলে ।

B=W|B/W\ * W/\ /*

এটি একটি নন-টার্মিনাল সংজ্ঞায়িত করে Bযা আউটপুট প্রায় এক চতুর্থাংশের সাথে মেলে, যেমন বাম এবং উপরের সীমানার সাথে একটি উইন্ডো প্যানেল। এটার মতো কিছু:

MSM
S  
M  

এই উইন্ডো প্যানেলটি বর্গক্ষেত্র কিনা তা নিশ্চিত করার জন্য, আমরা Bপুনরাবৃত্তভাবে সংজ্ঞা দিই । এটি হয় একটি উইন্ডো চরিত্র W, বা এটি B/W\ * W/\ /*যা ডান এবং নীচে এক স্তর যুক্ত করে। এটি কীভাবে এটি করে তা দেখতে, আসুন কয়েকটি সিনট্যাকটিক চিনির অপসারণ:

(B/W[ ]*)(W/[ ]/*)

এটি একই, কারণ অনুভূমিক সংক্ষিপ্ত বিবরণ দুটি লেখা যেতে পারে ABবা A Bতবে লম্বালম্বীর তুলনায় লম্বালম্বী তুলনামূলক কম থাকে তবে পূর্ববর্তীটির /উচ্চতর হয়। সুতরাং B/W[ ]*একটি হল Bএকটি উইন্ডো চরিত্র এবং নীচের জায়গার একটি সারিতে সঙ্গে। এবং তারপরে আমরা অনুভূমিকভাবে যুক্ত করব W/[ ]/*যা স্পেসগুলির একটি কলাম সহ একটি উইন্ডো অক্ষর।

শেষ পর্যন্ত, আমরা এই ননটারমিনালগুলিকে চূড়ান্ত উইন্ডো আকারে একত্রিত করি:

BB/BB/W+ W/+

এটি চারটি উইন্ডো প্যানেল যার Bপরে উইন্ডো অক্ষরের একটি সারি এবং উইন্ডো অক্ষরের একটি কলাম। মনে রাখবেন যে আমরা চারটি উইন্ডো প্যানেল একই আকারের, এর কোনও স্পষ্ট বক্তব্য দিচ্ছি না, তবে সেগুলি যদি না হয় তবে তাদের আয়তক্ষেত্রের সাথে সংযুক্ত করা অসম্ভব।

অবশেষে e`শুরুতে হ'ল একটি কনফিগারেশন যা গ্রিমকে বলে যে পুরো ইনপুটটি এই প্যাটার্নের সাথে মিলে যায় (এবং এটি প্রিন্ট করে 0বা 1তদনুসারে)।


5

জাভাস্ক্রিপ্ট (ES6), 115 113 বাইট

a=>(l=a.length)&a.every((b,i)=>b.length==l&b.every((c,j)=>(i&&l+~i-i&&l+~i&&j&&l+~j-j&&l+~j?/ /:/[MS]/).test(c)))

অক্ষরের অ্যারে একটি অ্যারে হিসাবে ইনপুট নেয় এবং আয় (স্ট্রিং একটি অ্যারে 5 বাইট যোগ করুন) 1অথবা 0। উচ্চতাটি বিজোড় তা যাচাই করার পরে, অ্যারেটি বর্গক্ষেত্র হয় কিনা তা নিশ্চিত করার জন্য প্রতিটি সারি পরীক্ষা করা হয় এবং প্রতিটি বর্ণকে আমরা সেই নির্দিষ্ট অবস্থানে প্রত্যাশা করে এমন একটি বর্ণ (গুলি) হতে যাচাই করা হয়। সম্পাদনা: @ পেট্রিকরোবার্টসকে ধন্যবাদ 2 টি বাইট সংরক্ষণ করা হয়েছে।


আপনি 1 বাইট সংরক্ষণ করতে পরিবর্তন (...).includes(c)করতে পারেন~(...).search(c)
প্যাট্রিক রবার্টস

1
আসলে, আরও ভাল আপনি এটি (...?/ /:/[MS]/).test(c)কেবল 1 এর পরিবর্তে 2 বাইট সংরক্ষণে পরিবর্তন করতে পারেন
প্যাট্রিক রবার্টস

@ পেট্রিকরোবার্টস কিউট, ধন্যবাদ!
নীল

5

পার্ল, 124 123 119 95 93 84

নিম্নলিখিত পার্ল স্ক্রিপ্টটি স্ট্যান্ডার্ড ইনপুট থেকে একজন প্রার্থী এমএস উইন্ডো পড়ে reads এটি প্রার্থী যদি এমএস উইন্ডো এবং শূন্য-বহির্গমন স্থিতি না হয় তবে এটি শূন্য প্রস্থান স্থিতি দিয়ে বেরিয়ে আসে।

এটি দুটি নিয়মিত অভিব্যক্তি উত্পন্ন করে, একটি উপরের, মধ্য এবং নীচের লাইনের জন্য এবং অন্য প্রতিটি লাইনের জন্য একটি এবং তাদের বিপক্ষে ইনপুট পরীক্ষা করে কাজ করে।

ধন্যবাদ, দাদা এবং আবার.

map{$s=$"x(($.-3)/2);$m="[MS]";($c++%($#a/2)?/^$m$s$m$s$m$/:/^${m}{$.}$/)||die}@a=<>

আমি নিশ্চিত না যে প্রস্থান স্থিতি অনুমোদিত হওয়ার কারণে ফলাফল দেওয়ার অনুমতি দেওয়া হয়েছে (যদিও প্রাসঙ্গিক মেটা পোস্ট সন্ধানের জন্য আমার কাছে সময় নেই)। নির্বিশেষে, আপনি কয়েকটি বাইট সংরক্ষণ করতে পারেন:@a=<>;$s=$"x(($.-3)/2);$m="[MS]";map{$a[$_]!~($_%($./2)?"$m$s$m$s$m":"$m${m}{$.}")&&die}0..--$.
দাদা

@ দাদা: ধন্যবাদ! এটি একটি চিত্তাকর্ষক উন্নতি: 24 অক্ষর। (আপনার কোডে "বিভ্রান্ত" $ মি "ছিল, সুতরাং এটি প্রথম দেখায় তার চেয়েও খাটো)) আমি নিশ্চিত ছিলাম না যে প্রস্থান কোডটি দিয়ে ফলাফলটি রিপোর্ট করার অনুমতি দেওয়া হয়েছিল কিনা তবে আমি" প্রোগ্রাম লিখি "( বা ফাংশন) "এই বিশেষ ক্ষেত্রে ফলাফল কীভাবে ফিরে আসে তার সাথে একজনকে নমনীয় হতে দেয়; প্রস্থান কোডগুলি কার্যতঃ * নিক্স পরিবেশের ফাংশন রিটার্ন মান। :-)
nwk

এটি 26 টি অক্ষর করুন।
nwk

1
বাস্তবিক, আমি decrementing করছি $.শেষে দুইবার ব্যবহার করা থেকে বিরত $.-1(বিশেষত পর প্রথমবারের মত এটি ছিল ($.-1)/2, তাই এটি কিছু অতিরিক্ত প্রথম বন্ধনী প্রয়োজন) যাতে $m$m${m}{$.}ভুল নয়। এছাড়াও, আমি এখনই বুঝতে পেরেছি, তবে রেজিক্সগুলি চারপাশে ঘিরে রাখা উচিত ^...$(শেষে বা শুরুতে অতিরিক্ত অক্ষরগুলি তাদের ব্যর্থ করে তোলে), বা সংক্ষিপ্ত: neপরিবর্তে ব্যবহার করুন !~
দাদা

কোন বিষয় নয়, স্পষ্টত আপনি এর neপরিবর্তে ব্যবহার করতে পারবেন না !~(আমি যখন 15 মিনিটের জন্য জাগ্রত ছিলাম তখন আমাকে বার্তা লিখতে হবে না!)। সুতরাং আপনাকে ^...$উভয়ই রেজেক্সে ব্যবহার করতে হবে আমি ভীত।
দাদা

2

গণিত, 166 বাইট

Union[(l=Length)/@data]=={d=l@#}&&{"M","S"}~(s=SubsetQ)~(u=Union@*Flatten)@{#&@@(p={#,(t=#~TakeDrop~{1,-1,d/2-.5}&)/@#2}&@@t@#),p[[2,All,1]]}&&{" "}~s~u@p[[2,All,2]]&

নামহীন ফাংশন অক্ষরের তালিকাদের তালিকা ইনপুট হিসাবে হিসাবে এবং প্রত্যাবর্তন Trueবা False। এখানে একটি কম গোল্ফ সংস্করণ রয়েছে:

(t = TakeDrop[#1, {1, -1, d/2 - 0.5}] &; 
Union[Length /@ data] == {d = Length[#1]}
  &&
(p = ({#1, t /@ #2} &) @@ t[#1];
SubsetQ[{"M", "S"}, Union[Flatten[{p[[1]], p[[2, All, 1]]}]]]
  && 
SubsetQ[{" "}, Union[Flatten[p[[2, All, 2]]]]])) &

প্রথম লাইনটি ফাংশনটি সংজ্ঞায়িত করে t, যা দৈর্ঘ্যের তালিকাকে dদুটি ভাগে বিভক্ত করে , যার প্রথমটি তালিকার প্রথম, মাঝারি এবং শেষ এন্ট্রি এবং যার দ্বিতীয়টি সমস্ত অংশ। দ্বিতীয় লাইনটি ইনপুটটি প্রথম স্থানে স্কোয়ার অ্যারে কিনা তা পরীক্ষা করে। চতুর্থ লাইনটি tএকবার, ইনপুট নিজেই এবং একবার * ইনপুটটিতে থাকা সমস্ত স্ট্রিংয়ের জন্য দু'বার ব্যবহার করে, যেগুলি বর্ণনীয় বলে মনে করা হয় "M"বা "S"যে স্থানগুলি শূন্যস্থান বলে মনে হয় তার থেকে পৃথক করে ; তারপরে পঞ্চম ও সপ্তম লাইনগুলি যা যা হওয়ার কথা তা সত্যই তারা কিনা তা পরীক্ষা করে।


2

জাভাস্ক্রিপ্ট (ES6), 108 106 বাইট

ইনপুট: স্ট্রিং / আউটপুট এর অ্যারে: 0 বা1

s=>s.reduce((p,r,y)=>p&&r.length==w&(y==w>>1|++y%w<2?/^[MS]+$/:/^[MS]( *)[MS]\1[MS]$/).test(r),w=s.length)

পরীক্ষার মামলা


2

জাভাস্ক্রিপ্ট (ES6), 140 138 141 140 বাইট

আমি জানি এটি কোনও বিজয়ী বাইট গণনা নয় (যদিও প্যাট্রিক রবার্টস -3-এর জন্য ধন্যবাদ, এবং আমি বুঝতে পেরেছিলাম যে এটি এম / এস এর পরিবর্তে 1 এর জন্য মিথ্যা ইতিবাচক নিক্ষেপ করেছে: +3), তবে আমি এটি কিছুটা আলাদাভাবে করেছি, আমি ' আমি এটি নতুন, এবং মজা ছিল ...

প্রতিটি লাইনের জন্য একটি স্ট্রিংয়ের অ্যারে গ্রহণ করে এবং সত্য বা মিথ্যা প্রত্যাবর্তন করে। স্পষ্টতার জন্য নিউলাইন যুক্ত হয়েছে (বাইট গণনায় অন্তর্ভুক্ত নয়)।

f=t=>t.every((e,i)=>e.split`S`.join`M`==[...p=[b='M'.repeat(s=t.length),
...Array(z=-1+s/2|0).fill([...'MMM'].join(' '.repeat(z)))],...p,b][i])

একটি সাধারণীকরণের প্যাটার্নের বিপরীতে ইনপুট পরীক্ষা করার পরিবর্তে, আমি একই আকারের একটি 'এম' উইন্ডো তৈরি করি, এস ইনপুটটিতে এম এর সাথে প্রতিস্থাপন করি এবং দুটিটি তুলনা করি।

Ungolfed

f = t => t.every( // function returns true iff every entry in t
                  // returns true below
  (e, i) => e.split`S`.join`M` // replace all S with M
                                 // to compare to mask
  == [ // construct a window of the same size made of Ms and
       // spaces, compare each row 
      ...p = [ // p = repeated vertical panel (bar above pane)
               // which will be repeated
              b = 'M'.repeat(s = t.length),
                  // b = bar of Ms as long as the input array
              ...Array(z = -1 + s/2|0).fill([...'MMM'].join(' '.repeat(z)))],
              // z = pane size; create enough pane rows with
              // Ms and enough spaces
      ...p, // repeat the panel once more
      b][i] // finish with a bar
)

console.log(f(["111","111","111"]))

console.log(f(["MMMMM","M S M","MSSSM","M S M","MSSSM"]))

পরীক্ষার মামলা

f=t=>t.every((e,i)=>e.split`S`.join`M`==[...p=[b='M'.repeat(s=t.length),
...Array(z=-1+s/2|0).fill([...'MMM'].join(' '.repeat(z)))],...p,b][i])


truthy=`MMM
MMM
MMM

SMSMS
M M M
SMSMS
M M M
SMSMS

MMMMMMM
M  S  M
M  S  M
MSSSSSM
M  S  M
M  S  M
MMMMMMM`.split('\n\n')

falsey=`Hello, World!

MMMM
MSSM
MS M
MMMM

MMSMM
M S.M
sSSSS
M S M
MMSMM

MMMMMMM
M  M  M
MMMMMMM
M  M  M
MMMMMMM

MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM`.split('\n\n')

truthy.forEach(test=>{
  console.log(test,f(test.split('\n')))
})

falsey.forEach(test=>{
  console.log(test,f(test.split('\n')))
})


1
ভবিষ্যতের রেফারেন্সের জন্য, যদি না ফাংশনটি পুনরাবৃত্তি হয়, f=বাইট গণনাতে অন্তর্ভুক্ত করার প্রয়োজন হয় না, সুতরাং এটি আসলে একটি 138 বাইট জমা দেওয়া।
প্যাট্রিক রবার্টস

আপনি 1 বাইট সংরক্ষণের z=-1+s/2|0সাথে প্রতিস্থাপন করতে পারেনz=(s-3)/2
প্যাট্রিক রবার্টস

আপনি অন্য একটি বাইট সংরক্ষণ করার e.replace(/S/g,'M')==...সাথে প্রতিস্থাপন করতে পারেনe.split`S`.join`M`==...
প্যাট্রিক রবার্টস

ধন্যবাদ! z=-1+s/2|0s == 1 এবং এমনকি s এর জন্য ইতিবাচক পূর্ণসংখ্যা ফেরত দিতে পারে, যেমন ফাংশনটি অ্যারে () কে ক্র্যাশ না করে মিথ্যা করে। অন্যথায় প্রয়োজনীয় যুক্তি এটিকে দীর্ঘ করে দিয়েছে। বিভক্ত / যোগদানের দুর্দান্ত টিপ, ধন্যবাদ
ক্রিস এম

ভাল ধরা, আমি s=1মামলাটি বিবেচনা করি নি , যেহেতু আমার অবৈধ রেজেক্স কেবল নিঃশব্দে ব্যর্থ।
প্যাট্রিক রবার্টস

1

জাভাস্ক্রিপ্ট (ES6), 109 107 106 105 99 বাইট

s=>!s.split`S`.join`M`.search(`^((M{${r=s.search`
`}})(
(M( {${w=(r-3)/2}})M\\5M
){${w}}))\\1\\2$`)

সম্পাদনা : দাঁড়ান, Arnauld আমাকে পরিবর্তন করে 6 বাইট সংরক্ষিত s.split`\n`.lengthকরার s.search`\n`! ধন্যবাদ!

এটি একটি একক মাল্টলাইন স্ট্রিং নেয় এবং RegExpইনপুট স্ট্রিংয়ের দৈর্ঘ্য ব্যবহার করে একটি ভিত্তিক বৈধতা তৈরি করে। রিটার্ন trueবা false। অনুমান করে একটি বৈধ জানালা রয়েছে নেই একটি trailing সম্পর্কে newline।

ডেমো

f=s=>!s.split`S`.join`M`.search(`^((M{${r=s.search`
`}})(
(M( {${w=(r-3)/2}})M\\5M
){${w}}))\\1\\2$`);
`MMM
MMM
MMM

SMSMS
M M M
SMSMS
M M M
SMSMS

MMMMMMM
M  S  M
M  S  M
MSSSSSM
M  S  M
M  S  M
MMMMMMM

Hello, World!

MMMM
MSSM
MS M
MMMM

MMSMM
M S.M
sSSSS
M S M
MMSMM

MMMMMMM
M  M  M
MMMMMMM
M  M  M
MMMMMMM

MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM`.split`

`.forEach(test=>{console.log(test,f(test));});


চমৎকার পন্থা! আপনি কি r=s.search('\n')পরিবর্তে ব্যবহার করতে পারেন split / length?
আর্নল্ড

@ আরনাউল্ড দুর্দান্ত পরামর্শ, ধন্যবাদ!
প্যাট্রিক রবার্টস

s=>!s.split`S`.join`M`.search([...])সিন্থ্যাক্স ত্রুটি না করেই চালু করা বন্ধনীগুলি সরানো যেতে পারে।
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল সঠিক, তবে তারপরে টেমপ্লেট হিসাবে স্ট্রিংটি পাস হয়ে যায়, যা অন্তর্নিহিতকে অকার্যকর করে দেয়RegExp
প্যাট্রিক রবার্টস

এটি স্তন্যপান করে ... আমি আসলেই এটির প্রত্যাশা করতাম না ...
ইসমাইল মিগুয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.