কনওয়ের গেম অফ লাইফ বাস্তবায়নের কার্যকরী-প্রোগ্রামিং উপায়গুলি কী কী [বন্ধ]


12

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

আমার প্রচেষ্টার জন্য এখানে সিউডোকোড:

class Node
  update: (board) ->
    get number_of_alive_neighbors from board
    get this_is_alive from board
    if this_is_alive and number_of_alive_neighbors < 2 then die
    if this_is_alive and number_of_alive_neighbors > 3 then die
    if not this_is_alive and number_of_alive_neighbors == 3 then alive

class NodeLocations
  at: (x, y) -> return node value at x,y
  of: (node) -> return x,y of node

class Board
  getNeighbors: (node) -> 
   use node_locations to check 8 neighbors 
   around node and return count

nodes = for 1..100 new Node
state = new NodeState(nodes)
locations = new NodeLocations(nodes)
board = new Board(locations, state)

executeRound:
  state = clone state
  accumulated_changes = for n in nodes n.update(board)
  apply accumulated_changes to state
  board = new Board(locations, state)


@ ওডড যা আমার মাথায় হতাশাব্যঞ্জক। আমি মৌলিক ধারণাগুলি সনাক্ত করি তবে কেবল সবেমাত্র
জর্জ মাউয়ার

আমার মাথার উপর দিয়েও ... আমি কেবলমাত্র একটি বিশেষজ্ঞ ভাষার কোনও মাস্টার কী করতে পারি তার উদাহরণ হিসাবে এটি পোস্ট করেছি। এটি আমাদের সকলের জন্য অনুপ্রেরণা বলুন :)
ওডে

@ জর্জিমৌয়ার "আসলে কফিসিপিটি কিন্তু একই জিনিস" এই দুঃখের দিন
রায়নস

উত্তর:


11

বেশ, ধারণা কয়েক। আমি এফপিতে বিশেষজ্ঞ নই, তবে ...

এটি মোটামুটি পরিষ্কার যে আমাদের এমন একটি প্রকার থাকা উচিত Boardযা একটি গেমের রাজ্যের প্রতিনিধিত্ব করে। বাস্তবায়নের ভিত্তি একটি evolveধরণের ফাংশন হওয়া উচিত evolve :: Board -> Board; মানে এটি Boardগেমের নিয়ম প্রয়োগ করে একটি তৈরি করে Board

আমাদের কীভাবে বাস্তবায়ন করা উচিত evolve? এ Boardসম্ভবত একটি এনএক্সএম ম্যাট্রিক্স হওয়া উচিত Cell। আমরা cellEvolveপ্রকারের একটি ফাংশন প্রয়োগ করতে পারি cellEvolve :: Cell -> [Cell] -> Cellযা প্রদত্ত একটি Cellএবং এর প্রতিবেশী রাষ্ট্রগুলি পরবর্তী পুনরাবৃত্তিতে রাষ্ট্রের Cellগণনা করে Cell

আমাদের এমন একটি getCellNeighborsফাংশনও বাস্তবায়ন করা উচিত যা একটি Cellথেকে প্রতিবেশী প্রতিবেশীদের উত্তোলন করে Board। আমি এই পদ্ধতির স্বাক্ষর সম্পর্কে পুরোপুরি নিশ্চিত নই; আপনি কীভাবে বাস্তবায়ন করেন Cellএবং Boardউদাহরণস্বরূপ আপনার কী থাকতে পারে তার উপর নির্ভর করে getCellNeighbors :: Board -> CoordElem -> CoordElem -> [Cell]যা একটি বোর্ড এবং দুটি সমন্বয় (একটিতে CoordElemসূচী পদের জন্য ব্যবহৃত ধরণ হবে Board) দেয়, আপনাকে প্রতিবেশীদের একটি পরিবর্তনশীল দৈর্ঘ্যের তালিকা দেয় (বোর্ডের সমস্ত কক্ষের নয়) একই সংখ্যক প্রতিবেশী- কোণে 3 প্রতিবেশী রয়েছে, সীমানা 5 এবং প্রত্যেকে, 8)।

evolveএইভাবে মিশ্রন দ্বারা প্রয়োগ করা যাবে cellEvolveএবং getCellNeighborsবোর্ডে সব কোষ জন্য, আবার সঠিক বাস্তবায়ন কিভাবে আপনি বাস্তবায়ন উপর নির্ভর করবে Boardএবং Cell, কিন্তু এটা মত "বর্তমান বোর্ডে সমস্ত কক্ষ জন্য, তাদের প্রতিবেশীদের পেতে এবং নিরূপণ করা তাদের ব্যবহার কিছু হওয়া উচিত নতুন বোর্ডের সংশ্লিষ্ট সেল 'এটি "বোর্ডের সেল ফাংশন ম্যাপ ওভার" ব্যবহার করে পুরো বোর্ডের উপর those ফাংশনগুলির জেনেরিক প্রয়োগ সহ এটি করা সম্ভব।

