টেনশন অন গ্রাফ, প্রথম খণ্ড: একটি ওয়েভির স্ট্রিং


21

আসুন ডোমেন [-3,3] এর উপরে f (x) = sin ()x) + 0.5 sin (3πx) ফাংশন প্লট করি । আমরা এটি বোর্ডে পড়ে থাকা আলগা স্ট্রিং হিসাবে ব্যাখ্যা করতে পারি। এখন আসুন বোর্ডে n নখগুলি পজিশনে (x 1 , y 1 ) থেকে (x n , y n ) এ চালান , যেখানে x i ∈ (-3,3) এবং y i ∈ [-1,1] । কল্পনা করুন যে স্ট্রিংয়ের শেষে দুটি আইলেট রয়েছে , এটি অবস্থানে রয়েছে (-3,0) এবং (3,0)। স্ট্রিং টানটান না হওয়া পর্যন্ত আমরা এখন স্ট্রিংয়ের প্রান্তগুলি নিতে পারি এবং আইলেলেটগুলি দিয়ে টানতে পারি। এটি আমাদের গ্রাফকে একটি অংশবিশেষ লিনিয়ার ফাংশনে বিকৃত করবে।

কিছু ছবি সাহায্য করতে পারে। (-2.8, -0.7), (-2.5, -0.9), (-1.2, .2), (-0.5, .8), (0.5, .4), (1.2, -0.9), এ 8 টি নখ নিন (1.5, -0.6), (1.8, -0.8) । নিম্নলিখিত বর্ণিত তিনটি প্লট উপরে বর্ণিত প্রক্রিয়াটি দেখায়:

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

বড় সংস্করণের জন্য: ডান ক্লিক করুন -> নতুন ট্যাবে খুলুন

স্ট্রিং টাইটিংয়ের একটি অ্যানিমেশন এখানে দেওয়া হয়েছে যদি এটির দৃশ্যায়ণ করতে আপনার কিছুটা অসুবিধা হয়:

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

চ্যালেঞ্জ

"নখ" (যা অগত্যা সাজানো হয় না) একটি তালিকা দেওয়া, সেই নখ টান স্ট্রিং প্লটে বিভক্ত যদি এটা উপরের ফাংশন আকৃতি থেকে শুরু

আপনি কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন এবং STDIN, ARGV বা ফাংশন যুক্তির মাধ্যমে ইনপুট নিতে পারেন। আপনি হয় ফলাফলটি স্ক্রিনে প্রদর্শন করতে পারেন বা একটি ছবিতে একটি চিত্র সংরক্ষণ করতে পারেন।

ফলাফলটি যদি জরিমানা করা হয় তবে এটি কমপক্ষে 300 পিক্সেল প্রশস্ত এবং 100 পিক্সেল লম্বা হওয়া দরকার। (-3, -1.1) থেকে (3,1.1) পর্যন্ত স্থানাঙ্কের পরিসীমা চিত্রের অনুভূমিক এবং উল্লম্ব পরিমাণের কমপক্ষে 75% কভার করতে হবে। এক্স এবং ওয়াইয়ের দৈর্ঘ্যের স্কেলগুলি একই হতে হবে না। আপনাকে নখগুলি দেখাতে হবে (কমপক্ষে 3x3 পিক্সেল ব্যবহার করে) এবং স্ট্রিং (কমপক্ষে 1 পিক্সেল প্রশস্ত)। আপনি অক্ষগুলি অন্তর্ভুক্ত করতে পারেন বা নাও করতে পারেন।

রঙগুলি আপনার পছন্দসই, তবে আপনার কমপক্ষে দুটি স্বতন্ত্র রঙ প্রয়োজন: একটি ব্যাকগ্রাউন্ডের জন্য এবং একটি নখ এবং স্ট্রিংয়ের জন্য (সেগুলির বিভিন্ন রঙ থাকতে পারে)।

আপনি ধরে নিতে পারেন যে সমস্ত নখ কমপক্ষে 10 -5 ইউনিট এফ থেকে দূরে রয়েছে (যাতে আপনার ভাসমান-পয়েন্টের অসম্পূর্ণতা সম্পর্কে চিন্তা করার দরকার নেই)।

