একটি সরলরেখা আঁকুন


15

একটি সরল রেখা সমন্বিত একটি সাধারণ ASCII আর্ট চিত্র আঁকুন। এটা তোলে অনুরূপ এই এবং এই কিন্তু বিভিন্ন স্পেসিফিকেশনের সঙ্গে।

ইনপুট

আপনার কোড অনুসারে আপনি এই ইনপুট ফর্ম্যাটটি পরিবর্তন করতে পারেন।

  • পূর্ণসংখ্যা width
  • পূর্ণসংখ্যা height
  • পূর্ণসংখ্যা x0
  • পূর্ণসংখ্যা y0
  • পূর্ণসংখ্যা x1
  • পূর্ণসংখ্যা y1

আউটপুট

নির্দিষ্ট প্রস্থ ও উচ্চতা পিক্সেল থেকে একটি লাইন ধারণকারী একটি পরিপূর্ণ হওয়া ASCII শিল্প ইমেজ (x0, y0)পিক্সেল থেকে(x1, y1)

পাঠ্য আউটপুটটির কোনও মানক ফর্ম গ্রহণযোগ্য, তবে লাইন অঙ্কন কার্যক্রমে অন্তর্নির্মিত ব্যবহার করবেন না।

বিস্তারিত

লাইনটি অবশ্যই একটি একক মুদ্রণযোগ্য অক্ষর (যেমন #) ব্যবহার করে আঁকতে হবে , যখন পটভূমিটি একটি অন্য অক্ষর (যেমন .) দিয়ে পূর্ণ থাকে । আপনার অবশ্যই অবশ্যই পূর্ববর্তী অক্ষরগুলি মুদ্রণ করতে হবে যাতে চিত্রের আকারটি সঠিক হয়।

পিক্সেল স্থানাঙ্কগুলি 0-সূচকযুক্ত বা 1-সূচকযুক্ত হতে পারে এবং চিত্রের কোনও কোণে শুরু হতে পারে। শুরু এবং শেষ পিক্সেলের কেন্দ্রগুলি সংযুক্ত করে 0-প্রস্থের উপ-পিক্সেল লাইনটি কল্পনা করে লাইনটি আঁকতে হবে। লাইনটি যে পিক্সেলটি প্রবেশ করে তা পূরণ করা উচিত।

জয়লাভ

সাধারণ কোড-গল্ফ নিয়ম। সংক্ষিপ্ততম কোড জিতেছে।

উদাহরণ

IN: width, height, x0, y0, x1, y1

IN: 7, 6, 0, 0, 6, 5
OUT:
.....##
....##.
...##..
..##...
.##....
##.....

IN: 3, 3, 1, 1, 1, 1
OUT:
...
.#.
...

IN: 3, 3, 0, 2, 2, 0
OUT:
#..
.#.
..#

IN: 6, 3, 0, 0, 5, 2
OUT:
....##
.####.
##....

IN: 4, 4, -1, -1, 0, 3
OUT:
#...
#...
#...
....

4
আমি "ওয়েলকাম টু পিপিসিজি" বলব তবে আপনি যতদিন আমার এখানে নিবন্ধিত থাকবেন। :-) চমৎকার প্রথম চ্যালেঞ্জ!
অ্যাডমবর্কবার্ক

আমরা কি ফাঁকা জায়গাগুলির পরিবর্তে প্রকৃত বিন্দুগুলি আউটপুট করতে পারি? বা স্পেস ছাড়া অন্য কোনও চরিত্র? (অনুমান করে এখনও পিছিয়ে থাকা <
চ্যারেক্টর

নিশ্চিত! আমি সম্পাদনাগুলি করব
কার্টিস বেচটেল

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

1
@ কেভিন ক্রুইজসেন বোঝাচ্ছেন যে একটি লাইন সোজা হওয়া দরকার , না? ;)
অ্যালবার্ট রেনশওয়া

উত্তর:


2

গণিত, 166 137 বাইট

