3 ডি এএসসিআইআই ব্লক বিল্ডিং


82

চ্যালেঞ্জ

একটি প্রোগ্রাম লিখুন যা 11x11 অ্যারে পূর্ণসংখ্যার গ্রহণ করে এবং একটি 3 ডি ASCII ব্লক বিল্ডিং তৈরি করে, যেখানে অ্যারের প্রতিটি মান অ্যারে অবস্থানের সাথে মিলিয়ে স্থানাঙ্কগুলিতে ব্লকের একটি কলামের উচ্চতা উপস্থাপন করে। নেতিবাচক উচ্চতা হ'ল "ভাসমান" কলাম - কেবল শীর্ষ ব্লকটি দৃশ্যমান।

উদাহরণ

                                                        __________________
                                        ___            /\__\__\__\__\__\__\
 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /\__\          /\/\__\__\__\__\__\__\
 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,     /\/__/         /\/\/__/__/__/__/__/__/
 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    /\/\__\        /\/\/\__\      /\/\/__/
 1, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0,    \/\/\__\      /\/\/\/__/     /\/\/__/
 0, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0,     \/\/__/     /\/\/\/\__\    /\/\/__/
 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,      \/\__\    /\/\/\/\/__/   /\/\/__/
 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,       \/__/    \/\/\/\/\__\_  \/\/__/
 1, 0, 0, 4, 3, 2, 1, 0, 0, 0, 1,                 \/\/\/\/__/_\_ \/__/
 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,            ___   \/\/\/__/__/_\_         ___
 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,           /\__\   \/\/__/__/__/_\       /\__\
 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,           \/\__\   \/__/__/__/__/       \/\__\
                                             \/\__\_________         ______\/\__\
                                              \/\__\__\__\__\       /\__\__\__\__\
                                               \/__/__/__/__/       \/__/__/__/__/

ইনপুট

ইনপুটটি 121 পূর্ণসংখ্যার একটি তালিকা হবে, হয় স্টিডিন থেকে পড়া (বিভাজনের পছন্দ আপনার উপর নির্ভরশীল) বা অ্যারে হিসাবে পাস করা হবে (1 ডি বা 2 ডি হতে পারে)।

উচ্চতাগুলি 11 থেকে 11 এর মধ্যে থাকবে।

আউটপুট

উত্পন্ন বিল্ডিংটি stdout এ সরাসরি লেখা যেতে পারে, সরাসরি স্ক্রিনে প্রদর্শিত হয়, বা একটি নতুন লাইন-বিচ্ছিন্ন স্ট্রিং হিসাবে ফিরে আসতে পারে।

শীর্ষস্থানীয় এবং পিছনে সাদা স্থান অনুমোদিত ites

বিল্ডিং বিধি

একটি পৃথক 3 ডি ব্লকের আকারটি দেখতে এরকম দেখাচ্ছে:

 ___
/\__\
\/__/

এবং একটি 2x2x2 কিউব ব্লকগুলির মতো দেখতে:

  ______
 /\__\__\
/\/\__\__\
\/\/__/__/
 \/__/__/

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

পাশ থেকে 2D উপস্থাপনা দেখে কলামের উচ্চতার ব্যাখ্যাটি সর্বোত্তমভাবে ব্যাখ্যা করা যেতে পারে।

HEIGHT:  1    2    3   -3   -2   -1
                  __   __
             __  |__| |__|  __
        __  |__| |__|      |__|  __
       |__| |__| |__|           |__|

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

আপনি যদি আরও কয়েকটি ইনপুটগুলিতে আপনার সমাধানটি চেষ্টা করতে চান তবে আমি এখানে কয়েকটি পরীক্ষার কেস একসাথে রেখেছি ।

জয়লাভ

এটি , তাই সংক্ষিপ্ততম জমা (বাইটে) জিতেছে।


9
ওহ ছেলে, 300+ বাইট সমাধানের জন্য প্রস্তুত হন। ভাল চ্যালেঞ্জ। +1
পুরোপুরি মানব

7
@ টোটালিহুমান নাহ, ডেনিস 20 মিনিটের মধ্যে এটির জন্য 9-বাইট সমাধান পেতে চলেছে।
ডিকন

