একটি লাঠি রং করতে কতক্ষণ সময় লাগে?


12

( এই ম্যাথ.এসই সমস্যার ভিত্তিতে যা কিছু গ্রাফিক্সও সরবরাহ করে)

আমার কাছে একটি কাঠি আছে যা দেখতে দারুণ দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

আমি এটি দেখতে চাই দয়া করে:

এখানে চিত্র বর্ণনা লিখুন

আমি কোনও বিশেষজ্ঞ চিত্রশিল্পী নই, তবে আমি যেমন উচ্চাভিলাষী ডিআইওয়াই প্রকল্প শুরু করার আগে, আমি নিশ্চিত করতে চাই যে আমি আমার মাথার মধ্যে নেই।

আপনার প্রোগ্রামটি আমাকে বলতে হবে যে এই কাঠিটি আঁকার জন্য কতগুলি পদক্ষেপ জড়িত। প্রতিটি পদক্ষেপে একটি দৃ color় রঙের সাথে একটি অবিচ্ছিন্ন অঞ্চল আঁকা জড়িত থাকে, যা পেইন্টের পূর্ববর্তী স্তরগুলিকে আবৃত করে। উপরের উদাহরণের জন্য, আমি বাম অর্ধেক নীল রঙ করতে পারি, ডান অর্ধেক লাল এবং তারপরে মোট দুটি ধাপের জন্য দুটি পৃথক সবুজ অঞ্চল (সবুজ ধারাবাহিকভাবে আঁকা হয় না)।

এখানে চিত্র বর্ণনা লিখুন

এটি ASCII এ রয়েছে:

------
bbb---
bbbrrr
bgbrrr
bgbrgr

এই কাঠিটি আঁকতে এবং একই ফলাফলটি দিয়ে শেষ করার জন্য বেশ কয়েকটি ভিন্ন উপায় রয়েছে। আমি কেবল সময়ের প্রাক্কলনের বিষয়ে আগ্রহী, তবে এটি চারটি ধাপ।

লক্ষ্য

আপনার প্রোগ্রামটি প্রদত্ত রঙের স্কিম দিয়ে একটি কাঠি আঁকার জন্য প্রয়োজনীয় ন্যূনতম সংখ্যার পদক্ষেপ আউটপুট করবে। পেইন্ট স্কিমটি অক্ষরের একটি স্ট্রিং আকারে হবে, যখন আউটপুট একটি সংখ্যা হবে। এটি কোড গল্ফ। সংক্ষিপ্ততম প্রোগ্রামের জয়।

ইনপুট

আপনার প্রোগ্রামটি একটি কাঠির জন্য একটি বর্ণের স্ট্রিং আকারে রঙিন স্কিম গ্রহণ করবে। প্রতিটি অনন্য বর্ণ (কেস সেনসিটিভ) একটি অনন্য রঙের প্রতিনিধিত্ব করে।

YRYGR

grG

GyRyGyG

pbgbrgrp

hyghgy

আউটপুট

এই সংখ্যাগুলি লাঠিগুলি আঁকার জন্য প্রয়োজনীয় কয়েকটি ধাপ।

4

3

4

5

4

ব্যাখ্যা

এইভাবে আমি উপরের নম্বরগুলিতে পৌঁছেছি। আপনার প্রোগ্রাম এ আউটপুট প্রয়োজন হয় না:

 -----
 YYY--
 YRY--
 YRYG-
 YRYGR

 ---
 g--
 gr-
 grG

 -------
 GGGGGGG
 GyyyGGG
 GyRyGGG
 GyRyGyG

 --------
 pppppppp
 pbbbpppp
 pbbbrrrp
 pbgbrrrp
 pbgbrgrp

 ------
 -yyyyy
 -ygggy
 hygggy
 hyghgy

সম্পাদনা করুন: যদি তারা আরও কঠিন পরীক্ষার ক্ষেত্রে প্রমাণিত হয় তবে আমি আরও পরীক্ষার কেস যুক্ত করব।


