অ্যাডভেন্ট চ্যালেঞ্জ 1: সান্টাকে তার বর্তমান ভল্টটি আনলক করতে সহায়তা করুন!


18

পরবর্তী >>

বর্ণনামূলক কীওয়ার্ড (অনুসন্ধানের জন্য): দুটি ম্যাট্রিক্স সমান করুন, ওভারল্যাপ, অ্যারে, সন্ধান করুন

চ্যালেঞ্জ

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

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

বিশেষ উল্লেখ

লকটি 1 এবং 0 এর বর্গ ম্যাট্রিক্স। এটি 1s এবং 0 এর এলোমেলো বিন্যাসে সেট করা আছে এবং একটি নির্দিষ্ট কোডে সেট করা দরকার। ভাগ্যক্রমে, সান্তা প্রয়োজনীয় কোডটি মনে রাখে।

তিনি কয়েকটি পদক্ষেপ নিতে পারেন are প্রতিটি পদক্ষেপ যে কোনও সংক্ষিপ্ত সাব-ম্যাট্রিক্সে সম্পাদন করা যেতে পারে (এটি আপনাকে অবশ্যই একটি উপ-ম্যাট্রিক্স নির্বাচন করতে হবে যা পুরোপুরি উপরের-বাম এবং নীচে-ডান কোণে আবদ্ধ থাকে) (এটি একটি বর্গাকার সাব-ম্যাট্রিক্স হতে পারে):

  1. ডানদিকে 90 ডিগ্রি ঘোরান
  2. 90 ডিগ্রি বাম দিকে ঘোরান *
  3. 180 ডিগ্রি ঘোরান
  4. প্রতিটি সারির nউপাদানগুলি ডান বা বামে চক্র করুন (মোড়ানো)
  5. প্রতিটি কলাম mউপাদান উপরে বা নীচে চক্র করুন (মোড়ানো)
  6. অনুভূমিকভাবে ফ্লিপ করুন
  7. উল্লম্বভাবে ফ্লিপ করুন
  8. মূল ডায়াগোনাল * এ ফ্লিপ করুন
  9. মূল অ্যান্টি-ডায়াগোনাল * এ ফ্লিপ করুন

* কেবলমাত্র সাব-ম্যাট্রিক্সটি বর্গক্ষেত্র হয়

অবশ্যই, তিনি পুরো ম্যাট্রিক্সেও এই পদক্ষেপগুলি সম্পাদন করতে পারেন। যেহেতু 1s এবং 0s কেবল ম্যাট্রিক্সে বদলানো যায় তবে কোনও বর্গের মান সরাসরি পরিবর্তন করা যায় না, শুরু এবং শেষের কনফিগারেশনের জন্য 1s এবং 0 এর সংখ্যা একই।

ফর্ম্যাটিং স্পেসিফিকেশন + বিধি

আপনার যে কোনও যুক্তিসঙ্গত বিন্যাসে আপনাকে দুটি বর্গ ম্যাট্রিক্স (শুরু অবস্থান এবং সমাপ্তি অবস্থান) হিসাবে ইনপুট দেওয়া হবে। আউটপুটটি কোনও পঠনযোগ্য বিন্যাসে এই পদক্ষেপগুলির ক্রম হওয়া উচিত। যেহেতু এটি কোড-গল্ফ নয়, দয়া করে এটি একটি সহজে যাচাইযোগ্য ফর্ম্যাট করুন তবে এটি কোনও কঠোর প্রয়োজন নয়। আপনি চাইলে ইনপুটটিতে ম্যাট্রিকগুলির পার্শ্ব-দৈর্ঘ্য নিতে বেছে নিতে পারেন।

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

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

1 0 0 1    0 0 0 0
0 1 1 0 -> 0 0 0 0
0 1 1 0 -> 1 1 1 1
1 0 0 1    1 1 1 1
  1. পুরো ম্যাট্রিক্স নিন। প্রতিটি কলাম 1 পর্যন্ত চক্র।
  2. সাব-ম্যাট্রিক্স হিসাবে মাঝের দুটি কলাম নিন। প্রতিটি কলামটি নীচে চক্র করুন।
