এম্বেডড হেক্সাগন!


18

আপনার টাস্ক: একটি পূর্ণসংখ্যা দেওয়া nহয়েছে, নবম গভীরতায় নীচের নিয়মগুলি অনুসরণ করে একটি এম্বেডেড ষড়ভুজ নকশা তৈরি করুন।

একটি এম্বেডেড ষড়ভুজ এর মূল আকার রয়েছে: ( n=0)

 __      
/  \
\__/

এম্বেডড হেক্সাগন n=1এবং n=2:

  ____    
 /  \ \
/\__/  \
\      /
 \____/

    ________    
   /  \ \   \
  /\__/  \   \
 /\      /    \
/  \____/      \
\              /
 \            /
  \          /
   \________/

পূর্ববর্তী গভীরতার দ্বিগুণে প্রতিটি পাশের দৈর্ঘ্য একই পক্ষের দৈর্ঘ্যের 2 গুণ। উপরের এবং নীচের দিকগুলি 2 টি অক্ষর দীর্ঘ n=0এবং যখন বাকিগুলি 1 অক্ষর দীর্ঘ হিসাবে শুরু হয়। নীচের দিকের নীচের দিকের দৈর্ঘ্য 2^nদীর্ঘ হওয়া উচিত ( OEIS: A000079 ) এবং উপরের এবং নীচের দিকগুলি নিয়মটি অনুসরণ করা উচিত 2^(n+1)(একই OEIS)।

বর্তমান হেক্সাগনগুলি 0-সূচকযুক্ত, আপনি চাইলে 1-সূচকযুক্ত ব্যবহার করতে বেছে নিতে পারেন।

এটি , তাই সংক্ষিপ্ত উত্তরটি জেতে!


@ লুইস মেন্ডো ঠিক আছে, আমি নামটি পরিবর্তন করব।
কমরেড স্পার্কলপনি

বড় ইনপুট পরিচালনা করা কঠিন হতে পারে (উদাঃ )৪)। সীমা আছে কি n?
ম্যাথু রোহ

@ সিগএসইজিভি এন এর কোনও সীমা নেই।
কমরেড স্পার্কলপনি

1
হেক্সাগনির একটি উত্তর দেখে আনন্দিত হবেন :))
মিঃ এক্সকোডার

1
হি, আমার কোচ বক্ররেখার জমা দেওয়ার টার্টল গ্রাফিক্স এটিও করতে পারে (কেবলমাত্র প্রথম ফাংশন পরিবর্তিত)। অবশ্যই এর জন্য খুব দীর্ঘ, যদিও :)
janrjan জোহানসেন

উত্তর:


10

কাঠকয়লা , 40 29 বাইট

11 টি বাইটগুলি অন্যান্য ট্রিকের মধ্যে থাকা লুপটি একটি লুপটিতে পরিবর্তন করে @ নীলকে ধন্যবাদ বাঁচিয়েছে

FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β

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

ব্যাখ্যা (পুরানো)

এই প্রোগ্রামটি বৃহত্তম হেক্সাগন তৈরি করে শুরু হয় এবং তারপরে ছোটগুলি একের পর এক লুপ (1-ইনডেক্সড) করে। অবগতির জন্য, α, ইনপুট সংখ্যা βপরিবর্তনশীল যে রয়েছে 2^(α-1)এবং ιলুপ iterating পরিবর্তনশীল।

Nα                        # Take input and store in α
Wα«                       # While α do:
 ×_X²ι                    #  Write "_"*(2**ι); this forms the top edge of the hexagon
 ↓                         #  Go down
 AX²⁻ι¹β                 #  Assign 2**(ι-1) to β
 ↘β←                       #  Write \ β times in a SE direction (top right edge) and then go left
 ↙β↑                       #  Write / β times in a SW direction (bottom right edge) and then go up
 ←×_X²ι                   #  Write the bottom edge
 ↖β→↗β                    #  Just like before, write the top and bottom left edges
 A⁻α¹α                    #  Decrement α
                          # Now the pointer is at the top left corner of the hexagon,
                          # from where the other smaller hexagons will soon be generated

আমি লক্ষ্য করেছি যে "হ্যালো, ওয়ার্ল্ড!" চারকোলের জন্য এখনও প্রোগ্রাম। আপনার এটি যুক্ত করা উচিত।
mbomb007

@ mbomb007 এটি কি কেবল তুচ্ছ একটি প্রতিলিপি হবে না "যদি এই ভাষাটির কোনও উত্স নেই তবে উত্তরটি উত্তর না দিয়ে যদি এই উত্স ফাইলটি প্রিন্ট করে?
নীল

