একটি পোর্টম্যান্টআউট তৈরি করুন!


16

পটভূমি

তিন বছর আগে, এই লোক টম মারফি একটি ভাষায় সমস্ত শব্দের কাছে একজন পোর্টম্যান্টিউর ধারণাটি প্রসারিত করার জন্য এটি নিজের মাথায় নিয়ে এসেছিল এবং একে একে পোর্টম্যান্ট আউট বলে ( পোর্টম্যানটিউ প্লাস টাউট [ সকলের জন্য ফরাসী ]) বলে। ইংরেজীকে 108,709 শব্দের একটি তালিকা হিসাবে সংজ্ঞায়িত করে, তিনি নিম্নলিখিত দুটি বৈশিষ্ট্য সহ 611,820 বর্ণের ক্রম সন্ধান করতে সক্ষম হন:

  • প্রতিটি ইংরেজী শব্দ স্ট্রিংয়ে থাকে।
  • স্ট্রিংয়ে দুটি সংলগ্ন অক্ষর সমন্বিত কিছু প্রতিবেশ একটি ইংরেজি শব্দ।

এখানে এমন একটি পৃষ্ঠার লিঙ্ক, যার উপরে এই পোর্টম্যান্ট খুঁজে পাওয়া যাবে (একটি ভিডিও ব্যাখ্যা সহ)।

একটি পোর্টম্যান্টআউট

পোর্টম্যান্টআউটের দুটি বৈশিষ্ট্যের মধ্যে প্রথমটি বোঝা সহজ। দ্বিতীয়টির কিছু ব্যাখ্যা প্রয়োজন হতে পারে।

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

তোমার কাজ:

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা স্ট্রিংয়ের একটি তালিকা নেয় এবং তালিকার কোনও পোর্টম্যান্ট আউট দেয়।

এই পাইথন 3 কোডটি একটি পোর্টম্যান্টআউট যাচাই করবে।

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

সমস্ত তালিকা আনঅর্ডারড; এটাই,

{"code", "ego", "golf"} -> "codegolf"
{"more", "elm", "maniac"} -> "morelmaniac" or "morelmorelmaniac" or "morelmorelmorelmaniac" or...
    Would a morelmaniac be some sort of mycologist?
{"ab", "bc", "cd", "de", "ef", "fg", "gh", "hi", "ij", "jk", "kl", "lm", "mn", "no", "op", "pq", "qr", "rs", "st", "tu", "uv", "vw", "wx", "xy", "yz", "za"} -> "abcdefghijklmnopqrstuvwxyza" or "rstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef" or any 27+ letters in order

এবং কেন না? আপনার কোডটি যদি যুক্তিসঙ্গত সময়ের মধ্যে কার্যকর করা হয় তবে মার্ফির সাইটে প্রচুর পরিমাণে।

বিধি

  • আপনার কোড অবশ্যই থামানো উচিত।
  • প্রতিটি মৃত্যুদণ্ডের সাথে আপনাকে একই পোর্টম্যান্ট ফেরত দেওয়ার দরকার নেই।
  • আপনি ধরে নিতে পারেন যে সমস্ত স্ট্রিং কেবলমাত্র ছোট হাতের অক্ষর aদ্বারা গঠিত z
  • যদি কোনও পোর্টম্যান্টআউট সম্ভব না হয় তবে আপনার প্রোগ্রামটি কিছু করতে পারে। উদা:{"most", "short", "lists"}
  • I / O এবং লুফোলগুলির জন্য মানক বিধিগুলি প্রযোজ্য।

এটি , তাই প্রতিটি ভাষার সংক্ষিপ্ততম সমাধান (বাইটে) জিতে! শুভ গল্ফিং!



1
কিছু পরীক্ষার কেস হতে পারে?
অ্যাডম

{"sic", "bar", "rabbits", "cradle"} -> "barabbitsicradle" {"mauve", "elated", "cast", "electric", "tame"} -> "mauvelectricastamelated"(আরও পরীক্ষার কেস)
সূন্দর - মনিকা

2
হ্যাঁ, হয়তো testcase যেখানে একটি শব্দ প্রয়োজন দুইবার ব্যবহার করা
হওয়া ASCII শুধুমাত্র

2
আমরা কি কখনও 1-অক্ষরের শব্দ পাব?

উত্তর:


3

পাইথন 2 , 204 202 বাইট

def f(l,s=''):
 if all(w in s for w in l):return s
 for i,w in enumerate(l):
	a=next((s+w[i:]for i in range(len(w)-1,0,-1)if s[-i:]==w[:i]),0)if s else w;x=a and f(l[:i]+l[i+1:]+[l[i]],a)
	if x:return x

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


সংরক্ষিত

  • -2 বাইট, পুনরাবৃত্তি করার জন্য ধন্যবাদ

