একটি বর্ণমালা চেষ্টা করুন


31

নিম্নলিখিত বর্ণমালা অনুসারে বাছাই করা শব্দের তালিকাটি বিবেচনা করুন:

balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom

সমস্ত শব্দ দিয়ে শুরু হয় bএবং প্রথম 5 দিয়ে শুরু হয় bal। আমরা যদি কেবল প্রথম 2 টি শব্দটি দেখি:

balderdash
ballet

আমরা পরিবর্তে লিখতে পারে:

balderdash
  +let

যেখানে ' 'ব্যবহৃত হয় যেখানে একটি শব্দ পূর্বের শব্দের সাথে একটি উপসর্গের অক্ষর ভাগ করে দেয়; '+'অক্ষর ব্যতীত যা সর্বশেষ অক্ষরকে নির্দেশ করে যেখানে দ্বিতীয় শব্দটি পূর্ববর্তী শব্দের সাথে একটি উপসর্গ ভাগ করে দেয়।

এটি এক ধরণের 'ত্রি' ভিজ্যুয়ালাইজেশন: পিতামাতার bal'এবং' এর 2 বংশধর: 'derdash'এবং 'let'

একটি দীর্ঘ তালিকা সহ, যেমন:

balderdash
ballet
brooding

নীচে '|'নীচে ভাগ করা উপসর্গটি কোথায় শেষ হবে তা পরিষ্কার করার জন্য আমরা পাইপ চরিত্রটি অতিরিক্তভাবে ব্যবহার করতে পারি:

balderdash
| +let
+rooding

ও সমমানের গাছের একটি রুট হবে 'b'দুটি সন্তান থাকার: সাবট্রি থাকার রুট 'al'এবং তার দুই সন্তান 'derdash'এবং 'let'; এবং 'rooding'

যদি আমরা এই কৌশলটি আমাদের মূল তালিকায় প্রয়োগ করি,

balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom

আমরা দেখতে পাই এমন আউটপুট পাই:

balderdash    
| +let     
|  +oonfish
|   | +ist 
|   +t     
+rooding   
   +m 

তালিকায় টানা দুটি শব্দের যদি কোনও ভাগ করা উপসর্গ না থাকে তবে কোনও বিশেষ অক্ষর প্রতিস্থাপন করা হবে না; যেমন তালিকার জন্য:

broom
brood
crude
crumb

আমরা আউটপুট চাই:

broom
   +d
crude
  +mb

ইনপুট

ইনপুটটির শব্দগুলি কেবলমাত্র আলফানিউমেরিক (কোনও ফাঁকা জায়গা বা বিরামচিহ্ন) দিয়ে তৈরি করা হবে; এটি স্ট্রিংগুলির তালিকা, একক স্ট্রিং বা অন্য কোনও যুক্তিসঙ্গত পদ্ধতির আকারে হতে পারে, যতক্ষণ আপনি আপনার নির্বাচিত ফর্ম্যাটটি নির্দিষ্ট করেন। টানা দুটি শব্দ একই রকম হবে না। তালিকাটি বর্ণমালা অনুসারে বাছাই করা হবে।

আউটপুট

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

এটি ; প্রতিটি ভাষার সংক্ষিপ্ততম কোডটি দাম্ভিক অধিকারগুলি ধরে রাখে। লুফোলের বিরুদ্ধে স্বাভাবিক নিষেধাজ্ঞাগুলি প্রযোজ্য।

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

Input:
apogee
apology
app
apple
applique
apply
apt

Output:
apogee     
 |+logy    
 +p        
 |+le      
 | +ique   
 | +y      
 +t        

Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb

Output:
balderdash 
| +let     
|  +oonfish
|   | +ist 
|   +t     
+rooding   
   +m      
donald     
| |+tella  
| +na      
| +t       
+umb 

আমার কেসের ballপরে কথাটি আছে সে ক্ষেত্রে কী হবে balloon। আমাদের কী আউটপুট আশা করা উচিত?
ডন হাজার হাজার

@ রুশভ মেহতা আমি অনুমান করছি +যে আপনার প্রথমটির নীচে কিছু হবে oতবে আমি চ্যালেঞ্জটি লিখিনি তাই আমি নিশ্চিত নই।
থিও

5
শব্দসমূহ বর্ণমালা অনুসারে বাছাই করা হয়েছে, সুতরাং এটি হবে না।
নিল

@ নীল ওহ ভাল পয়েন্ট
ডন হাজার হাজার

2
ইনপুটটির শব্দগুলি কেবলমাত্র বর্ণমালা দ্বারা তৈরি করা হবে : এর মধ্যে কী অঙ্কগুলি সত্যই অন্তর্ভুক্ত রয়েছে, বা আপনার বর্ণমালা বোঝানো হয়েছে?
আর্নৌল্ড

উত্তর:


11

রেটিনা 0.8.2 , 58 57 বাইট