3
অগ্রভাগের ইনপুট ডেটার নীচে বামদিক দিয়ে যেমন দেখানো হয়েছে তেমন দৃষ্টিকোণটি কি হতে হবে? এটি তথ্যের প্রথম বা শেষ উপাদান নয় এটি সত্যতর করে তোলে। এটি কি একটিকে গ্রহণযোগ্য? ১ ম্যাপিংটি ঠিক তেমনভাবে রাখুন এবং অগ্রভাগে নীচের ডান কলামটি দিয়ে আউটপুট আঁকুন বা ২. একটি আয়না চিত্রটি আঁকুন বা ডেটার 90 ডিগ্রি রোটেশন আঁকুন? এর মধ্যে যে কোনওটি শেষের ডেটা উপাদানটিকে অগ্রভাগের কলামের সাথে সামঞ্জস্য করবে, যা সহজ হবে।
স্তর নদী সেন্ট

3
আমি কোনও ফটো রেন্ডার করতে এবং এএসসিআইআইতে রূপান্তর করতে সত্যিকারের গেম ইঞ্জিন (বা এর অংশ) ব্যবহার করতে ঝোঁক বোধ করি
স্ট্যান স্ট্রাম

@ লেভেলআইভারস্টাস্ট এটি একটি যুক্তিসঙ্গত অনুরোধ বলে মনে হচ্ছে - যতক্ষণ আপনার অর্ডারটি সামঞ্জস্য থাকে ততক্ষণ আপনি 121 ইনপুট উপাদানগুলির ক্রমটি আপনার সমাধানের পক্ষে সবচেয়ে উপযুক্ত মনে করতে পারেন। ডিফল্ট অর্ডার দিয়ে উত্পাদিত হতে পারে এমন প্রতিটি ধরণের লেআউট উত্পাদন করা অবশ্যই সম্ভব।
জেমস হোল্ডারেন্স

উত্তর:


25

কাঠকয়লা , 70 69 68 বাইট

≔E¹¹⮌I⪪S,θF²F¹¹F¹¹F¹¹«J⁻⁻⁺λκ×μ³ι⁻λκ≔§§θλμη¿∨⁼±η⊕κ‹κη¿ι“↗⊟&⁹κUhnI”___

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

≔E¹¹⮌I⪪S,θ

অ্যারে পড়ুন, কমাতে প্রতিটি লাইন বিভক্ত করুন এবং পূর্ণসংখ্যায় কাস্ট করুন, তবে প্রতিটি লাইনটিও বিপরীত করুন, যেহেতু আমরা ডান থেকে বামে আঁকতে চাই যাতে বাম কলামগুলি ডান কলামগুলিকে ওভাররাইট করতে পারে। (অন্যান্য মাত্রাগুলি ইতিমধ্যে ওভাররাইটিং আচরণ পছন্দ করেছে have)

F²F¹¹F¹¹F¹¹«

ল) মধ্যবর্তী লুপগুলি এবং শীর্ষস্থানীয় ল) কে) উচ্চতা l) সারিগুলি এম) কলামগুলি। (প্রথম শীর্ষ রেখাগুলির মধ্য দিয়ে লুপিং করা এবং তারপরে মৃতদেহগুলি শীর্ষ রেখাসমূহের উপরের লিখনগুলি এড়ানো যায়))

J⁻⁻⁺λκ×μ³ι⁻λκ

কিউবের অবস্থানটিতে ঝাঁপ দাও।

≔§§θλμη

বর্তমান সারি এবং কলামে উচ্চতা আনুন।

¿∨⁼±η⊕κ‹κη

এই সারি এবং কলামের জন্য এই উচ্চতায় একটি ঘনকটি আঁকতে হবে কিনা তা পরীক্ষা করুন।

¿ι“↗⊟&⁹κUhnI”___

দেহ বা কিউবের শীর্ষে আঁকুন।


আমি যখন প্রথম পরিবর্তন 3একটি থেকে 33, আমি শুধুমাত্র মিনার 11 ব্লক পেতে। সাধারণ টাওয়ারগুলিতে ১১ টায় মনে হয় এটি কীভাবে ঘটে?
ফ্যাবিয়ান রোলিং 13

