ম্যাট্রিক্সের মাধ্যমে কোনও ম্যাট্রিক্সের জন্য ট্রেস… ব্রেসেনহ্যামের লাইন রাস্টেরাইজেশন


12

দ্বারা অনুপ্রাণিত এই

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

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

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

 function line(x0, y0, x1, y1)
     real deltax := x1 - x0
     real deltay := y1 - y0
     real deltaerr := abs(deltay / deltax)    // Assume deltax != 0 (line is not vertical),
           // note that this division needs to be done in a way that preserves the fractional part
     real error := 0.0 // No error at start
     int y := y0
     for x from x0 to x1 
         plot(x,y)
         error := error + deltaerr
         while error ≥ 0.5 then
             y := y + sign(deltay) * 1
             error := error - 1.0

(দ্রষ্টব্য যে এই সিউডোকোডটি কেবল 1 এরও কম opালের জন্য কাজ করে; লম্বা গ্রিডগুলির জন্য, একই ধরণের চিকিত্সা করা উচিত, তবে একটি লুপ দিয়ে with দুটি ক্ষেত্রে এই বিভাগটিy দেখুন ))

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

কার্য

একটি ম্যাট্রিক্স এ দেওয়া , রাস্টারাইসড মূল তির্যক (উপরে বাম থেকে নীচে ডানদিকে) থাকা উপাদানগুলির যোগফলটি ফিরে আসুন, যেখানে পরবর্তীটি ব্রেসেনহ্যামের লাইন অ্যালগরিদম দ্বারা নির্ধারিত হয়। এটি হ'ল ধরে নেওয়া যে ম্যাট্রিক্স একটি এম gr n গ্রিড উপস্থাপন করে, সেই গ্রিডে ব্রেসেনহ্যামের অ্যালগোরিদম ব্যবহার করে এ [1, 1] থেকে এ [এম, এন] পর্যন্ত একটি রেখা আঁকুন এবং লাইনের সমস্ত উপাদানগুলির যোগফল নিন take নোট করুন যে 1 × N এবং N × 1 ম্যাট্রিক্সের জন্য পুরো ম্যাট্রিক্স তার নিজস্ব তির্যক হয়ে যায় (কারণ এটি প্রথম সারির প্রথম উপাদান থেকে শেষ সারির শেষ উপাদান পর্যন্ত একটি লাইন আঁকবে)।

ইনপুট: একটি আসল ম্যাট্রিক্স ( 1 × 1 ম্যাট্রিক্স, একটি সারি ম্যাট্রিক্স, একটি কলাম ম্যাট্রিক্স বা আয়তক্ষেত্রাকার ম্যাট্রিক্স হতে পারে)। আউটপুট: একটি সংখ্যা।

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

চ্যালেঞ্জ বিধি

  • I / O ফর্ম্যাটগুলি নমনীয়। একটি ম্যাট্রিক্স স্পেস-সীমাবদ্ধ সংখ্যাগুলির অনেকগুলি রেখা নিউলাইনগুলি, বা সারি ভেক্টরগুলির একটি অ্যারে, বা কলামের ভেক্টরগুলির একটি অ্যারে ইত্যাদি দ্বারা পৃথক হতে পারে can
  • এটি , তাই বাইট জেতে সংক্ষিপ্ত উত্তর।
  • স্ট্যান্ডার্ড নিয়মগুলি আপনার উত্তরের জন্য প্রযোজ্য , সুতরাং আপনাকে সঠিক পরামিতি এবং রিটার্ন-টাইপ, সম্পূর্ণ প্রোগ্রাম সহ STDIN / STDOUT, ফাংশন / পদ্ধতি ব্যবহারের অনুমতি দেওয়া হবে।
  • ডিফল্ট লুফোলগুলি নিষিদ্ধ।

পরীক্ষার মামলা

  1. [[1,2,3],[4,5,6],[7,8,9]]1+5+9→ আউটপুট: 15

পরীক্ষার মামলা ১

  1. [[1,2,3,4],[5,6,7,8]]1+2+7+8→ আউটপুট: 18

পরীক্ষার মামলা ২

  1. [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24]]1+8+9+16+17+24→ আউটপুট: 75

পরীক্ষার মামলা ৩

  1. [[1,2,3,4,5],[6,7,8,9,10]]1+2+8+9+10(ব্যবহার ত্রুটি শর্ত) আউটপুট →: 30

পরীক্ষার মামলা ৪

তবে, যদি >আপনার কোডটিতে কঠোর বৈষম্য ব্যবহার করা আরও কম হয় তবে অনুমোদিত আউটপুটটি 1+2+3+9+10=25তবে আপনার আলাদাভাবে এটি উল্লেখ করা উচিত।

পরীক্ষার মামলা ৫

  1. [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]1+5+8+12→ আউটপুট: 26

পরীক্ষার মামলা ৫

  1. [[-0.3,0.5]]→ আউটপুট: 0.2

  2. [[3.1],[2.9]]→ আউটপুট: 6

  3. [[-5]]→ আউটপুট: -5

ব্রেসেনহ্যামের অ্যালগরিদম সম্পর্কে আরও তথ্য


অনুরোধ করা পরীক্ষা মামলা: [[1,2,3,4,5],[6,7,8,9,10]]
ব্যবহারকারী 202729