এটি কোড গল্ফ, তাই সংক্ষিপ্ত উত্তরটি (বাইটে) জেতে।

আরও উদাহরণ

এখানে আরও দুটি (সরল) উদাহরণ রয়েছে:

{{-2.5, 1}, {-1.5, -1}, {-0.5, 1}, {0.5, -1}, {1.5, 1}, {2.5, -1}}

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

(স্ট্রিংটি এক্স- এক্সিসের সাথে মিলে যায় ))

{{-2.7, -0.5}, {-2.3, -0.5}, {-1.7, 0.5}, {-1.3, 0.5}, {-0.7, -0.5}, {-0.3, -0.5}, {0.5, 1}, {1.5, -1}, {2.5, 1}}

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

আরেকটি চ্যালেঞ্জ চান?

এখানে দ্বিতীয় খণ্ড!


আমরা কি ধরে নিতে পারি যে নখগুলি বাম থেকে ডানে সাজানো হয়েছে?
Ell

@ সব আহ, ভাল ক্যাচ যেহেতু আমি এটি দিয়ে শুরু করার জন্য নির্দিষ্ট করে নেই, না। আমি এটা স্পষ্ট করব।
মার্টিন ইন্ডার

উত্তর:


8

পাইথন + পাইকাইরো, 727 708 608, + পাইল্যাব, 383

from pylab import*
def f(N):
 def P(u,w,N):
    T=lambda v,p:(C(v-u,p-u)>0)==(C(w-v,p-v)>0)==(C(u-w,p-w)>0);M=[(i,n)for i,n in enumerate(N)if T(V([n[0],sin(pi*n[0])+sin(3*pi*n[0])/2]),n)]
    if M:i,n=max(M,key=lambda n:C(n[1]-u,w-u)**2);M=P(u,n,N[:i])+[n]+P(n,w,N[i+1:])
    return M
 V=array;C=cross;a=V([3,0]);plot(*zip(*([-a]+P(-a,a,map(V,sorted(N)))+[a])));N and scatter(*zip(*N));show()

উদাহরণ

f([(-2.8,-0.7),(-2.5,-0.9),(-1.2,0.2),(-0.5,0.8),(0.5,0.4),(1.2,-0.9),(1.5, -0.6),(1.8, -0.8)])

উদাহরণ 1

কিভাবে এটা কাজ করে

ধরুন আমরা জানি যে টান স্ট্রিং দুই পয়েন্ট মাধ্যমে প্রেরণ করা একটি এবং বি (আমরা সবসময় দিয়ে শুরু করতে পারেন
একটি = (-3, 0) এবং বি = (3, 0) আমরা স্ট্রিং টান হিসাবে, এটি "চায়" নিতে।) এবং বি এর মধ্যে সবচেয়ে সংক্ষিপ্ততম পথ , এটি আদর্শভাবে, বিভাগটি এবি । তবে, যদি ফাংশন ( sin sinx + ... ) এবং AB দ্বারা আবদ্ধ এলাকায় কোনও নখ থাকে , তবে তাদের মধ্যে অন্তত একটি স্ট্রিংটি ব্লক করতে হবে। বিশেষত, উল্লিখিত অঞ্চলের মধ্যে AB থেকে দূরে পেরেক (গুলি) অবশ্যই স্ট্রিংটি ব্লক করবে। সুতরাং, সি যদি এই পেরেক হয় তবে আমরা জানি যে টাউট স্ট্রিংটি অবশ্যই অতিক্রম করবেসি , এবং বি ছাড়াও । আমরা এখন বিভাগগুলি এসি এবং সিবির জন্য প্রক্রিয়াটি পুনরাবৃত্তি করতে পারি এবং অবশেষে আর কোনও হস্তক্ষেপকারী নখ না পাওয়া পর্যন্ত এই ফ্যাশনে চালিয়ে যেতে পারি। চিত্র 1

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


পয়েন্টগুলির তালিকা খালি থাকলে এটি ত্রুটি করে। তবে তা ছাড়া আমার অন্যটি অবশ্যই হতাশ!
feersum