@ ফ্যাবিয়ান আমি কিছুটা বিভ্রান্ত হলাম যা F¹¹F¹¹F¹¹কোনও ক্লু ছিল না ...
নীল

আমি এই প্রোগ্রামিংয়ের ভাষা জানি না, আমি টিআইও লিঙ্কটি নিয়ে কিছুটা খেলেছি।
ফ্যাবিয়ান রোলিং

30

সি,  376   350   313   309  285 বাইট

চার জন বাইট সংরক্ষণের জন্য @ জোনাথন ফ্রেঞ্চকে ধন্যবাদ!

#define F for(
char*t,G[26][67],*s;i,j,e,k,v,x,y;b(){F s="\\/__//\\__\\ ___ ";*s;--y,s+=5)F e=5;e--;*t=*s<33&*t>32?*t:s[e])t=G[y]+x+e;}f(int*M){F;e<1716;++e)G[e/66][e%66]=32;F k=0;++k<12;)F i=0;i<11;++i)F j=11;j--;v+k||b())x=i+j*3+k,y=14+i-k,(v=M[i*11+j])>=k&&b();F;++e<26;)puts(G+e);}

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

Unrolled:

#define F for(

char *t, G[26][67], *s;
i, j, e, k, v, x, y;

b()
{
    F s="\\/__//\\__\\ ___ "; *s; --y, s+=5)
        F e=5; e--; *t=*s<33&*t>32?*t:s[e])
            t = G[y]+x+e;
}

f(int*M)
{
    F; e<1716; ++e)
        G[e/66][e%66] = 32;

    F k=0; ++k<12;)
        F i=0; i<11; ++i)
            F j=11; j--; v+k||b())
                x = i+j*3+k,
                y = 14+i-k,
                (v=M[i*11+j])>=k && b();

    F; ++e<26;)
        puts(G+e);
}

হতে পারে 26*66না 1716?
জোনাথন ফ্রেচ

@ জোনাথনফ্রেচ অবশ্যই, আমি সে সম্পর্কে ভুলে গেছি
স্টেডিবক্স