যখন আমি বুঝতে পারি যে আমি কিছু বাইট সংরক্ষিত ×_X²ιহিসাবে একই ×__β, এবং কিছু আরো অনেক কিছু আপনার রূপান্তর দ্বারা বাইট একটি মধ্যে , যা ইনপুট সংখ্যা সঞ্চয় করতে থাকার এড়াতে। এটি অনলাইন চেষ্টা করুন!
নিল

@ নীল ধন্যবাদ, এটি বেশ ঝরঝরে :)
ক্রিটসি লিথোস

5

হাস্কেল , 230 217 207 বাইট

সম্পাদনা করুন:

  • -13 বাইট: @ এক্সনর দেখেছি যে আমার ন্যায়বিচার #হতে পারে max
  • -10 বাইট: এবং এটি zipWithএবং pএকটি ?অপারেটরে একীভূত হতে পারে এবং আমি (একরকম!) পুনরায় প্রয়োগ করেছি replicate

mনেয় Integerএবং ফেরত দেয় a String

m n=unlines.foldr1 o$((2^n)&).(2^)<$>[0..n]
l&t|a<-c[l,2*t]" _",b<-[c[l-i,1,2*t+2*i-2,1,l-i]" / \\ "|i<-[1..t]]=a:b++r(r<$>o[a]b)
c=(concat.).z replicate
o=max?' '?""
f?e=z f.(++repeat e)
r=reverse
z=zipWith

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

কিভাবে এটা কাজ করে

  • mপ্রধান কাজ। এটি &সঠিক প্যাডিং সহ হেক্সাগন তৈরি করতে ব্যবহার করে, তারপরে এগুলি এক সাথে ভাঁজ করে o
  • l&tপাশের দৈর্ঘ্যের একটি ছোট ষড়্ভুজ তৈরি করে , লাইনগুলির তালিকা হিসাবে tপাশের দৈর্ঘ্যের বৃহত একের মধ্যে প্যাড করে। lString
    • a আন্ডারস্কোর সহ হেক্সাগনের শীর্ষ লাইন।
    • bষড়ভুজের উপরের অর্ধেকের অন্যান্য রেখার একটি তালিকা। রেখাগুলি bপ্যাডিংকে কেন্দ্র করে, যা আয়তক্ষেত্রাকার; এটি পরবর্তী পদক্ষেপটি কাজ করতে দেয়।
    • ষড়ভুজটির নীচের অর্ধেকটি a উপরে bদিয়ে আচ্ছাদিত o, তারপরে বিপরীত (উভয় রেখার ক্রম এবং প্রতিটি লাইনের মধ্যে)।
  • cদুটি আর্গুমেন্ট, লেন্থ এবং একটি স্ট্রিং একটি তালিকা নেয় এবং একটি স্ট্রিং সংশ্লিষ্ট দৈর্ঘ্য, যেমন মূল প্রতিটি অক্ষর অনেক প্রতিলিপি হিসাবে আছে উত্পন্ন c[1,3,2]"abc" == "abbbcc"। এটি &লাইনগুলি তৈরি করতে ব্যবহৃত হয় ।
  • o লাইনগুলির তালিকা হিসাবে চিত্র উপস্থাপন করে দুটি যুক্তি গ্রহণ করে এবং দ্বিতীয়টির উপরে প্রথম, ছোটটিকে ওভারলে করে।
    • এটি হেক্সাগনগুলিকে একত্রিত করতে এবং প্রতিটি ষড়ভুজকে নীচে যুক্ত করতে উভয়ই ব্যবহৃত হয়।
    • এটি মূলত ?দু'বার নীচে এবং ডানদিকে অসীম অনেকগুলি স্পেস সহ প্রথম ছবিটি প্যাড করার মাধ্যমে দু'বার ব্যবহার করে কাজ করে , তারপরে সংশ্লিষ্ট অক্ষরগুলির সাথে একসাথে জিপ করে maxযা কোনও স্থান থাকলে অ-স্থানের অক্ষর নির্বাচন করে।
  • (f?e)l mlঅসীম অনেক 'ই' উপাদান যুক্ত করে একটি তালিকা প্যাড করে, তারপরে ফলাফলের তালিকা এবং ফাংশনটির mসাথে তালিকাগুলি জিপ করে f

