একটি গ্রাফের উপর টান, দ্বিতীয় খণ্ড: একটি রাবার ব্যান্ড


13

"টান টান টান টান" সম্পর্কে এটি দুটি চ্যালেঞ্জের দ্বিতীয়। এখানে সামান্য সরল প্রথম অংশ

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

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

উদাহরণস্বরূপ, এম = 12 প্রাথমিক নখ অবস্থানগুলিতে (0, 0), (2, -1), (3/2, 4/3), (7/2, 1/3), (11/2, 16/3), (1, 16/3), (0, 1), (7, -2), (3, 4), (8, 1), (3, -1), (11, 0) , এবং n = 10 অবস্থানগুলিতে আরও নখ (1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0) ), (6, 2), (7, 1), (6, 0) । নিম্নলিখিত বর্ণিত তিনটি প্লট উপরে বর্ণিত প্রক্রিয়াটি দেখায়:

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

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

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

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

চ্যালেঞ্জ

"নখ" এর দুটি তালিকা দেওয়া, দ্বিতীয় তালিকার চারপাশে টট রাবার ব্যান্ডটি প্লট করুন যদি এটি প্রথম তালিকার সমস্ত নখকে ঘুরিয়ে আকৃতি থেকে শুরু করে।

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

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

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

আপনি ধরে নিতে পারেন যে দ্বিতীয় তালিকার সমস্ত নখ রাবার ব্যান্ডের প্রাথমিক আকার থেকে কমপক্ষে 10 -5 ইউনিট দূরে রয়েছে (যাতে আপনার ভাসমান-পয়েন্টের ভুল সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই)।

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

আরও উদাহরণ

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

{{1, 1}, {3, 3}, {2, 4}, {1, 3}, {4, 0}, {3, -1}, {2, 0}, {4, 2}}
{{2, 1}, {3, 2}, {1, 2}, {4, 1}}

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

{{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 5}, {3, 5}, {-1, 3}, {-1, 0}, {3, 4}, {5, 1}, {5, -1}, {7, -1}, {3, 7}, {7, 5}}
{{0, 0}, {0, 2}, {0, 4}, {0, 6}, {2, 0}, {2, 2}, {2, 4}, {2, 6}, {4, 0}, {4, 2}, {4, 4}, {4, 6}, {6, 0}, {6, 2}, {6, 4}, {6, 6}}

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

এবং এখানে একটি উদাহরণ যা প্রাথমিক দুটি পেরেক বাকি রেখে গেছে তার তাত্পর্য দেখায়। ফলাফলটি হতে হবে এবং একটি নয় :

{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}

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

এই উদাহরণটি প্রদানের জন্য এলকে ধন্যবাদ।


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

আউটপুট কী এই ?
Ell

@ সমস্ত আহ, খুব সুন্দর পরীক্ষার কেস। আমি ধারাবাহিকতার জন্য মনে করি, এটি হওয়া উচিত , তবে আমি সত্যিই সে সম্পর্কে প্রশ্নটি স্পষ্ট করা দরকার। শিগগিরই তা করবে। ধন্যবাদ!
মার্টিন ইন্ডার

উত্তর:


11

পাইথন + ম্যাটপ্ল্লোলিব, 688

from pylab import*
C=cross
P,M=eval("map(array,input()),"*2)
P,N=[[P[0]]+L+[P[-1]]for L in P,M]
W=[.5]*len(P)
def T(a,c,b):
 I=[(H[0]**2,id(n),n)for n in N for H in[(C(n-a,b-a),C(n-b,c-b),C(n-c,a-c))]if(min(H)*max(H)>=0)*H[1]*H[2]]
 if I:d=max(I)[2];A=T(a,c,d);B=T(d,c,b);return[A[0]+[d]+B[0],A[1]+[sign(C(c-a,b-c))]+B[1]]
 return[[]]*2
