মার্চিং স্কোয়ারস লুকআপ


9

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

এই প্রক্রিয়াটির প্রথম পদক্ষেপটি কোণগুলি কনট্যুরের মানের উপরে বা নীচে রয়েছে কিনা তার উপর ভিত্তি করে কোন প্রান্তগুলি কনট্যুরের সাথে সংযুক্ত রয়েছে তা নির্ধারণ করা হয়। সরলতার জন্য, আমরা কেবল মানটির সংক্ষেপণগুলি বিবেচনা করব 0, যেমন কোণগুলি ইতিবাচক বা নেতিবাচক কিনা তা নিয়ে আমরা আগ্রহী। পার্থক্য করার ক্ষেত্রে রয়েছে :24 = 16

এখানে চিত্র বর্ণনা লিখুন
চিত্র উত্স: উইকিপিডিয়া

সাদা এবং কালো চিহ্নিতকরণ এখানে সত্যিকার অর্থে গুরুত্বপূর্ণ নয়, তবে নিশ্চিতভাবেই বলে যে সাদা ইতিবাচক এবং কালো positiveণাত্মক। আমরা এমন একটি বিষয়গুলিকে অগ্রাহ্য করব যেখানে এক কোণে ঠিক আছে 0

স্যাডল পয়েন্টগুলি (কেস 5 এবং 10) কিছুটা অতিরিক্ত অসুবিধা প্রদান করে: এটি কোন কোণগুলি কেবলমাত্র দেখলে কোনটিটি ব্যবহার করা উচিত তা পরিষ্কার নয় clear চারটি কোণার গড় (যেমন কেন্দ্রের মানের একটি আনুমানিক) সন্ধান করে এবং ত্রিভুজগুলি এমনটি বেছে নিয়ে বিপরীত চিহ্নের সাহায্যে কোণগুলি থেকে কেন্দ্রকে পৃথক করে এটি সমাধান করা যেতে পারে। যদি গড়টি ঠিক 0হয় তবে উভয় ক্ষেত্রেই বেছে নেওয়া যেতে পারে।

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

চ্যালেঞ্জ

আপনাকে আপনার পছন্দের একটি স্থির ক্রমে চারটি কোণার (শূন্য-পূর্বের পূর্ণসংখ্যার) মান দেওয়া হবে। তারপরে আপনার স্যাডল পয়েন্টের কেসগুলি সঠিকভাবে সমাধান করে রূপকগুলির সঠিক লেআউট উত্পন্ন করা উচিত।

