একটি এএসসিআইআই পাদোভান সর্পিল উত্পন্ন করুন


22

এটি এই চ্যালেঞ্জের ASCII সংস্করণ । প্রাথমিক পোস্টটি মার্টিন ইন্ডারের অনুরোধ অনুসারে পৃথক করা হয়েছিল

ভূমিকা

ফিবোনাচি সিকোয়েন্সের অনুরূপ, প্যাডোভান সিকোয়েন্স ( ওইআইএস এ 1000931 ) হ'ল সংখ্যার ক্রম যা ক্রমটিতে পূর্ববর্তী পদগুলি যুক্ত করে উত্পাদিত হয়। প্রাথমিক মানগুলি হিসাবে সংজ্ঞায়িত করা হয়:

P(0) = P(1) = P(2) = 1

0 তম, 1 ম এবং 2 য় পদগুলি সমস্ত 1 The পুনরাবৃত্তির সম্পর্কটি নীচে বর্ণিত:

P(n) = P(n - 2) + P(n - 3)

সুতরাং, এটি নিম্নলিখিত ক্রম উত্পাদন করে:

1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...

এই সংখ্যাগুলি সমান্তরাল ত্রিভুজগুলির দৈর্ঘ্য হিসাবে ব্যবহার করা একটি দুর্দান্ত সর্পিল দেয় যখন আপনি সেগুলি সমস্ত একসাথে রাখেন, অনেকটা ফিবোনাচি সর্পিলের মতো:

এখানে চিত্র বর্ণনা লিখুন

উইকিপিডিয়ায় চিত্র সৌজন্যে


কার্য

আপনার টাস্কটি এমন একটি প্রোগ্রাম লিখতে হবে যা এএসসিআইআই আর্ট দ্বারা এই সর্পিলটি পুনরায় তৈরি করে, কোনও শব্দটির সাথে সম্পর্কিত। যেহেতু পাশের দৈর্ঘ্য 1 (1 অক্ষর) এর ত্রিভুজটি ASCII এ সুন্দরভাবে উপস্থাপন করা অসম্ভব, তাই পাশের দৈর্ঘ্য 2 এর একটি ফ্যাক্টর দ্বারা বিভক্ত হয়েছে। সুতরাং, পাশের দৈর্ঘ্য 1 এর ত্রিভুজটি আসলে এর মতোই উপস্থাপিত হয়েছে:

 /\
/__\

সুতরাং, উদাহরণস্বরূপ, যদি ইনপুটটি 5 (5 তম শব্দ) হত তবে আউটপুটটি হওয়া উচিত:

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

প্রথম 5 টি পদ ছিল 1, 1, 1, 2, 2, সুতরাং ত্রিভুজটির প্রসারিত হওয়ার কারণে পাশের দৈর্ঘ্য 2, 2, 2, 4, 4 ছিল। ইনপুট 8 এর জন্য আরেকটি উদাহরণ:

     __________
   /\          /\
  /  \        /  \
 /    \      /    \
/______\    /      \
\      /\  /        \
 \    /__\/          \
  \  /\  /            \
   \/__\/______________\
    \                  /
     \                /
      \              /
       \            /
        \          /
         \        /
          \      /
           \    /
            \  /
             \/

বিধি

  • আপনাকে অবশ্যই ফলাফল মুদ্রণ করতে হবে, এবং ইনপুট অবশ্যই পদ সংখ্যার সাথে সম্পর্কিত একটি পূর্ণসংখ্যা হতে হবে
  • ট্রেলিং এবং শীর্ষস্থানীয় নিউলাইনগুলিকে অনুমতি দেওয়া হয়েছে, লাইনের পরেও ফাঁকা স্থানগুলি অনুমোদিত
  • আপনার জমাটি অবশ্যই কমপক্ষে 10 ম মেয়াদ পর্যন্ত পরিচালনা করতে সক্ষম হবে (9)
  • আপনার জমাটি অবশ্যই একটি সম্পূর্ণ প্রোগ্রাম বা ফাংশন হতে হবে যা ইনপুট নেয় এবং ফলাফল মুদ্রণ করে
  • আউটপুট আবর্তনের অনুমতি দেওয়া হয় 60 ডিগ্রি গুণায়
  • ঘড়ির কাঁটার বিপরীতে যাওয়ার অনুমতিও রয়েছে
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ

আপনি ধরে নিতে পারেন যে ইনপুটটি> 0 হবে এবং ইনপুটটির সেই সঠিক ফর্ম্যাটটি দেওয়া হবে।

স্কোরিং

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী। সবাইকে শুভ নববর্ষ!


1
আমার ভাষা টার্টল্ড বেস 10 ইনপুট নিতে পারে এবং এটি সূক্ষ্মভাবে প্রক্রিয়া করতে পারে, তবে যদি এই ইনপুটটিকে অবিচ্ছিন্ন হিসাবে গ্রহণ করা হয় তবে এই চ্যালেঞ্জটি এত সহজ হবে। যে অনুমতি দেওয়া হবে?
ধ্বংসাত্মক লেবু

