অস্পষ্ট বহুবচন (গুলি) সরান!


21

প্রোগ্রামিং খুব অনমনীয়। আপনি কোনও প্রোগ্রামকে "কলা গণনা আউটপুট" করতে বলতে পারবেন না, আপনাকে এটি বলতে হবে print(bananas)

তবে আপনি যখন এটি করেন, আপনি একটি সমস্যার সাথে শেষ করে: আপনার আগে কয়টি কলা রয়েছে তা জানেন না, তাই বহুবচন ব্যবহার করবেন কিনা তা আপনি জানেন না।

কখনও কখনও, প্রোগ্রামাররা অলস পথে যায়। চেক করার পরিবর্তে, তারা কেবল মুদ্রণ করে there are X banana(s)

তবে এটি কুৎসিত, সুতরাং এটি ঠিক করার জন্য আমাদের একটি প্রোগ্রামের দরকার।

পদ্ধতি (গুলি)

একটি স্ট্রিংয়ে অস্পষ্ট বহুবচনগুলি সরাতে, নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন:

  1. শব্দের তালিকায় স্প্রিংগুলিতে স্ট্রিং বিভক্ত করুন।

  2. শেষ হওয়া প্রতিটি শব্দের জন্য (s), নিম্নলিখিতটি করুন:

    • পূর্ববর্তী শব্দ হয় তাহলে a, an, 1বা one, অপসারণ (s)শব্দের শেষে হয়।
    • অন্যথায়, যদি শব্দ স্ট্রিং প্রথম শব্দ বা পূর্ববর্তী শব্দ নয় a, an, 1বা one, প্রতিস্থাপন (s)শব্দ শেষে s
  3. মূল শ্বেতক্ষেত্র সংরক্ষণ করে আবার স্ট্রিংয়ে শব্দের তালিকায় যোগ দিন।

উদাহরণ (গুলি)

একটি স্ট্রিং নেওয়া যাক there's a banana(s) and three apple(s)

প্রথমত, আমরা স্ট্রিংটিকে শব্দের তালিকায় বিভক্ত করি: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]

দ্বিতীয় পদক্ষেপের জন্য, আমরা দুটি শব্দটি শেষ করে নিই (s): banana(s)এবং apple(s)

আগে কোনো শব্দ banana(s)হয় a, তাই আমরা অপসারণ (s), এটি তৈরি banana। আগে কোনো শব্দ apple(s)হয় three, তাই আমরা পরিবর্তন (s)করতে sএভাবেই হয়ে apples

আমাদের এখন আছে ["there's", "a", "banana", "and", "three", "apples"]। আবার একসাথে তালিকায় যোগ দেওয়া, আমরা পেয়েছি there's a banana and three apples। এটি আমাদের শেষ ফলাফল।

চ্যালেঞ্জ)

এমন একটি প্রোগ্রাম বা ফাংশন তৈরি করুন যা যে কোনও যুক্তিসঙ্গত ফর্ম্যাটে দ্ব্যর্থহীন স্ট্রিং নেয় এবং সেই স্ট্রিংয়ের অ-সংশয়িত সংস্করণ দেয়।

আপনি ধরে নিতে পারেন স্ট্রিংয়ে কোনও নতুনলাইন, ট্যাব বা ক্যারিজ রিটার্ন নেই।

আমি স্পেস বা ফাঁকা স্থান (যেমন কিনা দলের উপর বিভক্ত করা হবে কিনা তা নির্দিষ্ট করতে ভুলে গেছেন okay thenদুই ব্যবধান সহ হওয়া উচিত ["okay", "then"]বা ["okay", "", "then"]) যখন চ্যালেঞ্জ পোস্ট, তাই আপনি বিভাজন উভয় ফর্ম অনুমান হতে পারে।

পরীক্ষার কেস