আপনি STDIN (বা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে এবং STDOUT (বা নিকটতম বিকল্প), ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে ফলাফল আউটপুট করতে পারেন।

ইনপুট কোনও সুবিধাজনক স্ট্রিং বা তালিকার বিন্যাসে নেওয়া যেতে পারে।

নিম্নলিখিত 5x5 ব্লকগুলির মধ্যে একটিতে 16 টি কেসকে ASCII শিল্পে উপস্থাপন করা হবে:

o---o  o---o  o---o
|   |  |   |  | | |
|   |  |---|  | | |
|   |  |   |  | | |
o---o  o---o  o---o

o---o  o---o  o---o  o---o
|/  |  |  \|  |   |  |   |
|   |  |   |  |   |  |   |
|   |  |   |  |\  |  |  /|
o---o  o---o  o---o  o---o

o---o  o---o
|/  |  |  \|
|   |  |   |
|  /|  |\  |
o---o  o---o

আপনার অবশ্যই কোনও শীর্ষস্থানীয় বা চলমান সাদা স্থান মুদ্রণ করা উচিত নয়, তবে আপনি একটি একক alচ্ছিক নিউলাইন মুদ্রণ করতে পারেন।

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

পরীক্ষার কেস

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

[1, 2, 1, 3]
[-9, -2, -2, -7]

[4, 5, -1, -2]
[-1, -2, 3, 4]

[7, -7, 7, -7]
[-5, 5, -5, 5]

[1, -6, -4, -1]
[-2, 3, 3, 4]

[-1, 6, -4, -1]
[2, -3, 3, 4]   

[-1, -6, 4, -1]
[2, 3, -3, 4]

[-1, -6, -4, 1]
[2, 3, 3, -4]

[3, -8, -9, 2]
[-3, 8, 9, -2]

[8, -3, -2, 9]
[-8, 3, 2, -9]

অধিকন্তু, নিম্নলিখিত পরীক্ষার কেসগুলি স্যাডল পয়েন্টগুলির মধ্যে (আপনার পছন্দ) ফেরত দিতে পারে:

[1, -4, -2, 5]
[-1, 4, 2, -5]

উত্তর:


5

রুবি, 201 180 176

এটি একটি বেনামে ল্যাম্বডা ফাংশন, যা অসঙ্গিত উদাহরণে দেখানো যেতে পারে।

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

স্টাডাউটে মুদ্রণের পরিবর্তে পাঁচটি অক্ষরের পাঁচটি স্ট্রিংয়ের অ্যারে হিসাবে আউটপুটটি ফিরে দেওয়া যদি গ্রহণযোগ্য হয় তবে আরও একটি বাইট সংরক্ষণ করা যায়।

->a{p=t=0
4.times{|i|t+=a[i]*=a[3];p+=a[i]>>9&1<<i}
q=p==6&&t>0?19:'@AC@P*10'[p].ord
puts c='o---o',(0..2).map{|i|b=p*i==3?'|---|':'|   |';b[q%4]='|/|\|/'[q%4+(i&2)];q/=4;b},c}

আমি অ্যারের বিশ্লেষণে খুশি, তবে আমি মনে করি আউটপুট গঠনের আরও ছোট উপায় থাকতে পারে।

ইনপুট অ্যারের সমস্ত চারটি উপাদান শেষ উপাদান দ্বারা গুণিত হয়। এটি গ্যারান্টি দেয় যে শেষ উপাদানটি ইতিবাচক, এবং কেস সংখ্যা 16 থেকে কমিয়ে 8 পর্যন্ত হ্রাস করে The উপাদানগুলিকে 9 টি স্থান অধিকারী করা হয়েছে, যাতে সমস্ত ধনাত্মক সংখ্যা 0 হয় এবং সমস্ত নেতিবাচক সংখ্যা -1 হয়ে যায় (কমপক্ষে ইনপুটের পরিসীমাতে) পরীক্ষার ক্ষেত্রে প্রদত্ত।) তারপরে তারা 1<<array indexএকটি 3-বিট বাইনারি নম্বর দেয় যা প্যাটার্নটি নির্দেশ করে (প্রকৃতপক্ষে 4-বিট, তবে শেষ উপাদানটি সর্বদা ইতিবাচক থাকে, 4 র্থ বিট সর্বদা শূন্য থাকে))

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

আউটপুট কাজ করার উপায়টি কোডের মন্তব্যগুলি থেকে আশাবাদী পরিষ্কার।

পরীক্ষা প্রোগ্রামে ungolfed

f=->a{p=t=0
  4.times{|i|                      #for each number in the input
    t+=a[i]*=a[3];                   #multiply each number by a[3]; totalize the sum in t
    p+=a[i]>>9&1<<i                  #shift right to find if negative; AND with 1<<i to build index number for pattern 
  }                                #q is a 3-digit base 4 number indicating which character of each line is non-whitespace (if any). 
  q=p==6&&t>0?19:'@AC@P*10'[p].ord #It's encoded in the magic string, except for the case of saddles with a positive total, which is encoded by the number 19.
  s=(0..2).map{|i|                 #build an array of 3 strings, indexes 0..2
    b=p*i==3?'|---|':'|   |';        #IF p is 3 and we are on row 1, the string is |---| for the horizontal line case. ELSE it is |   |.
    b[q%4]='|/|\|/'[q%4+(i&2)];      #The numbers in q indicate which character is to be modified. The characters in the string indicate the character to replace with.
    q/=4;                            #If q%4=0, the initial | is replaced by | (no change.) i&2 shifts the string index appropriately for the last row.
    b                                #divide q by 4, and terminate the loop with the expression b so that this is the object loaded into array s.  
  }
puts c='o---o',s,c}                #print the array s, capped with "o---o" above and below.


[[1, 2, 1, 3],
[-9, -2, -2, -7],

[4, 5, -1, -2],
[-1, -2, 3, 4],

[7, -7, 7, -7],
[-5, 5, -5, 5],

[1, -6, -4, -1],
[-2, 3, 3, 4],

[-1, 6, -4, -1],
[2, -3, 3, 4],

[-1, -6, 4, -1],
[2, 3, -3, 4],

[-1, -6, -4, 1],
[2, 3, 3, -4],

[3, -8, -9, 2],
[-3, 8, 9, -2],

[8, -3, -2, 9],
[-8, 3, 2, -9],

[1, -4, -2, 5],
[-1, 4, 2, -5]].each{|k|f.call(k)}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.