এটি আমাকে স্ট্যাকওভারফ্লো . com / q / 10364248 / 785745 এর স্মরণ করিয়ে দেয় যা একই রকম তবে 2D তে।
কেন্ডল ফ্রে

উত্তর:


3

গল্ফস্ক্রিপ্ট, 82 72 67 টি অক্ষর

.,n*{:c,,{[).2$1<*\c>+1$.,,{).2$<\3$<=},,.@>@@>]}%\;{~S)}%$0+0=}:S~

গল্ফস্ক্রিপ্ট প্রোগ্রামের জন্য যুক্তিসঙ্গতভাবে দ্রুত, উদাহরণগুলি:

> hyghgy
4

> pbgbrgrp
5

নীচের বিবৃতি অনুসারে ব্যবহৃত অ্যালগরিদম বাম থেকে ডান পুনরাবৃত্তভাবে রংগুলির মাধ্যমে কাজ করে:

  • বাম দিক থেকে সমস্ত অংশ উপেক্ষা করুন যা ইতিমধ্যে প্রয়োজনীয় রঙ রয়েছে। এগুলিকে আবার অতিবাহিত করা এর চেয়ে ভাল উত্তর সরবরাহ করবে না।
  • যদি পুরো স্টিকটিতে ইতিমধ্যে পছন্দসই রঙ থাকে তবে ফলাফল হিসাবে 0 টি পদক্ষেপ ফিরুন।
  • অন্যথায়, এখনের বামতম অংশের লক্ষ্য রঙ নিন (যেমন পছন্দসই রঙে প্রথম নয়)।

    • লক্ষ্য রঙ এবং পুনরাবৃত্তি সহ 1 অংশ পেইন্ট করুন।
    • এই রঙের সাথে 2 অংশগুলি পেইন্ট করুন এবং পুনরাবৃত্তি করুন।

    ...

    • এই রঙের সাথে পুরো অবশিষ্ট স্টিকটি পেইন্ট করুন এবং পুনরাবৃত্তি করুন।

    এই সমস্ত সংখ্যার সর্বনিম্ন নিন এবং 1 যোগ করুন (বর্তমান পদক্ষেপের জন্য)। পদক্ষেপের সর্বোত্তম সংখ্যা হিসাবে এটি ফিরিয়ে দিন।

এই অ্যালগরিদম কাজ করে, কারণ বাম দিকের অংশটি যে কোনও উপায়ে এক সময় আঁকা উচিত, তাই কেন এটি তাত্ক্ষণিকভাবে করা যায় না - কোনও সম্ভাব্য ফ্যাশনে।

.,n*         # prepare the initial situation (target stick, unpainted stick)
             # used n instead of '-' for the unpainted parts, because it is shorter
{            # Define the operator S which does t c S -> n
             #   - t: the desired target colors
             #   - c: the stick as it is colored currently
             #   - n: minimum number of steps required to go from c to t
  :c         # Assign the current configuration to the variable c
  ,,{[       # Map the list [0 1 2 .. L-1]
             # We will build a list of all possible configurations if we paint
             # the stick with the 0th part's color (either 1 or 2 or 3 or ... parts)
    ).       # Increase the number, i.e. we paint 1, 2, 3, ... L parts, copy
    2$1<     # Take the first color of the target configuration
    *        # ...paint as many parts
    \c>+     # ...and keep the rest as with the current stick
    1$       # take the target configuration
             # Top of stack now e.g. reads
             #    h----- hyghgy (for i=0)
             #    hh---- hyghgy (for i=1)
             # Next, we strip the common leading characters from both strings:
    .,,      # Make list [0 1 2 ... L-1]
    {        # Filter {}, all the numbers for which the first j+1 parts are the same
      ).     # incr j
      2$<    # take leftmost j parts of stick A
      \3$<   # take leftmost j parts of stick B
      =      # are they equal?
    },,      # The length of the result is the number of common parts.
    .@>      # cut parts from A
    @@>      # cut parts from B
  ]}%
  \;         # Remove the target from the stack (not needed anymore)               
             # We now have a list of possible paintings where 1, 2, ..., L parts were
             # painted from the left with the same color.
             # All configurations were reduced by the common parts (they won't be
             # painted over anyways)
  {~S)}%     # Call the method S recursively on the previously prepared configurations
  $0+0=      # $0= -> sort and take first, i.e. take the minimum, 0+ is a workaround
             # if the list was empty (i.e. the operator was called with a stick of length 0).
}:S
~            # Execute S

