একটি স্টেম এবং পাতার প্লট বৈধ করুন


20

একটি স্টেম এবং পাতার প্লট গোষ্ঠীতে সংখ্যাসূচক মানের মানগুলি প্রদর্শন করে, যা শেষ সংখ্যা ব্যতীত সকলের দ্বারা নির্ধারিত হয়। উদাহরণস্বরূপ, ধরুন আমাদের কাছে এই ডেটা সেট রয়েছে:

0, 2, 12, 13, 13, 15, 16, 20, 29, 43, 49, 101

আমরা এই কান্ড এবং পাতার প্লট উত্পাদন করতে পারে:

0|02
1|23356
2|09
3|
4|39
5|
6|
7|
8|
9|
10|1

প্রথম সারির স্টেমটি 0, সুতরাং এর "পাতাগুলি" - এর পরে অঙ্কগুলি |- 0 সমেত এবং 10 একচেটিয়া মানের মধ্যে প্রতিনিধিত্ব করে। প্রতিটি কান্ডের পাতা বাছাই করা হয়। কোনও পাতা না থাকা ডালপালা (৩ টির মতো) এখনও প্লটে হাজির। 101 এর মান 100 অন্তর্ভুক্ত এবং 110 টির মধ্যে একচেটিয়া, তাই এর স্টেমটি 10 ​​(10 দ্বারা 10 ভাগ)।

আপনার চ্যালেঞ্জটি হ'ল কোনও পাঠ্যের কোনও বৈধ কান্ড এবং পাতার প্লট কিনা তা পরীক্ষা করা। একটি বৈধ প্লট এই নিয়মগুলি সন্তুষ্ট করে:

  • প্রতিটি কান্ডের জন্য (যেমন 10-প্রশস্ত গোষ্ঠী) ডাটাগুলির পরিসীমাতে হুবহু এক সারি রয়েছে (কোনও পাতা ছাড়াই রেঞ্জের মাঝের কান্ড সহ)
  • সীমার বাইরে কোনও কান্ড নেই
  • সমস্ত পাতা ডানদিকে আরোহণ অনুসারে বাছাই করা হয়
  • সমস্ত কান্ড নীচে বাছাই করা হয়
  • কেবলমাত্র সংখ্যাযুক্ত অক্ষর রয়েছে (বিভাজক ছাড়াও |)

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

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

এখানে কিছু পরীক্ষার কেস যা বৈধ প্লট (ফাঁকা লাইন দ্বারা পৃথক):

2|00003457
3|35
4|799
5|3

99|3
100|0556
101|
102|
103|8

0|0

এখানে কিছু পরীক্ষার মামলা রয়েছে যা ডানদিকে ভাষ্য সহ অবৈধ প্লট:

|0               Blank stem

5|347            Missing a stem (6) in the range
7|9

4|               Has a stem (4) outside the range
5|26
6|7

11|432           Leaves aren't sorted correctly
12|9989

5|357            Stems aren't sorted correctly
4|002
6|1

4|5              Duplicate stem
4|6
4|6
5|1

51114            No stem and leaf separator
609

1|2|03           Multiple separators
2|779|

4|8abcdefg9      Invalid characters
5|1,2,3

75 | 4 6         Invalid characters (spaces)
76 | 2 8 8 9

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম কোডটি জয়ী! স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।


3
এটি খুব সুন্দর প্রথম চ্যালেঞ্জ, দুর্দান্ত কাজ! :) আমি একটি অবৈধ পরীক্ষার কেস যুক্ত করব যা এর মতো একটি লাইন আছে 1|2|3
লিন

1
দুর্দান্ত প্রথম চ্যালেঞ্জ!
অ্যাডমবর্কবার্ক

ভাল প্রথম চ্যালেঞ্জ। একটি পরীক্ষার ক্ষেত্রে আপনি সম্ভবত যুক্ত করতে পারেন 4|;5|26;6|7যা ব্যাপ্তির বাইরে প্রথম কাণ্ড রয়েছে, তবে পরিবর্তে শেষে, অর্থাৎ 12|3;13|4559;14|
কেভিন ক্রুইজসেন

উত্তর:


4

পার্ল, 47 বাইট

জন্য +2 অন্তর্ভুক্ত -0p

STDIN এ ইনপুট দিন

stem.pl:

#!/usr/bin/perl -0p
$"="*";$_=/^((??{$_+$n++})\|@{[0..9,"
"]})+$/

এটি $"দারুণ সুন্দর ... সেই কৌশলটি খুব সুন্দর!
দাদা

2

পিপ , 60 58 + 1 = 59 বাইট