for(e=k=1;e;++k)for(e=-> for(k=1;e;++k)for(e=
জোনাথন ফ্রেচ

#define B b(...)&++e-> #define B++e&b(...)(ধরে নিলাম bনির্ভর করে না e, যা আমি মনে করি এটি এটি করে না)।
জোনাথন ফ্রেচ

9

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

a=>(n=55,$=f=>[...Array(n)].map((_,i)=>f(i)),S=$(_=>$(_=>' ')),n=11,$(l=>$(z=>$(y=>$(x=>(x=10-x,X=x*3+y+z,Y=y-z+n,Z=a[y][x])<=z&&Z+z+1?0:l?['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s)):S[Y].splice(X+1,3,...'___'))))),S.map(r=>r.join``).join`
`)

@ নীলের পরামর্শ থেকে 26 বাইট সংরক্ষণ করা হয়েছে ।

Ungolfed

a=>(
    n=55,
    $=f=>[...Array(n)].map((_,i)=>f(i)),
    S=$(_=>$(_=>' ')),
    n=11,
    $(l=>
        $(z=>$(y=>$(x=>(
            x=10-x,
            X=x*3+y+z,
            Y=y-z+n,
            Z=a[y][x],
            Z<=z && Z+z+1 || (
                l
                ? ['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s))
                : S[Y].splice(X+1,3,...'___')
            )
        ))))
    ),
    S.map(r=>r.join``).join`\n`
)

2
,$(w=>$(z=>$(y=>$(x=>(Z=a[y][x=10-x,X=x*3+y+z,Y=y-z+n,x])<=z&&Z+z+1?0:w?['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s)):S[Y].splice(X+1,3,...'___'))))),26 বাইট সংরক্ষণ করা হবে বলে মনে হচ্ছে।
নিল

নিল উজ্জ্বল! প্রথমে সমস্ত শীর্ষ লাইন আঁকলে আমাকে ফাঁকা স্থান ছাড়াই যাচাইয়ের ঝামেলা বাঁচায়।
darrylyeo

6

পাইথন 2 , 243 বাইট

a=input()
s=eval(`[[' ']*55]*23`)
for h in range(7986):
 k=h%3;x=h/3%11;y=h/33%11;z=h/363%11;i=h/3993;u=y+z-x*3+30;v=y-z+10
 if~-(z>=a[y][10-x]!=~z):
	if i*k:s[v+k][u:u+5]='\//\____/\\'[k%2::2]
	if~-i:s[v][u+1+k]='_'
for l in s:print''.join(l)

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

নীলের কাঠকয়লা পদ্ধতির একটি পাইথন অনুবাদ।


এর জন্য একটি গল্ফ পাইথন সমাধান দেখে ভাল লাগছে। আমার পাইথন প্রুফ অফ-কনসেপ্টটি 900 বাইটের বেশি ছিল!
জেমস হোল্ডারেন্স



5

Tcl, 380 409 বাইট

ব্যবহারকারী সার্জিওল খুব সুন্দরভাবে এটিকে সঙ্কুচিত করতে ব্যস্ত রয়েছেন:

set X [read stdin]
proc L {a b c d e s} {time {incr z
set y -1
time {incr y
set x -1
time {if {abs([set Z [lindex $::X [expr ($y+1)*11-[incr x]-1]]])==$z|$z<$Z} {set s [string repl [string repl $s [set i [expr -3*$x+57*$y-55*abs($z)+701]] $i+$b $a] [incr i $c] $i+$e $d]}} 11} 11} 12
set s}
puts [L /\\__\\ 4 56 \\/__/ 4 [L "" -1 -55 ___ 2 [string repe [string repe \  55]\n 23]]]

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

আসল বিষয়বস্তু

set xs [read stdin]
proc L {a b c d e s} {set z 0
while {[incr z]<12} {set y -1
while {[incr y]<11} {set x -1
while {[incr x]<11} {set Z [lindex $::xs [expr ($y+1)*11-$x-1]]
if {abs($Z)==$z||$z<$Z} {set i [expr -3*$x+57*$y-55*abs($z)+701]
set s [string repl [string repl $s $i $i+$b $a] [incr i $c] $i+$e $d]}}}}
set s}
puts [L /\\__\\ 4 56 \\/__/ 4 [L "" -1 -55 ___ 2 [string repe [string repe \  55]\n 23]]]

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

হায় আফসোস, এটাই তাই। যখন "উজ্জীবিত" তখন এটি চোখের সামনে আরও সহজ

set s [string repeat [string repeat " " 55]\n 23]

proc loops {s0 i0 io s1 i1} {
  set z  0; while {[incr z] < 12} {
  set y -1; while {[incr y] < 11} {
  set x -1; while {[incr x] < 11} {
    set Z [lindex $::xs [expr {($y+1) * 11 - $x - 1}]]
    if {abs($Z) == $z || $z < $Z} {
        set i [expr {-3*$x + 57*$y - 55*abs($z) + 701}]
        set ::s [string replace $::s $i $i+$i0 $s0]
        incr i $io
        set ::s [string replace $::s $i $i+$i1 $s1]
    }
  } } }
}

loops ""      -1 -55 \
       ___     2
loops /\\__\\  4  56 \
      \\/__/   4

puts $s

প্রয়োজনীয়তা অনুসারে একটি স্ট্রিং তৈরি করে। স্টিডিন থেকে অ্যারে নেয়। নীচে থেকে উপরে, সামনে থেকে পিছনে, স্ট্রিং ডেটার উপরে ডান থেকে বামে যায়। এটি কি দুটি পাসে, একবার উপরের প্রান্তের জন্য এবং আবার প্রতিটি ঘনক্ষেতের বাকী অংশের জন্য থাকে?

আমি কিছু মিষ্টি ফাংশনাল ল্যাম্বদা মোজো ব্যবহার করে এটি আরও ছোট করার চেষ্টা করেছি, তবে হায়, এটি এটিকে আরও বড় করে তুলেছে।


আপনি গল্ফ করতে পারেন: tio.run/…
সার্জিওল

আরও গল্ফিং: tio.run/…
সার্জিওল


তবু আরও: tio.run/…
সার্জিওল

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