try:
 while 1:
    i=[w%1*2or w==0for w in W[2:-2]].index(1);u,a,c,b,v=P[i:i+5];P[i+2:i+3],W[i+2:i+3]=t,_=T(a,c,b);t=[a]+t+[b]
    for p,q,j,k in(u,a,1,i+1),(v,b,-2,i+len(t)):x=C(q-p,c-q);y=C(q-p,t[j]-q);z=C(c-q,t[j]-q);d=sign(j*z);W[k]+=(x*y<=0)*(x*z<0 or y*z>0)*(x!=0 or d*W[k]<=0)*(y!=0 or d*W[k]>=0)*d
except:plot(*zip(*P))
if M:scatter(*zip(*M))
show()

STDIN থেকে দুটি পয়েন্টের তালিকা পড়ে।

উদাহরণ

[(0, 0), (2, -1), (3.0/2, 4.0/3), (7.0/2, 1.0/3), (11.0/2, 16.0/3), (1, 16.0/3), (0, 1), (7, -2), (3, 4), (8, 1), (3, -1), (11, 0)]
[(1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0), (6, 2), (7, 1), (6, 0)]

চিত্র 1

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

সমাধানের মূলটি হ'ল ছোট, বর্ধিত পদক্ষেপে কাজ করা। আমরা যখন একবারে সমস্ত নখ অপসারণ করি তখন কী ঘটে তা বোঝার চেষ্টা করার পরিবর্তে, আমরা কেবল একটি নখ অপসারণের প্রত্যক্ষ প্রভাবগুলিতে মনোনিবেশ করি। তারপরে আমরা একের পর এক নখকে স্বেচ্ছাসেবী করে ফেলতে পারি।

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

চিত্র ২

মনে রাখবেন যে:

  • পেরেকটির ব্যান্ডটি পেরেকের স্পর্শকাতর হয়ে যাওয়ার সাথে সাথে আমরা গণনা শুরু করি, যদিও পেরেকটি তার আকারটিকে কঠোরভাবে প্রভাবিত করে না। মনে রাখবেন, চিত্রটির বিপরীতে, আমাদের নখগুলি মাত্রাবিহীন। অতএব, যদি ব্যান্ড একটি পেরেক থেকে স্পর্শক হয়ে আমরা বলতে পারবো না ব্যান্ডের যা পার্শ্ব পেরেক একা তার অবস্থান চালু আছে --- আমরা যেখানে এটি ট্র্যাক রাখতে হবে ব্যবহৃত ব্যান্ড আপেক্ষিক যাবে।

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

এখন আমরা প্রতিটি পদক্ষেপে কী ঘটে তা বর্ণনা করতে পারি:

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

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

  • ব্যান্ডের পথে পরিবর্তনগুলি প্রতিফলিত করতে আমরা দুটি প্রতিবেশী নখের মান আপডেট করি (সহজেই সবচেয়ে জটিল অংশ!)

অপসারণের জন্য আর কোনও নখ না পাওয়া পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি হবে:

চিত্র 3

এবং এখানে পেরেকের চারপাশে বেশ কয়েকবার ব্যান্ড মোড়ানো ব্যান্ড চিত্রিত করার আরও জটিল উদাহরণ রয়েছে:

চিত্র 4


অ্যামেজিং! কেবল একটি জিনিস: এই গ্রাফিকগুলি কি রাস্টেরাইজড বা তারা ভেক্টর গ্রাফিক্স? পূর্ববর্তী ক্ষেত্রে, আমি আপনাকে "x এবং y এর দৈর্ঘ্যের স্কেল একই হতে হবে" to এছাড়াও, আপনি আপনার ব্যাখ্যাগুলিতে ব্যবহার করেন এমন সমস্ত গ্রাফিকগুলি তৈরি করতে আপনি কী ব্যবহার করছেন। ম্যাটপ্লটলিবও?
মার্টিন ইন্ডার

ধন্যবাদ! এর ... ম্যাটপ্ল্লোটিব যেহেতু আমাকে উড়ানের প্লটটি স্কেল করতে দিন আমি ভেক্টর গ্রাফিক্স নিয়ে যাব :) আমি যে চিত্রণগুলি বেশিরভাগই জিওজেব্রা ব্যবহার করি তার জন্য । এটি একটু কৌতূহলযুক্ত তবে এটি কাজটি সম্পন্ন করে।
এলো

