আমাকে পিরামিড বানাও


16

আপনাকে কিউব থেকে একটি পিরামিড তৈরি করতে হবে। কিউবগুলি 2 টি কোণ থেকে দেখা যায়:

  _____        _____
 /\    \      /    /\
/  \____\    /____/  \
\  /    /    \    \  /
 \/____/      \____\/

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

ইনপুট একটি স্ট্রিং হিসাবে সংখ্যার (কিউবসের আকার), স্ল্যাশ বা ব্যাকস্ল্যাশ (দিক / কোণ নির্দেশ করতে) এবং অন্য একটি সংখ্যা (পিরামিডের উচ্চতা) সরবরাহ করবে।

উদাহরণ:

ইনপুট:

1/1

আউটপুট:

 ___
/\__\
\/__/

ইনপুট:

1\1

আউটপুট:

 ___
/__/\
\__\/

ইনপুট:

2/1

আউটপুট:

  _____
 /\    \
/  \____\
\  /    /
 \/____/

ইনপুট:

1/2

আউটপুট:

     ___ 
 ___/\__\
/\__\/__/
\/__/\__\
    \/__/

ইনপুট:

2\2

আউটপুট:

  _____          
 /    /\         
/____/  \_____   
\    \  /    /\ 
 \____\/____/  \ 
 /    /\    \  /
/____/  \____\/ 
\    \  /        
 \____\/        

ইনপুট:

1/3

আউটপুট:

         ___  
     ___/\__\
 ___/\__\/__/
/\__\/__/\__\
\/__/\__\/__/
    \/__/\__\
        \/__/
  • অনুসরণ / শীর্ষস্থানীয় সাদা স্থান ঠিক আছে।
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।
  • আপনি ধরে নিতে পারেন ইনপুট সর্বদা বৈধ হবে।
  • আপনি ধরে নিতে পারেন ইনপুটটির ফলে খুব বড় আউটপুট আসবে না, যেমন: টার্মিনালে আউটপুট প্রিন্ট করা হবে না তখন কোনও লাইন মোড়ানো নয়।
  • পিরামিডের কিউব এবং উচ্চতা ধনাত্মক (যেমন ≥ 1)
  • এটি কোড-গল্ফ, তাই বাইট জেতে সংক্ষিপ্ততম কোড।

বর্তমান বিজয়ী হলেন:

জুলিয়াতে 270 বাইট সহ গ্লেন ও

চ্যালেঞ্জ খোলা থাকে। আপনি যদি বর্তমানের সেরাটিকে পরাজিত করেন তবে আমি গৃহীত উত্তরটি আপডেট করব।


2
আপনার কিউবগুলি সাম্প্রতিক হীরক প্যাটার্ন চ্যালেঞ্জগুলির চেয়ে আলাদা, কারণ শীর্ষ সারিতে 2s + 1 আন্ডারস্কোর রয়েছে, অন্য চ্যালেঞ্জগুলির উপরের সারিতে 2s আন্ডারস্কোর এবং অন্যান্য সারিগুলিতে 2s-1 রয়েছে। তার মানে আপনার অনুভূমিক পিচটি 3s + 1। আমার ধারণা আশেপাশের জিনিসগুলি মিশিয়ে দেওয়া ভাল। কেউ যদি এটিকে মিস করে তবে কেবল পর্যবেক্ষণ করা।
স্তর নদী সেন্ট

1
আকার এবং উচ্চতার সর্বোচ্চ মানগুলি কী কী? আমরা কি তারা এক অঙ্কের ধরে নিতে পারি?
স্তর নদী সেন্ট

না, আপনি এটি এক অঙ্কের হিসাবে ধরে নাও নিতে পারেন তবে আপনি ধরে নিতে পারেন সরবরাহকৃত ইনপুট আউটপুটটিকে "খুব বড়" হতে দেবে না, অর্থাৎ আপনার টার্মিনালে লাইন মোড়ানোর কারণ হবে না।
গিলাদ হচ

উত্তর:


3

জুলিয়া - 503 455 369 346 313 270 বাইট