^((.*).)(?<=\b\1.*¶\1)
$.2$* +
m)+`^(.*) (.*¶\1[+|])
$1|$2

এটি অনলাইন চেষ্টা করুন! লিঙ্কে একটি পরীক্ষার কেস অন্তর্ভুক্ত। সম্পাদনা: @FryAmTheEggman এ সংরক্ষিত 1 বাইট ধন্যবাদ যে ইশারা আমি থেকে একটি সুইচ উপেক্ষিত \bথেকে ^দ্বারা তৈরি করা হয়েছে m)। ব্যাখ্যা:

m)

^পুরো প্রোগ্রামটির জন্য প্রতি-লাইনে চালু করুন ।

^((.*).)(?<=^\1.*¶\1)
$.2$* +

প্রতিটি শব্দের জন্য, পূর্ববর্তী শব্দের শুরু থেকে যতটা সম্ভব ম্যাচ করার চেষ্টা করুন। , স্পেস থেকে ম্যাচ পরিবর্তন শেষ অক্ষর, যা একটি হয়ে ব্যতীত +

+`^(.*) (.*¶\1[+|])
$1|$2

বারে বারে +s বা |s এর উপরে s এর সাথে সাথে সমস্ত স্পেস প্রতিস্থাপন করুন |


@ ফ্রাইআম দ্য এজিগম্যান সত্যই, আমি এটি m)করতে সক্ষম হতে বিশেষভাবে যুক্ত করেছি , তাই আমি বিরক্ত হয়েছি যে আমি একটি উদাহরণ মিস করেছি।
নিল

ওহ, লোকেরা যদি কেবল তাদের মুছতে চলে যায় তবে আমি কেন মন্তব্যগুলির জবাব দিতে বিরক্ত করব ...
নীল

9

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

অক্ষরের তালিকার একটি তালিকা প্রত্যাশা করে এবং প্রত্যাবর্তন করে।

a=>a.map((w,y)=>a[~y]=w.map(m=(c,x)=>(p=a[y-1]||0,m|=c!=p[x])?c:p[x+1]==w[x+1]?' ':(g=y=>a[y][x]<1?g(y+1,a[y][x]='|'):'+')(-y)))

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

কিভাবে?

+প্রথমে সর্বশেষ শব্দের মধ্য দিয়ে হাঁটলে স্পেস এবং এরগুলি সন্নিবেশ করা যায় তবে একবার শনাক্ত করা গেলে এটি |কেবল একটি পোস্টেরিয়েরি sertedোকানো যেতে পারে +। এটি দুটি স্বতন্ত্র পাস করে অর্জন করা যেতে পারে তবে পরিবর্তে আমরা প্রতিটি পরিবর্তিত এন্ট্রিতে একটি পয়েন্টার সংরক্ষণ করি a[~y]যাতে এটি পরে একই map()লুপের মধ্যে আবার আপডেট করা যায় ।

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

a =>                           // a[] = input array
  a.map((w, y) =>              // for each word w at position y in a[]:
    a[~y] =                    //   save a pointer to the current entry in a[~y]
    w.map(m =                  //   initialize m to a non-numeric value
      (c, x) => (              //   for each character c at position x in w:
        p = a[y - 1] || 0,     //     p = previous word or a dummy object
        m |= c != p[x]         //     set m = 1 as soon as w differs from p at this position
      ) ?                      //     if w is no longer equal to p:
        c                      //       append c
      :                        //     else:
        p[x + 1] == w[x + 1] ? //       if the next characters are still matching:
          ' '                  //         append a space
        : (                    //       else:
            g = y =>           //         g() = recursive function to insert pipes
            a[y][x] < 1 ?      //           if a[y][x] is a space:
              g(               //             do a recursive call to g()
                y + 1,         //               with y + 1
                a[y][x] = '|'  //               and overwrite a[y][x] with a pipe
              )                //             end of recursive call
            :                  //           else:
              '+'              //             make the whole recursion chain return a '+'
                               //             which will be appended in the current entry
          )(-y)                //         initial call to g() with -y (this is ~y + 1)
    )                          //   end of map() over the characters
  )                            // end of map() over the words

আপনি কি আমার সমাধানটি দেখুন, আমি নিজেই এটি নিয়ে এসেছি তবে এটি আপনার সমাধানের স্মরণ করিয়ে দেয়। সুতরাং যদি এটি খুব কাছাকাছি হয় তবে আপনি এটি নিজের হিসাবে জমা দিতে পারেন (বা না) এবং এটি খারাপভাবে মুছে ফেলতে পারেন :)
ড্যানিয়েলইন্ডি

পছন্দ করুন এটি যথেষ্ট আলাদা।
আর্নৌল্ড


1

পাইথন, 263 260 বাইট

- 3 বাইট জনাথন ফ্রেচকে ধন্যবাদ

কোড:

p=lambda t,f,g:"\n".join([(f[:-1]+"+"if(a!=min(t))*g else"")+a+p(t[a],(f+" "if len(t[a])>1or a==max(t)else f[:-1]+"| "),1)for a in t])if t else""
def a(t,x):
 if x:c=x[0];t[c]=c in t and t[c]or{};a(t[c],x[1:])
