pssssssssssssst


31

ভূমিকা

এটি একটি বেশ সোজা। আমরা আস্কিতে সাপ আঁকব। এটি সেই পুরানো সাপের গেম দ্বারা অনুপ্রাণিত হয়েছিল যেখানে আপনাকে ফল সংগ্রহ করতে হবে এবং আপনি ক্রমাগত বৃদ্ধি পেতে পারেন।

সংজ্ঞা

একটি ধনাত্মক পূর্ণসংখ্যার এন দেওয়া হয়েছে যা সাপের দৈর্ঘ্যের প্রতিনিধিত্ব করে, একটি সাপ টানুন যাতে এটির দেহের এন প্লাস একটি মাথা এবং একটি লেজ থাকে।

আর্জেন্টিনা:

  • প্রধান: <, >, ^, v
  • লেঙ্গুড়: @
  • উল্লম্ব: |
  • horizonal: -

সমস্ত কোণ এক \বা /যথাক্রমে সন্তুষ্ট হওয়া উচিত । মাথা কোনও কোণে শেষ না হওয়া <, >, ^, vঅবধি যদি সাপটি কুঁকড়ে যায় তার দিকে মাথা অগ্রাধিকার নেয়। দৈর্ঘ্য 1 উদাহরণস্বরূপ, এটি ঘড়ির কাঁটার বিপরীতে পরিণত হয় এবং তাই মাথাটি সেদিকে ফেলা হয়। ঘড়ির কাঁটার সমাধানের জন্য এটি ডানদিকে থাকবে >

সাপটি অবশ্যই তার লেজ দিয়ে মাঝখানে শুরু করতে হবে তবে আপনি ঘড়ির কাঁটা বা ঘড়ির কাঁটার দিকের দিক থেকে বেছে বেছে যে কোনও দিকে যেতে পারে out এটি একটি বৃত্তাকার ফ্যাশনে বাইরের দিকে প্রসারিত হওয়ায় এটি নিজের চারপাশেও শক্তভাবে আবৃত থাকতে হবে।

উদাহরণ

/--\
|/\|
||@|
|\-/
\--->

যেখানে @লেজটি এবং শুরুর অবস্থান। লেজটি উপরের দিকে যেমন দেখা যায় মাঝখানে শুরু হয়, বাইরে থেকে ঘড়ির কাঁটার বিপরীতে বাম দিকে যায়।

এখানে দৈর্ঘ্যটি 19আরও একটি লেজ এবং একটি মাথা।

অন্য উদাহরণ হিসাবে, এখানে দৈর্ঘ্য 1:

<\
 @

জয়লাভ

এটি কোড-গল্ফ তাই টাই যেটি ব্রেক ব্রেক হিসাবে ব্যবহার করার জন্য সময় সহ ছোট্ট সংখ্যক বাইট জয়ের সাথে জমা দেওয়া উত্তর।

আনন্দ কর!


2
এটি খুব পরিষ্কার নয় যে আমাকে কেবল সরল সাপের মতো আঁকার অনুমতি নেই @---->। আপনি সম্ভবত সাপের আকৃতি সম্পর্কে আরও কঠোর শর্ত পোষণ করতে চান। আরও কতটা সাদা স্থান অনুমোদিত বা অনুমোদিত নয় তাও পরিষ্কার করুন
টন হসপেল

1
"সাপটি অবশ্যই তার লেজ দিয়ে মাঝখানে শুরু হতে পারে তবে এটি আপনি যে কোনও দিক থেকে এবং দিক থেকে ঘড়ির কাঁটার দিকে বা ঘড়ির কাঁটার বিপরীত দিকে বাইরে যেতে যেতে পারে"
জ্যাকসকনাক

