একটি এলোমেলো হেক্সা-গ্লিফ আঁকুন


23

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

উপরের চিত্রটিকে হেক্সা-গ্লাইফ বলা হয়। হেক্সা-গ্লাইফগুলি আমার ডিফেক ক্লাস চলাকালীন ডুডলিংয়ের সময় তৈরি কিছু শীতল নিদর্শন। আপনি কীভাবে এটি তৈরি করেন তা এখানে:

  1. নিয়মিত হেক্সগ্রামের মতো আকারের নীচের পয়েন্টগুলির সেটটি বিবেচনা করুন। অভ্যন্তরীণ ষড়ভুজটি চূড়ান্ত গ্লাইফটি ধারণ করবে, যখন বাইরের 6 পয়েন্টগুলি একটি তারা তৈরি করে এবং যেখানে আমরা আমাদের লাইন আঁকতে শুরু করব।

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

  1. বাইরের ছয়টি পয়েন্ট থেকে, এলোমেলোভাবে একটি জুড়ি নির্বাচন করুন। দক্ষতার জন্য, দুটি নির্বাচিত পয়েন্টের মধ্যে কমপক্ষে অন্য একটি পয়েন্ট থাকা উচিত (অন্যথায়, এটি চূড়ান্ত চিত্রটিতে কোনও প্রভাব ফেলবে না)। তারপরে, দুটি পয়েন্টের প্রতিটি থেকে অন্য দিকে একটি রশ্মি ফেলুন। এই রশ্মি পূর্ববর্তী লাইনে অবরুদ্ধ

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

  1. পরবর্তী কয়েকটি ছবিতে প্রদর্শিত 9 টি প্রান্ত তৈরি না হওয়া পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করুন।

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

  1. রশ্মি ব্লক হওয়ার উদাহরণ এখানে is রশ্মি বিভাগের প্রান্তগুলি এখনও দৃশ্যমান, তবে মাঝের অংশটি আমরা আঁকা প্রথম দুটি বিভাগ দ্বারা আবৃত হয়।

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

  1. এই দুটি রশ্মিও "অবরুদ্ধ" রয়েছে, তবে এটি কোনও দৃশ্যমান পার্থক্যের কারণ করে না কারণ এগুলি একই অন্যান্য লাইনের দ্বারা অবরুদ্ধ রয়েছে।

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

  1. সমস্ত 9 লাইন টানা না হওয়া অবধি দ্রুত-ফরওয়ার্ডিং। আপনি যদি এই বাদ দেওয়া পদক্ষেপগুলির আরও বিশদ ব্যাখ্যা চান তবে আমি ব্যাখ্যা করতে পারি।

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

  1. শেষ পর্যন্ত, তারার পয়েন্টগুলি সরান। এটি সুন্দর দেখানোর জন্য, ঘন বিন্দুগুলিও সরানো হয়।

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

চ্যালেঞ্জ

আপনি চ্যালেঞ্জটি র্যান্ডম হেক্সা-গ্লাইফের একটি ভিজ্যুয়াল উপস্থাপনা আউটপুট করা। এটি কোড-গল্ফ, সবচেয়ে কম বাইট জেতা।

  1. সমস্ত সম্ভাব্য হেক্সা-গ্লাইফগুলি কিছু ইতিবাচক সম্ভাবনার সাথে উপস্থিত হওয়া উচিত। 9 টি প্রান্ত আঁকানো ক্রমটি পরিবর্তন করে বিভিন্ন হেক্সা-গ্লাইফ তৈরি করা হয়।

  2. তদুপরি, আপনার প্রোগ্রাম দ্বারা সমস্ত চিত্র আউটপুট অবশ্যই বৈধ হেক্সা-গ্লাইফ হতে হবে। কিছু নিদর্শন (অভ্যন্তরীণ ষড়্ভুজের সম্পূর্ণ রূপরেখার মতো) সম্ভবত হেক্সা-গ্লাইফ হিসাবে উপস্থিত হতে পারে না এবং সুতরাং আপনার প্রোগ্রামটি অবশ্যই এগুলি আউটপুট না করে।

  3. আউটপুটটি একটি গ্রাফিকাল চিত্র হওয়া উচিত (স্ক্রিন বা ফাইলে মুদ্রিত)।

  4. ষড়ভুজ অবশ্যই নিয়মিত হওয়া উচিত, তবে যে কোনও অরিয়েন্টেশনে উপস্থিত হতে পারে।

  5. প্রতিচ্ছবি / আবর্তনগুলি অনন্য হিসাবে বিবেচিত হয় না । (এর ফলে অনুসরণ করা প্রয়োজন 1 টি সহজতর হতে পারে)।