"রঙের সবচেয়ে বামে ভুল" অ্যালগরিদমের জন্য +1। তবে, এটি n!ধাপগুলি বলে মনে হচ্ছে ;) (তবে সম্ভবত এটিই আসল জটিলতা, আমি জানি)।
yo '

2

জাভাস্ক্রিপ্ট: 187 বাইট

ধরে নিই আমাদের কেবল কোনও ফাংশনে ইনপুট এবং আউটপুট দেওয়ার অনুমতি দেওয়া হয়েছে (দয়া করে)!

function p(w){var j,l,s=-1,i,m=i=w.length;if(m<2)return m;for(;i--;){l = 1;for(var k=-1;(j=k)!=m;){if((k=w.indexOf(w[i],++j))==-1)k=m;l+=p(w.substring(j,k));}if(s==-1||l<s)s=l;}return s;}

157 আরও কুরুচিপূর্ণ অপ্টিমাইজেশান করে বাইটস (যা পয়েন্টটির অংশ, এবং আমি অবিশ্বাস্যভাবে মজা পেয়েছি):

function p(w){var j,l,s=-1,i,m=i=w.length;if(m<2)return m;for(;i--;s<0|l<s?s=l:1)for(l=1,j=0;~j;)l+=p(w.substring(j,(j=w.indexOf(w[i],j))<0?m:j++));return s}

135 বাইট আমি বুঝতে পেরেছি যে ইনপুটটির দৈর্ঘ্য একটি উপরের বাউন্ড এবং এখন আমার তুচ্ছ ঘটনাগুলি আলাদাভাবে হ্যান্ডেল করার দরকার নেই।

function p(w){var j,l,s,i,m=s=i=w.length;for(;i--;l<s?s=l:1)for(l=1,j=0;~j;)l+=p(w.substring(j,~(j=w.indexOf(w[i],j))?j++:m));return s}

পরীক্ষার কেস:

p("YRYGR")
4
p("grG")
3
p("GyRyGyG")
4
p("pbgbrgrp")
5
p("hyghgy")
4

প্রসারিত সংস্করণ:

function paint(word) {
    var smallest = -1;
    if(word.length < 2) return word.length;
    for(var i = word.length; i-->0;) {
        var length = 1;
        for(var left, right = -1;(left = right) != m;) {
            if((right = word.indexOf(word[i],++left)) == -1) right = word.length;
            if(left != right) length += paint(word.substring(left , right));
        }
        if(smallest == -1 || length < smallest) smallest = l;
    }
    return smallest;
}

ইনপুটটির প্রতিটি চরিত্রের জন্য, আমরা যদি প্রথমে সেই রঙটি আঁক করি তবে প্যাটার্নটির দৈর্ঘ্য গণনা করুন। এটি যে রঙটি আমরা রঙ করি তা ভান করে এবং তারপরে বিটগুলির বাইরে সাব বিভাগগুলি তৈরি করা হয় যা সেই রঙ নয়, এবং তাদের উপর রঙিন পদ্ধতিটি পুনরাবৃত্তভাবে কল করে। সংক্ষিপ্ততম পথটি ফিরে আসল।

উদাহরণ ( YRYGR):

প্রথমদিকে, চেষ্টা করুন R। এটি আমাদের উপ গ্রুপ দেয় Yএবং YGYতুচ্ছভাবে একবারে আঁকা হয়।

জন্য YG: চেষ্টা করুন G, Yতুচ্ছ, দৈর্ঘ্য 2। চেষ্টা করুন Y, Gতুচ্ছ, দৈর্ঘ্য 2 YGসুতরাং দৈর্ঘ্য 2

পেইন্টিং Rপ্রথম তাই আমাদের দেয়1 + 1 + 2 = 4