1 0 1 0 1    0 1 0 1 0
0 1 0 1 0    1 0 1 0 1
1 0 1 0 1 -> 0 1 1 1 0
0 1 0 1 0    1 0 1 0 1
1 0 1 0 1    0 1 0 1 0
  1. পুরো ম্যাট্রিক্স নিন। প্রতিটি কলাম 1 নীচে চক্র।
  2. মাঝের কলামটি নিন। এটি নিচে চক্র 2।
  3. শীর্ষ 2 সারি ধরুন। এটি উল্লম্বভাবে ফ্লিপ করুন।
  4. উপরের সারির ডানদিকে 2 টি উপাদান নিন Take এগুলি অদলবদল করুন (ডানে / বাম দিকে ঘোরান, অনুভূমিকভাবে উল্টান)।
  5. শীর্ষ সারির বামতম 2 টি উপাদান নিন। তাদের অদলবদল করুন।

আরও কার্যকর পদ্ধতি থাকতে পারে তবে তাতে কিছু আসে যায় না। মন্তব্যগুলির মধ্যে নির্দ্বিধায় তাদের নির্দ্বিধায় যদি আপনি কোনওটি খুঁজে পান :)

পরীক্ষার মামলার বিচারক

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

যদি আমি বিশ্বাস করি যে উত্তরগুলি খুব বেশি বিশেষজ্ঞ করছে তবে পরবর্তী পরীক্ষার মামলার MD5 হ'ল 3c1007ebd4ea7f0a2a1f0254af204eed। (প্রতারণার অভিযোগ থেকে নিজেকে মুক্ত করতে এই মুহূর্তে এখানে লেখা হয়েছে: পি)

স্ট্যান্ডার্ড লুফোলস প্রয়োগ করুন। কোন উত্তর গৃহীত হবে না। শুভ কোডিং!

দ্রষ্টব্য: আমি অ্যাডভেন্ট অফ কোড থেকে এই চ্যালেঞ্জ সিরিজের জন্য অনুপ্রেরণা তৈরি করেছি । এই সাইটের সাথে আমার কোনও সম্পর্ক নেই

আপনি এখানে প্রথম চ্যালেঞ্জের 'লিঙ্কযুক্ত' বিভাগটি দেখে সিরিজের সমস্ত চ্যালেঞ্জের একটি তালিকা দেখতে পারেন ।


তথ্য: পরীক্ষার কেসটির 192 0টি এবং 64 এর রয়েছে এবং 1মোট 256 choose 64 ≈ 1.9 × 10⁶¹পৌঁছনযোগ্য ম্যাট্রিক রয়েছে es (যা একটি মেগামিনেক্সের সাথে তুলনীয়, এবং কোনও রুবিকের প্রতিশোধের চেয়ে বড়, যদিও এটি কোনও অধ্যাপকের কিউবের থেকে অনেক কম)
ব্যবহারকারী 202729

উত্তর:


1

জাভা

import java.util.Arrays;

public class SantaMatrix4 {
	
	public static void flipV(int[][] matrix, int row1, int col1, int row2, int col2) {
		for (int row = row1; row <= (row2 - row1) / 2 + row1; row++) {
			for (int col = col1; col <= col2; col++) {
				int tmp = matrix[row][col];
				matrix[row][col] = matrix[row2 - row + row1][col];
				matrix[row2 - row + row1][col] = tmp;
			}
		}
	}
	
	public static void flipH(int[][] matrix, int row1, int col1, int row2, int col2) {
		for (int row = row1; row <= row2; row++) {
			for (int col = col1; col <= (col2 - col1) / 2 + col1; col++) {
				int tmp = matrix[row][col];
				matrix[row][col] = matrix[row][col2 - col + col1];
				matrix[row][col2 - col + col1] = tmp;
			}
		}
	}