8
I made up while doodling during my DiffEq class। সমস্ত দুর্দান্ত আবিষ্কারগুলি যেভাবে ঘটে ...: P
Rɪᴋᴇʀ

চিত্রটির জন্য ন্যূনতম প্রয়োজনীয়তাগুলি কী কী? যতক্ষণ না প্রতিটি প্রান্তটি উপস্থাপিত করা হয় এবং অস্পষ্টভাবে সঠিক জায়গায় স্থাপন করা হয় ততক্ষণ একটি ASCII শিল্পের স্বীকৃতি হওয়া উচিত?
জন ডিভোরাক

@ জনডভোরাক আমি চ্যালেঞ্জের ASCII আর্ট বিকল্পটি অপসারণ করেছি (পোস্ট করার 2 মিনিটের মধ্যে) কারণ যে প্রোগ্রামগুলি ASCII- শিল্প এবং গ্রাফিকাল আউটপুট উত্পাদন করে তা সহজে তুলনামূলক নয়।
PhiNotPi

তখন পিক্সেল আর্টের কী হবে? একটি পিপিএম শিরোনাম খুব বেশি ভারী নয় এবং এর পরে কেবলমাত্র পার্থক্যটি '01'পরিবর্তে স্থানের সাথে ইন্টারলিভড ব্যবহার করা হয় ' *'
জন ডিভোরাক

@ জানডভোরাক আউটপুট তাহলে সঠিকভাবে ফর্ম্যাট করা ইমেজ ফাইল হবে, তাই না? তারপরে আমি এতে কোনও ভুল দেখছি না।
PhiNotPi

উত্তর:


18

গণিত, 273 268 264 242 বাইট

