অ্যাসিরিস্টস ভাইরাল


9

একটি ধনাত্মক পূর্ণসংখ্যা N ("ভাইরালতা") দেওয়া, আপনার প্রোগ্রামের দৈর্ঘ্যের N এর দুটি শাখাযুক্ত একটি গাছের একটি ASCII- শিল্প অঙ্কন তৈরি করা উচিত নীচের দিকে এবং / অথবা উপরের-বাম কোণ থেকে প্রসারিত ।

প্রথম নক্ষত্রের পরে প্রতিটি শাখার দিকনির্দেশটি ডানদিক বা নীচের দিকে হতে পারে এবং এই পছন্দটি প্রতিটি পরবর্তী পদক্ষেপে এলোমেলোভাবে 1 করা উচিত ।

উদাহরণস্বরূপ, 5 এর একটি ইনপুট দেওয়া, আউটপুটটি দেখতে দেখতে পারে:

***
* ***
**
 **

দুটি শাখা স্পর্শ করার অনুমতি দেওয়া হয়েছে (সংলগ্ন কোষে থাকা), তবে ওভারল্যাপ নয় (একই কোষে থাকুন), সুতরাং নিম্নলিখিতগুলির অনুমতি দেওয়া হবে না:

***
* *
*****
  *
  *

উদাহরণ

ইনপুট জন্য 1, একমাত্র সম্ভাব্য আউটপুট:

**
*

(এটি সমস্ত বৈধ আউটপুটগুলিতে উপস্থিত থাকবে, যেহেতু দুটি শাখাকে একই পথে নিয়ে যাওয়া তাদের ওভারল্যাপে ডেকে আনবে))

এর একটি ইনপুট জন্য সম্ভাব্য আউটপুট 3অন্তর্ভুক্ত:

***
* *
**
**
***
*
*

ইনপুট জন্য 7:

****
*  **
*   **
*
***
  *

ইনপুট জন্য 10:

****
*  *      
*********
  *
  *****

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

১. এটি অভিন্নভাবে এলোমেলোভাবে হওয়া উচিত (অর্থাত্ প্রতিটি দিকের একটি 50/50 সম্ভাবনা), বা আপনি সাধারণ হার্ডওয়্যারটিতে যতটা পেতে পারেন সমানভাবে এলোমেলোভাবে কাছাকাছি হওয়া উচিত।


আমার দীর্ঘ পোস্টটি গ্রাস করতে আপনার যদি কোনও সমস্যা হয় তবে মন্তব্য করুন - সম্ভবত আমি কিছু ছোট করতে পারি (আমি চেষ্টা করব) then
নিকেল 20

3
শুধু এটি আশা করতে শিখুন। কখনও কখনও এটি সমস্ত heck হিসাবে ব্যস্ত। অন্য সময়ের মতো এখন শান্ত আছে। ভুলে যাবেন না, এটি ইস্টারও।
জাকারি

আমার পোস্টে কী ভুল হয়েছে তা আমি সত্যিই নিশ্চিত নই। যিনি হ্রাস করেছিলেন তিনি কি দয়া করে ব্যাখ্যা করার জন্য দয়াবান হবেন?
নিকেল 22

1
আইএমও এন সময় হিসাবে আরও ভালভাবে বর্ণনা করা হয়: পি
এএসসিআইআই-

1
আমরা কি স্পেস এবং অ্যাসিটার্কসের পরিবর্তে 0s এবং 1s এর একটি ম্যাট্রিক্স ফিরিয়ে দিতে পারি ?
dylnan

উত্তর:


5

সিজেম , 58 51 বাইট