1
চমৎকার সমাধান! আমার মনে হয় (#)হতে পারে max
xnor

1
জিপ করা সঙ্গে মিলিত হতে পারে pবাইট সংরক্ষণ করতে: o=max?' '?"";f?e=z f.(++repeat e)। সংক্ষিপ্ত পয়েন্টফ্রি হতে পারে।
xnor

2
(\n->(<$[1..n]))হয় replicate
xnor

@ এক্সনোর replicate? এখন এটি কেবল আলিঙ্গন করছে। আমি খুব অভ্যস্ত <$[1..n]বা [1..n]>>প্রায় সবসময় জিতেছি। তবে আমি কীভাবে ?আরও ছোট করব তা দেখছি না । আমি ইতিমধ্যে pপয়েন্টফ্রি তৈরির চেষ্টা করেছি এবং এটি ++কেবল ভুল জায়গায় রয়েছে, দিয়ে জিনিসগুলিকে উড়িয়ে দেওয়া flip
janrjan জোহানসেন 4

3

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

f=(n,s=` `.repeat(1<<n),p=(n?f(n-1):`


`).replace(/(.*)\n/g,s+`$1 `+s)+s,t=`_`.repeat(2<<n))=>(s+t+s+`
`+s.replace(/ /g,"$'/$'$'  $`$`$`$`\\$'\n")).replace(/ /g,(c,i)=>p[i+(1<<n>>1)])+s.replace(/ /g,"$`\\$`$`  $'$'$'$'/$`\n").replace(/ +\/( *)\n$/,t+`/$1
`)
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

ব্যাখ্যা: প্রথমের পরে ষড়জাগুলির জন্য, পূর্ববর্তী ষড়জাগুলি প্রথমে প্রতিটি দিকে উত্পন্ন এবং প্যাড করা হয় (এটি আউটপুটটি একটি আয়তক্ষেত্র হওয়ার উপর নির্ভর করে)। (প্রথম শিরোনামের জন্য, কিছু ডামি প্যাডিং তৈরি করা হয়েছে)) ষড়জাগরের উপরের এবং উপরের অংশগুলি উত্পন্ন হয় এবং সমস্ত স্পেস পূর্ববর্তী ষড়্ভুজের সাথে মিশে যায়। (ষড়গাছগুলি রেখায় আনার জন্য কিছু কৌশল রয়েছে; অতিরিক্ত মার্জিনের অনুমতি দেওয়া থাকলে এটি আরও সহজ হবে) পুনরাবৃত্তিটি কাজ করার জন্য ট্রেলিং নিউলাইন সহ আয়তক্ষেত্রাকার আউটপুট ফেরত নেওয়ার যত্ন নিতে হবে।


সুতরাং, আপনি প্রদর্শন করছেন যে এটি, টেফলন এবং ডিপ ডিশ পিজ্জা, সব কি আসলে একই রকম নির্মাণ? দারুণ ঝরঝরে।
অ্যাডমবর্কবার্ক

1
@ অ্যাডমবার্কবার্ক আমার কাছে আরও কয়েকটি উত্তর রয়েছে যা তা করে; এই তির্যকগুলি /ASCII শিল্পে জনপ্রিয় এবং replaceপদ্ধতিটি জাভাস্ক্রিপ্টে এগুলি উত্পন্ন করার তুলনামূলকভাবে সস্তা উপায়।
নীল

1<<n>>1: দুর্দান্ত প্রতিসাম্য ;-)
লুক

@ লুক আমি এই ভেরিয়েবলটি বলতে পারি, বলতে পারি, vতবে দুঃখের বিষয় এটি 1আমার কোনও সাধারণ ফন্টের প্রতিসাম্য নয়।
নীল

2

পিএইচপি, 337 বাইট

0 সূচীকরণ

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v));for(;1+$c;$c--)for($i=0;$i<$e=2**$c*2+1;$i++){$z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1;$h[$i]=substr_replace($h[$i],$s=str_pad(!$y?$z|$x?"\\":"":"/",$e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),$z|!$i?"_":" ").(!$y?$z|$x?"/":"":"\\"),$v-$z-$y*$i-$x*($e-$i),strlen($s));}echo join("\n",$h);

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

সম্প্রসারিত

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v)); # fill array with maximal width
for(;1+$c;$c--)  # greatest hexagon to lowest
for($i=0;$i<$e=2**$c*2+1;$i++){ # loop through the rows
    $z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1; # booleans last first ad second half
    $h[$i]=substr_replace($h[$i], # replace substring
    $s=str_pad(
        $z?"\\":($y?"/":($x?"\\":"")),
        $e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),
        $z|!$i?"_":" "
        ).(!$z?!$y?$x?"/":"":"\\":"/"), # with string for smaller hexagon
    $v-$z-$y*$i-$x*($e-$i), # at offset
    strlen($s));
}
echo join("\n",$h); # Output
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.