অন্যান্য চিন্তা:

  • আপনার সত্যিকার অর্থে বাস্তবায়ন করা উচিত cellEvolveযাতে এটি পরামিতি হিসাবে GameRulesএকধরণের যা গেমের নিয়মগুলিকে এনকোড করে t এমন একটি তালিকার একটি তালিকা বলুন (State,[(State,NumberOfNeighbors)],State)যা প্রদত্ত রাজ্যের জন্য বলে এবং প্রতিটি রাজ্যের প্রতিবেশীর সংখ্যা, যা পরবর্তী পুনরাবৃত্তির মধ্যে রাষ্ট্র হওয়া উচিত । cellEvolveএর স্বাক্ষর তখন হতে পারেcellEvolve :: GameRules -> Cell -> [Cell] -> Cell

  • এই কথাটি উপার্জন করার জন্য আপনি গ্রহণ করা হবে evolve :: Board -> Boardপরিণত evolve :: GameRules -> Board -> Board, আপনি ব্যবহার করতে পারে, যাতে evolveবিভিন্ন সঙ্গে অপরিবর্তিত GameRules, কিন্তু আপনি একটি ধাপ যান এবং বানাতে পারে cellEvolveপরিবর্তে প্লাগেবল GameRules

  • সঙ্গে বাজানো getCellNeighborsআপনার কাছে বানাতে পারে evolveশুভেচ্ছা সঙ্গে জেনেরিক Board'র topology- আপনি থাকতে পারে getCellNeighborsযা মোড়ানো পারেন বোর্ডের প্রান্ত, 3D বোর্ড, ইত্যাদি প্রায়


9

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

কৌশলটি হ'ল সময় এবং স্থান উভয় জুড়েই লাইফ বোর্ডগুলির বিশাল স্ব-মিলের সুবিধা গ্রহণ করা। বোর্ডের বৃহত বিভাগগুলির ভবিষ্যতের অবস্থা স্মরণে রেখে আপনি একবারে বিশাল বিভাগগুলি দ্রুত অগ্রসর করতে পারেন।

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

নোট করুন যে আপনি হাইপারজেমেট্রিক সমষ্টি গণনা করার জন্য গস্পার্স অ্যালগরিদমকে নয়, জীবন গণনার জন্য গসপরের অ্যালগরিদম সন্ধান করতে চান ।


আকর্ষণীয় দেখাচ্ছে - এখনও সেই লিঙ্কটির জন্য অপেক্ষা করা হচ্ছে যদিও ...;)
জে কে।

3

ভাল কাকতালীয়, আমরা আজ আমাদের হাস্কেল বক্তৃতা এই সঠিক সমস্যাটি coveredাকা। আমি প্রথমবার এটি দেখেছি কিন্তু এখানে আমাদের দেওয়া উত্স কোডের একটি লিঙ্ক রয়েছে:

http://pastebin.com/K3DCyKj3


আপনি এটি কি করে সে সম্পর্কে আরও ব্যাখ্যা করতে আপত্তি করবেন এবং আপনি কেন জিজ্ঞাসিত প্রশ্নের উত্তর হিসাবে এটি সুপারিশ করবেন? "লিঙ্ক কেবল-উত্তর" বেশ স্ট্যাক এক্সচেঞ্জ এ স্বাগত জানাই হয় না
মশা

3

অনুপ্রেরণার জন্য আপনি রোসেটা কোডে প্রয়োগগুলি দেখতে চাইতে পারেন ।

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

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


1

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

(defn neighbours [[x y]]
  (for [dx [-1 0 1] 
        dy (if (zero? dx) [-1 1] [-1 0 1])]
    [(+ dx x) (+ dy y)]))

(defn step [cells]
  (set (for [[loc n] (frequencies (mapcat neighbours cells))
             :when (or (= n 3) (and (= n 2) (cells loc)))]
         loc)))

তারপরে ঘরের একটি সেটটিতে বার বার "পদক্ষেপ" ফাংশন প্রয়োগ করে গেমটি খেলতে পারা যায়, যেমন:

(step #{[1 0] [1 1] [1 2]})
=> #{[2 1] [1 1] [0 1]}

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

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