एक सीधी रेखा खींचें


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
मैं कहता हूँ कि "PPCG में आपका स्वागत है" लेकिन आप यहाँ तक पंजीकृत हो चुके हैं जब तक कि मैं। :-) अच्छी पहली चुनौती!
AdmBorkBork

क्या हम रिक्त स्थान के बजाय वास्तविक डॉट्स का उत्पादन कर सकते हैं? या किसी अन्य चरित्र लेकिन रिक्त स्थान? (अनुगामी <चरित्र> s सहित अभी भी मानकर)
R

ज़रूर! मैं संपादन करता हूँ
कर्टिस बेचटेल

1
@AlbertRenshaw वास्तव में, जब मैं विकिपीडिया पर वक्र को देखता हूं तो यह बताता है: " गणित में, एक वक्र ( पुराने ग्रंथों में एक वक्र रेखा भी कहा जाता है ), आम तौर पर बोलना, एक पंक्ति के समान एक वस्तु है, लेकिन सीधे होने की आवश्यकता नहीं है। " )
केविन क्रूज़सेन

1
@KevinCruijssen यह कहते हुए कि एक लाइन की जरूरत है सीधे , नहीं? ;)
अल्बर्ट रेनशॉ

जवाबों:


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-अनुक्रमित है, शीर्ष बाएं में शुरू होता है। आउटपुट जैसा दिखता है

एक नमूना उत्पादन

1एस और पृष्ठभूमि के रूप में प्रदर्शित लाइन के साथ 0एस (यहां दिखाया गया है f[{2, 6}, {4, 2}, 5, 7])। की एक मेथेमेटिका मैट्रिक्स मोड़ का कार्य 1है और 0की एक स्ट्रिंग में रों #रों और .एस से पहले कई अन्य चुनौतियों में 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-tuples -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
अब जब कि समाप्त हो गया है, दोपहर के भोजन के लिए समय! (शाम 6:30 बजे ...)
पेड़ नहीं

1

CJam, 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*

इसे ऑनलाइन आज़माएं

यह मूल रूप से दो उत्तरों को जोड़ती है जो मैंने पहले अन्य चुनौतियों के लिए लिखा था (मुख्य रूप से 2 वें एक फ़ंक्शन से गणना l)।
(0, 0) स्वाभाविक रूप से शीर्ष बाएँ कोने में है, न कि नीचे दिए गए कथन में उदाहरणों की तरह।

अवलोकन:

{),V>{[I\]E.*A.+}/}:F;फ़ंक्शन F को परिभाषित करता है जो किसी दिए गए x निर्देशांक के लिए सभी पिक्सल (समन्वय जोड़े) को उत्पन्न करने में मदद करता
l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:Dहै और इनपुट को संसाधित करता है, और
0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fIपिछले एक को छोड़कर सभी x निर्देशांक पर डॉट्स के मैट्रिक्स को बनाता है , और सभी संगत पिक्सेल को समान बनाता
D~\:I;Fहै। अंतिम x समन्वय
{_Wf>\S.<+:*},केवल उन पिक्सेल को रखता है जो छवि के अंदर दिखाई देना चाहिए
{~_3$=@0tt}/, प्रत्येक पिक्सेल के लिए मैट्रिक्स में 0 डालता है
N*, प्रदर्शन के लिए नई रूपरेखा के साथ मैट्रिक्स को जोड़ता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.