1
সুতরাং আমি বলছি @মাঝখানের (এটি তৈরি করতে সম্ভাব্য কিছু স্থান যুক্ত করুন), "ডানদিকে" ঘোষণাকে দিক হতে হবে এবং ঠিক মাথা নীচু করে নিন এবং সেই ঘড়ির কাঁটার দিকে ঘোষণা করুন। আপনার শর্তাদি আপনার কাছে স্পষ্ট মনে হতে পারে তবে এগুলি আসলে দ্ব্যর্থক। আমি বুঝতে পেরেছি আপনি সম্ভবত একটি বাঁধা সাপ হিসাবে শক্ত হিসাবে বোঝাচ্ছেন তবে আপনার এটি পরিষ্কার করা উচিত
টন হসপেল

1
চিন্তা করবেন না। সেই চ্যালেঞ্জের অফসেটের কারণে এটি বেশ শক্ত।
মার্টিন এন্ডার

2
ভাল লাগলো প্রথম চ্যালেঞ্জ! সাইটে স্বাগতম!
লুইস মেন্ডো

উত্তর:


10

এমএটিএল , 85 83 বাইট

এবং আমি ভেবেছিলাম একটি spiralঅন্তর্নির্মিত সংক্ষিপ্ত কোড তৈরি করবে ...