Input                                         -> Output
there are two banana(s) and one leprechaun(s) -> there are two bananas and one leprechaun
there's a banana(s) and three apple(s)        -> there's a banana and three apples
apple(s)                                      -> apples
one apple(s)                                  -> one apple
1 banana(s)                                   -> 1 banana
banana                                        -> banana
preserve    original      whitespace(s)       -> preserve    original      whitespaces
11 banana(s)                                  -> 11 bananas
an apple(s)                                   -> an apple
this is a te(s)t                              -> this is a te(s)t
I am a (s)tranger(s)                          -> I am a (s)tranger

স্কোরিং

এটি , ন্যূনতম বাইটস সহ জমাটি জয়!


এই প্রশ্নটি স্যান্ডবক্স করা হয়েছে ।
LyricLy

করা উচিত apple(s)পরীক্ষা ক্ষেত্রে উত্পাদ applesপরিবর্তে? চ্যালেঞ্জটি Otherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.আমি উল্লেখ করেছি যে এই মামলাটি applesপ্রথম তিনটি সংশোধনীর জন্য স্যান্ডবক্সে পেয়েছিল তবে চতুর্থ স্থানে পরিবর্তিত হয়েছিল।
অগ্নিনির্বাপক 241

@ fireflame241 নিয়মের দ্বিতীয় খসড়াটি লেখার সময়, আমি এটি তৈরি করতে যাচ্ছিলাম যাতে স্ট্রিংটির শুরুটি অপরিবর্তিত থাকে। আমি পরে সেই নিয়ম পরিবর্তন করেছি, তবে পরীক্ষার ক্ষেত্রে নয়। ভালো বল ধরা.
লিরিকলি

পরীক্ষার ক্ষেত্রে পরামর্শ: There's a single banana(s)-> There's a single bananas
জোনাথন অ্যালান

1
পছন্দ করুন আমি কয়েকটি পরীক্ষার কেস যুক্ত করব।
লিরিকলি

উত্তর:


6

গণিত, 151 148 বাইট

StringReplace[j=" ";k=Except@j;j<>j<>#<>j,j~~a:k...~~s:j..~~w:k..~~"(s)"~~j:>{j,a,s,w,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]}<>j]~StringTake~{3,-2}&

ব্যাখ্যা

j=" ";k=Except@j

jএকটি সাদা স্থানের অক্ষর (গুলি) এ সেট করুন । k"না j" (= অ-সাদা অংশের অক্ষর) প্যাটার্নটিতে সেট করুন ।

j<>j<>#<>j

দুটি সাদা স্থান (গুলি) প্রস্তুত করুন এবং ইনপুটে একটি সাদা স্থান (গুলি) যুক্ত করুন।

j~~a:k...~~s:j..~~w:k..~~"(s)"~~j

প্যাটার্নটি মিলে একটি স্ট্রিংয়ের জন্য:

  1. একটি সাদা স্থান, এর পরে
  2. একটি দৈর্ঘ্য-শূন্য বা দীর্ঘতর স্ট্রিংয়ের মধ্যে কেবল অ-সাদা অংশের অক্ষর (কোয়ান্টিফায়ার) থাকে (এটি কল করুন a), তারপরে
  3. একটি দৈর্ঘ্য-এক বা দীর্ঘতর স্ট্রিং যা কেবলমাত্র শ্বেতস্পেস অক্ষর (গুলি) নিয়ে থাকে (এর পরে কল করুন s)
  4. একটি দৈর্ঘ্য-এক বা দীর্ঘতর স্ট্রিংয়ে কেবল অ-শ্বেতস্থান অক্ষর (শব্দ) (শব্দ) (এটি কল করুন w) থাকে, তারপরে অনুসরণ করা হয়
  5. স্ট্রিং "(s)", দ্বারা অনুসরণ
  6. একটি সাদা স্থান
যদি [FreeQ [একটি, "একটি" | "একটি" | "1" | "এক"], "গুলি", ""]

যদি aএকক শব্দ (গুলি) এর একটিও না হয় তবে "s"অন্যথায় মূল্যায়ন করুন ""

StringReplace[..., ... :>{j,a,s,w,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]}<>j]