[TT]{_2_m*\f.+{:-},mR}ri*]ee{~\)S*\{'*t}/}%::a:.+N*

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

মূল ধারণাটি হ'ল আমরা শুরু করে [0 0]এবং তারপরে বারবার প্রতিটি উপাদানকে 0 বা 1 যুক্ত করে (তা নিশ্চিত করে তোলা যে ওভারল্যাপ এড়ানোর জন্য এগুলি কখনই সমান নয়) সমস্ত মধ্যবর্তী ফলাফল সংগ্রহ করে।

[[0 0] [0 1] [0 2] [0 2] [1 3]]

তারপরে আমরা অ্যারেগুলির একটি বৃহত অ্যারে তৈরি করি যেখানে প্রতিটি সুবরেই *মূল অ্যারে এবং অন্য কোথাও ফাঁকা জায়গাগুলিতে সংশ্লিষ্ট জুটির দেওয়া সূচকগুলিতে থাকে ।

["*"
 "**"
 "* *"
 "* * "
 " * * "]

এটি আউটপুট ম্যাট্রিক্সের তির্যক স্লাইসগুলি সরবরাহ করে (যেখানে বাম থেকে ডানদিকে সরানো প্রকৃত ম্যাট্রিক্সের উপরের-ডান থেকে নীচে-বামে সরে যাওয়ার সাথে মিলে যায়)।

তারপরে আমরা ::a:.+"ডি-ডায়াগোনালাইজ" করতে এবং ফলস্বরূপ লাইনগুলি পেতে পারি:

[ "**** "
  "*  *"
  "** "
  " *"
  ""     ]

3

কাঠকয়লা , 31 24 বাইট

F²«J⁰¦⁰F⊕θ«¿ι*↓*≔‽²ι¿KK↗

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। মূলত আমি ভেবেছিলাম প্রথম ধাপটি এলোমেলো করা সহজ হবে তবে এটি প্রথম শাখাটিকে পূর্বাভাসযোগ্য করে তুলতে গল্ফায়ার হিসাবে পরিণত হয়েছিল। ব্যাখ্যা:

F²«

সূচক ভেরিয়েবল ব্যবহার করে দু'বার লুপ করুন i। (এটি আসলে অন্তর্নিহিত তালিকার উপরে পুনরাবৃত্তি করে, তাই iলুপের অভ্যন্তরে পরিবর্তন করা নিরাপদ safe )

J⁰¦⁰

ক্যানভাসের উত্সে ঝাঁপ দাও।

F⊕θ«

লুপ N+1বার।

¿ι*↓*

একটি মুদ্রণ করুন *, তবে কার্সারটির মান অনুসারে ডানদিকে বা কার্সারের নীচে রেখে দিন i

‽²ι

iঅভ্যন্তরীণ লুপের পরবর্তী পুনরাবৃত্তির জন্য মানটি এলোমেলো করুন ।

¿KK↗

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


এটি প্রায় সঠিক, তবে এটি Nআকারের শাখাগুলি প্রিন্ট করে না , তবে N-1আকারযুক্ত করে
তোলে

@nicael দুঃখিত, স্থির
নীল

আপনি সম্ভবত এটি ইতিমধ্যে অনেক বার দেখেছেন, কিন্তু: 23 বাইট
এএসসিআইআই-

3

জাভা 10, 273 272 268 239 বাইট

n->{var c=new char[++n][n];for(var d:c)java.util.Arrays.fill(d,' ');for(int i=0,j=0,k=0,l=0,r=0,s=0,t=0,u=0;n-->0;){c[i+=r][j+=s]=c[k+=t][l+=u]=42;do{r=t=2;r*=Math.random();t*=Math.random();s=r^1;u=t^1;}while(i+r==k+t&j+s==l+u);}return c;}

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

29 বাইট গল্ফ করার জন্য কেভিন ক্রুইজসেনকে ধন্যবাদ ।

অবরুদ্ধ সংস্করণ:

n -> { // lambda taking an int as argument
    var c = new char[++n][n]; // the output; increment the virality since the root does not count
    for(var d : c) // for every line
        java.util.Arrays.fill(d,' '); // initialize it with spaces
    for(int i = 0, j = 0, // coordinates of the first branch
            k = 0, l = 0, // coordinates of the second branch
            r = 0, s = 0, // offsets for the first branch, one will be 0 and the other 1 always except for the first '*' where the two branches overlap
            t = 0, u = 0; // offsets for the second branch, one will be 0 and the other 1 always except for the first '*' where the two branches overlap
        n-- > 0; ) { // decrement virality and repeat as many times
        c[i+=r][j+=s] = c[k+=t][l+=u] = 42; // move according to offsets and place an '*' for each branch, 42 is ASCII code
        do { // randomly pick offsets for both branches
            r = t = 2; // Math.random() provides results in [0,1)
            r *= Math.random(); // flip a coin for the first branch
            t *= Math.random(); // flip another coin for the second
            s = r^1; // set s to 0 if r=1, to 1 if r=0
            u = t^1; // set u to 0 if t=1, to 1 if t=0
        } while(i+r==k+t&j+s==l+u); // repeat if the branches overlap
    }
    return c; // return the output
}

239 বাইট (আমি শুধুমাত্র কিছু ভিতরে পরিবর্তন করেছি do{}। একটি বিট (ints এর জন্য-লুপ) থানা প্রথম অংশ এবং স্থাপন: আপনার প্রারম্ভিক উত্তরে 0.5করার golfed করা হয়ে থাকতে পারে .5পাশাপাশি।
কেভিন Cruijssen

কেভিন ক্রুজসেন দেখে মনে হচ্ছে আমার গাণিতিক বিষয়ে কাজ করা দরকার। ধন্যবাদ :-)
ওওবালেন্স

3

পার্ল 5 , 208 124 122 118 বাইট

নিউলাইন, ইনডেন্টেশন এবং মন্তব্য ছাড়াই 118 বাইট। স্টিডিন থেকে এন নেয় :

@b=1..2;                            #number of branches is 2
for(1..<>){                         #add length <> (the input) to each branch
  ($x,$y)=@$_                       #get where current branch has its tip now
 ,.5>rand?$x++:$y++                 #increase either x or y
 ,$o[$y][$x]++&&redo                #try again if that place is already occupied
 ,$_=[$x,$y]                        #register new tip of current branch
   for@b                            #...and do all that for each branch 
}
say map$_||!$i++?'*':$",@$_ for@o;  #output the branches

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


চমৎকার, তবে এটি শাখাগুলি তাদের চেয়ে কম 1 টি ছোট ছোট প্রিন্ট করে :)
নিকেল