Oli2+XH:UQXItH:+XJh(YsXKoQ3I(4J(5l(H:)0HX^XkU(6H(3M1YL3X!P)'|-\/@' '<v>^'KHq))h0hw)

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

ব্যাখ্যা

আসুন এন ইনপুট বোঝান। আমরা দৈর্ঘ্যের একটি ভেক্টর তৈরি করব ceil(sqrt(N+2))^2, এটি হ'ল ক্ষুদ্রতম নিখুঁত বর্গক্ষেত্র যা N + 2 এর সমান বা অতিক্রম করে । এই ভেক্টরটি সংখ্যাসূচক মানগুলিতে পূর্ণ হবে, একটি সর্পিলে রোলড হবে (এজন্যই এর দৈর্ঘ্যটি একটি নিখুঁত বর্গক্ষেত্র হওয়া দরকার) এবং তারপরে সংখ্যাসূচক মানগুলি অক্ষর দ্বারা প্রতিস্থাপিত হবে।

যাক এন প্রতিটি পদক্ষেপ সর্পিল কেন্দ্রে 1 থেকে শুরু বোঝান। চিহ্নগুলি এবং n 2 + n +1 (যা: 3, 7, 13, ...) জন্য সাপটি ঘুরিয়ে নেওয়ার পদক্ষেপগুলি এন 2 +1 (যা: 2, 5, 10 , ...) দিয়ে দেওয়া হয়েছে জন্য । একটি মধ্যবর্তী পদক্ষেপ এবং একটি হওয়া উচিত , এবং একটি মধ্যে যারা এবং হওয়া উচিত ।\/\/-/\|

ভেক্টরটি এমনভাবে তৈরি করা হয়েছে যাতে এটি 1টার্ন পয়েন্টগুলিতে (2,3,5,7,10,13 ...) এবং 0বাকি অংশে থাকে। ক্রমসংগমের সমষ্টিটি জানায় যে প্রতিটি এন্ট্রি এক -বা একটি হওয়া উচিত |। এই ফলাফলটিতে 1 যুক্ত করে আমরা একটি ভেক্টর পাই 1(যার জন্য |) বা 2(জন্য -)। তবে এটি টার্ন পয়েন্টগুলি নিজেরাই হয়ে যায় 1বা 2খুব বেশি। সুতরাং টার্ন পয়েন্টগুলি, যার অবস্থানগুলি আমরা জানি, ওভাররাইট করা হয়েছে: পজিশন এন 2 +1 পূরণ করা হয়েছে 3এবং n 2 + n +1 পজিশন পূরণ করা হয়েছে 4। লেজ এবং মাথা এছাড়াও বিশেষ ক্ষেত্রে: ভেক্টর (পুচ্ছ) প্রথম উপাদান সেট করা হয় 5, এবং সূচক এন সঙ্গে উপাদান+2 (মাথা) সেট করা আছে 6। অবশেষে, এন +2 ছাড়িয়ে সূচকযুক্ত উপাদানগুলিতে সেট করা আছে 0

উদাহরণস্বরূপ ইনপুট এন = 19 নিলে এখন আমাদের 25 এর দৈর্ঘ্যের ভেক্টর রয়েছে:

5 3 4 1 3 2 4 1 1 3 2 2 4 1 1 1 3 2 2 2 6 0 0 0 0

আমাদের এই ভেক্টরটিকে একটি সর্পিল হিসাবে রোল করা উচিত। এর জন্য আমরা একটি বিল্টিন ফাংশন ব্যবহার করি যা সর্পিল ম্যাট্রিক্স উত্পন্ন করে, তার পরে একটি প্রতিবিম্ব এবং উত্পাদনের স্থানান্তর হয়:

13 12 11 10 25
14  3  2  9 24
15  4  1  8 23
16  5  6  7 22
17 18 19 20 21 

ম্যাট্রিক্স দিয়ে ভেক্টরকে সূচক করে

4 2 2 3 0
1 4 3 1 0
1 1 5 1 0
1 3 2 4 0
3 2 2 2 6

যেখানে 0স্থান থেকে অনুরূপ, 1সাথে সঙ্গতিপূর্ণ |, 2করতে -, 3করতে \, 4করতে /, 5করতে @, এবং 6মাথা থেকে।

জানতে চারটি অক্ষরের ^, <, v, অথবা >মাথা থাকা উচিত, আমরা পালা পয়েন্ট ক্রমসঞ্চিত সমষ্টি যে আমরা পূর্বে নির্ণিত ব্যবহার করুন। বিশেষত, এই সংখ্যার যোগফলের দ্বিতীয়-শেষ মান (অর্থাত্ এন + 1-ম মান) মডিউল 4 আমাদের মাথার জন্য কোন অক্ষর ব্যবহার করা উচিত তা বলে tells আমরা কারণ প্রয়োজন "যদি কোন কোণায় মাথা প্রান্ত মাথার ক্রমসঞ্চিত সমষ্টি, গত নয় দ্বিতীয় সর্বশেষ মান নিয়ে <, >, ^, vঅগ্রাধিকার দিক সাপ কার্ল হয় লাগে"। জন্য এন = 19 উদাহরণস্বরূপ প্রধান >

এখন আমরা একটি স্ট্রিং ষষ্ঠ অবস্থানে মাথা জন্য উপযুক্ত চরিত্র সহ সব সাপ অক্ষর, ধারণকারী নির্মাণ করতে পারেন: '|-\/@> '। তারপরে আমরা উপরের ম্যাট্রিক্সের সাথে এই স্ট্রিংটি সূচক করি (সূচীকরণ 1-ভিত্তিক এবং মডিউলার হয়, সুতরাং স্থানটি সর্বশেষে যায়), যা দেয়

/--\ 
|/\| 
||@| 
|\-/ 
\--->

1
চমৎকার কাজ! অংশগ্রহণের জন্য ধন্যবাদ!
জ্যাকসোনাক

8

পাইথন 2, 250 233 191 বাইট

n=input()
l=[''],
a=x=0
b='@'
while a<=n:x+=1;l+=b,;l=zip(*l[::-1]);m=x%2;b='\/'[m]+x/2*'-|'[m];k=len(b);a+=k
l+=b[:n-a]+'>v'[m]+' '*(k-n+a-1),
if m:l=zip(*l[::-1])
for i in l:print''.join(i)
  • 39 জন বাইট সংরক্ষণ করেছেন @ জোনাথন অ্যালানকে ধন্যবাদ

repl.it

পুরো সাপটিকে 90º ঘড়ির কাঁটার দিকে ঘোরানো এবং নীচের অংশটি যুক্ত করে সাপটি আঁকুন, এইভাবে সাপটি সর্বদা অবিচ্ছিন্নভাবে থাকবে।
নতুন বিভাগটি সর্বদা শুরু হয়ে যাবে \এবং -এমনকি উভয় পক্ষের এবং / -বিজোড় পক্ষগুলির জন্য বডি হিসাবে থাকবে । অংশ আকার (কোণে ছাড়া) হয় 0, 1, 1, 2, 2, 3... যা floor(side/2)
যদি বিভাগটি শেষ হয়, এটি অতিরিক্ত অক্ষরগুলি সরিয়ে দেয়, মাথাটি যুক্ত করে এবং স্পেসগুলি দিয়ে সম্পূর্ণ করে।

desired_size=input()
snake=[['']]
snake_size=side=0
new_segment='@'
while snake_size<=desired_size:
    side+=1
    snake+=[new_segment]
    snake=zip(*snake[::-1])
    odd_side=side%2
    new_segment='\/'[odd_side]+side/2*'-|'[odd_side]
    snake_size+=len(new_segment)
diff=desired_size-snake_size
snake+=[new_segment[:diff]+'>v'[odd_side]+' '*(len(new_segment)-diff-1)]
if odd_side:
    snake=zip(*snake[::-1])

for line in snake:print ''.join(line)

সুন্দর কাজ! আপনি টাইব্রেকার জয় আছে। লোকেরা কী নিয়ে আসে তা দেখতে দিন।
জ্যাকসকোনাক

2
এই চ্যালেঞ্জটি সমাধান করার জন্য অবশ্যই এটিই আদর্শ ভাষা
নীল

+1 টি। কেবল ত্রুটিটি হ'ল যখন মাথা কোনও কোণে থাকে তখন এটি বোঝানো হয় সোজা নির্দেশ করা, কোণার চারপাশে নয়।
জোনাথন অ্যালান

1
: তাই মত স্ট্রিং মধ্যে ইন্ডেক্স 16 বাইট সংরক্ষণ '\/'[m], '-|'[m]এবং'>v'[m]
জনাথন অ্যালান

1
সংরক্ষণ করুন 1 টি মধ্যে স্থান সরিয়ে printএবং''.join
জনাথন অ্যালান

7

জাভাস্ক্রিপ্ট (ES6), 193 201 203 215 220 224

সম্পাদনা সংরক্ষিত 4 বাইট ধন্যবা @Arnauld
Edit2 পরিবর্তিত যুক্তি, x এবং y জন্য বর্তমান বাড়তি সংরক্ষণকারী না, শুধু বর্তমান দিক থেকে তাদের পেতে
Edit3 কয়েক বাইট উদ্ধার করে আমি ফাঁকা স্থান একটি ভাল পরিচালনার জন্য তাদের ব্যবহার করার সিদ্ধান্ত নিয়েছে
Edit4 8 বাইটগুলি মাথার দিকনির্দেশ সম্পর্কে হুবহু উদাহরণগুলি অনুসরণ না করে - অন্যান্য উত্তরগুলির মতো সংরক্ষণ করে

বর্তমান সংস্করণটি ক্রোম, ফায়ারফক্স এবং এমএস এজ সহ কাজ করে

এই উত্তরটি কিছু পিছনে এবং নেতৃস্থানীয় স্থান দেয় (এবং ফাঁকা লাইন)।

n=>(t=>{for(x=y=-~Math.sqrt(++n)>>1,g=[i=t];(g[y]=g[y]||Array(x).fill` `)[x]='^<v>|-/\\@'[t?n?i-t?4+t%2:x-y?7:6:t%4:8],n--;i=i>1?i-2:++t)d=t&2,t&1?x+=d-1:y+=d-1})(0)||g.map(x=>x.join``).join`
`

কিছুটা কম গল্ফ

n=>
{
  g = [],
  // to save a few bytes, change line below (adds a lot of spaces)
  // w = ++n,
  w = -~Math.sqrt(++n)
  x = y = w>>1,
  s=c=>(g[y] = g[y] || Array(x).fill(' '))[x] = c, // function to set char in position
  s('@'); // place tail
  for (
     i = t = 0; // t increases at each turn, t%4 is the current direction
     n--;
     i = i > 0 ? i - 2 : t++ // side length increases every 2 turns
  )
     d = t & 2,
     t & 1 ? x += d-1: y += d-1
     s(!n ? '^<v>' [t % 4] // head
          : '|-/\\' [i > 0 ? t % 2 : x-y ? 3 : 2]) // body
  return g.map(x=>x.join``).join`\n`
}

f=
n=>(t=>{for(x=y=-~Math.sqrt(++n)>>1,g=[i=t];(g[y]=g[y]||Array(x).fill` `)[x]='^<v>|-/\\@'[t?n?i-t?4+t%2:x-y?7:6:t%4:8],n--;i=i>1?i-2:++t)d=t&2,t&1?x+=d-1:y+=d-1})(0)||g.map(x=>x.join``).join`
`

function update() {
  O.textContent=f(+I.value);
}

update()
<input type=number id=I value=19 oninput='update()' 
 onkeyup='update() /* stupid MS browser, no oninput for up/down keys */'>
<pre id=O>


আপনি এর (' ')সাথে ` ` এবং এর ('@')সাথে প্রতিস্থাপন করে কয়েকটি বাইট সংরক্ষণ করতে পারেন`@`
আর্নল্ড

@ আর্নল্ড অ্যারে (২) .ফিল` `==> [ Array[1], Array[1] ], যখন Array(2).fill(' ')==>[' ',' ']
বন্ধুরা

@ বন্ধুরা - সত্য। তবে একবার যুক্ত হয়ে গেলে তাতে কোনও পার্থক্য করা উচিত নয়।
আর্নল্ড

@ আর্নল্ড প্রথমে আমি বন্ধুত্বীদের সাথে একমত হয়েছি, তবে এটি বাস্তবে কার্যকর হয়েছে। ধন্যবাদ
edc65

@ ট্রাভিজেজে এটি ক্রোমে কাজ করে না, তবে ফায়ারফক্স কাজ করছে বলে মনে হচ্ছে।
আদনান

3

জাভাস্ক্রিপ্ট (ES7), 200 বাইট

(n,s=(n*4+1)**.5|0,i=+`1201`[s%4],d=i=>`-`.repeat(i))=>[...Array(s-2>>2)].reduce(s=>`/-${d(i)}\\
${s.replace(/^|$/gm,`|`)}
|\\${d(i,i+=2)}/`,[`/\\
|@`,`/-\\
|@/`,`@`,`/@`][s%4])+`
\\${d(n-(s*s>>2))}>`

পরীক্ষার স্বাচ্ছন্দ্যের জন্য ES6 সংস্করণ:

f=(n,s=Math.sqrt((n*4+1))|0,i=+`1201`[s%4],d=i=>`-`.repeat(i))=>[...Array(s-2>>2)].reduce(s=>`/-${d(i)}\\
${s.replace(/^|$/gm,`|`)}
|\\${d(i,i+=2)}/`,[`/\\
|@`,`/-\\
|@/`,`@`,`/@`][s%4])+`
\\${d(n-(s*s>>2))}>`;
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>


আকর্ষণীয় বাস্তবায়ন। আমি এটা করতে ভেবে দেখিনি। অবদান এবং সুন্দর কাজের জন্য ধন্যবাদ !!
জ্যাকসোনাক

3

পার্ল, 111 110 বাইট

এর জন্য +1 অন্তর্ভুক্ত -p

STDIN এ আকার দিন

snake.pl:

#!/usr/bin/perl -p
s%> %->%+s%\^ %/>%||s/
/  
/g+s%.%!s/.$//mg<//&&join"",//g,$/%seg+s/ /^/+y%/\\|>-%\\/\-|%for($\="/
\@
")x$_}{

অসাধারণ! সুন্দর কাজ! অবদানের জন্য ধন্যবাদ!
জ্যাকসকনাক

0

ব্যাচ, 563 বাইট

@echo off
if %1==1 echo /@&echo v&exit/b
set w=1
:l
set/ah=w,a=w*w+w
if %a% gtr %1 goto g
set/aw+=1,a=w*w
if %a% leq %1 goto l
:g
call:d
set r=/%r%\
set/ae=h%%2,w=%1-h*w+2
for /l %%i in (1,1,%h%)do call:r
call:d
echo \%r%^>
exit/b
:d
set r=
for /l %%i in (3,1,%w%)do call set r=%%r%%-
exit/b
:r
echo %r:!=^|%
if %e%==0 set r=%r:@!=\/%
set r=%r:@/=\/%
set r=%r:!\=\-%
set r=%r:/@=\/%
set r=%r:/!=-/%
set r=%r:@!=\/%
set r=%r:/\=!@%
set r=%r:/-=!/%
if %e%==1 set r=%r:/\=@!%
set r=%r:/\=@/%
set r=%r:-\=\!%
if %e%==1 set r=%r:/\=/@%

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


অসাধারণ! অবদানের জন্য ধন্যবাদ!
জ্যাকসোনাক

-1

পাইথন 2.7, একটি দাপট 1230 বাইট

আমি অজগর এবং কোড গল্ফে নতুন কিন্তু আমি অনুভব করেছি যে আমাকে নিজের প্রশ্নের উত্তর দিতে হবে এবং সত্যের পরে লজ্জায় দূরে সরে যেতে হবে। যদিও এতে কাজ করে অনেক মজা পাই!

def s(n):
x = []
l = 0
if n % 2 == 1:
    l = n
else:
    l = n + 1
if l < 3:
    l = 3
y = []
matrix = [[' ' for x in range(l)] for y in range(l)] 
slash = '\\'
newx = l/2
newy = l/2
matrix[l/2][l/2] = '@'
newx = newx-1
matrix[newx][newy] = slash
#newx = newx-1
dir = 'West'

for i in range(0, n-1):    
    newx = xloc(newx, dir)
    newy = yloc(newy, dir)
    sdir = dir
    dir = cd(matrix, newx, newy, dir)
    edir = dir

    if (sdir == 'West' or sdir == 'East') and sdir != edir:
        matrix[newx][newy] = '/'
    else:
        if (sdir == 'North' or sdir == 'South') and sdir != edir:
            matrix[newx][newy] = '\\'
        else:
            if dir == 'East' or dir == 'West':
                matrix[newx][newy] = '-'
            else:
                matrix[newx][newy] = '|'
newx = xloc(newx, dir)
newy = yloc(newy, dir)
sdir = dir
dir = cd(matrix, newx, newy, dir)
edir = dir
print 'eDir: ' + dir
if dir == 'North':
    matrix[newx][newy] = '^'
if dir == 'South':
     matrix[newx][newy] = 'v'
if dir == 'East':
     matrix[newx][newy] = '>'
if dir == 'West':
     matrix[newx][newy] = '<'    


p(matrix, l)

def cd(matrix, x, y, dir):    
if dir == 'North':
    if matrix[x][y-1] == ' ':
        return 'West'
if dir == 'West':
    if matrix[x+1][y] == ' ':
        return 'South'
if dir == 'South':
    if matrix[x][y+1] == ' ':    
        return 'East'
if dir == 'East':
    if matrix[x-1][y] == ' ':        
        return 'North'
return dir

def p(a, n):
for i in range(0, n):
    for k in range(0, n):
        print a[i][k],
    print ' '

def xloc(x, dir):
if dir == 'North':
    return x -1
if dir == 'West':
    return x
if dir == 'East':
    return x 
if dir == 'South':
    return x + 1
 def yloc(y, dir):
if dir == 'North':
    return y
if dir == 'West':
    return y - 1
if dir == 'East':
    return y + 1
if dir == 'South':
    return y

s(25)

https://repl.it/Dpoy


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