f=A->(t=47A;h='/'+45t;(m,n)=int(split(A,h));W=2m*n+1;X=(l=3m+1)n+m+1;s=fill(' ',X,W);s[end,:]=10;for i=1:n,j=i:n,M=1:m s[M+i*l+[[L=[J=(2j-i)m,J,J-m]+M W-L]X.-[l,m,0] [0 m].+[1,m,m].+[J,J+m,J-m]X-l]]=[1,1,1]*[h 139-h 95 s[i*l,i*m-m+1]=95]end;print((t?s:flipud(s))...))

Ungolfed:

function f(A)
  t=47A      # Determine if '/' is in A ('/' = char(47))
  h='/'+45t   # Set h to the appropriate slash ('\\' = char(92), 92=47+45)
  (m,n)=int(split(A,h)) # Get the two integers from A
  W=2m*n+1    # Get number of rows of output (vertical height of pyramid)
  X=(l=3m+1)n+m+1 # Get columns of output + 1 (for newlines)
  s=fill(' ',X,W) # Create 'canvas' of size X x W
  s[end,:]=10 # Put newlines at end of each output row
  for i=1:n, j=i:n, M=1:m
    # This is where the fun happens.
    # K and L represent the shifting points for '/' and '\\' in the
    # horizontal and vertical directions.
    # They are used to make the code neater (and shorter).
    K=M+i*l-[l,m,0]
    L=[J,J,J-m]+M
    # The next two assign the slashes to appropriate places
    s[K+L*X]=h
    s[K+(W-L)X]=139-h
    # This one puts the first 2m underscores in each of the underscore sets
    s[M+i*l-l+[0 m].+[1,m,m].+[J,J+m,J-m]X]=95
    # This places the final underscores on the top edges (repeatedly)
    s[i*l,i*m-m+1]=95
  end
  # The above produces the array orientation for backslash, but uses
  # the "wrong" slashes along the diagonals if there's a forward slash.
  # This line flips the matrix in that case, before printing it.
  print((t?s:flipud(s))...))
end

ব্যবহার:

f("3/2")

অথবা

f("2\\3")

9

পার্ল, 343 বাইট