দয়া করে আমার প্রশ্নগুলির উদাহরণগুলি আবার দেখুন :)
নিকেল

ওহ, আমি পরিবর্তন করেছি 2..$Nকরতে 1..shiftএখন এবং কয়েক বাইট বন্ধ চাঁচা।
কেজেটিল এস

1
ভাল উত্তর! প্যারেন্সগুলি এড়াতে আপনি কল করার <>পরিবর্তে shiftআর আর্গুমেন্টের পরিবর্তে কয়েকটি বাইট ব্যবহার এবং ইনপুট সংরক্ষণ করতে পারেন rand। আপনার নিজের অ্যাসাইনমেন্টটি কোনওটি মোড়ানোর দরকার নেই @o। আমি ব্যবহার করার চেষ্টা করেছি@b=([],[]);যা দেখা যাচ্ছে তা , তবে আমি খুব বেশি পরীক্ষা করিনি তাই আমি সেখানে কোনও প্রান্তের ঘটনাটি মিস করেছি। আশা করি তারা কিছুটা সাহায্য করবে!
ডম হেস্টিংস

1
পার্ল পৃষ্ঠা থেকে golfing জন্য টিপস কিছু ভাল পরামর্শ আছে, এটি চেক আউট নিশ্চিত করা! গুড লাক এবং মজা আছে!
ডম হেস্টিংস



1

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

for($r="*",$w=$argn+2;$argn--;$r[$q+=rand(0,$r[$q+1]<"*")?:$w]=$r)$r[$p+=rand(!$i++,1)?:$w]=$r;echo wordwrap($r,$w-1);

এলভিস অপারেটরের জন্য পিএইচপি 5.4 বা তার পরে প্রয়োজন। ?:সঙ্গে প্রতিস্থাপন?1: পুরোনো পিএইচপি জন্য।

পাইপ হিসাবে চালান -nRবা এটি অনলাইনে চেষ্টা করুন


1
আমি কীভাবে সেখানে বিভিন্ন ইনপুট দিয়ে পরীক্ষা করব?
নিকেল

@ নিকেল: আপনি লাইনে যুক্তিটি পরিবর্তন করতে পারেন$argBak=$argn=
গ্যালেন ইভানভ

ঠিক আছে! এই
উপায়টি