def f(*s):t={};[a(t,i)for i in s];return p(t,"",0)

অনলাইনে চেষ্টা করে দেখুন!

ব্যাখ্যা:

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

{'b': {'a': {'l': {'d': {'e': {'r': {'d': {'a': {'s': {'h': {}}}}}}}, 'l': {'e': {'t': {}}, 'o': {'o': {'n': {'f': {'i': {'s': {'h': {}}}}, 'i': {'s': {'t': {}}}}}, 't': {}}}}}, 'r': {'o': {'o': {'d': {'i': {'n': {'g': {}}}}, 'm': {}}}}}}

পি ফাংশনটি এই কাঠামোর মাধ্যমে পুনরাবৃত্তি করে এবং চ্যালেঞ্জের দ্বারা প্রত্যাশিত ট্রাইয়ের স্ট্রিং প্রতিনিধিত্ব করে। F ফাংশনটি আর্গুমেন্ট হিসাবে স্ট্রিংগুলির একটি গোছা নেয়, এগুলি সমস্তকে একটি এর সাথে একটি ট্রিতে যুক্ত করে, তারপরে ট্রাইতে পি কল করার ফলাফল প্রদান করে।


1
সম্ভাব্য 252 বাইট
জোনাথন ফ্রেচ

1

সি (জিসিসি) , 165 155 বাইট

তিনটি যুক্তি গ্রহণ করে:

  • char** a : নাল-সমাপ্ত শব্দগুলির একটি অ্যারে
  • char* m : প্রতিটি শব্দের দৈর্ঘ্যের একটি অ্যারে
  • int n : অ্যারে শব্দের সংখ্যা
f(a,m,n,i,j)char**a,*m;{for(i=n;--i;)for(j=0;j<m[i]&j<m[i-1]&a[i][j]==a[i-1][j];j++)a[i][j]=a[i][j+1]^a[i-1][j+1]?43:++i<n&j<m[i]&a[i--][j]%81==43?124:32;}

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



@ আর্নল্ড অবশ্যই! যদিও ++i<n&j<m[i]&a[i--]নির্ধারিত আচরণ নয়? আমি কি বাম থেকে ডানদিকে জিসিসি মূল্যায়নের উপর নির্ভর করতে পারি?
কর্টিস বেচটেল

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

1

পার্ল 6 , 149 144 142 বাইট

{1 while s/(\n.*)\s(.*)$0(\+|\|)/$0|$1$0$2/;$_}o{$=({.[1].subst(/^(.+)<?{.[0].index($0)eq 0}>/,{' 'x$0.ords-1~'+'})}for '',|$_ Z$_).join("
")}

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

আমি নিশ্চিত যে এটি আরও গল্ফ করা যেতে পারে, বিশেষত যেহেতু আমি রেজেক্সেসের বিশেষজ্ঞ নই। এটি নীলের রেটিনা উত্তরের মতো একই প্রক্রিয়াটি ব্যবহার করে ।



0

রুবি , 118 বাইট

->a{i=1;a.map{s="";a[i+=j=-1].chars{|c|a[i][j+=1]=i<0&&a[i-1][/^#{s+=c}/]?a[i+1][j]=~/[|+]/??|:?\s:c}[/[| ]\b/]&&=?+}}

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

মূল ইনপুট অ্যারে-জায়গায় সংশোধন করে আউটপুট স্ট্রিংয়ের একটি অ্যারে গ্রহণ করে।

ব্যাখ্যা

প্রাথমিক স্ট্রিং রূপান্তরটি খুব জটিল নয়, তবে উল্লম্ব পাইপগুলি যথাযথভাবে সন্নিবেশ করার জন্য, আমাদের বিপরীত ক্রমে পুনরাবৃত্তি করতে হবে এবং যেহেতু reverseপদ্ধতিটি বেশ ভার্জোজ, তাই আমরা এটি একটি কৌতুকপূর্ণ পদ্ধতিতে করব। এখানে, আমরা mapকেবল লুপটি চালাতে ব্যবহার করি , প্রথম শব্দটি একা রেখে, এবং তারপর নেতিবাচক সূচকগুলি ব্যবহার করে শেষ থেকে পুনরাবৃত্তি করি:

->a{
 i=1;                   #Initialize word indexer
 a.map{                 #Loop
  s="";                 #Initialize lookup string
  a[i+=j=-1]            #Initialize char indexer and decrement i
  .chars{|c|            #Loop through each char c of current word
   a[i][j+=1]=          #Mofify current word at position j 
    i<0&&               #If it's not the first word and
    a[i-1][/^#{s+=c}/]? #Word above matches current one from start to j
     a[i+1][j]=~/[|+]/? #Then if char below is | or +
      ?|:?\s:c          #Then set current char to | Else to Space Else leave as is
  }[/[| ]\b/]&&=?+      #Finally, replace Space or | at word boundary with +
 }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.