হ্যাঁ ঠিক আছে, আপনি যদি এটিকে নির্বিচারে আকার দিতে পারেন তবে তা ঠিক। লিঙ্কটির জন্য ধন্যবাদ, আমি এটি পরীক্ষা করে দেখব!
মার্টিন ইন্ডার

4

জাভা - 1262 বাইট

আমি জানি এটি সম্ভবত যতটা সম্ভব গল্ফ হয় না।

যাইহোক, অন্য কারও কাছে মনে হয় না যে তারা প্লেটে উঠে এই প্রশ্নের উত্তর দিচ্ছেন, তাই আমি করব।

প্রথম, "টি" শ্রেণি - যা একটি বিন্দু শ্রেণি - 57 বাইট

class T{double x,y;public T(double a,double b){x=a;y=b;}}

এবং প্রধান শ্রেণি - 1205 বাইট

import java.awt.Color;import java.awt.Graphics;import java.util.*;import javax.swing.*;class Q extends JPanel{void d(List<T>a,T[]z){JFrame t=new JFrame();int m=0;int g=0;for(T v:a){if(v.x>m)m=(int)v.x;if(v.y>g)g=(int)v.y;}for(T v:z){if(v.x>m)m=(int)v.x;if(v.y>g)g=(int)v.y;}t.setSize(m+20,g+20);t.setVisible(true);t.getContentPane().add(this);double r=9;while(r>1){r=0;for(int i=0;i<a.size()-1;i+=2){T p1=a.get(i),p2=new T((p1.x+a.get(i+1).x)/2,(p1.y+a.get(i+1).y)/2);a.add(i+1,p2);if(y(p1,p2)>r){r=y(p1,p2);}}}double w=15;List<T>q=new ArrayList<T>();while(w>3.7){w=0;q.clear();for(int e=0;e<a.size()-2;e++){T p1=a.get(e),u=a.get(e+1),p3=a.get(e+2),p2=new T((p1.x+p3.x)/2,(p1.y+p3.y)/2);w+=y(u,p2);int k=0;if(y(p1,a.get(e+1))<.5){a.remove(e);}for(T n:z){if(y(n,p2)<1){k=1;q.add(n);}}if(k==0){a.set(e+1,p2);}}}q.add(a.get(a.size()-1));q.add(1,a.get(0));p=z;o=q.toArray(new T[q.size()]);repaint();}T[]p;T[]o;double y(T a,T b){return Math.sqrt(Math.pow(b.x-a.x,2)+Math.pow(b.y-a.y,2));}public void paintComponent(Graphics g){if(o!=null){for(int i=0;i<o.length-1;i++){g.drawLine((int)o[i].x,(int)o[i].y,(int)o[i+1].x,(int)o[i+1].y);}g.setColor(Color.blue);for(T i:p){g.fillOval((int)i.x-3,(int)i.y-3,6,6);}}}}

উদাহরণ:

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

চালানোর জন্য, পয়েন্টগুলির তালিকা এবং নখের একটি অ্যারে দিয়ে "ডি" ফাংশনটি কল করুন (হ্যাঁ, আমি জানি, অদ্ভুত)। এর মানে কি:

  • পয়েন্টগুলির একটি তালিকা তৈরি করে যা রেখাগুলি উপস্থাপন করে - এটি হ'ল লাইনের মধ্যবর্তী সমস্ত পয়েন্ট।
  • এই পয়েন্টগুলিতে বারবার একটি অ্যালগরিদম পুনরাবৃত্তি করে যাতে প্রতিটি পয়েন্ট তার চারপাশের দুটি পয়েন্টের গড় হয়।
  • যখন পয়েন্টগুলি আরও বেশি চলমান বলে মনে হচ্ছে না, তখন আমি স্পর্শ করছি এমন কোনও নখের মাঝে আঁকছি।