2 বাইট সংরক্ষণ করতে আপনি শেষ দুটি লাইনে ট্যাব ব্যবহার করতে পারেন।
পুনরাবৃত্তি


এটি এর জন্য সঠিক আউটপুট উত্পাদন করে না ["ab", "ba", "ca"]। আমার সমাধান একই বাগ আছে।
পুনরাবৃত্তি

1

পাইথ, 39 বাইট

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b

এখানে চেষ্টা করুন

ব্যাখ্যা

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b
JQ                                        Get a copy of the input.
  W}_1mxbdQ                          )    While there are words in the input
                                          that aren't in b (initially space)...
                   KOQ    OP._KOJ         ... get a random input word, a random
                                          prefix, and a random joined word...
                       =T+                ... stick them together...
                  q   <          lKT      ... and check if joining them together
                                          is valid...
               =b*                        ... then update b accordingly...
           =+J|                     Y     ... and stick the new word into J.
                                      b   Output the final result.

1

স্ট্যাক্স , 39 36 বাইট

ä▬│•.k=╠lƒ☺╜00║¿~,▓╕╠7ÉΔB<e┼>☼Θ²└ô┴\

এটি চালান এবং এটি ডিবাগ করুন

প্রায় এক সেকেন্ডে নির্ধারিতভাবে সমস্ত পরীক্ষার কেস চালায়।

এটি একটি পুনরাবৃত্ত আলগোরিদিম m

  • প্রার্থী হিসাবে ইনপুট প্রতিটি শব্দ দিয়ে শুরু করুন
  • প্রতিটি পদক্ষেপে, প্রার্থীর সাবস্ট্রিং হিসাবে শব্দগুলি কতবার ঘটে সেগুলি ক্রম করুন।
  • বর্তমান প্রার্থীর শেষের সাথে সামঞ্জস্যপূর্ণ প্রতিটি শব্দের জন্য, নতুন প্রার্থী গঠনের জন্য এই শব্দটিতে যোগ দিন এবং পুনরাবৃত্ত কল করুন।

এখানে প্রোগ্রামটি আনপ্যাকড, অবরুদ্ধ এবং মন্তব্য করা হয়েছে।

FG              for each word in input, call target block
}               unbalanced closing brace represents call target
  x{[#o         sort input words by their number of occurrences in the current candidate
  Y             store it in register Y
  h[#{,}M       if all of the words occur at least once, pop from input stack
                input stack is empty, so this causes immediate termination,
                followed by implicitly printing the top of the main stack
  yF            for each word in register y, do the following
    [n|]_1T|[|& intersect the suffixes of the candidate with prefixes of the current word
    z]+h        get the first fragment in the intersection, or a blank array
    Y           store it in register Y
    %t+         join the candidate with the current word, eliminating the duplicate fragment
    y{G}M       if the fragment was non-blank, recursively call to the call target
    d           pop the top of stack

এটি চালান

সম্পাদনা: এটি ["ab", "ba", "ca"]অন্যান্য শ্রেণীর পোস্টের মতো বেশিরভাগ উত্তরগুলির মতো লুপযুক্ত শ্রেণীর ইনপুটগুলির জন্য ব্যর্থ ।


0

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

f=a=>a[1]?a.map((c,i)=>a.map((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a

তালিকাগুলির জন্য ত্রুটি ফিরিয়ে দেয় যা সম্পূর্ণরূপে চিত্রিত করা যায় না।

Ungolfed:

f = a =>
  a[1] ?                                        //if more than one element ...
    a.map((c, i)=>                              // for each element
      a.map((w, j, [...b])=>                    //  for each element
        i != j &&                               //   if not the same element
        !/0/.test(m=(c+0+w).split(/(.+)0\1/).join``) &&  //   and the elements overlap
        (t = f(b,                               //   and f recursed is true when
               b[i] = m,    //    replacing the ith element with the 2-element portmanteau
               b.splice(j, 1)                   //    and removing the jth element
              )
        )
      )
    ) &&
    t :                                         //return the recursed function value
    a                                           //else return a

কোড excruciatingly পূর্ণ বর্ণমালা উদাহরণঃ (স্নিপেট উপরে যে কারণে না অন্তর্ভুক্ত) উপর ধীর।

এটি 2 টি বাইট হ্রাসের জন্য mapএস-তে পরিবর্তিত করে প্রতিকার করা হয় some:

f=a=>a[1]?a.some((c,i)=>a.((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a


1
মনে হচ্ছে আমি ভুল করেছি। আমি আচরণ নকল করা না পারেন, আমি ভেবেছিলাম আমি গতকাল দেখেছি। আমার বিভ্রান্তির জন্য এবং আপনার সময় নষ্ট করার জন্য দুঃখিত আমি এই বিষয়ে আমার মন্তব্যগুলি মুছে ফেলব, কারণ সেগুলি সবই ভুল এবং বিভ্রান্তিকর।
পুনরাবৃত্তির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.