এএসসিআইআই হিলবার্ট কার্ভ


23

অক্ষর এবং ব্যবহার করে ASCII এ হিলবার্ট কার্ভের ত্রি পুনরাবৃত্তিকে একটি পূর্ণসংখ্যা nআউটপুট দেওয়া হয়েছে ।n_|

এখানে প্রথম 4 টি পুনরাবৃত্তি রয়েছে:

n=1
 _ 
| |

n=2
 _   _ 
| |_| |
|_   _|
 _| |_

n=3
 _   _   _   _ 
| |_| | | |_| |
|_   _| |_   _|
 _| |_____| |_ 
|  ___   ___  |
|_|  _| |_  |_|
 _  |_   _|  _ 
| |___| |___| |

n=4
 _   _   _   _   _   _   _   _ 
| |_| | | |_| | | |_| | | |_| |
|_   _| |_   _| |_   _| |_   _|
 _| |_____| |_   _| |_____| |_ 
|  ___   ___  | |  ___   ___  |
|_|  _| |_  |_| |_|  _| |_  |_|
 _  |_   _|  _   _  |_   _|  _ 
| |___| |___| |_| |___| |___| |
|_   ___   ___   ___   ___   _|
 _| |_  |_|  _| |_  |_|  _| |_ 
|  _  |  _  |_   _|  _  |  _  |
|_| |_| | |___| |___| | |_| |_|
 _   _  |  ___   ___  |  _   _ 
| |_| | |_|  _| |_  |_| | |_| |
|_   _|  _  |_   _|  _  |_   _|
 _| |___| |___| |___| |___| |_ 

ব্যাখ্যা

  • আমার প্রশ্ন হিলবার্ট কার্ভ আঁকুন এবং স্ল্যাশ ব্যবহার করে হিলবার্ট কার্ভ আঁকুন ।
  • আন্ডারস্কোর ( _) এবং উল্লম্ব বারগুলির মধ্যে রূপান্তরটি |হ'ল u=2*v-1যেখানে s এর uসংখ্যা _এবং vএটি s এর সংখ্যা |।
  • আমার মূল পোস্টের সাথে ধারাবাহিকতা বজায় রাখার জন্য বাঁকটি শুরু এবং নীচে শেষ হওয়া উচিত।
  • আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন থাকতে পারে।
  • স্টডআউট আউটপুট (বা অনুরূপ কিছু)।
  • আপনার সাদা-ফাঁকা স্থানগুলির শীর্ষস্থানীয় বা পিছনে থাকতে পারে, আউটপুটটির কেবল সীমাবদ্ধ করা দরকার যাতে এটি উদাহরণগুলির মতো দেখায়।
  • এটি কোড-গল্ফ তাই বাইট জিতে সংক্ষিপ্ত উত্তর।

3
আপনি কি দয়া করে আপনার পোস্টে হিলবার্ট কার্ভের একটি সংজ্ঞা এবং ASCII সংস্করণটি কীভাবে তৈরি হয় তার সঠিক বিবরণ অন্তর্ভুক্ত করতে পারেন?
— লুভজো



@ লভজো আমি "স্পেসিফিকেশন" এর অধীনে আন্ডারস্কোর (_) এবং উল্লম্ব বারগুলি (|) এর দৈর্ঘ্য সম্পর্কে একটি পয়েন্টে যোগ করেছি, যদি আরও তথ্যের বা কঠোর সংজ্ঞা প্রয়োজন হয় তবে দয়া করে আমাকে বলুন।
— বোবাস_পেট

@ শুকী আমি ট্যাগটি
— সরিয়েছি

উত্তর:


5

বেফুঞ্জ, 444 368 323 বাইট

