একটি চিত্র হিলবার্টাইফাই করুন


28

আমি চাই হিলবার্ট কার্ভ


এই চ্যালেঞ্জটির জন্য আপনার কাজটি হ'ল একটি চিত্র নেওয়া (কঠোরভাবে একটি বর্গক্ষেত্রের চিত্র যেখানে সমস্ত পক্ষই দুটি পিক্সেলের প্রশস্ত শক্তিযুক্ত) এবং একটি জিগ-জ্যাগিং ফ্যাশনে রেখার সাথে রেখাটি উন্মোচন করা এবং এটি ছদ্ম-হিলবার্ট বক্ররেখায় পরিণত করা back ।

unraveling

খোলার জন্য আপনি উপরের বাম কোণে পিক্সেল দিয়ে শুরু করবেন এবং আপনি চিত্রের প্রান্তে পৌঁছা পর্যন্ত ডানদিকে ভ্রমণ করবেন। একবার আপনি চিত্রটির প্রান্তে আঘাত করলে আপনি পরবর্তী সারিতে নীচে চলে যাবেন এবং আপনি আবার প্রান্তটি আঘাত না করা পর্যন্ত বাম দিকে যাত্রা শুরু করবেন। আপনি প্রতি বার দিকটি স্যুইচ করে সারিটি অবমুক্ত করা চালিয়ে যাবেন যাতে আপনি একটি অবিচ্ছিন্ন বক্ররেখা পান। এটি সাপের খেলা খেলে ভাল মত দেখা উচিত

আনারভেলিংয়ের ফলাফলটি পিক্সেলের একটি ক্রম হওয়া উচিত যা প্রতি পিক্সেলকে একবারে অন্তর্ভুক্ত করে

Reraveling

আপনার পিক্সেলগুলির অর্ডার হয়ে গেলে আপনি ছদ্ম-হিলবার্ট বক্ররেখার অনুসরণ করে একটি নতুন সমান আকারের ক্যানভাসে পুনরায় সাজিয়ে তুলবেন। একটি 2**nআকারের বর্গক্ষেত্র চিত্রের জন্য আপনার সিউডো-ইলবার্ট কার্ভের নবম পুনরাবৃত্তিটি ব্যবহার করা উচিত। প্রতিটি পিক্সেল নতুন ক্যানভাসে ঠিক একটি স্পটে স্থাপন করা হবে। আপনার চিত্রটি পুনঃনির্মাণ করা উচিত যাতে মূলত উপরের বাম দিকের পয়েন্টটি (আমাদের সাপের বক্ররেখার শুরু) সেখানে থেকে যায় এবং নীচের ডানদিকে (আমাদের সাপের বক্ররের শেষ অংশ) উপরের ডানদিকে স্থাপন করা যায়।

ইনপুট / আউটপুট

আপনার প্রোগ্রাম বা ফাংশনটি স্ট্যান্ডার্ড পদ্ধতিগুলির মাধ্যমে নির্দিষ্ট সীমাবদ্ধতার একটি চিত্র নিতে হবে এবং মানক পদ্ধতিগুলির মাধ্যমে অন্য চিত্রটি আউটপুট করা উচিত।

স্কোরিং

এই প্রোগ্রামটি হ'ল সবচেয়ে কম বাইট জয়।

উদাহরণ

ইনপুট

Mondrian

আউটপুট

আউটপুট 1


ইনপুট

Rothko

আউটপুট

আউটপুট 2


ইনপুট

scrambled

আউটপুট

সিংহ


আপনি কোনও পিক্সেল মিস করছেন না তা নিশ্চিত করার জন্য আমি একটি ফাঁকা সাদা বা শক্ত রঙের ছবিতেও পরীক্ষা করার পরামর্শ দিই।

আপনার উত্তরে নিজের ফলাফল অন্তর্ভুক্ত নির্দ্বিধায়!