@ এনিকায়েল টিওতে, কেবলমাত্র এর জন্য মানটি প্রতিস্থাপন করুন $argn। বাস্তব পরিবেশে, $argnএসটিডিএন থেকে আসে যদি আপনি এটির সাথে পাইপ হিসাবে চালনা করেন -R। এরপরে এটি প্রতিটি লাইন ইনপুটটির কোড নির্বাহ করবে (তবে আমি বেশ নির্দিষ্ট পিএইচপি ভেরিয়েবলকে অভ্যন্তরে আনসেট করতে পারি না; সুতরাং সুস্পষ্ট ক্রমাগত রানগুলি খারাপ বিস্ময় এড়ানোর সম্ভাবনা বেশি বেশি।)
টাইটাস

0

লাল , 195 190 বাইট

func[n][g: func[s][i: 0 d: s while[i < n][b/(d): #"*"until[r: 1 if 1 = random 2[r: n + 1]b/(d + r) =#" "]d: d + r
i: i + 1]]b:""loop n[loop n[append b" "]append b"^/"]b/1: #"*"g n + 2 g 2 b]

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

রিডেবল:

f: func[n][
    g: func[s][
        i: 0
        d: s
        while[i < n][
            b/(d): #"*"
            until[
                r: 1 if 1 = random 2[r: n + 1]
                b/(d + r) = #" "
            ]
            d: d + r
            i: i + 1
        ]
    ]
    b: ""
    loop n[loop n[append b " "]append b "^/"]
    b/1: #"*"
    g n + 2
    g 2
    b
]

0

জেলি , 50 43 41 বাইট

2ḶẊ⁸С+\‘Ṗ
⁸ÇU;Ǥ⁻Q$¿
‘,þ`⁼€þÇS+»þ`Ị$ị⁾* 

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

এটি লিখতে সত্যিই মজাদার ছিল। আরও অনেক বেশি অনুকূল পদ্ধতি থাকতে পারে। এই পদ্ধতির মধ্যেও সম্ভবত কিছু গল্ফ করার দরকার আছে।

এটি পোস্ট করার ঠিক পরে আমি বুঝতে পারলাম এর ,þ`পরিবর্তে আমি ব্যবহার করতে পারি aþ,""oþ`Ɗ


0

আর , 148 142 বাইট

n=scan();`~`=sample;o=r=k=1;l=c(1,n);for(i in 1:n){r=r+l~1;t=l~1;k=k+"if"(k+t-r,t,l[l!=t]);o=c(o,r,k)};write(c(" ","*")[1:n^2%in%o+1],1,n,,"")

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

অতিরিক্তভাবে, যদিও এটি আউটপুট স্পেকটি পূরণ করবে না, আপনি দুটি শাখা আলাদা করতে পারবেন: এটি অনলাইনে চেষ্টা করুন!

ব্যাখ্যা:

সূচী থেকে শুরু করে 1, আমরা যথাযথভাবে rযোগ করে nবা 1যথাক্রমে শাখার জন্য ডান বা বাম পদক্ষেপটি এলোমেলোভাবে নির্বাচন করি । তারপরে আমরা শাখার জন্য অন্য ডান বা বাম পদক্ষেপটি নির্বাচন করি kএবং এটি যেখানে ছেদ করে সেখানে rচলেছে, আমরা অন্য দিকটি নির্বাচন করি। তারপর আমরা ব্যবহার rএবং kমধ্যে সূচকের হিসাবে m, যেমন যারা মান নির্ধারণের "*"। Iterating n-1বার আমরা কি তবে ফলাফলের মুদ্রণ করুন।



0

পাইথন 2 , 191 187 176 বাইট

from random import*
n=input()
p,q=c=1,1j;s={p,q,0}
exec'z=choice(c);q,p=p+[z,1+1j-z][p+z in s],q;s|={q};'*2*~-n
R=range(n+1)
for y in R:print''.join(' *'[y+x*1jin s]for x in R)

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

ফর্মটির জটিল সংখ্যার জন্য পাইথনের স্থানীয় সমর্থন রয়েছে a+bj; এটি কিছু 2-D সমস্যাটিকে কিছুটা ট্র্যাকটেবল করে তোলে ...

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