একটি ক্যান্টর সেট মুদ্রণ করুন


19

চ্যালেঞ্জ

একটি এন-লেভেল্ড ক্যান্টর সেট তৈরি করুন

ক্যান্টোর টেরিনারি সেটটি বারবার লাইন বিভাগগুলির একটি সেটের খোলা মাঝারি তৃতীয়াংশ মুছে ফেলার মাধ্যমে তৈরি করা হয়।

প্রোগ্রামটি একটি প্যারামিটার N(একটি পূর্ণসংখ্যা নম্বর) পায় এবং তারপরে এন স্তরের ক্যান্টর সেট প্রিন্ট করে (কনসোল বা অনুরূপ উপায়ে)। মুদ্রণটিতে কেবল আন্ডারস্কোর ( _) এবং সাদা স্থানের অক্ষর থাকতে পারে । প্যারামিটারটি ইতিবাচক বা নেতিবাচক হতে পারে এবং এই চিহ্নটি ক্যান্টর সেট নির্মাণের দিকনির্দেশকে নির্দেশ করে: যদি N > 0ক্যান্টর সেটটি নীচের দিকে নির্মিত হয় এবং যদি N < 0ক্যান্টর সেটটি উপরের দিকে নির্মিত হয়। তাহলে N = 0প্রোগ্রামটি একটি একক লাইন ( _) প্রিন্ট করে ।

উদাহরণ স্বরূপ:

এন = 2

_________
___   ___
_ _   _ _

এন = -2

_ _   _ _
___   ___
_________

এন = 3

___________________________
_________         _________
___   ___         ___   ___
_ _   _ _         _ _   _ _

এন = -3

_ _   _ _         _ _   _ _
___   ___         ___   ___
_________         _________
___________________________

জয়ের মানদণ্ড

এটি একটি কোড গল্ফ চ্যালেঞ্জ হিসাবে, সংক্ষিপ্ততম কোডটি জয়ী।

সম্পাদিত: উগোরেনের পরামর্শে 0 ইনপুটটি সংশোধন করুন।


এন = 0 থাকা অবস্থায় কেন কিছুই মুদ্রণ করবেন না? এটি 0 কে একটি বিশেষ কেস তৈরি করে এবং পুনরাবৃত্তি ব্যবহার করা আরও শক্ত করে তোলে। সাধারণ হ্যান্ডলিংটি একটি একক মুদ্রণ করতে হবে _(তবে এটি -0 পাওয়ার সময় নীচে প্রিন্ট করা হবে)।
ugoren

ঠিক। আমি ইতিমধ্যে চশমা পরিবর্তন করেছি।
অ্যাভারোয়েস

উত্তর:


10

গল্ফস্ক্রিপ্ট, 49 42 40 অক্ষর