সমস্যাটিতে প্রথম ছুরিকাঘাত, সম্ভবত আরও গল্ফিং ব্যবহার করতে পারে। স্টিডিন -rথেকে ইনপুট লাইনগুলি পড়তে পতাকা ব্যবহার করে । সত্যবাদী আউটপুট হ'ল 1মিথ্যা আউটপুট 0বা খালি স্ট্রিং।

g=a+,#g&a@vNE'|NEg@v@v&$&{Y(a^'|1)a@`^\d+\|\d*$`&SNy=^y}Mg

ব্যাখ্যা এবং পরীক্ষার স্যুটটি মুলতুবি, তবে এর মধ্যে: এটি অনলাইনে চেষ্টা করুন!


1

জাভাস্ক্রিপ্ট, 189 বাইট

(x,y=x.split`
`.map(a=>a.split`|`),z=y.map(a=>a[0]))=>!(/[^0-9|\n]|^\|/m.exec(x)||/^\d+\|\n|\|$/.exec(x)||y.some((c,i,a)=>c.length!=2||c[1]!=[...c[1]].sort().join``)||z!=z.sort((a,b)=>a-b))

একই দৈর্ঘ্যের বিকল্প সমাধান:

(x,y=x.split`
`.map(a=>a.split`|`),z=y.map(a=>a[0]))=>!(/[^0-9|\n]|^\||^.*\|.*\|.*$/m.exec(x)||/^\d+\|\n|\|$/.exec(x)||y.some((c,i,a)=>c[1]!=[...c[1]].sort().join``)||z!=z.sort((a,b)=>a-b))

একটি বেনামি ফাংশন সংজ্ঞা দেয় যা মাল্টলাইন স্ট্রিং হিসাবে ইনপুট নেয়।

আমি নিশ্চিত গল্ফের আরও কিছু আছে তাই আপনি যদি কোনও সম্ভাব্য উন্নতি দেখতে পান তবে আমাকে জানান।

ব্যাখ্যা:

ফাংশনটি বেশ কয়েকটি খারাপ জিনিস পরীক্ষা করে এবং সেগুলির মধ্যে যদি কোনওটি সত্য হয় তবে এটি মিথ্যা ফিরিয়ে দেয় (লজিকাল ওআর এবং একটি নয়)

(x,y=x.split("\n").map(a=>a.split`|`),          //y is input in pairs of stem and leaves
z=y.map(a=>a[0]))                               //z is stems
=>                                              //defines function
!(                                              //logical not
/[^0-9|\n]|^\|/m.exec(x)                        //checks for invalid chars and blank stems
||/^\d+\|\n|\|$/.exec(x)                        //checks for stems out of range
||y.some((c,i,a)=>c.length!=2                   //checks for multiple |s in a line
||c[1]!=[...c[1]].sort().join``))               //checks if leaves are in wrong order
||z!=z.sort((a,b)=>a-b))                        //checks for stems in wrong order

বিকল্প সমাধানে, |এক লাইনে একাধিক গুলি পরীক্ষা করার পরিবর্তে প্রথম রেজেজের অংশ হিসাবে করা হয়।


আপনি যদি এর testপরিবর্তে ব্যবহার করেন exec(আপনি প্রায় testবুলিয়ান ফলাফল প্রয়োজন তবে আপনি প্রায় সর্বদা ব্যবহার করতে চান ) তবে আপনি সম্ভবত বিটওয়াইজ বা লজিকাল বা এর পরিবর্তে ব্যবহার করতে পারেন।
নিল

এটি কি সদৃশ বা অনুপস্থিত কান্ডের জন্য পরীক্ষা করে?
নিল

আপনি যেহেতু প্রতিস্থাপন y.some((c,i,a)=>...করে কিছু বাইট সংরক্ষণ করতে পারেন এবং ব্যবহার করা হচ্ছে না। এবং দেখে মনে হচ্ছে এটি কাজ করে নাy.some(c=>...iaz!=z.sort((a,b)=>a-b)''+z!=z.sort()
Hedi

1

ব্যাচ, 409 বাইট

echo off
set/pp=||exit/b1
set t=
set i=%p:|=&set t=%
if "%t%"=="" exit/b1
for /f "delims=0123456789" %%s in ("%i%")do exit/b1
:l
set t=-
set s=%p:|=&set t=%
if "%s%"=="" exit/b1
if not "%s%"=="%i%" exit/b1
set/ai+=1
for /f "delims=0123456789" %%s in ("%t%")do exit/b1
:m
if "%t:~1,1%"=="" goto n
if %t:~0,1% gtr %t:~1,1% exit/b1
set t=%t:~1%
goto m
:n
set/pp=&&goto l
if "%t%"=="" exit/b1

STDIN এ ইনপুট নেয়, তবে এটির ত্রুটি দেখার সাথে সাথে প্রস্থান করে।

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