l:={i,j};s=Sign;f[p_,q_,h_,w_]:=Grid@Table[(1-Max[s[p-l]s[q-l],0])Boole[Abs@Mean[s@Det@{p-l+#,p-q}&/@Tuples[.5{1,-1},2]]<.6],{i,h},{j,w}]

আরও পঠনযোগ্য সংস্করণ:

l := {i, j}; s = Sign; 
f[p_, q_, h_, w_] := 
 Grid@Table[(1 - Max[s[p - l] s[q - l], 0]) Boole[
     Abs@Mean[
        s@Det@{p - l + #, p - q} & /@ 
         Tuples[.5 {1, -1}, 2]] < .6], {i, h}, {j, w}]

এটি বলা একটি ফাংশন সংজ্ঞায়িত করে f। আমি ইনপুট এবং আউটপুট স্পেসিফিকেশন মোটামুটি উদারভাবে ব্যাখ্যা করেছি। ফাংশনটি fফর্ম্যাটটিতে ইনপুট নেয় f[{x0, y0}, {x1, y1}, height, width]এবং গ্রিডটি 1-সূচীযুক্ত হয়, উপরের বাম দিকে শুরু হয়। আউটপুটগুলির মতো দেখতে

একটি নমুনা আউটপুট

1s হিসাবে প্রদর্শিত লাইন এবং এর হিসাবে পটভূমি সহ 0(এখানে দেখানো হয়েছে f[{2, 6}, {4, 2}, 5, 7])। একটি ম্যাথামেটিকাল ম্যাট্রিক্স বাঁক কাজটি 1s এবং 0একটি স্ট্রিং মধ্যে গুলি #s এবং. র সামনে অনেক অন্যান্য চ্যালেঞ্জ মধ্যে golfed হয়েছে, তাই আমি শুধু একটি মান পদ্ধতি ব্যবহার করতে পারে, কিন্তু আমি মনে করি না কিছু আকর্ষণীয় যোগ না।

ব্যাখ্যা:

সাধারণ ধারণাটি হ'ল লাইনটি যদি কিছু পিক্সেল দিয়ে যায় তবে পিক্সেলের চারটি কোণার কমপক্ষে একটি লাইনটির উপরে এবং কমপক্ষে একটি নীচের দিকে থাকে। ভেক্টর ( {x0,y0}কোণে) এবং ( {x0,y0}থেকে {x1,y1}) এর মধ্যবর্তী কোণটি পরীক্ষা করে কোন কোণটি রেখার উপরে বা নীচে রয়েছে কিনা তা পরীক্ষা করে দেখি: যদি এই কোণটি ইতিবাচক হয় তবে কোণটি উপরে থাকে, এবং কোণটি নেতিবাচক হলে কোণটি নীচে থাকে।

আমাদের যদি দুটি ভেক্টর থাকে {a1,b1}এবং {a2,b2}আমরা ম্যাট্রিক্সের নির্ধারকের চিহ্নটি সন্ধান করে তাদের মধ্যবর্তী কোণটি ইতিবাচক বা নেতিবাচক কিনা তা পরীক্ষা করতে পারি {{a1,b1},{a2,b2}}। (জটিল সংখ্যার এই ব্যবহৃত গাণিতিকটি করার আমার পুরানো পদ্ধতি, যা ছিল বেশ ... ভাল, জটিল))

কোডে এটি যেভাবে কাজ করে তা নিম্নরূপ:

  • {p-l+#,p-q}&/@Tuples[.5{1,-1},2]চার ভেক্টর পায় {x0,y0}এবং পিক্সেল চার কোণায় (সঙ্গে l:={i,j}, পিক্সেল এর স্থানাঙ্ক, তার আগে সংজ্ঞায়িত), এবং এছাড়াও মধ্যে ভেক্টর {x0,y0}এবং{x1,y1}
  • s@Det@...রেখা এবং চার কোণার (ব্যবহার করে s=Sign) মধ্যে কোণগুলির চিহ্নগুলি সন্ধান করে । এগুলি -1, 0 বা 1 সমান হবে।
  • Abs@Mean[...]<.6পরীক্ষা করে যে কয়েকটি কোণ ইতিবাচক এবং কিছু নেতিবাচক। এই বৈশিষ্ট্যযুক্ত 4-টিউপলসের চিহ্নগুলির সমস্তটির অর্থ -0.5 এবং 0.5 (অন্তর্ভুক্ত) এর মধ্যে রয়েছে, সুতরাং এর <পরিবর্তে ব্যবহার করে বাইট সংরক্ষণ করতে আমরা 0.6 এর সাথে তুলনা করি <=

এখনও একটি সমস্যা রয়েছে: এই কোডটি ধরে নিয়েছে যে রেখাটি উভয় দিক দিয়ে চিরতরে প্রসারিত। সুতরাং আমাদের লাইনটি ক্রপ করতে হবে 1-Max[s[p-l]s[q-l],0](ট্রায়াল এবং ত্রুটির দ্বারা পাওয়া) দ্বারা গুন করে , যা 1লাইনটির শেষ বিন্দু দ্বারা সংজ্ঞায়িত আয়তক্ষেত্রের অভ্যন্তরে এবং এর 0বাইরেও।

একটি আয়তক্ষেত্র দ্বারা একটি লাইন ক্রপ করা

বাকি কোডগুলি এই পিক্সেলগুলির একটি গ্রিড করে।

(বোনাস হিসাবে, 181 বাইটের জন্য, এখানে সম্পূর্ণ ভিন্ন পদ্ধতির সাথে পূর্বের চেষ্টা রয়েছে :)

Quiet@Grid@Table[(1-Max[Sign[{i,j}-#3]Sign[{i,j}-#4],0])Boole[#3==#4=={i,j}||2Abs@Tr[Cross@@Thread@{{i,j},#3,#4}]/Norm[d=#3-#4]<2^.5Cos@Abs[Pi/4-Mod[ArcTan@@d,Pi/2]]],{i,#},{j,#2}]&

1
এখন যে শেষ, লাঞ্চের সময়! (সন্ধ্যা সাড়ে At টায়…)
গাছ নয়

1

সিজেম, 122 বাইট

{),V>{[I\]E.*A.+}/}:F;l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:D[0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fID~\:I;F]{_Wf>\S.<+:*},{~_3$=@0tt}/N*

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

এটি মূলত দুটি চ্যালেঞ্জের জন্য আমি আগে লিখেছি এমন দুটি জবাব একত্রিত করে (মূলত ২ য় জনের গণনা - ফাংশন l)।
(0, 0) স্বাভাবিকভাবে উপরের বাম কোণে, বিবৃতিতে উদাহরণগুলির মতো নীচে বাম দিকে নয়।

সংক্ষিপ্ত বিবরণ:

{),V>{[I\]E.*A.+}/}:F;ফাংশন এফ সংজ্ঞায়িত করে যা প্রদত্ত এক্স কোঅর্ডিনেটের জন্য সমস্ত পিক্সেল (স্থানাঙ্ক জোড়া) উত্পন্ন করতে সহায়তা করে
l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:Dএবং ইনপুটটি প্রসেস করে এবং
0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fIশেষের ব্যতীত সমস্ত x স্থানাঙ্কের উপরে বিন্দুগুলির একটি ম্যাট্রিক্স তৈরি
D~\:I;Fকরে এবং একই পিক্সেলগুলির জন্য একই কাজ করে শেষ এক্স সমন্বয়টি
{_Wf>\S.<+:*},কেবল পিক্সেল
{~_3$=@0tt}/রাখে যা চিত্রের অভ্যন্তরে উপস্থিত হওয়া উচিত প্রতিটি পিক্সেলের জন্য ম্যাট্রিক্সে 0 রাখে যা
N*প্রদর্শনের জন্য নতুন লাইন অক্ষরের সাথে ম্যাট্রিক্সে যোগ দেয়

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