আমি নিশ্চিত না যে পিক্সেলগুলিতে অক্ষগুলি ঠিক আছে কিনা। এটি সর্বদা স্থানের 75% এরও বেশি সময় নেয়, এটি সম্ভবত সত্যই সত্যই ছোট।

আমি এখানে যা করছি তা প্রদর্শনের জন্য এখানে একটি দুর্দান্ত অ্যানিমেশন রয়েছে:

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

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

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

এখানে অসম্পূর্ণ, অ্যানিমেশন কোডটি রয়েছে:

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Q extends JPanel{
    List<Point>points=new ArrayList<Point>();
    List<Point>n=new ArrayList<Point>();
    public Q() throws InterruptedException{
        double[][]rawPoints={{0, 0}, {2, -1}, {3/2, 4/3}, {7/2, 1/3}, {11/2, 16/3}, {1, 16/3}, {0, 1}, {7, -2}, {3, 4}, {8, 1}, {3, -1}, {11, 0}};
        double[][]rawNails={{1, 1}, {3, 1}, {4, 4}, {1, 3}, {2, 2}, {5, -1}, {5, 0}, {6, 2}, {7, 1}, {6, 0}};
        List<Point>p=new ArrayList<Point>(),nails = new ArrayList<Point>();
        double factor = 50;
        for(double[]rawP:rawPoints){p.add(new Point(rawP[0]*factor+100,rawP[1]*factor+100));}
        for(double[]rawN:rawNails){nails.add(new Point(rawN[0]*factor+100,rawN[1]*factor+100));}
        n=nails;
        JFrame frame=new JFrame();
        frame.setSize(700,500);
        frame.setVisible(true);
        frame.getContentPane().add(this);
        d(p,nails);
    }
    public static void main(String[]a) throws InterruptedException{
        new Q();
    }
    void d(List<Point>a,List<Point>nails) throws InterruptedException{
        //add midpoint every iteration until length of 1 is achieved
        //begin algorithm
        //stop points that are within a small amount of a nail
        double distance=20;
        while(distance>1){
            distance=0;
            for (int i=0;i<a.size()-1;i+=2){
                double fir=a.get(i).x;
                double sec=a.get(i).y;
                double c=(fir+a.get(i+1).x)/2;
                double d=(sec+a.get(i+1).y)/2;
                a.add(i+1,new Point(c,d));
                double dist=distBP(new Point(fir,sec),new Point(c,d));
                if(dist>distance){distance=dist;}
            }
        }
        for(Point p:a){a.set(a.indexOf(p), new Point(p.x,p.y));}
        //algorithm starts here:
        setEqual(a);
        repaint();
        invalidate();
        System.out.println(a);
        int count=0;
        while(true){
            count++;
            for(int index=0;index<a.size()-2;index++){
                double x2=(a.get(index).x+a.get(index+2).x)/2;
                double y2=(a.get(index).y+a.get(index+2).y)/2;
                int pointStable=0;
                if(distBP(a.get(index),a.get(index+1))<.5){a.remove(index);}
                for(Point n:nails){
                    if(distBP(n,new Point(x2,y2))<1){pointStable=1;}
                }
                if(pointStable==0){a.set(index+1, new Point(x2,y2));}
            }
            if(count%10==0){
            setEqual(a);
            invalidate();
            repaint();
            Thread.sleep(5);
            }
        }
        //System.out.println(a);
    }
    void setEqual(List<Point>a){
        points = new ArrayList<Point>();
        for(Point p:a){points.add(p);}
    }
    double distBP(Point a,Point b){
        return Math.sqrt(Math.pow(b.x-a.x, 2)+Math.pow(b.y-a.y, 2));
    }
    @Override
    public void paintComponent(Graphics g){
        g.setColor(Color.white);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(Color.black);
        for(Point p:points){
            g.drawRect((int)p.x, (int)p.y, 1, 1);
        }
        for(Point nail:n){
            g.drawOval((int)nail.x-2, (int)nail.y-2, 4, 4);
        }
    }
}

7
আপনার ব্যবহারকারীর নামটি এই সমস্যার পক্ষে উপযুক্ত।
ফসজিন

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

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