@ user202729 এটি অস্পষ্টতা সমাধানের জন্য যুক্ত করেছে।
Andreï Kostyrka

আমরা কি কোনও টেস্ট কেসটি প্রশস্তের চেয়ে লম্বা হতে পারি? লাইক[[1,2],[3,4],[5,6],[7,8],[9,10]]
জিউসেপে

@ জিউসেপ ক্যাচ কেস 5 এখন দেখুন। আপনার উদাহরণস্বরূপ, উত্তরটি 28( প্রত্যাশিত বাস্তবায়ন সহ) বা 27 ( >,
চ্ছিক

প্রোগ্রামটি কেবলমাত্র একটি নির্দিষ্ট আকার পর্যন্ত ম্যাট্রিকগুলি সমর্থন করতে পারে (বলুন, 500 × 500)?
ব্যবহারকারী 202729

উত্তর:



3

স্মাইলব্যাসিক, 101 99 বাইট

DEF D A,W,H
GCLS
GTRI.,0,0,0,W-1,H-1FOR I=0TO W*H-1=I MOD W
S=S+A[I/W,M]*!!GSPOIT(M,I/W)NEXT?S
END

আমি মূলত একটি লাইন আঁকার জন্য জি-লাইন ফাংশনটি ব্যবহার করার কথা ভেবেছিলাম, তবে এটি সঠিক অ্যালগরিদম ব্যবহার করে বলে মনে হচ্ছে না। তবে, জিটিআরআই কাজ করে বলে মনে হচ্ছে,

পরীক্ষার কেস 4 আউটপুট 30।

প্রস্থ / উচ্চতার পাশাপাশি ইনপুটটি [Y, X] আকারে একটি 2D অ্যারে (কোনও অ্যারের মাত্রা, কেবলমাত্র উপাদানগুলির মোট সংখ্যা পরীক্ষা করার উপায় নেই)।


1

জাভাস্ক্রিপ্ট (ES6), 110 103 বাইট

25চতুর্থ পরীক্ষা মামলার আউটপুট ।

a=>(X=a[x=y=0].length-1,Y=1-a.length,g=e=>a[y][x]+(x-X|y+Y&&g(e+(e*2>Y&&++x&&Y)+(e*2<X&&++y&&X))))(X+Y)

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

অথবা ম্যাট্রিক্সের মাত্রাগুলি ইনপুট হিসাবে গ্রহণের ক্ষেত্রে 88 বাইট ব্যবহার করা যেতে পারে।


1

পাইথন 3.X, 269 বাইট

স্থান-সীমিত সংখ্যার কমা-বিস্মৃত সারি হিসাবে ইনপুট সহ।

import math;c=math.ceil;a=[[float(k)for k in q.split(" ")]for q in input().split(",")];_=len;m=lambda f,t,x,y,e,d:sum(x[0]for x in a)if 2>_(a[0])else m(*[0]*4,*[(_(a)-1)/(_(a[0])-1)]*2)if f else m(f,t+a[y][x],x+1,y+c(e-0.5),e+d-c(e-0.5),d)if x<_(a[0])else t;m(1,*[0]*5)

প্রি-golfing:

def line(a):
   if len(a[0])<2: return sum([x[0] for x in a])
   e = d = abs((len(a)-1)/(len(a[0])-1))
   y=t=0
   for x in range(len(a[0])): 
       t += a[y][x]
       f = ceil(e-0.5)
       y += f
       e += d-f
   return t

দেখে মনে হচ্ছে যেন c=math.ceilপ্রোগ্রামটি আরও দীর্ঘায়িত হয় ...
ব্যবহারকারী 202729

এছাড়াও, আপনার এর []মধ্যে কোনও দরকার নেই sum(..)a if c else bপ্রায়ই হতে পারে c and a or b
ব্যবহারকারী 202729

input("")হতে পারে input()
ব্যবহারকারী 202729

এছাড়াও ... ইনপুট / আউটপুট ফর্ম্যাটটি কী? স্ক্রিনে মুদ্রণ?
ব্যবহারকারী 202729

1

এফএমএসলোগো , 136 বাইট

make 1 rl
setxy -1+count :1 -1+count last :1
pu home
make 9 0
foreach :1[foreach ?[if
0=last pixel[make 9 :9+?]fd 1]setxy xcor+1 0]pr :9

সম্পূর্ণ প্রোগ্রাম, ব্যবহারকারীকে ইনপুট (ডায়লগ বক্স পপআপ) এর জন্য অনুরোধ করুন এবং তারপরে আউটপুটটিকে স্ক্রিনে মুদ্রণ করুন।

কেবলমাত্র পর্দায় একটি লাইন আঁকুন এবং আউটপুট গণনা করুন। কঠোর বৈষম্য ব্যবহার করুন।


এটি কেবল এফএমএসলোগোর ক্যানভাস আকার (প্রায় 500 × 500) পর্যন্ত ম্যাট্রিক্স আকারকে সমর্থন করে

অবরুদ্ধ কোড:

Make "input ReadList
SetXY (-1+Count :input) (-1+Count Last :input)
PenUp
Home
Make "sum 0
ForEach :input[
    ForEach ?[
        If 0=Last Pixel[
            Make "sum :sum+?
        ]
        Forward 1
    ]
    SetXY XCor+1 0
]
Print :sum
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.