ইনপুট হিসাবে কোনও চিত্রের পরিবর্তে আরজিবি মানগুলির একটি অ্যারে নেওয়া কি ঠিক আছে? আউটপুট সম্পর্কে কি?
জংহওয়ান মিন

@ জেএইচএম না আপনি পারবেন না। আপনি চাইলে যা ইমেজ ফর্ম্যাট বেছে নিতে পারেন তা বেছে নিতে পারেন, সুতরাং আপনার ভাষা যদি অন্তর্নির্মিত চিত্র সমর্থন না করে থাকে তবে আপনি একটি সঙ্কুচিত। পিপিএম ফাইল ব্যবহার করতে পারেন যা আরজিবি মানগুলির একটি অ্যারের অনুরূপ।
গম উইজার্ড

উত্তর:


8

গণিত, 286 273 বাইট

Image[Array[1,{l=Length@#,l}]~ReplacePart~Thread[#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2@l]]]->Join@@MapAt[Reverse,#,2;;;;2]]]&@*ImageData

রাম রাম! চ্যালেঞ্জিং কিন্তু মজা!

ব্যাখ্যা

ImageData

Imageআরজিবি মানের একটি অ্যারে রূপান্তর করুন

Array[1,{l=Length@#,l}]

একটি তৈরি করুন lদ্বারা lমাথা দিয়ে অ্যারের 1, যেখানে lইনপুটের দৈর্ঘ্য (ইমেজ প্রস্থ অর্থাৎ) হয়।

এই ফলন {{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}( lবিভ্রান্তি হ্রাস করতে ক্যাপগুলিতে লিখিত)

StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"}

এমন একটি StringReplaceফাংশন যা প্রতিস্থাপন করে"L" সাথে "+RF-LFL-FR+"এবং "R"সাথে হয়"-LF+RFR+FL-"

Nest[ ... ,"L",Log2@l]

StringReplaceফাংশন প্রয়োগ করুনString "L"Log2[l]সময়ে , ।

Characters

ফলাফল রূপান্তর করুন String একটি Listঅক্ষরে ।

Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&

একটি নামহীন ফাংশন যা:

  • যদি দ্বিতীয় ইনপুট হয় "-"তবে প্রথম ইনপুটটির দ্বিতীয় উপাদানটি দিয়ে গুণ করুন I
  • যদি দ্বিতীয় ইনপুট হয় "+" তবে প্রথম ইনপুটটির দ্বিতীয় উপাদানটি দ্বারা ভাগ করুন I
  • যদি দ্বিতীয় ইনপুট হয় "F" ,ReIm (ইনপুটটির আসল এবং কল্পিত অংশটি পৃথক করে) দ্বারা প্রথম ইনপুট বাড়ান ।
ফোল্ডলিস্ট [..., {1,1}, I}, ...]

শুরু করে {{1,1},I}, উপরের নামবিহীন ফাংশনটি ক্রমবর্ধমানভাবে প্রয়োগ করুন List, অক্ষরের প্রতিটি উপাদানকে দ্বিতীয় ইনপুট হিসাবে ব্যবহার করুন। এই কোডটি সমস্ত পুনরাবৃত্তির ফলাফল আউটপুট দেয়।

#&@@@Split[#&@@@ ... ]

প্রত্যেকের দ্বিতীয় উপাদানগুলি থেকে মুক্তি পান Listএবং সদৃশগুলি মুছুন। (এই মুহূর্তের উপরের পদক্ষেপগুলি Listহিলবার্ট বক্ররেখার সমন্বয়গুলির একটি উত্পন্ন করে)

Join@@MapAt[Reverse,#,2;;;;2]

আরবিজি অ্যারের ইনপুটটি আনারভেল করুন (প্রতিটি অন্যান্য সারি এবং উল্টাপাল্টা বিপরীতে)।

Thread[ ... -> ... ]

Ruleঅবজেক্ট তৈরি করুন , যেমন প্রথম ইনপুট (হিলবার্ট কার্ভের স্থানাঙ্ক) এর প্রথম উপাদানটি দ্বিতীয় ইনপুটটির প্রথম উপাদানটির (জোড়বিহীন চিত্রটি), দ্বিতীয় ইনপুট সহ দ্বিতীয় উপাদান যুক্ত করে তৈরি করা হয়।

... ~ReplacePart~ ...

ঐ প্রতিস্থাপন প্রয়োগ Ruleকরতে গুলি Arrayদ্বিতীয় ধাপ থেকে।

Image

আরজিবি মানগুলির অ্যারেতে একটিতে রূপান্তর করুন Image

নমুনা ইন / আউট

ইনপুট:

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

আউটপুট:

আউটপুট


ইনপুট:

ফুলমেটাল অ্যালকেমিস্ট থেকে এডওয়ার্ড এবং আলফোনস এলরিক

আউটপুট:

ওয়াত

বিপরীত কার্য ( 266 253 বাইট)

Image[MapAt[Reverse,Extract[#,#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@b,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2[l=Length@#]]]]]~Partition~l,2;;;;2]]&@*ImageData

5

অষ্টাভ 234 বাইট

I=imread(input(''));w=rows(I);X=[0,3;1,2];for k=2:log2(w);n=numel(X);X=[X',rot90(X',2)+3*n;X+n,X+2*n];end;for k = 1:3;I(2:2:end,:,k)=fliplr(I(2:2:end,:,k));end[~,S]=sort(X(:));I(S+(0:w^2:2*w^2))=permute(I,[2 1 3]);imwrite(I,input(''))

ইনপুট এবং আউটপুট চিত্রের ফাইলের নামগুলি ফর্ম স্ট্যান্ডার্ড ইনপুট সরবরাহ করা উচিত। ইনপুট / আউটপুট ছাড়াই কোডের আকার 194 বাইট
ব্যাখ্যা:

সূচকের বেস প্যাটার্নটি হ'ল:

X =
  0 3
  1 2

প্রতিটি পুনরাবৃত্তিতে পূর্ববর্তী পুনরাবৃত্তির ফলাফল থেকে 4 টি অনুলিপি তৈরি করা হয়েছিল এবং প্রতিটি অনুলিপিটিতে কিছু রূপান্তর প্রয়োগ করা হয়েছিল এবং তারপরে সমস্ত ব্লক বর্তমান ফলাফল গঠনে একত্রিত হয়।

X =[0,3;1,2];
for k = 2:log2(s)
    n=numel(X);
    X = [X',rot90(X',2)+3*n;X+n,X+2*n];
end

তাহলে আমাদের আছে:

block(1,1): X' 
block(1,2): rot90(X',2)+3*n 
block(2,1): X+n
block(2,2): X+2*n

0    1  | 14   15
3    2  | 13   12
--------|--------
4    7  |  8   11
5    6  |  9   10

হিলবার্ট সূচকগুলি বাছাই করা হয়েছে এবং সাজানো উপাদানগুলির সূচি ফিরে এসেছে:

[~,S]=sort(X(:));

সমস্ত অবধি সারিটি উল্টানো প্রয়োগ করা হচ্ছে:

for k = 1:3
    I(2:2:end,:,k) = fliplr(I(2:2:end,:,k));
end

পুনর্বিবেচনা প্রয়োগ করা হয়েছে:
-অনেকটা চ্যানেলের জন্য পুনরায় প্রতিক্রিয়া জানানো হয়েছে -
অক্টোবায় ডেটা কলাম অনুসারে ডেটা সাজানো থেকে প্রমিত প্রয়োগ করা হয়েছে

I(S+(0:w^2:2*w^2))=permute(I,[2 1 3]);

উদাহরণ চিত্রসমূহ:

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

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

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

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


আপনি যদি I / O ব্যবহার এড়াতে চান তবে আপনি নিজের প্রোগ্রামটিকে একটি কার্য হিসাবে কাজ করতে বেছে নিতে পারেন।
গম উইজার্ড

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