&1>\1-:v
0v^*2\<_$00p>
_>:10p\:20pv^_@#-*2g00:+1,+55$
^!-<v*2g000<>$#<0>>-\:v
g2*^>>10g20g+v \ ^*84g_$:88+g,89+g,\1+:00
v#*!-1g02!g01_4^2_
>::00g2*-!\1-:10g-\20g-++>v
87+#^\#p01#<<v!`g01/2\+76:_
vv1-^#1-g01:\_$:2/20g`!
_ 2/^>:10g#vv#`g02/4*3:\+77
v>0p^^/2:/2_
<^2-1-g02</2`#*3:
0g+10p2*:^*3_1
! "#%$
%$"#!
 !!##%
|||_
 _ __

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

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

সুতরাং আমরা যে পদ্ধতির এখানে নিয়েছি সেটি হ'ল এমন একটি সূত্র যা আমাদের জানায় যে প্রদত্ত x, y স্থানাঙ্কের জন্য ঠিক কোন অক্ষরটি আউটপুট করতে হয়। কিভাবে এই কাজ করে বোঝার জন্য এটা হওয়া ASCII রেন্ডারিং দিয়ে শুরু করতে উপেক্ষা করার, এবং বক্স অক্ষর দিয়ে তৈরি বক্ররেখা মাত্র মনে সবচেয়ে সহজ পদ্ধিতি হল আছে: ┌, ┐, └, ┘, │, এবং─ ।

আমরা যখন এর মতো বক্ররেখার দিকে নজর দিই, আমরা ততক্ষনে দেখতে পাব যে ডান হাতটি বাম হাতের একদম সঠিক আয়না। ডান দিকে অক্ষর কেবল বাম তাদের অংশীদার আপ খুঁজছেন, এবং এটা অনুভূমিকভাবে অনুধ্যায়ী দ্বারা নির্ধারিত করা যেতে পারে (অর্থাৎ ঘটনার ┌এবং ┐অদলবদল করা হয়, হিসাবে └এবং ┘)।

স্তরের 3 হিলবার্ট কার্ভটি উল্লম্ব অক্ষ জুড়ে প্রতিফলন দেখায়

তারপরে নীচের বাম কোণে তাকিয়ে আমরা আবার দেখতে পাবো যে নীচের অর্ধেকটি উপরের অর্ধের প্রতিচ্ছবি। এভাবে নীচে অক্ষর কেবল উপরে তাদের অংশীদার আপ খুঁজছেন, এবং এটা উল্লম্বভাবে অনুধ্যায়ী দ্বারা নির্ধারিত হয় (অর্থাত এর ঘটনার ┌এবং └অদলবদল করা হয়, হিসাবে ┐এবং ┘)।

স্তর 3 হিলবার্ট কার্ভ নীচে বাম কোণে অনুভূমিক অক্ষ জুড়ে প্রতিচ্ছবি দেখায়

এই কোণার বাকি অর্ধেকটি কিছুটা কম স্পষ্ট। ডান হাতের ব্লকটি ত্রিভুজ সংলগ্ন ব্লকের উল্লম্ব প্রতিবিম্ব থেকে প্রাপ্ত হতে পারে।

স্তর 3 হিলবার্ট কার্ভটি দেখায় যে নীচের বাম কোণার উপরের ডান দিকের ব্লকটি কীভাবে উত্পন্ন করা যায়

এবং বাম হাতের ব্লকটি সম্পূর্ণ বক্ররেখার খুব উপরে বামে ব্লকের উল্লম্ব প্রতিবিম্ব থেকে উদ্ভূত হতে পারে।

স্তর 3 হিলবার্ট কার্ভটি দেখায় যে নীচের বাম কোণার উপরের বাম ব্লকটি কীভাবে উত্পন্ন করা যায়

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

শীর্ষ স্তরের ব্যতীত অন্য যে কোনও ক্ষেত্রে নীচের কোণার অক্ষরগুলিকে একটি বিশেষ কেস হিসাবে পরিচালনা করা দরকার, যেখানে ┌চরিত্রটি প্রতিবিম্বিত হয় ─এবং │চরিত্রটি প্রতিফলিত হয় └।

স্তর 3 হিলবার্ট কার্ভটি দেখায় যে নীচের বাম কোণার উপরের বাম ব্লকটি কীভাবে উত্পন্ন করা যায়

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

বক্রের অবশিষ্ট অংশগুলি কীভাবে উত্পন্ন হয়েছে তা দেখানো চিত্রগুলির ক্রম

এখন যে আমাদের একটি নির্দিষ্ট এক্স, ওয়াই স্থানাঙ্কিতে বক্রের আকৃতি নির্ধারণ করার একটি উপায় রয়েছে, আমরা কীভাবে এএসসিআইআই রেন্ডারিংয়ে অনুবাদ করব? এটি আসলে কেবল একটি সাধারণ ম্যাপিং যা প্রতিটি সম্ভাব্য টাইলকে দুটি ASCII অক্ষরে অনুবাদ করে into

  • ┌হয়ে যায়  _(স্পেস প্লাস আন্ডারস্কোর)
  • ┐  (দুটি স্পেস) হয়ে যায়
  • └হয়ে যায় |_(উল্লম্ব বার প্লাস আন্ডারস্কোর)
  • ┘হয়ে যায় | (উল্লম্ব বার প্লাস স্পেস)
  • │হয়ে যায় | (আবার একটি উল্লম্ব বার প্লাস স্পেস)
  • ─হয়ে যায় __(দুটি আন্ডারস্কোর)

এই ম্যাপিংটি প্রথমে স্বজ্ঞাত নয়, পাশাপাশি পাশাপাশি দুটি অনুরূপ রেন্ডারিংয়ের দিকে তাকালে এটি কীভাবে কাজ করে তা আপনি দেখতে পারেন।

স্তর 2 হিলবার্ট কার্ভটি ASCII শিল্প হিসাবে এবং বাক্স অক্ষরের সাথে রেন্ডার হয়েছে

এবং এটি মূলত এটি আছে। বাস্তবে বেফুঞ্জে এই অ্যালগরিদমটি পুরোপুরিভাবে আরও একটি সমস্যা, তবে আমি সেই ব্যাখ্যাটি আরও একটি সময়ের জন্য রেখে দেব।


2

সি, 267 বাইট

const n=4,s=1<<n,a[]={1,-s,-1,s};l,p,q;
t(d){d&=3;p-q||printf("%.2s",&"__|      _|       |___ _|_| | | "[l*8+d*2]);p+=a[l=d];}
h(d,r,n){n--&&(h(d+r,-r,n),t(d+r),h(d,r,n),t(d),h(d,r,n),t(d-r),h(d-r,-r,n));}
main(){for(;p=s*s-s,l=1,q<s*s;++q%s||putchar(10))h(0,1,n),t(3);}

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

h()হিলবার্ট কার্ভের স্ট্রোক উত্পন্ন করতে পুনরাবৃত্তি ব্যবহার করে। t()কলমের অবস্থান pবর্তমান আউটপুট অবস্থানের সমান হলে কেবলমাত্র স্ট্রোক চরিত্রটি মুদ্রণ করে q।

এটি অদক্ষ তবে সহজ।

যদি বাঁকটি উপরে-বামে শুরু হয়, কোডটি 256 বাইটে হ্রাস করা যেতে পারে।


সুপারিশ puts("")পরিবর্তে putchar(10)এবং "..."+l*8+d*2পরিবর্তে &"..."[l*8+d*2]এবং n--?h(d+r...-r,n):0পরিবর্তেn--&&(h(d+r...-r,n))
— ceilingcat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.