$_=<>;$_=~/(\d+)(\S)(\d+)/;$v=$2eq'/';$w=$1*3+1;for$y(0..$1*2*$3){$k=$w*$3+$1-1;for$z(0..$k){$x=$v?$k-$z:$z;$q=($y+$1-1)/$1|0;$r=$x/$w|0;$d=$q+$r&1;$f=($y-1)%$1;$f=$1-$f-1if$d;$g=($x-$f)%$w;$u=$r;$q=2*$3-$q+1,$u++if$q>$3;print(($q>=$r&&$q&&$g==0)||($q>$r&&$g==$w-$1)?$d^$v?'/':'\\':$q>=$u&&$y%$1==0&&$g>0&&$g<($w-$1+($q==$r))?"_":$")}print$/}

মন্তব্যে মাল্টলাইন:

$_=<>;$_=~/(\d+)(\S)(\d+)/;$v=$2eq'/'; # read input
$w=$1*3+1; # compute width of each cube in chars
for$y(0..$1*2*$3){$k=$w*$3+$1-1;for$z(0..$k){ # iterate over rows, columns
    $x=$v?$k-$z:$z;   # flip x co-ordinate based on 2nd param
    $q=($y+$1-1)/$1|0;$r=$x/$w|0;   # parallelogram row and column index
    $d=$q+$r&1;  # flag parallelogram as left or right leaning
    $f=($y-1)%$1;$f=$1-$f-1if$d;  # compute a zig-zag offset
    $g=($x-$f)%$w;  # compute column position, offset by zig-zag
    $u=$r;$q=2*$3-$q+1,$u++if$q>$3; # vertical threshold for printing chars   
    print(($q>=$r&&$q&&$g==0)||($q>$r&&$g==$w-$1)?$d^$v?'/':'\\': # output slash
    $q>=$u&&$y%$1==0&&$g>0&&$g<($w-$1+($q==$r))?"_":$") # underscore or space
}print$/}   # print out newline at end of row

উদাহরণ আউটপুট:

2/3
                _____  
               /\    \ 
         _____/  \____\
        /\    \  /    /
  _____/  \____\/____/ 
 /\    \  /    /\    \ 
/  \____\/____/  \____\
\  /    /\    \  /    /
 \/____/  \____\/____/ 
       \  /    /\    \ 
        \/____/  \____\
              \  /    /
               \/____/ 

আমি একই অ্যালগরিদম ব্যবহার করে সি ফাংশন হিসাবে এটি বাস্তবায়নের চেষ্টা করেছি, একক-অক্ষর ভেরিয়েবল নামের বিলাসিতা থেকে বাইটগুলি সংরক্ষণের আশায়, তবে এটি 15 বাইট আরও বড় হয়ে 358 বাইটে শেষ হয়েছে ( -std=c89ছাড়ার জন্য জিসিসির অধীনে সংকলন করা দরকার) voidফাংশন হেডারের মধ্যে):

j(char*s){int c,p,v,x,y,k,z,u,g,w,r,d,q,f;char e;sscanf(s,"%d%c%d",&c,&e,&p);v=e=='/';w=c*3+1;for(y=0;y<=c*2*p;y++){k=w*p+c-1;for(z=0;z<=k;z++){x=v?k-z:z;q=(y+c-1)/c;r=x/w;d=q+r&1;f=(y+c-1)%c;if(d)f=c-f-1;g=(x-f)%w;u=r;if(q>p){q=2*p-q+1;u++;}printf("%c",(q>=r&&q&&g==0)||(q>r&&g==w-c)?d^v?'/':'\\':q>=u&&y%c==0&&g>0&&g<(w-c+(q==r))?'_':' ');}printf("\n");}}

আপনি সর্বাধিক পেতে সক্ষম হবেন, যদি সেই 15 বাইটগুলি সি সংস্করণে ফিরে না পাওয়া যায়: printf("%c" --> putchar(,, printf("\n") --> puts("")সমস্ত ইনটেনশন ডিক্লারেশনগুলি ফাংশনের বাইরে নিয়ে যান, তবে আপনি এটি মুছে ফেলতে পারবেন int ( মেটা কোডেগল্ড.স্ট্যাককেেক্সচেঞ্জ দেখুন / কি / 5532/15599 ), তাদের ascii কোডগুলির জন্য সমস্ত অক্ষরের আক্ষরিক পরিবর্তন করুন ' ' --> 32। লুপগুলির জন্য যেমন আপনার রিফ্যাকচারিং যেমন সহায়তা for(k+1;z--;)করতে পারে তবে তা আরও জটিল।
স্তর নদী সেন্ট

এছাড়াও আমি মনে করি eআপনি যদি এটি শূন্যে আরম্ভ করেন তবে প্রদত্ত একটি ইনট হতে পারে। sscanf কেবলমাত্র সর্বনিম্ন তাত্পর্যপূর্ণ বাইটটি মুছে ফেলবে এবং অন্য তিনটি বাইটে যে কোনও আবর্জনা থাকতে পারে।
স্তর নদী সেন্ট

শেষ পর্যন্ত আমি মনে করি একটি সম্পূর্ণ প্রোগ্রাম এই ক্ষেত্রে একটি ফাংশন চেয়ে ভাল যেতে হবে। mainপরিবর্তে আপনি তিনটি অতিরিক্ত অক্ষর অর্জন করেছেন jতবে আপনাকে প্যারামিটারটি পাস করতে হবে না sএবং আপনি বৈশ্বিক ভেরিয়েবলগুলির স্বয়ংক্রিয় সূচনার সুবিধা নিতে পারেন।
লেভেল নদী সেন্ট

3

রুবি, 332

এখন পর্যন্ত করা একমাত্র গল্ফিং হ'ল মন্তব্য এবং ইনডেন্টগুলি বাদ দেওয়া। আমি পরে গল্ফ করব।

gets.match(/\D/)
d=$&<=>"@"
n=$`.to_i
m=2*n
p=$'.to_i
a=(0..h=4*n*p).map{' '*h*2}
(p*p).times{|j|
x=h-j/p*(3*n+1)*d
y=h/2+(j/p-j%p*2)*n
if j%p<=j/p
(-n).upto(n){|i|
a[y+i][i>0?x+m+1-i :x-m-i]=?/
a[y+i][i>0?x-m-1+i :x+m+i]='\\'
a[y+n][x+i]=a[y-n][x+i]=a[y][x-d*(n+i-1)]=?_
a[y+i+(i>>9&1)][x+d*i.abs]='\_/'[(0<=>i*d)+1]
}
end
}
puts a

আমি ফাঁকের একটি অ্যারে সেট আপ করেছি এবং এতে পৃথক অক্ষরগুলিকে ঠোকাচ্ছি। অতিরিক্ত কোড এড়ানোর জন্য একটি ঘনক্ষেত্রের অন্যের উপরে (নীচ থেকে উপরে পর্যন্ত কাজ করা) এবং ঘনক্ষেত্রের মধ্যেই যথেষ্ট পরিমাণে ওভারড্রয়িং রয়েছে। আমি একটি রম্বস অঙ্কন করে পিরামিড তৈরি করি ( /codegolf//a/54297/15599 এর অনুরূপ) ) এবং উপরের অর্ধেকে ছাড়িয়েছি।

শক্ত অংশটি স্কেলেবল কিউব আঁকছিল। আমি _অনুভূমিক দিকগুলির 2n + 1 অক্ষর দিয়ে একটি ঘের ষড়ভুজ দিয়ে শুরু করেছি । আমার কাছে 2n + 1 /ও ছিল এবং \আমারও অনেক বেশি ছিল তবে _শেষের প্লট করে আমি সেগুলি ওভাররাইট করেছিলাম।

অভ্যন্তরীণ লাইনগুলি কেবল ঘনক্ষেত্রের মুখের দিকে নির্ভর করে পরিবর্তিত হয়। আমি সমস্ত /এবং \একটি একক অ্যাসাইনমেন্ট দিয়ে প্লট করি । absদিকটি বিপরীত করতে সহায়তা করে এবং i>>9&1i এর নেতিবাচক মানগুলিতে অতিরিক্ত 1 যুক্ত করে যা উপরের অংশটি নীচে নামিয়ে দেয়। জন্য i= 0 প্রয়োজনীয়গুলির _একটির ওভারপ্লিট্ট করা হয়েছে, সুতরাং নির্বাচক স্ট্রিংয়ে '\_/'তিনটি চিহ্ন রয়েছে, এর চিহ্ন অনুসারে নির্বাচিত হয়i

আউটপুটটির চারপাশের শ্বেতস্থানটি যথেষ্ট তবে অতিরিক্ত নয়: 4 * পি * এন উচ্চ এবং 8 * পি * এন প্রশস্ত (দ্বিতীয়টি শীর্ষস্থানীয় ঘনক্ষনকে সর্বদা আউটপুটের কেন্দ্রে রাখতে সক্ষম করে)) আমি বুঝতে পারি "পিছনে / অগ্রণী পুরো স্পেসগুলি অন্তর্ভুক্ত করতে হোয়াইটস্পেসগুলি ", তবে প্রয়োজনে সংশোধন করতে পারে।

অবহেলিত কোড

gets.match(/\D/)                                   #find the symbol that is not a digit. it can be extracted from $&
d=$&<=>"@"                                         #direction, -1 or 1 depends if ascii code for symbol is before or after "@"
n=$`.to_i                                          #side length extracted from match variable $`
m=2*n
p=$'.to_i                                          #pyramid height extracted from match variable $'
a=(0..h=4*n*p).map{' '*h*2}                        #setup an array of h strings of h*2 spaces

(p*p).times{|j|                                    #iterate p**2 times
  x=h-j/p*(3*n+1)*d                                #calculate x and y coordinates for each cube, in a rhombus
  y=h/2+(j/p-j%p*2)*n                              #x extends outwards (and downwards) from the centre, y extends upwards 

  if j%p<=j/p                                      #only print the bottom half of the rhombus, where cube y <= cube x  
    (-n).upto(n){|i|                               #loop 2n+1 times, centred on the centre of the cube 
      a[y+i][i>0?x+m+1-i :x-m-i]=?/                #put the / on the perimeter of the hexagon into the array          
      a[y+i][i>0?x-m-1+i :x+m+i]='\\'              #and the \ also.
      a[y+n][x+i]=a[y-n][x+i]=a[y][x-d*(n+i-1)]=?_ #plot all three lines of _ overwriting the / and \ on the top line    
      a[y+i+(i>>9&1)][x+d*i.abs]='\_/'[(0<=>i*d)+1]#plot the internal / and \ overwriting unwanted _
    }
  end
}
puts a
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.