তারপরে চেষ্টা করুন G। এটি আমাদের উপ গ্রুপ দেয় YRYএবং RRতুচ্ছ

এর জন্য YRY:

চেষ্টা করুন Y: Rতুচ্ছ, দৈর্ঘ্য 2। চেষ্টা করুন R: Yএবং Yদুটি গ্রুপ, দৈর্ঘ্য 3

YRYদৈর্ঘ্য 2

পেইন্টিং Gপ্রথম দেয়1 + 1 + 2 = 4

তারপরে চেষ্টা করুন Y। এটি সাব গ্রুপগুলি দেয় Rএবং GRRতুচ্ছ, GRদৈর্ঘ্য 2Yদৈর্ঘ্য4

এই প্রয়োগের পরে কোডের দৈর্ঘ্য হ্রাস করতে পুনরায় আর এবং ওয়াই পরীক্ষা করা হবে। ফলস্বরূপ YRYGRতাই 4


আমি মনে করি আপনার প্রসারিত সংস্করণটি mকোথাও হারিয়ে গেছে ।
হাস্তুরকুন

দুর্ভাগ্যক্রমে, এছাড়াও আপনার সংস্করণ ইনপুট জন্য সঠিক ফলাফল দেয় না "abcacba"
হাওয়ার্ড

@ হস্তুরকুন mকেবলমাত্র শর্টহ্যান্ডের জন্য ছিল word.length:) @ আপনি ঠিক বলেছেন, আমাকে এটি আবারও ভাবতে হবে।
meiamsome

1

পাইথন, 149 অক্ষর

D=lambda s:0 if s=='?'*len(s)else min(1+D(s[:i]+'?'*(j-i)+s[j:])for i in range(len(s))for j in range(i+1,len(s)+1)if set(s[i:j])-set('?')==set(s[i]))

আমি ?এমন কোনও অঞ্চল চিহ্নিত করতে ব্যবহার করি যা কোনও রঙ হতে পারে। Dস্টিকটির একটি সংলগ্ন অঞ্চল বেছে নিয়েছে যা কেবলমাত্র একক রঙ (আরও কিছু ?গুলি), রঙগুলি যে অঞ্চলটি শেষ থাকে, সেই অঞ্চলকে ?এস দিয়ে প্রতিস্থাপন করে এবং পূর্ববর্তী সমস্ত পদক্ষেপগুলি সন্ধান করতে পুনরাবৃত্তি করে।

ক্ষতিকারক চলমান সময়। যুক্তিযুক্ত সময়ে (কয়েক মিনিট) উদাহরণগুলি করার জন্য সবেমাত্র দ্রুত আমি স্মৃতিচারণের সাথে বাজি ধরছি এটি আরও দ্রুত হতে পারে।


1

পাইথন 3 - 122

def r(s,a):c=s[0];z=c in a;return s[1:]and min([1+r(s[1:],a+c)]+[r(s[1:],a[:a.rfind(c)+1])]*z)or(1-z)
print(r(input(),''))

এটি কাজ করছে বলে মনে হচ্ছে, তবে আমি এখনও 100% নিশ্চিত নই যে এই পদ্ধতিটি সর্বদা সর্বনিম্ন সংখ্যার পদক্ষেপের সন্ধান করবে।


1

কফিস্ক্রিপ্ট - 183 247 224 215 207

x=(s,c='')->return 0if !s[0]?;return x s[1..],c if s[0]is c;l=s.length;return x s[1...l],c if s[l-1]is c;i=s.lastIndexOf s[0];1+(x s[1...i],s[0])+x s[i+1..],c
y=(z)->z=z.split "";Math.min (x z),x z.reverse()

জেএসফিডালটনে ডেমো

ডিবাগ কোড এবং মন্তব্য সহ অরোগল্ড সংস্করণ:

paintSubstring = (substring, color = '####') ->
  console.log 'Substring and color', substring, color, substring[0]
  # no need to color here
  if !substring[0]?
    return 0
  # no need to recolor the first part
  if substring[0] is color
    return paintSubstring (substring[1..]), color
  l = substring.length
  # no need to recolor the last part
  if substring[l-1] is color
    return paintSubstring substring[0...l], color
  # cover as much as possible
  index = substring.lastIndexOf substring[0]
  part1 = substring[1...index]
  part2 = substring[index+1..]
  console.log 'Part 1:', part1
  console.log 'Part 2:', part2
  # color the rest of the first half
  p1 = paintSubstring part1, substring[0]
  # color the rest of the second half, note that the color did not change!
  p2 = paintSubstring part2, color
  # sum up the cost of the substick + this color action
  return p1+p2+1
paintSubstringX=(x)->Math.min (paintSubstring x.split("")), paintSubstring x.split("").reverse()
console.clear()
input = """YRYGR
grG
GyRyGyG
pbgbrgrp
aaaaaaaa
hyghgy""".split /\n/
for stick in input
  console.log paintSubstringX stick

এর জন্য একটি ভুল ফলাফল ফিরে আসে বলে মনে হচ্ছে hyghgy। এটি 5 বলে তবে এটি 4 হওয়া উচিত (তবে এটি 4 এর জন্য সঠিক ফলাফল দেয় hyghgyh)।
PhiNotPi

@ ফিলনটপি Godশ্বর, এটি আমাকে characters০ টিরও বেশি অক্ষরের পিছনে ফেলেছে :(
ঝাঁকুনি

0

হাস্কেল, ১৪৩ টি চর

f s=g(r n ' ')0where{r=replicate;n=length s;g p l=minimum$n:[0|p==s]++[1+g(take i p++r(j-i)(s!!i)++drop j p)(l+1)|l<n,i<-[0..n-1],j<-[i+1..n]]}

এটি স্ট্রিংয়ের দৈর্ঘ্য পর্যন্ত সমস্ত সম্ভাব্য পুনর্লিখন চেষ্টা করে এবং এটি ইনপুট প্যাটার্নটি তৈরি করে এমনটি না পাওয়া পর্যন্ত যায়। বলার অপেক্ষা রাখে না, সূচকীয় সময় (এবং তারপরে কিছু)।


0

একটি সহজ প্রস্থ প্রথম অনুসন্ধান। এটি ইতিমধ্যে দেখা সারিতে কিছু দেয় না। এটি সমস্ত উদাহরণের জন্য একটি সেকেন্ডের অধীনে কাজ করে তবে 'pbgbrgrp' যা আসলে পুরো মিনিট সময় নেয় :(

এখন যে আমার এমন কিছু কাজ করে যা আমি দ্রুত এবং সংক্ষিপ্ততর কিছু সন্ধানের জন্য কাজ করব।

পাইথন - 300 296

def f(c):
 k=len(c);q=['0'*99];m={};m[q[0]]=1
 while q:
  u=q.pop(0)
  for x in ['0'*j+h*i+'0'*(k-j-i) for h in set(c) for j in range(1+k) for i in range(1,1+k-j)]:
   n=''.join([r if r!='0' else l for l,r in zip(u,x)])
   if n == c:
     return m[u]
   if not n in m:
    m[n]=m[u]+1;q.append(n)

আপনি দয়া করে ইন্ডেন্টেশন পরীক্ষা করতে পারেন? মনে হচ্ছে এটি ভেঙে গেছে।
হাওয়ার্ড

@ হাওয়ার্ড স্থির গতরাতে আমি কী ভাবছিলাম তা আমার কোনও ধারণা নেই।
ট্রেভরএম

0

হাস্কেল, 118 86 টি অক্ষর

p""=0
p(a:s)=1+minimum(map(sum.map p.words)$sequence$map(a%)s)
a%b|a==b=b:" "|1<3=[b]

টেস্ট রান:

λ: p "YRYGR"
4

λ: p "grG"
3

λ: p "GyRyGyG"
4

λ: p "pbgbrgrp"
5

λ: p "hyghgy"
4

λ: p "abcacba"
4

এই পদ্ধতি এমনকি যে সমস্ত অদক্ষ!

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