~.abs.3\?'_'*\{.3%..,' '*\++}*](0>2*(%n*

42- > 40 এর জন্য হামার ধন্যবাদ ।

আরও সংখ্যা-তাত্ত্বিক পদ্ধতির কাছে এখনও আমার সেরা প্রচেষ্টা দুঃখজনকভাবে অনেক দীর্ঘ:

~.abs:^3\?,{3^)?+3base(;1+1?.'_'*^@-)' '*+}%zip\0>2*(%n*

অথবা

~.abs 3\?:^,{6^*+3base.1+1?.('_'*@,@-' '*+}%zip\0>2*(%n*

এবং আমি সন্দেহ করি যে এর দৈর্ঘ্য baseএবং zipএটি ধরা সহজতর করে তুলবে।


~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*39 টি অক্ষর, তবে ইনপুটটিতে ক্র্যাশ 0। :-(
ইলমারি করোনেন

@IlmariKaronen, হ্যাঁ, শূন্য দ্বারা বিভাগ সি বাস্তবায়ন আমিও লিখেছিলেন একটি ব্যথা, ছিল কারণ এটা বোঝানো আপনি ব্যবহার করতে পারবেন না n/abs(n)পেতে signum(n)
পিটার টেলর

6

পাইথন, 116 113 104 103 অক্ষর

n=input()
d=n>0 or-1
for i in range(n*d+1)[::d]:
 s='_'*3**i
 while i<n*d:s+=len(s)*' '+s;i+=1
 print s

পুরানো অ্যালগরিদম 113 টি অক্ষরে শীর্ষে রয়েছে

r=input()
u='_'
l=[u]
for _ in abs(r)*u:o=len(l[0]);l=[s+o*' '+s for s in l]+[u*o*3]
print'\n'.join(l[::r>0 or-1])

5

রুবি (97)

স্টিভেন রাম্বালস্কির অজগর সংস্করণের উপর ভিত্তি করে:

n,r=$*[0].to_i,[?_]
n.abs.times{z=r[0].size;r=r.map{|s|s+' '*z+s}+[?_*z*3]}
puts n<0?r:r.reverse

পূর্ববর্তী প্রচেষ্টা, উভয় একই দৈর্ঘ্য (112)

অংশগুলি থেকে লাইন তৈরি করুন:

c=->x,n{n<1??_*x :(z=c[s=x/3,n-1])+' '*s+z}
r=(0..m=(n=$*[0].to_i).abs).map{|i|c[3**m,i]}
puts n<0?r.reverse: r

একটি লাইন দিয়ে শুরু করুন, এতে গর্ত করুন:

r=[?_*3**a=(n=$*[0].to_i).abs]
a.times{|c|r<<r[-1].gsub((x=?_*o=3**(a-c-1))*3,x+' '*o+x)}
puts n<0?r.reverse: r

3

পার্ল, 93 অক্ষর

@x=($t=$x=_ x 3**($a=abs($n=<>)),map$x.=$"x($x=~s/(.)../$1/g).$x,1..$a);say for$n<0?sort@x:@x

আমি ভেবেছিলাম পিটার টেলারের গল্ফস্ক্রিপ্ট সমাধান পার্লের কাছে কতটা ভালভাবে বন্দরিত হবে তা দেখার চেষ্টা করব । উল্লেখযোগ্য বৈশিষ্ট্যগুলির মধ্যে তিনটি অক্ষর সংরক্ষণের sortপরিবর্তে এর ব্যবহার অন্তর্ভুক্ত রয়েছে, reverseএটি একটি স্পেসের আগে সাজানোর বিষয়টি ব্যবহার করে _


2

সাধারণ লিস্প, 217 210 টি অক্ষর

(defun m(x)(flet((c(n v)(if(= n 0)`((,v))(cons(substitute v nil(make-list(expt 3 n)))(mapcar #'append(c(1- n)v)(c(1- n)" ")(c(1- n)v))))))(format t "~{~{~a~}~%~}"(let((r(c(abs x)'_)))(if(< x 1)(reverse r)r)))))

সম্প্রসারিত:

(defun m(x)
  (flet((c(n v)
    (if(= n 0)
       `((,v))
       (cons(substitute v nil(make-list(expt 3 n)))
            (mapcar #'append
                    (c(1- n)v)
                    (c(1- n)" ")
                    (c(1- n)v))))))
   (format t "~{~{~a~}~%~}"(let((r(c(abs x)'_)))(if(< x 1)(reverse r)r)))))

আমি বুঝতে পারছি যে লিস্প কোডটি অন্য ভাষার জন্য কোনও প্রাথমিক গণনাটি পরিচালনা করতে সক্ষম হয় (সি, 219) আমি ঠিক করছি :)


2

সি ( 163 161 অক্ষর)

i,l,N;f(n,m,s){if(n){s=--n<l?m:s;f(n,m,s);f(n,s,s);f(n,m,s);}else
putchar(m);}main(n,v)int**v;{for(i=N=abs(n=atoi(1[v]));i+1;i--)l=n<N?N-i:i,f(N,95,32),f(0,10);}

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


2

সি, 219 193 179 143 136 131 টি অক্ষর

পেটিয়ার টেলরের অন্য একটি ধারণাকে অনুসরণ করে আমার নিজের উন্নতি করে আরও 6 টি সংরক্ষণ করা হয়েছে।
@ পিটারটেলর থেকে কিছু টিপস ইন্টিগ্রেটেড, এবং তার মূল ফাংশনটি অনুলিপি করে কিছুটা পরিবর্তন করে, যা একটি চরিত্রকে বাঁচায় (এটি অনুলিপি করা কি যথাযথ? যেহেতু আমরা উভয়ই এটি জিততে পারি না, আমি অনুমান করি এটি খুব খারাপ নয়)।
আমার পুনরাবৃত্তি কীভাবে কাজ করে তাতে আমি একটি উল্লেখযোগ্য উন্নতির কথা ভেবেছিলাম এবং পিটার টেলরের উত্তর দেখে আমি নেতৃত্ব ফিরে পেতে এটিকে প্রয়োগ করেছি implemented তার উত্তরটি আবার পড়ার সময় আমি দেখতে পেলাম যে তিনি যা করেছিলেন ঠিক তেমনই আমি করেছি। সুতরাং এটি হাইব্রিডাইজেশনের পরামর্শ মতো বলে মনে হচ্ছে। একই দৈর্ঘ্য রেখে
লুপটি সরল করে main
এবং পিটারের কৌশলটি পরিবর্তে নিউলাইন মুদ্রণ করার জন্য puts("")- একটি চরিত্র সংরক্ষণ করে।

intপরিবর্তনীয় ঘোষণা থেকে সরানো - একটি সতর্কতা, তবে 4 টি অক্ষর সংরক্ষণ করে।
নতুন অ্যালগরিদম 3 ^ x অগ্রিম গণনা করে না, তবে 3 ^ x অক্ষর মুদ্রণের জন্য একটি একক লুপ ব্যবহার করে।
সংজ্ঞা দিয়ে আরও একটি বাঁচাতে পারে int*vতবে 64 বিট কাজ করবে না।
অক্ষর গণনা শ্বেত স্পেস বাদ দেয় (যা সরানো যেতে পারে)।

o,i,n;
p(c) {
    n-- ?
        p(c),p(o>n?c:32),p(c)
    :
        putchar(c);
    n++;
}
main(c,v)int**v; {
    for(n=abs(c=atoi(v[1]));i<=n;i++)o=c+n?n-i:i,p(95),puts("");
}

পুরানো অ্যালগরিদম, 219 টি অক্ষর:

p(l,o,i,m,c,j) {
    for(;i<(m=l);i++)
        for(j=0,c=95;m/o||!putchar(c);j++)
            i/m%3-1||(c=32),m/=3;
    puts("");
}
main(c,v,n,i,l,o)int**v;{
    (n=atoi(v[1]))<0?n=-n:(c=0);
    for(i=n,l=1;i;i--)l*=3;
    o=c?1:l;
    for (;i<=n;i++)p(l,o,0),c?o*=3:(o/=3);
}

@ পিটারটেলর, আমি iপ্যারামিটারটি সরাতে পারছি না , কারণ গ্লোবাল ব্যবহারে হস্তক্ষেপ হবে mainl--হস্তক্ষেপ করবে o>=l, এবং আমাকে এটির সাথে প্রতিস্থাপন করতে হবে >(সুতরাং আমি কেন এটি লিখি কারণ এটি একটি খারাপ জিনিস?) আমি আপনাকেও অনুলিপি করতে পারি main, যা আমার চেয়ে সহজ এবং খাটো।
ugoren

@ পিটারটেলর, আপনি ঠিকই বলেছেন i- আমি সত্যটি মিস করেছি যে আমি আসলেই এটি ব্যবহার করি না (আমি ভেবেছিলাম আপনি বোঝাতে চেয়েছিলেন যে আমি এটি পাস করি না)।
ugoren

যাইহোক, আপনি আমার প্রধান কাজটি গ্রহণ করতে আমার আপত্তি নেই। আমার আঙ্গুলের নিয়মটি হল যে কোনও একক চরিত্র পরিবর্তন করার জন্য অন্য কারও সমাধানের অনুলিপি করা অত্যধিক আক্রমণাত্মক, এর অর্ধেকটি আবার লেখার জন্য অন্য কারও সমাধানটি অনুলিপি করা পুরোপুরি ন্যায্য, এবং এর মাঝে কোথাও একটি ধূসর অঞ্চল রয়েছে। আমাদের সম্ভবত মেটাতে কিছু সম্প্রদায়ের মানগুলি সম্মত করার চেষ্টা করা উচিত।
পিটার টেলর

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

বিটিডাব্লু আপনি কীভাবে আপনার চরিত্রগুলি গণনা করছেন? কারণ আমি না 136. আপনার সর্বশেষ সংস্করণ 138 অক্ষর করা
পিটার টেলর

2

জে, 44 39 38 37 বাইট

' _'{~0&>_&(]|.)(,:1)1&(,],.0&*,.])~|

_প্রাথমিকভাবে 1 (উপস্থাপক ) দিয়ে শুরু করে পরবর্তী সেটটি তৈরি করতে পুনরাবৃত্তি ব্যবহার করে ।

ব্যবহার

   f =: ' _'{~0&>_&(]|.)(,:1)1&(,],.0&*,.])~|
   f 0
_
   f 1
___
_ _
   f _1
_ _
___
   f 2
_________
___   ___
_ _   _ _
   f _2
_ _   _ _
___   ___
_________
   f 3
___________________________
_________         _________
___   ___         ___   ___
_ _   _ _         _ _   _ _
   f _3
_ _   _ _         _ _   _ _
___   ___         ___   ___
_________         _________
___________________________

ব্যাখ্যা

' _'{~0&>_&(]|.)(,:1)1&(,],.0&*,.])~|  Input: integer n
                                    |  Absolute value of n
                (,:1)                  The array [1]
                     1&(          )~   Repeat abs(n) times starting with x = [1]
                                 ]       Identity function, gets x
                            0&*          Multiply x by 0
                               ,.        Join the rows together
                         ]               Identity function, gets x
                          ,.             Join the rows together
                     1  ,                Prepend a row of 1's and return
      0&>                              Test if n is negative, 1 if true else 0
         _&(   )                       If n is negative
             |.                          Reverse the previous result
            ]                            Return that
                                       Else pass the previous result unmodified
' _'                                   The string ' _'
    {~                                 Select from the string using the result
                                       as indices and return

নিস! আমি ব্যক্তিগতভাবে চেষ্টা করিনি, তবে আমি এজেন্ডাটি ব্যবহার করতে পছন্দ @.করি - এটির সাথে মিলিত $:, এখানে কিছুটা ব্যবহার হতে পারে? যেমন কিছু (zero case)`(positive case)`(negative case)@.*, এমনকি হতে পারে ":@_:`(positive case)`(|."1@$:)@.*
কনর ও'ব্রায়েন

আমি পুনরাবৃত্ত সমাধান সমাধান করতে চেষ্টা করি নি, তবে আমি এটি চেষ্টা করতে পারি।
মাইলস

2

আর , 141 139 137 বাইট

m=abs(n<-scan());write("if"(n<m,rev,c)(c(" ","_")[Reduce(`%x%`,rep(list(matrix(c(1,1,1,1,0,1),3)),m),t(1))[,1+2^m-2^(m:0)]+1]),1,3^m,,"")

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

-15 বাইটস ধন্যবাদ জিউসেপের '('পরিচয় ফাংশন হিসাবে ব্যবহারের জন্য ; writeপরিবর্তে catআউটপুট মুদ্রণ; চতুর ব্যবহার %x%

-2 বাইটস ক্যারিল এলকে পরিচয় ফাংশন হিসাবে ব্যবহার cনা করে ধন্যবাদ জানায় '('


কোনও ক্রোনেকার পণ্য এখানে কাজ করতে পারে? %x%? বিকল্প সারি নিয়ে কিছু সমস্যা হতে পারে ...
জিউস্পে

@ জিউস্পেপ আমি চেষ্টা করেছি, আপনার "ছোট" এইচ "এস" উত্তর থেকে একটি "এইচ" তৈরি করুন ... আমি এটিকে আবার চেষ্টা করব।
জয়সি

আহ, সুতরাং আপনিই সেটিকে উজ্জীবিত করেছিলেন। আমি kronখুব ভেবেছিলাম এই কারণ ! আমি ধারণা করতে পারি যে যদি আমরা সঠিক পদ্ধতির সন্ধান করতে পারি তবে এটি 125 বাইট পছন্দ করতে সক্ষম হবে।
জিউসেপে

আপনি `(`পরিচয় ফাংশন হিসাবে ব্যবহার করতে পারেন যাতে আপনি writeসরাসরি পরিবর্তে catএবং একটি forলুপ ব্যবহার করতে পারেন । 141 বাইট
জিউসেপে

@ জিউজেপ্পে আমার ধারণা ছিল না যে (এইভাবে ব্যবহার করা যেতে পারে, বা এটি if দুটি ফাংশন থেকে নির্বাচন করতে ব্যবহৃত হতে পারে। এবং আমি লেখার ব্যবহার শুরু করব ... "\ n" এর অনেকগুলি সঞ্চয় করে।
জেসি

1

পাইথন, 177 অক্ষর

N=input()
n=abs(N)
c=lambda x:0if x<1 else x%3==1or c(x/3)
r=["".join([["_"," "][c(x/3**i)]for x in range(3**n)])for i in range(n+1)]
print"\n".join(r[::N>0 or-1])

যেহেতু আপনি পাইথন 2 ব্যবহার করছেন আপনার ফলাফল inputহিসাবে ফলাফলের দরকার নেই int। আপনার শেষ দুটি লাইন সংক্ষিপ্ত করা যেতে পারেprint"\n".join(r[::N>0 or-1])
স্টিভেন রাম্বালস্কি

@ স্টিভেন আমি পরিবর্তন করেছি। ধন্যবাদ.
এন্টে

1

পার্ল, ১১৩ টি চর

$i=abs($I=<>);@w=$_='_'x3**$i;while($i--){$x=3**$i;s/(__){$x}/'_'x$x.' 'x$x/eg;push@w,$_}say for$I>0?reverse@w:@w

সম্প্রসারিত:

$i=abs($I=<>);
@w=$_='_'x3**$i;
while($i--){
    $x=3**$i;
    s/(__){$x}/'_'x$x.' 'x$x/eg;
    push@w,$_
}
say for$I>0?reverse@w:@w

1

জাভাস্ক্রিপ্ট 121 বাইট

ইনার রিকার্সিভ ফাংশন, তারপরে প্রয়োজনে পশ্চাদপটে আউটপুটটির যত্ন নিন

n=>(f=(n,t=n&&f(n-1),r=t[0])=>n?[r+r+r,...t.map(x=>x+t[n]+x)]:['_',' '],f=f(n<0?-n:n),f.pop(),n<0?f.reverse():f).join`\n`

কম গল্ফড

n=>{
  var f = n => { // recursive function
    var t = n && f(n-1), r = t[0]
    return n 
      ? [r+r+r, ...t.map(x => x+t[n]+x)]
      : ['_',' ']
  };
  f = f(n < 0 ? -n : n);
  f.pop(); // last row is all blanks
  if (n<0) f.reverse();
  return f.join`\n`
}

পরীক্ষা

var F=
n=>(f=(n,t=n&&f(n-1),r=t[0])=>n?[r+r+r,...t.map(x=>x+t[n]+x)]:['_',' '],f=f(n<0?-n:n),f.pop(),n<0?f.reverse():f).join`\n`

function go()
{
  var n=+I.value
  O.textContent = F(n)
}

go()
<input id=I type=number value=3 oninput='go()'>
<pre id=O></pre>


1

ব্যাচ, 265 262 242 236 235 বাইট

@echo off
set/pn=
set c=%n%,-1,0
if %n% lss 0 set c=0,1,%n:-=%
for /l %%i in (%c%)do call:l %%i
exit/b
:l
set s=_
for /l %%j in (1,1,%n:-=%)do call:m %1 %%j
echo %s%
:m
set t=%s%
if %1 lss +%2 set t=%s:_= %
set s=%s%%t%%s%

সম্পাদনা করুন: @ l4m2 ধন্যবাদ 12 19 বাইট সংরক্ষণ করা। অপ্রয়োজনীয় %a%ভেরিয়েবলটি সরিয়ে 8 বাইট সংরক্ষণ করা হয়েছে ।


এটি 247 বাইটের জন্য।
কনডর ও'ব্রায়েন

@ কনরোও ব্রায়েন মনে হ'ল 261 হবে যদি আমি সমস্ত সিআর পাশাপাশি এলএফও গণনা করি (যা আমি নিশ্চিত যে আপনাকে করার দরকার নেই তবে আমি সে মতো অলস)।
নীল

তাহলে আপনি নিজের কোড থেকে সিআর সরিয়ে দিচ্ছেন না? যদিও এটি .BAT ফাইলগুলি দ্বারা প্রয়োজনীয় নয় এবং কোনওভাবে এসই দ্বারা ছড়িয়ে দেওয়া হয়েছে? : পি
কনর ও'ব্রায়েন

@ কনোরো ব্রায়েন এটি ব্যাচের ফাইলগুলি লেখার জন্য নোটপ্যাড ব্যবহার করতে পেনাল্টি।
নীল

আপনি কি কিছু করতে পারেন set c=%n%,-1,0 [LF] if %n% lss 0 set c=0,1,%a% [LF] for /l %%i in (%c%)do call:l %%i?
l4m2




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