	public static void main(String[] args) {
		int counter = 0;
		int n = Integer.parseInt(args[counter++]);
		int[][] matrix1 = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				matrix1[i][j] = Integer.parseInt(args[counter++]);
			}
		}
				
		int[][] matrix2 = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				matrix2[i][j] = Integer.parseInt(args[counter++]);
			}
		}
			
		int[] ops = new int[5 * matrix1.length * matrix1.length * 2];
		int numOps = 0;
		int opsI = 0;
		
		for (int row = 0; row < n; row++) {
			for (int col = 0; col < n; col++) {
				int goal = matrix2[row][col];
				boolean gotIt = false;
				
				//Look for required number to the right
				for (int i = row; i < n && !gotIt; i++) {
					for (int j = col; j < n && !gotIt; j++) {
						if (i == row && j == col) continue;
						if (matrix1[i][j] == goal) {
							flipH(matrix1, row, col, i, j);
							flipV(matrix1, row, col, i, j);
							ops[opsI++] = 1;
							ops[opsI++] = row;
							ops[opsI++] = col;
							ops[opsI++] = i;
							ops[opsI++] = j;
							numOps++;
							
							gotIt = true;
						}
					}
				}

				//Look for required number below and to the left
				for (int i = row + 1; i < n && !gotIt; i++) {
					for (int j = 0; j < col && !gotIt; j++) {
						if (matrix1[i][j] == goal) {
							flipH(matrix1, i, j, i, col);
							ops[opsI++] = 2;
							ops[opsI++] = i;
							ops[opsI++] = j;
							ops[opsI++] = i;
							ops[opsI++] = col;
							
							flipV(matrix1, row, col, i, col);
							ops[opsI++] = 3;
							ops[opsI++] = row;
							ops[opsI++] = col;
							ops[opsI++] = i;
							ops[opsI++] = col;
							
							numOps += 2;
							gotIt = true;
						}
					}
				}
				
			}
		}

		System.out.println(Arrays.toString(ops));
		System.out.println(numOps);
	}
}

সামান্য দ্রুত হার্ড-কোডেড সংস্করণ: এটি অনলাইনে চেষ্টা করুন!

ইনপুট হ'ল কমান্ড লাইনের মাধ্যমে স্থান পৃথক পূর্ণসংখ্যা। প্রথম পূর্ণসংখ্যা দুটি ম্যাট্রিকের প্রস্থ। বাকী পূর্ণসংখ্যার সারি-সারি তাদের উপাদানগুলি।

একটি ম্যাট্রিক্সের প্রতিটি ক্রমাঙ্কনটি কেবল অনুভূমিক ফ্লিপ এবং উল্লম্ব ফ্লিপ অপারেটরগুলির সাথে পাওয়া যায়, তাই 180 ডিগ্রি ঘোরানোর সাথে একই অঞ্চলে একটানা ভিএফ্লিপ এবং এইচএফ্লিপ প্রতিস্থাপন করা বাদ দিয়ে আমি বাকিটিকে উপেক্ষা করেছি।

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

প্রোগ্রামটির আউটপুট হ'ল একটি অ্যারে যা মানসিকভাবে পাঁচটি দলে বিভক্ত হওয়া উচিত। প্রতিটি গ্রুপ হ'ল (i, সারি 1, কল 1, রো 2, কোল 2) যেখানে আমি নো-অপের জন্য 0, 180 ডিগ্রি ঘোরার জন্য 1, অনুভূমিক ফ্লিপের জন্য 2 এবং উল্লম্ব ফ্লিপের জন্য 3। বাকী 4 টি উপাদান অপারেশনটি যে অঞ্চলে চলে তার বর্ণনা দেয়। আমি নিশ্চিত নই যে এটি পঠনযোগ্য ফর্ম্যাট কিনা।

প্রদত্ত পরীক্ষার ক্ষেত্রে, আমি আমার কম্পিউটারে 258 টি অপারেশন এবং দুই থেকে তিন মিলিসেকেন্ড পাই।


@ এরিক দ্য আউটগল্ফার এটি নির্দিষ্ট করা হয়নি, এবং হার্ড-কোডিং এটি বিচার করা সহজ করে তোলে।
হোয়াটটো

আমি কমান্ড লাইন থেকে ইনপুট নেওয়ার জন্য এটি পরিবর্তন করেছি
2:37

এই আউটপুট ফর্ম্যাট যথেষ্ট যুক্তিসঙ্গত। আমি অ্যারেতে 1000 নম্বর পাচ্ছি (200 অপারেশন?) তবে 258 কোথা থেকে আসছে? এই থেকে আউটপুটটি কীভাবে পড়তে হবে সে সম্পর্কে আমি কিছুটা বিভ্রান্ত: পি
হাইপারনিট্রিনো

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