c=CirclePoints;b@_=k=1>0;Graphics[Line/@Cases[Append[Join@@({c@6,{3^.5/2,-Pi/6}~c~6}),{0,0}][[b@#=!k;#]]&/@TakeWhile[#,t=k;(r=t;t=b@#;r)&]&/@Join@@RandomSample[{#,Reverse@#}&/@Partition[Range@12,3,2,1]~Join~Array[{2#,13,2#+6}&,3]],{_,__}]]

একটি সুপারস্ক্রিপ্ট যেমন উপস্থাপনা Tম্যাথামেটিকাল এবং একটি পোস্টসাফিক্স TRANSPOSE অপারেটর।

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

মনে রাখবেন যে এটি একটি সম্পূর্ণ প্রোগ্রাম এবং আপনি যদি কোনও একক REPL সেশনের মধ্যে কোডটি একাধিকবার চালাতে চান তবে আপনাকে এটির উপসর্গ করতে হবে Clear[b]

এখানে 20 রান ফলাফল:

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

ব্যাখ্যা

এই সমাধানটি বাহ্যিক তারকা বিন্দুগুলির মোটেও ব্যবহার করে না। পরিবর্তে এটি হেক্সাগ্লাইফ এবং লাইনগুলির অংশ যা একই সাথে তিনটি কভার করে সেই পয়েন্টগুলির সাথে সরাসরি কাজ করে।

পয়েন্টগুলি লেবেল করা যাক:

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

1কিছুটা অদ্ভুত কোণে শুরু হয় তবে এটি (কিছুটা অদ্ভুত) এর ডিফল্ট আচরণের কারণে CirclePoints। সেখান থেকে ষড়ভুজ শুরু করা সর্বাধিক সক্রিয় হয়ে উঠল।

এখন আমরা সেই তিনটি পয়েন্টের মধ্য দিয়ে প্রাসঙ্গিক লাইনগুলি খুঁজতে চাই যা বাইরের তারার সংযুক্ত পয়েন্টগুলির সাথে মিল রয়েছে। ষড়ভুজের চারপাশেরগুলি অবশ্যই একটি বিজোড় সংখ্যা থেকে শুরু করে কেবল 3 সংলগ্ন পয়েন্ট (মডুলো 12)। কেন্দ্র জুড়ে বেশী একটি এমনকি সংখ্যা দ্বারা গঠিত n, 13এবং n+6

এই লাইনের প্রতিনিধিত্ব (তিনটি পয়েন্টের তালিকা আকারে নিম্নলিখিত কোড দ্বারা উত্পন্ন হয়):

Partition[Range@12,3,2,1]~Join~Array[{2#,13,2#+6}&,3]

Partitionষড়ভূজ প্রায় লাইন এবং উত্পন্ন Arrayলাইন সেন্টারের মাধ্যমে। উভয় মরীচি প্রসেস করতে, আমরা লাইনের তালিকার উপরে এই ফাংশনটি ম্যাপ করি:

{#,Reverse@#}&

এখন এগুলি RandomSampleএলোমেলো ক্রমে প্রসেস করার জন্য আমরা এগুলি পরিবর্তন করি । Join @@জোড়ের তালিকাকে সমতল করে যাতে আমাদের মরীচিগুলির একটি তালিকা থাকে।

সংক্ষিপ্ত মধ্যস্থতা: কোন পয়েন্টটি ইতিমধ্যে অবরুদ্ধ রয়েছে তা ট্র্যাক করতে আমরা একটি লুকিং ফাংশন ব্যবহার করি b, যা Trueদ্বারা সমস্ত মানের জন্য শুরু করা হয় b@_=k=1>0;। মরীচি প্রক্রিয়াকরণের সময় আমরা প্রথম পয়েন্ট পর্যন্ত সমস্ত পয়েন্ট রাখি b[n] == False( যেটি সহ ):

TakeWhile[#,t=k;(r=t;t=b@#;r)&]&

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

Append[Join@@({c@6,{3^.5/2,-Pi/6}~c~6}),{0,0}][[b@#=!k;#]]&

প্রথম অংশটি দুটি কলের আন্তঃবাহিত ফলাফলগুলি ব্যবহার করে CirclePoints(প্রান্ত কেন্দ্রগুলি এবং ষড়্ভুজের কোণগুলির জন্য বিভিন্ন রেডিয়াই সহ ) সমস্ত 13 পয়েন্টের তালিকা তৈরি করে । নোটটি b@#=!kযা এখনকার পয়েন্টটির জন্য অনুসন্ধান সারণীর মান সেট করে Falseযাতে কোনও বিম এর মধ্য দিয়ে যেতে না পারে। শেষ অবধি, সঠিক 2D পয়েন্ট পেতে স্থানাঙ্কের তালিকায় মানটি সূচক হিসাবে ব্যবহৃত হয়।

Cases[...,{_,__}]

এটি সমস্ত একক-উপাদান তালিকা বাতিল করে দেয় কারণ তারা পৃথক (এবং দৃশ্যমান) পয়েন্ট হিসাবে রেন্ডার করবে। শেষ পর্যন্ত আমরা ফলাফল রেন্ডার:

Graphics[Line/@...]


@ ক্যাটসআরএলফ্লি আমার মনে হয়না এটি কাজ করে, কারণ আমাকে পরে পৃথক মানগুলি ওভাররাইট করতে সক্ষম হতে হবে।
মার্টিন এন্ডার

সার্কেলপয়েন্টগুলির দুর্দান্ত ব্যবহার।
ডেভিডসি

আমি সেই ইউটিউব লিঙ্কটির প্রশংসা করেছি।
DanTheMan

8

জুতা (রুবি) রেভ সি 184 বাইট

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

Shoes.app{t=[]
d=->p,q{t[p]&&t[q]||line(p/6*8,p%6*14,q/6*8,q%6*14)}
%w{1I IW WM M5 5' '1 =A P. R,}.shuffle.map{|i|b=i.sum/2
c=b*2-a=i.ord
t[a]&&t[c]||(d[a,b]
d[b,c]
t[a]=t[b]=t[c]=1)}}

জুতা (রুবি) 205 ... রেভ বি 196 বাইট

জুতো জিইআইআই তৈরির জন্য রুবি ভিত্তিক সরঞ্জাম ইত্যাদি etc. এটি আমি প্রথমবার ব্যবহার করেছি। mothereff.in/byte-counter আমার জমা 196 বাইট হিসাবে গণনা করে, তবে কোনও কারণে জুতো 202 হিসাবে গণনা করে।

এছাড়াও, রুবি আপনাকে পছন্দ মতো জিনিসগুলি করতে দেয় t[a=i.ord]তবে আশ্চর্যের বিষয়, এটি জুতার সাথে প্রত্যাশার মতো কাজ করবে না বলে মনে হয়।

Shoes.app{t=[]
d=->p,q{line(p/6*8,p%6*14,q/6*8,q%6*14)}
%w{1I IW WM M5 5' '1 =A P. R,}.shuffle.map{|i|b=i.sum/2
c=b*2-a=i.ord
t[a]&&t[c]||(t[a]&&t[b]||d[a,b]
t[b]&&t[c]||d[b,c]
t[a]=t[b]=t[c]=1)}}

ব্যাখ্যা

আমি ষড়ভুজের বাইরে লাইনের অংশগুলি বিবেচনা করি না। আমি কেবল সেই অংশটি আঁকছি যা আঁকতে হবে। গুরুত্বপূর্ণ বিষয়টি হ'ল লাইনগুলি ছেদগুলি পেরিয়েছে কিনা (যদি আমরা কেবল সেই অংশগুলি আঁকি যা আঁকতে হয় তবে এর অর্থ তারা ছেদগুলি শুরু করে / শেষ করে))

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

অ্যারেতে কোন পয়েন্টগুলি পরিদর্শন করা হয়েছে সে সম্পর্কে আমি নজর রাখি t[]। এটি নীচে গ্রিডে প্রতিটি শারীরিক স্থানাঙ্কের জন্য একটি এন্ট্রি সমাপ্ত করে। কোনও পৃথক 13-উপাদান যৌক্তিক অ্যারে নেই। শেষ t[]অবধি, 87 টি উপাদান থাকতে পারে, যদিও কেবল 13 টিতে দরকারী ডেটা থাকবে।

অভ্যন্তরীণভাবে, রেখাগুলির শেষ বিন্দুগুলির স্থানাঙ্কগুলি একক সংখ্যা z দ্বারা দেওয়া হয়, যেখানে z% 6 হল y স্থানাঙ্ক এবং z / 6 হ'ল x স্থানাংক। এই সিস্টেমে ষড়ভুজ সমতল হয়। যখন লাইনগুলি প্লট করা হয়, এক্স স্কেলটি 8 দ্বারা গুণিত হয় এবং y স্কেলটি 14 দ্বারা গুণিত হয়, যা সঠিক অনুপাতের খুব ঘনিষ্ঠ যুক্তিযুক্ত: 14/8 = 1.75 বনাম স্কয়ার্ট (3) = 1.732।

অভ্যন্তরীণ স্থানাঙ্ক সিস্টেমটি কয়েকটি নমুনা আউটপুট সহ নীচে প্রদর্শিত হবে।

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

Ungolfed

Shoes.app{
  t=[]                                          #Empty array for status tracking
  d=->p,q{line(p/6*8,p%6*14,q/6*8,q%6*14)}      #Drawing method. Convert p and q into x,y pairs, scale and draw line.
  %w{1I IW WM M5 5' '1 =A P. R,}.shuffle.map{|i|#take an array of the coordinates of the endpoints of each line, shuffle, then for each line
    b=i.sum/2                                   #b = midpoint of line, convert ASCII sum to number (average of the two coordinates)
    a=i.ord                                     #a = first endpoint of line, convert ASCII to number (no need to write i[0].ord)
    c=b*2-a                                     #c = second endpoint of line (calculating is shorter than writing i[1].ord)
    t[a]&&t[c]||(                               #if both endpoints have already been visited, line is completely blocked, do nothing. ELSE
      t[a]&&t[b]||d[a,b]                        #if first endpoint and midpoint have not both been visited, draw first half of line
      t[b]&&t[c]||d[b,c]                        #if second endpoint and midpoint have not both been visited, draw second half of line
      t[a]=t[b]=t[c]=1                          #mark all three points of the line as visited
    )
  }
}

আরও নমুনা আউটপুট

এগুলি প্রোগ্রামটির একটি পুরানো সংস্করণ দিয়ে করা হয়েছিল। পার্থক্যটি হ'ল উইন্ডোতে হেক্সাগ্লাইফের অবস্থান এখন কিছুটা আলাদা।

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


mothereff.in/byte-counter counts my submission as 196 bytes, but for some reason Shoes counts it as 202.এটি সত্য কিনা আমি 100% জানি না তবে আমি মনে করি যে জুতাগুলি 196 এর পরিবর্তে 202 বাইট হিসাবে আপনার কোড গণনা করেছে কারণ আপনার নিউলাইনগুলি আসলে দুটি চরিত্রের ক্রম "\ r \ n"। এটি প্রতিটি নিউলাইন দু'বার গণনা করে। \ R এবং regarding n সম্পর্কিত একটি স্ট্যাক ওভারফ্লো উত্তর answer
কে ঝাং

হি, আমি জুতার এক্সডি সহ রুবি নামটি পেতে পারি না
বিটা ডেকে

3

পাইথন, 604 591 574 561 538 531 536 534 528 493 483 452 431 420 419 415 388 385 384 বাইট

লেভেলের উভয় প্রান্তটি ইতিমধ্যে পরিদর্শন করা হয়েছে কিনা তা পরীক্ষা করে কোনও লাইন ব্লক করা হবে কিনা তা যাচাই করার জন্য আমি লেভেল রিভার সেন্টের ধারণাটি রূপান্তর করেছি। এটি 27 বাইট সঞ্চয় করে। গল্ফিং পরামর্শ স্বাগত জানাই।

সম্পাদনা করুন:g(p,q) 3 বাইটের জন্য বাগ ফিক্সিং এবং গল্ফিং । Lএকটি বাইট জন্য গল্ফড ।

from turtle import*
from random import*
R=range
G=goto
*L,=R(9)
shuffle(L)
a=[0]*13
ht()
T=12
c=[(j.imag,j.real)for j in(1j**(i/3)*T*.75**(i%2/2)for i in R(T))]+[(0,0)]
def g(p,q):pu();G(c[p]);a[p]*a[q]or pd();G(c[q])
for m in L:
 p=2*m;x,y,z=R(p,p+3)
 if m<6:
  if a[x]*a[z%T]<1:g(x,y);g(y,z%T);a[x]=a[y]=a[z%T]=1
 else:
  if a[p-11]*a[p-5]<1:g(p-11,T);g(p-5,T);a[p-11]=a[p-5]=a[T]=1

Ungolfing:

from turtle import*
from random import*

def draw_line(points, p_1, p_2):
    penup()
    goto(points[p_1])
    if not (a[p] and a[q]):
        pendown()
    goto(points[p_2])

def draw_glyph():
    ht()
    nine_lines = list(range(9))
    shuffle(nine_lines)
    size = 12
    center = [0,0]

    points = []
    for i in range(12):      # put in a point of a dodecagon
                             # if i is even, keep as hexagon point
                             # else, convert to hexagon midpoint
        d = 1j**(i/3) * 12   # dodecagon point
        if i%2:
            d *= .75**.5     # divide by sqrt(3/4) to get midpoint
        points += (d.imag, d.real)
    points.append(center)

    a = [0]*13
    for m in nine_lines:
        p = 2*m
        if m<6:
            x, y, z = p, p+1, p+2
            if not (a[x] and a[z%12]):
                draw_line(points, x, y)
                draw_line(points, y, z%12)
                a[x] = a[y] = a[z%12] = 1
        else:
            if not (a[p-11] and a[p-5]):
                draw_line(p-11, 12)
                draw_line(p-5, 12)
                a[p-11] = a[p-5] = a[12] = 1

আমরা 12-পিক্সেল হেক্সাগনকে বেস হিসাবে ব্যবহার করি কারণ (গল্ফিং কারণে) x এখানে কয়েকটি উদাহরণ হেক্সা-গ্লাইফস (দরিদ্র ফসলের জন্য ক্ষমা):

একটি উদাহরণ হেক্সা-গ্লাইফ একটি উদাহরণ হেক্সা-গ্লাইফ একটি উদাহরণ হেক্সা-গ্লাইফ একটি উদাহরণ হেক্সা-গ্লাইফ একটি উদাহরণ হেক্সা-গ্লাইফ একটি উদাহরণ হেক্সা-গ্লাইফ


কয়েকটি বাইট সংরক্ষণ করতে পারে:R=range;G=goto
টিম Čas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.