সঙ্গে মিলে যাওয়ার ধরণটি প্রতিস্থাপন j, a, s, w, If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""], এবং jএকসঙ্গে যোগ দেন।

... ~StringTake~{3,-2}

অবস্থান 3 থেকে অবস্থান -2 এ যান (1-সূচকযুক্ত; নেতিবাচক সূচকগুলি শেষ থেকে গণনা করা হয়)। এটি কারণ আমরা শুরুতে তিনটি স্থান (গুলি) যুক্ত করেছি।


3
বহুবচন-এস অপসারণের জন্য বিল্টিন ব্যবহার করবেন না কেন?
থমাস ওয়েলার

5

পাইথন 3 , 94 বাইট

lambda s,r=re.sub:r(r"\(s\)( |$)","s",r(r"\b(an?|1|one)(\s+)(.+)\(s\)",r"\1\2\3",s))
import re

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

-4 বাইটস আই ক্রিভ এরিটিমকে ধন্যবাদ (আমি মনে করি এটি গ্রহণযোগ্য)


@ জোনাথান অ্যালান স্থির, ধন্যবাদ
হাইপারনিউট্রিনো

1
__import__সম্ভবত সংক্ষিপ্ত হতে পারে না ... হ্যাঁ, এটি নিয়মিত হিসাবে 4 বাইট ছোট হয় import re
সম্পূর্ণমানবিক

@ ক্রিভারিটিম হু আপনি ঠিক বলেছেন (যদিও মাত্র 3 বাইট) ধন্যবাদ
হাইপারনিউটারিনো


টুইটারে ওহ্ দারুণ. ধন্যবাদ!
হাইপারনিউট্রিনো


4

গণিত, 313 বাইট