পছন্দ করুন সংশোধন করা হয়েছে।
Ell

3

পাইথন + পাইলাব, 576 বাইট

অ্যালগরিদম:

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

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

২ rand টি এলোমেলো পয়েন্ট সহ উদাহরণ:

(-0.367534, -0.722751), (-0.710649, -0.701412), (1.593101, -0.484983), (1.771199, 0.681435), (-1.878764, -0.491436), (-0.061414, 0.628570), (-0.326483, -0.512950), (0.877878, 0.858527), (1.256189, -0.300032), (1.528120, -0.606809), (-1.343850, -0.497832), (1.078216, 0.232089), (0.930588, -0.053422), (-2.024330, -0.296681), (-2.286014, 0.661657), (-0.009816, 0.170528), (2.758464, 0.099447), (-0.957686, 0.834387), (0.511607, -0.428322), (-1.657128, 0.514400), (1.507602, 0.507458), (-1.469429, -0.239108), (0.035742, 0.135643), (1.194460, -0.848291), (2.345420, -0.892100), (2.755749, 0.061595), (0.283293, 0.558334), 

খোঁড়া উদাহরণ

Golfed

for j in R(i&~1)লুপে ইন্ডেন্টেশনের বিভিন্ন স্পেস হিসাবে যা প্রদর্শিত হবে তা আসলে একটি ট্যাব হওয়া উচিত।

from pylab import*
P=((3,0),(-3,0))+input()
X=sorted(set(zip(*P)[0]))
l=len(X)*2
if l>4:scatter(*zip(*P[2:]))
f=lambda x:sin(pi*x)+sin(3*pi*x)/2
B=[[max([-9]+[p[1]for p in P if x==p[0]and p[1]<f(x)]),min([9]+[p[1]for p in P if x==p[0]and p[1]>f(x)])]for x in X]
b=zeros(l);b[2:]=inf
v=list(b)
R=range
for i in R(l):
 for j in R(i&~1):
    A=B[j/2][j&1];D,d=B[i/2][i&1]-A,X[i/2]-X[j/2];K=1;c=b[j]+norm((d,D))
    for k in R(j/2+1,i/2):C=A+D/d*(X[k]-X[j/2]);K&=C<B[k][1];K&=C>B[k][0]
    if(c<b[i])&K:b[i]=c;v[i]=j,(X[j/2],A)
l-=2
s=P[:1]
while l/2:l,p=v[l];s+=(p,)
plot(*zip(*s))
show()

Ungolfed

from pylab import*
P = input()
Xn,Yn = zip(*P)
X = set(Xn+(3,-3))
f = lambda x:sin(pi*x)+sin(3*pi*x)/2
ylb = {x: max([-9]+[p[1] for p in P if p[0] == x and p[1] < f(x)]) for x in X}
yub = {x: min([9]+[p[1] for p in P if p[0] == x and p[1] > f(x)]) for x in X}
ylb[-3] = yub[3] = ylb[3] = 0
X = sorted(X)
l = len(X)
best = zeros((l,2))
best[1:] = inf
prev = [ [0,0] for i in range(l) ]
for i in range(l): # calculate min path to X[i] lb or ub
  for ib in 0,1:
    for j in range(i): # point to come from
      for jb in 0,1:
          Y2, Y1 = (ylb, yub)[ib][X[i]], (ylb, yub)[jb][X[j]]
          dy,dx = Y2 - Y1, X[i] - X[j]
          if all([Y1 + dy/dx*(x - X[j]) < yub[x] and Y1 + dy/dx*(x - X[j]) > ylb[x] for x in X[j+1:i]]):
             c = best[j][jb] + (dy**2+dx**2)**.5
             if c < best[i][ib]:
                 best[i][ib] = c
                 prev[i][ib] = j, jb, (X[j], Y1)
j, jb = l-1,0
pts = [(3,0)]
while j:
    j, jb, p = prev[j][jb]
    pts += [p]
plot(*zip(*pts))
scatter(Xn,Yn)
show()

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