1
পছন্দ করুন ইনপুটটি কেবল কোনও ধরণের আকারে পূর্ণসংখ্যা হতে হবে।
অ্যান্ড্রু লি

শীতল। আমি এখন এটিতে কাজ শুরু করব
ধ্বংসাত্মক লেবু

3
অপেক্ষা করুন আসলে এটি এখনও সত্যিই শক্ত
ধ্বংসাত্মক লেবু

উত্তর:


13

Befunge, 871 836 798 বাইট

&00p45*:10p20p030p240p050p060p9010gp9110gp1910gp1-91+10gpv
<v-g03+g06*2g041g055_v#!:%6:p06p05+p04g05g06:g04<p*54+292<
->10g:1\g3+:70p110gv >:5- #v_550g:01-\2*40g+1-30g
/\110:\-g03:\1:g055 _v#!-4:<vp01:-1g01-g03-1\-
^1<v07+1:g07< p08p < >:1-#v_550g:01-\40g+60g+1-30g-50g>v
 _0>p80gp:5-|v1\+66\:p\0\9:$<:p02:+1g02-g03+g06-\g04\1:<
0v|-g00:+1$$<>\p907^>p:!7v>3-#v_550g:30g+:30p1\0\-
1>10g+::0\g3-:70p\0^^07<v<>50#<g::30g+:30p-1-01-\
v >\$0gg> :1+10gg1- #v_^>0g10gg*+\:!2*-70g2+10gv>:#->#,"_"$#1_:1#<p
+1+g03$_^#`gg011+3:+3<g07\+*2+*`0:-\gg01+5g07:g<>1#,-#*:#8>#4_$#:^#
>55+,p30g40p10gg10g1>#v_
#v:#p0$#8_:$#<g!#@_0^ >
 >>:180gg`>>#|_:2+80gg:!v
3+^g\0p08:<vgg08+2::+3<$_100p1-v>g,\80gg+\80gp:2+90g:!01p\80gp
!#^_80g:1+^>\180gg`+!#^_20g80g`
5*g10!g09p04-1-\0\+g04:gg08:p09<^3`0:gg08+1:::$$_1#!-#\\:,#\<g

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

যেমনটি বেফুঞ্জের ক্ষেত্রে প্রায়শই ঘটে থাকে তেমন কৌশলটি একটি অ্যালগোরিদম নিয়ে আসছে যা আমাদের উপরের থেকে নীচে পর্যন্ত প্যাটার্নটি রেন্ডার করতে দেয়, যেহেতু এটি সীমিত জায়গার সাথে প্রথমে স্মৃতিতে রেন্ডার করা ঠিক সম্ভব নয়।

প্রথমে সর্পিলটি আঁকতে প্রয়োজনীয় প্রান্তগুলি উপস্থাপন করে একটি সাধারণ ডেটা কাঠামো তৈরি করে এটি কাজ করে way দ্বিতীয় পর্যায়ে তারপরে আউটপুট প্রতিটি লাইন জন্য প্রয়োজনীয় প্রান্ত টুকরা রেন্ডার করে, কাঠামোটিকে উপর থেকে নীচে পর্যন্ত বিশ্লেষণ করে।

এই কৌশলটি ব্যবহার করে, 8-বিট মেমরির কোষগুলিতে ওভারফ্লো সমস্যা হওয়া শুরু করার আগে আমরা রেফারেন্স প্রয়োগে n = 15 পর্যন্ত সমর্থন করতে পারি। বড় কক্ষের আকারযুক্ত দোভাষীগণ মেমরির বাইরে চলে যাওয়ার আগে n = 25 পর্যন্ত সমর্থন করতে সক্ষম হওয়া উচিত।


এটি খুব চিত্তাকর্ষক ... তবে আপনি কি এই প্রোগ্রামগুলি পড়তে সক্ষম বলে মনে করেন? আমার কাছে এলোমেলো লাগছে। এটি কীভাবে ডেটা স্ট্রাকচার তৈরি করে? এটি কোন ধরণের ডেটা স্ট্রাকচার ব্যবহার করে? ধন্যবাদ!
উজ্জ্বল

1

যান, 768 বাইট

func 卷(n int){
    数:=0
    p:=[]int{1,1,1}
    for i:=3;i<n;i++ {p=append(p,p[i-2]+p[i-3])}
    宽:=p[len(p)-1]*10+10
    素:=make([]int,宽*宽)
    for 数=range 素 {素[数]=32}
    for i:=0;i<数;i+=宽 {素[i]=10}
    态:=[]int{1,1,宽/2,宽/2,92}
    表:=[70]int{}
    s:="SRSQTSPQQ!QOQP~QQQQQQSQR~ORQR!OPOPTSQRQ$QPPQNQPPPXQQQQQQRRQXQRRRNOQPQ$"
    for i:=range s {表[i]=int(s[i])-33-48}
    表[49],表[59]=48,48
    for i:=0;i<4*n;i++ {
        梴:=p[i/4]*2
        if 态[1]==0 {梴=梴*2-2}
        for k:=0;k<梴;k++ {
            址:=(态[2]+态[3]*宽)%len(素)
            if 素[址]==32 {素[址]=态[4]}
            态[2]+=态[0]
            态[3]+=态[1]
        }
        数=((态[0]+1)*2+态[1]+1)*5
        if i%4>2 {数+=35}
        for k:=0;k<5;k++ {态[k]+=表[数+k]}
    }
    for i:=0;i<宽*宽;i++ {fmt.Printf("%c",rune(素[i]))}
}

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

কিভাবে এটা কাজ করে

মূলত আমি ASCII পিক্সেল গ্রিডে লোগোর মতো একটি 'অঙ্কন কচ্ছপ' অনুকরণ করি, তবে কচ্ছপ কেবল এই তিনটি কমান্ড করতে পারে:

rt   - right turn, turn 120 degrees right (1/3 of a Turn)
rth  - right turn half, turn  60 degrees right (1/6 of a Turn)
fd n - forward, go forward n steps, drawing a trail of _, /, or \

এখন প্রতিটি ত্রিভুজের জন্য, আমি এটির মতো চলেছি, যেখানে পি 2 র্থ নবম পদোভান সংখ্যা:

fd P
rt
fd P
rt 
fd P
rt
fd P
rth

চতুর্থ 'এফডি' অর্থ প্রতিটি ত্রিভুজের প্রথম দিকটি আমি আবার ট্রেস করছি। এটি পরবর্তী ত্রিভুজটির জন্য একটি দুর্দান্ত সূচনাপর্বে ফিরে যেতে সহায়তা করে। আধ-ডান-টার্নটি নিশ্চিত করে তোলে যে পরবর্তী ত্রিভুজটি সঠিক দিকনির্দেশে থাকবে।


কচ্ছপটি গল্ফ করার জন্য আমি অ্যারে vari স্টেটের ভেরিয়েবলগুলি সংরক্ষণ করি x: এক্স অবস্থান, y অবস্থান, এক্স বেগ, y বেগ এবং 'অঙ্কন রুনি'। প্রতিটি অ্যানিমেশন ফ্রেমে, x + = x বেগ, y + = y বেগ এবং রানটি আঁকানো হয়।

তারপরে আমি টেবিল সেট আপ করেছি 表 যা কীভাবে আসলে পালাটি করবে tells এএসসিআইআই আর্ট যেভাবে কাজ করে তার কারণে টার্ন কোডটি জটিল। এটি পিক্সেল ডিসপ্লেটির মতো সোজা সোজা আন্দোলন নয়। কচ্ছপের দিক, এক্স এবং ওয়াই বেগ দ্বারা নির্ধারিত, টার্নটি যথাযথ দেখানোর জন্য প্রয়োজনীয় পরিবর্তনগুলি নির্ধারণ করে।

ঘুরতে, এটি বর্তমান x এবং y বেগের দিকে নজর রাখে এবং এগুলিকে একটি সূচীতে একত্রিত করে।

xv = x velocity, yv = y velocity. 
i.e. a turtle facing down and to the right has 
xv of 1, and yv of 1. It can only face 6 
different directions. Formula is (xv+1)*2+yv+1

xv  yv    index
-1  -1    0
-1   0    1
-1   1    2
 1  -1    4
 1   0    5
 1   1    6

এই সূচকটি টেবিলের 5 টি মানের একটি সেট অনুসন্ধান করতে ব্যবহৃত হয় 表 টেবিলের এই 5 টি মান then তারপরে রাজ্যে 5 টি ভেরিয়েবলের প্রত্যেকটিতে যুক্ত করা হয় 态 কচ্ছপটি তখন কার্যকরভাবে পরিণত হয় এবং পরবর্তী 'এফডি' এর জন্য প্রস্তুত।

Rth জন্য, ডান দিকে অর্ধেক, 表 টেবিলের একটি পৃথক বিভাগ রয়েছে। এটি 7 * 5 বা 35 দ্বারা অফসেট হয়, প্রথম টেবিল থেকে 表 এ প্রবেশ করুন 表

অবশেষে আমি টেবিলের পূর্ণসংখ্যার কিছু সাধারণ এনকোডিংটি একটি এসকি স্ট্রিংয়ে করেছি।

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

数  index number
宽  screen width
素  pixel data
梴  length of side of triangle
态  current state
址  address of pixel
表  state transition table

কোডটি পরীক্ষা করতে আপনার এই শিরোলেখ সহ পুরো গোলং ফাইলের প্রয়োজন হবে

package main
import "fmt"

এবং এই পাদচরণ

func main ()  {
    for i := 0; i<15; i++ {
       卷(i)
    }
}

ধন্যবাদ

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