(Table[If[StringLength@z[[i]]>3&&StringTake[z[[i]],-3]=="(s)",z[[i]]=StringDrop[z[[i]],-3];t=1;While[z[[i-t]]=="",t++];If[FreeQ[{"a","an","1","one"},z[[i-t]]],z[[i]]=z[[i]]<>"s"]],{i,2,Length[z=StringSplit[#," "]]}];If[StringTake[z[[1]],-3]=="(s)",z[[1]]=StringDrop[z[[1]],-3];z[[1]]=z[[1]]<>"s"];StringRiffle@z)&

3

পার্ল 5, 43 + 1 (-পি) = 44 বাইট

s/\b((one|1|an?) +)?\S+\K\(s\)\B/"s"x!$1/ge

(s)শব্দের শেষে প্রতিটা ম্যাচ করুন , এটিকে !$1(1 বা 0) এসেস দিয়ে প্রতিস্থাপন করুন ।


2

পাইথ - 53 বাইট

অ্যালগরিদমটি যেমনটি অনুসরণ করে তেমনি অনুসরণ করে।

K+kczdjdt.e?q"(s)"gb_2+<b_3*\s!}@Ktk[\a"an""one"\1)bK

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


1
ব্যর্থ হয় there are two banana(s) and one leprechaun(s)(এর পরে দুটি স্পেস one)। আসল শ্বেত স্থানটি সংরক্ষিত leprechaun(s)থাকলেও এর oneআগে থাকা বিষয়টিকে উপেক্ষা করে ।
লিরিকলি

1
@ লিরিকলাই আপনি ওপিতে এটি স্পষ্টভাবে বলেননি। দুটি স্পেস দিয়ে (আপনার "পদ্ধতি (গুলি)" বিভাগের "বিভাগের দুটি অংশ শব্দের তালিকায় স্পেসে স্ট্রিং বিভক্ত করুন") এর মধ্যে আসলে একটি ফাঁকা শব্দ রয়েছে oneএবংleprechaun(s)
জোনাথন অ্যালান

2

জেলি ,  52 51  49 বাইট

জেলি একটি রেগেক্স (গুলি) পরমাণু পান নি

Ṫ
Ñ;”s
Ṫḣ-3
UṪw“)s(”⁼1
“µḣ⁴µuʠg*»ḲċḢ‘×Ç‘
⁶;ḲÇĿ2ƤK

একটি সম্পূর্ণ প্রোগ্রাম স্ট্রিং গ্রহণ করে (পাইথন ফর্ম্যাটিং ব্যবহার করে যদি মাল্টলাইন বা কোট থাকে) এবং আউটপুট মুদ্রণ করে।

এটি অনলাইন চেষ্টা করুন! অথবা পরীক্ষা-স্যুট দেখুন

কিভাবে?

Ṫ - Link 1, tail: two words (list of lists)
Ṫ - tail

Ñ;”s - Link 2, tail and replace last three chars with an 's': two words (list of lists)
Ñ    - call the next link (3) as a monad
  ”s - literal 's'
 ;   - concatenate

Ṫḣ-3 - Link 3, tail and remove the last three chars: two words (list of lists)
Ṫ    - tail
  -3 - literal minus three
 ḣ   - head from index (1-indexed and modular)

UṪw“)s(”⁼1 - Link 4, tail ends with "(s)"?: two words (list of lists)
U          - upend (reverse each word)
 Ṫ         - tail
   “)s(”   - literal [')', 's', '('] - that is "(s)" reversed
  w        - index of first sublist equal to that or 0 if not found
         1 - literal one
        ⁼  - equal?

“µḣ⁴µuʠg*»ḲċḢ‘×Ç‘ - Link 5, categorise: two words (list of lists)
“µḣ⁴µuʠg*»        - compression of string "a 1" + word " an" + word " one"
          Ḳ       - split on spaces = ["a", "1", "an", "one"]
            Ḣ     - head (the first word)
           ċ      - count occurrences (of head in the list - either 0 or 1)
             ‘    - increment
               Ç  - call the last link (4) as a monad - i.e. f(two words)
              ×   - multiply
                ‘ - increment - so we have: 1 for ["1", "blah"],
                  -             2 for ["blah", "blah(s)"] or 3 for ["1", "blah(s)"]

⁶;ḲÇĿ2ƤK - Main link: list of characters, the string
⁶        - literal space character
 ;       - concatenate (place a space at the beginning as we want to inspect pairs)
  Ḳ      - split on spaces (giving an empty list at the start)
     2Ƥ  - for all infixes of length two:
    Ŀ    -   call the link at the given index as a monad:
   Ç     -     call the last link (5) as a monad
       K - join the result with spaces
         - implicit print

আপনি কেন আলাদা লিঙ্ক হিসাবে ব্যবহার করেছেন তা সম্পর্কে আমি আগ্রহী । এটি কি আসল তালিকা থেকে উপাদান মোছা থেকে বাধা দেয়?
হাইপারনিউট্রিনো

না, আমার এই জুটির লেজটি পাওয়া দরকার ... একটি কোড মন্তব্য লিখে, সম্ভবত একবার আপনি এটি দেখলে কোনও গল্ফকে খুঁজে পেতে পারেন।
জোনাথন অ্যালান

আহ ঠিক আছে. ধন্যবাদ, আমি একবার মন্তব্য (বা তার আগে) এর পরে গল্ফটি স্পট করার চেষ্টা করব!
হাইপারনিউট্রিনো

সুতরাং লিঙ্ক 1, 2 এবং 3 সমস্ত পুচ্ছ, এবং লিঙ্ক 5 চয়ন করে যা কল করতে হবে এবং এটি করতে ব্যবহার Ŀকরে, তবে আমি লিঙ্ক 4 এর অভ্যন্তরে কোনও সংক্ষিপ্ত পথ দেখতে পাচ্ছি না, তবে সেখানে থাকতে পারে। এমনকি লিঙ্ক 4 এর লেজও পেতে একটি উপায় হতে পারে!
জোনাথন অ্যালান

@ হাইপার নিউট্রিনো আমি মনে করি যে Ŀজিনিসটি প্রথম লিঙ্কটি কল করতে পারে, সে কারণেই এটি একটি নিজস্ব লিঙ্ক।
এরিক আউটগল্ফার


1

পার্ল 5 , 56 + 1 ( -p) = 57 বাইট

s/\b(an?|1|one) +\S+\K\(s\)(?= |$)//g;s/\(s\)( |$)/s$1/g

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


1
পরীক্ষার ক্ষেত্রে নয়, তবে আমি মনে করি এটি ব্যর্থ a hel(s)lo
নীল

যা পরীক্ষার ক্ষেত্রে সরবরাহ করা হয়েছে ঠিক মতো কাজ করছে। এটি আমার টিআইও লিঙ্কে পরীক্ষাগুলির নীচের অংশে।
এক্সকালি

ঠিক আছে আমাকে a hel(s)loপরীক্ষার
নীল

0

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

a=>a.replace(/(\S+)( +)(\S+)\(s\)/g,(m,f,s,w)=>f+s+w+(/^(a|an|1|one)$/.exec(f)?'':'s'))

ব্যাখ্যা শীঘ্রই আসছে।


1
আপনি \s`with এর সাথে প্রতিস্থাপন করতে পারেন " "আপনি স্ট্রিংটিতে কোনও নতুনলাইন, ট্যাব বা ক্যারেজ রিটার্ন নেই বলে ধরে নিতে পারেন।
সুপারস্টোরমার

"এটি একটি টি (গুলি) টিতে ব্যর্থ। আপনি (\s|$)রেজেক্সের শেষে যুক্ত করে ঠিক করতে পারেন ।
বিরজোলাক্সিউ

"আপেল (গুলি)" এও ব্যর্থ। এই
টিআইওতে

ধন্যবাদ @ বিরজোলাক্সিউ, যখন আমি পারব পরিবর্তনগুলি সম্পাদনা করব ...
XavCo7

0

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

s=>s.replace(/((^|\S+ +)\S+)\(s\)(?!\S)/g,(_,a)=>a+(/^(1|an?|one) /.test(a)?'':'s'))

শেষ অংশটি পুনরায় সাজানোর জন্য এখানে একটি আকর্ষণীয় উপায় রয়েছে যা দু: খজনকভাবে 2 বাইট দীর্ঘতর:

s=>s.replace(/((^|\S+ +)\S+)\(s\)(?!\S)/g,(_,a)=>a+'s'.slice(/^(1|an?|one) /.test(a)))

0

জাভাস্ক্রিপ্ট (স্পাইডারমোনকি) , 82 বাইট

s=s.replace(/(\S+ +(\S+))\(s\)\B/g,(_,a)=>a+("s"[+/^(1|one|an?)\b/i.test(a)]||""))

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

78 বাইট সংস্করণ (কম শক্তিশালী)

s=s.replace(/(\S+ +(\S*))\(s\)/g,(_,a)=>a+("s"[+/^(1|one|an?)/i.test(a)]||""))

এটি ইটিএইচ প্রডাকশনগুলির একটি সংশোধিত সংস্করণ (আমার কাছে 50 টি রেপ নেই)

ব্যাখ্যা

  • /(\S+ +(\S+))\(s\)/g - সন্ধানের জন্য আসল প্যাটার্ন (amount object(s) )
  • (_,a)=>a- _একটি ক্যাচ সমস্ত পরিবর্তনশীল,a হয়(\S+ +(\S+))
  • "s"[+/^(1|one|an?)/i.test(a)]||"" - অ্যারে কেটে দেওয়ার পরিবর্তে, কেবল একটি ডামি অ্যারে তৈরি করুন এবং সূচকটি পান (+/.../.test একটি সংখ্যা ফেরৎ দেয়)
    • উচিত "s"[+/^(1|one|an?)/i.test(a)]আসতে undefined( trueঅথবা 1পরীক্ষার জন্য) আগমন""
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.