লাইফ ধাঁচের সাধারণ গেম গণনা করুন


21

এখানে কাজটি হ'ল একটি গলি .rleবা প্লেইন টেক্সট ফাইল (আপনার পছন্দ) থেকে পড়া যাঁর ফাইলের নাম দেওয়া হয়েছে (এসটিডিআইএন বা কমান্ড লাইন আর্গুমেন্ট হিসাবে) এবং এটিতে এনকোডেড গ্রিডের সাধারণ প্যাটার্নগুলি সনাক্ত এবং গণনা করা।

বিকল্পভাবে, আপনি তার পরিবর্তে ফাইলের সামগ্রী সরাসরি STDIN এর মাধ্যমে সরবরাহ করতে পারেন।

আপনার প্রোগ্রামটি কমপক্ষে পনেরটি সাধারণ কড়া স্টিল লাইফ এবং পাঁচটি অতি সাধারণ দোলক , প্লাস গ্লাইডার সনাক্ত এবং আলাদা করতে সক্ষম হওয়া উচিত ।

গ্লাইডারের চারটি পর্যায় যেমন হওয়া উচিত, তেমনি এই দোলকগুলির সমস্ত ধাপগুলিও স্বীকৃত হওয়া উচিত।

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

যে নিদর্শনগুলি অন্য নিদর্শনগুলির অংশ হিসাবে গণনা করা হচ্ছে তা গণনা করা উচিত নয়। (উদাহরণস্বরূপ, বীকনের 8-সেল ফেজটিও দুটি ব্লক হিসাবে গণনা করা উচিত নয়, এবং একটি শিপ-টাইও দুটি জাহাজ হিসাবে গণনা করা উচিত নয়)

আপনি ধরে নিতে পারেন যে ইনপুটটি ইতিমধ্যে স্থিতিশীল হয়েছে এবং এতে কোনও নকশাগুলি নেই যা সংযোজনিত সেটে নেই। আপনি ধরেও নিতে পারেন ইনপুট গ্রিড একটি 1024x1024 বাক্সের মধ্যে ফিট হবে।

এটি , তাই সংক্ষিপ্ততম প্রোগ্রামটি জয়ী।

আরএলই ফাইল ফর্ম্যাট বিবরণ

একটি আরএলই ফাইলটিতে একটি রান-দৈর্ঘ্যের এনকোডেড লাইফ গ্রিড থাকে। শুরু হওয়া সমস্ত লাইন #মন্তব্য এবং এড়ানো উচিত।

প্রথম অ-খালি, নন-মন্তব্য লাইনটি ফর্মের x=<width>,y=<height>,rule=<rule>। এই কাজের উদ্দেশ্যে, নিয়ম সর্বদা থাকবে B3/S23। এটিতে এমন স্পেস থাকতে পারে যা এই লাইনটি প্রক্রিয়াজাত করার আগে ছিনিয়ে নেওয়া উচিত (অবশ্যই, এই লাইনটি প্রক্রিয়াজাত করা মোটেই প্রয়োজন হয় না))

প্রথমটির পরে মন্তব্য না করা লাইনগুলিকে একক স্ট্রিং হিসাবে বিবেচনা করা উচিত। এটি কেবলমাত্র দশমিক সংখ্যা, বর্ণ হওয়া উচিত $, bএবং o, এবং লাইন ব্রেক, এবং একটি অঙ্ক দিয়ে শেষ হবে না। লাইন বিরতি উপেক্ষা করা হবে, তবে আপনি ধরে নিতে পারেন যে লাইন ব্রেকগুলি অঙ্কগুলির স্ট্রিংগুলিকে বাধা দেয় না।

এটি একক দ্বারা সমাপ্ত হতে পারে !

bএকটি মৃত ঘরের oপ্রতিনিধিত্ব করে , একটি জীবন্ত সেলকে $উপস্থাপন করে এবং একটি সারির প্রান্তটি উপস্থাপন করে। যে কোনও দশমিক সংখ্যা নির্দেশ করে যে নিম্নলিখিত চিহ্নটি বহুবার পুনরাবৃত্তি হিসাবে বিবেচিত হবে।

সাদামাটা প্যাটার্ন এনকোডিং

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

আপনি ধরে নিতে পারেন যে সমস্ত মন্তব্য ছাড়াই সমস্ত লাইন হাইফেনের সাথে সমান দৈর্ঘ্যে প্যাড করা হবে।

শুরু হওয়া লাইনগুলি !মন্তব্য এবং এড়ানো হবে।

কিছু পরীক্ষার মামলা

RLE:

#This is a comment
x = 35, y = 16, rule = B3/S23
bo$2o$obo5$22bo$22bo$22bo2$18b3o3b3o2$22bo$22bo10b2o$22bo10b2o!

প্লেইন:

!This is a comment
-O---------------------------------
OO---------------------------------
O-O--------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
----------------------O------------
----------------------O------------
----------------------O------------
-----------------------------------
------------------OOO---OOO--------
-----------------------------------
----------------------O------------
----------------------O----------OO
----------------------O----------OO

ফলাফল:

Glider 1
Blinker 4
Block 1

RLE:

x = 27, y = 15, rule = B3/S23
5b2o$5b2o9$11bo$o9bobo$o9bobo$o10bo12b3o!
#Here's a comment at the end

প্লেইন:

-----OO--------------------
-----OO--------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
-----------O---------------
O---------O-O--------------
O---------O-O--------------
O----------O------------OOO
!Here's a comment at the end

ফলাফল:

Block 1
Blinker 2
Beehive 1

RLE:

#You may have multiple comments
#As shown here
x = 13, y = 11, rule = B3/S23
2o$2o2$12bo$12bo$12bo$2b2o$2b2o4b2o$7bo2bo$7bobo$8bo!

প্লেইন:

!You may have multiple comments
!As shown here
OO-----------
OO-----------
-------------
------------O
------------O
------------O
--OO---------
--OO----OO---
-------O--O--
-------O-O---
--------O----

ফলাফল:

Block 2
Blinker 1
Loaf 1

RLE:

# Pentadecathlon
# Discovered by John Conway
# www.conwaylife.com/wiki/index.php?title=Pentadecathlon
x = 10, y = 3, rule = B3/S23
2bo4bo2b$2ob4ob2o$2bo4bo!

প্লেইন:

! Pentadecathlon
! Discovered by John Conway
! www.conwaylife.com/wiki/index.php?title=Pentadecathlon
--O----O--
OO-OOOO-OO
--O----O--

ফলাফল:

Pentadecathlon 1

বোনাস

যদি আপনি উভয় ইনপুট ফর্ম্যাটকে সমর্থন করেন (ফাইল এক্সটেনশন ব্যবহার করে [ .rlerle ফাইলের .cellsজন্য এবং প্লেইন টেক্সটের জন্য- অন্য এক্সটেনশনগুলি কীভাবে পড়তে হবে তা অপরিজ্ঞাত করা হয়] বা তাদের মধ্যে পার্থক্য করার জন্য একটি কমান্ড লাইন পতাকা ব্যবহার করা হয়) আপনি আপনার স্কোর থেকে 5% বিয়োগ করতে পারেন।


কেমন হবেOOO.OO\n....OO
আকাংকা

@ খ্রিস্টিয়ান ইরওয়ান ওয়েল, এটি একটি স্থিতিশীল প্যাটার্ন নয় তাই আপনাকে এটিকে যাইহোক ইনপুট হিসাবে দেওয়া হবে না।
সুপারজেডি ২২৪

উত্তর:


13

হাস্কেল, 2417 বাইট

এটি বেশ খানিকটা সময় নিয়েছে এবং এখনও কয়েকটি বাগ রয়েছে, তবে আমি বেশ কয়েকটি কৌশল কাজ করেছিলাম সুতরাং এটির মূল্য ছিল।

নোট:

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

এটি কয়েকটি মূল ধারণা একত্রিত করেছে:

  • নিদর্শন এবং প্রতিসাম্যগুলি প্রাক-গণনা করা যায়
  • একটি একক প্যাটার্নটি একটি পূর্ণসংখ্যায় প্যাক করা যেতে পারে, যার সাথে মাত্রাগুলি জানা যায়
  • সমস্ত submatrices সন্ধান করা সহজ
  • সমতা গণনা করা সহজ

কোডটি এখানে:

r=[1..20]
a!0=a!!0
a!x=tail a!(x-1)
u[_,x,y,l]=[[odd$div l$2^i|i<-[0..y],mod i x==j]|j<-[0..x-1]]
main=interact(\s->let q=[map(=='O')l|l<-lines s,l!0/='!']in let g=[i|i<-[[[0,3,11,3339,0,4,11,924,0,4,11,3219,0,3,11,1638,1,4,15,19026,1,4,15,9636,2,3,11,1386,2,4,11,1686,3,7,48,143505703994502,3,7,48,26700311308320,3,7,48,213590917399170,3,7,48,8970354435120,4,2,3,15,5,3,8,171,5,3,8,174,5,3,8,426,5,3,8,234,6,4,15,36371,6,4,15,12972,6,4,15,51313,6,4,15,13644,6,4,15,50259,6,4,15,12776,6,4,15,51747,6,4,15,6028,7,4,15,26962,7,4,15,9622,7,4,15,19094,7,4,15,27044,8,5,24,9054370,8,5,24,2271880,9,4,15,51794,9,4,15,13732,9,4,15,19027,9,4,15,9644,10,4,19,305490,10,5,19,206412,10,5,19,411942,10,4,19,154020,11,3,8,427,11,3,8,238,12,6,35,52217012547,12,6,35,3306785328,13,3,8,170,14,3,8,428,14,3,8,458,14,3,8,107,14,3,8,167,14,3,8,482,14,3,8,302,14,3,8,143,14,3,8,233,14,3,8,241,14,3,8,157,14,3,8,286,14,3,8,370,14,3,8,181,14,3,8,115,14,3,8,346,14,3,8,412,15,4,15,51219,15,4,15,12684,15,4,15,52275,15,4,15,13260,16,1,2,7,16,3,2,7,17,3,29,313075026,17,10,29,139324548,17,3,23,16252911,17,8,23,16760319,17,5,49,152335562622276,17,10,49,277354493774076,17,7,69,75835515713922895368,17,10,69,138634868908666122360,17,9,89,135722011765098439128942648,17,10,89,58184575467336340020006960,17,5,59,160968502306438596,17,12,59,145347113669124612,17,5,59,524156984170595886,17,12,59,434193401052698118,17,5,69,164495599269019571652,17,14,69,222245969722444385292,17,5,69,517140479305239282702,17,14,69,222262922122170485772,17,3,47,83020951028178,17,16,47,39740928107556,17,3,35,62664969879,17,12,35,40432499049,17,3,41,1581499314234,17,14,41,1293532058322,17,3,41,4349006881983,17,14,41,3376910168355,17,3,47,92426891685930,17,16,47,83780021865522,17,3,47,79346167206930,17,16,47,11342241794640,18,13,168,166245817041425752669390138490014048702557312780060,18,15,224,1711376967527965679922107419525530922835414769336784993839766570000,18,13,168,141409121010242927634239017227763246261766273041932,19,2,7,126,19,4,7,231,19,4,7,126,19,2,7,189,19,4,15,24966,19,4,15,18834,19,4,15,10644,19,4,15,26646]!p|p<-[h..h+3]]|h<-[0,4..424]],j<-[[[q!y!x|x<-[a..a+c]]|y<-[b..b+d]]|c<-r,d<-r,a<-[0..(length$q!0)-c-1],b<-[0..length q-d-1]],u i==j]in show[(words"aircraftcarrier barge beehive biloaf1 block boat eater1 loaf longbarge longboat mango ship shiptie tub glider beacon blinker pentadecathlon pulsar toad"!(e!0),sum[1|f<-g,e!0==f!0])|e<-g])

এখানে গাণিতিক কোডটি 0,1 এর অ্যারে প্যাক করার জন্য ব্যবহৃত হয় ফর্ম্যাটে পরে হ্যাসেল প্রোগ্রাম দ্বারা প্যাক করা হয়েছে:

rotate[m_]:=Transpose[Map[Reverse,m]]
findInversePermutation[m_]:=Block[{y=Length[First[m]], x=Length[m]}, InversePermutation[FindPermutation[Flatten[m], Flatten[Table[Table[Flatten[m][[i+1]], {i, Select[Range[0, x * y - 1], Mod[#, x]==j&]}], {j, 0, x - 1}]]]]]
enumShape[m_]:=Partition[Range[1, Length[Flatten[m]]], Length[m[[1]]]]
pack[m_]:={Length[rotate[rotate[m]]], Length[Flatten[rotate[rotate[m]]]], FromDigits[Permute[Flatten[rotate[rotate[m]]], findInversePermutation[enumShape[rotate[rotate[m]]]]], 2]}

এখানে কোডটির আরও অনেকগুলি সম্পূর্ণরূপে আলোচনা করা হয়েছে:

range = [1..16]          -- all of the patterns fall within this range

list ! 0        = list !! 0           -- this is a simple generic (!!)
list ! position = (tail list) ! (position - 1)

unpack [_, unpackedLength, unpackedSize, packed] = [ [odd $ div packed (2^i) | i <- [0..unpackedSize], (mod i unpackedLength) == j] | j <- [0..unpackedLength - 1]]

main=interact doer

doer input = show $ tallyByFirst (words nameString) foundPatterns -- this counts equalities between the list of patterns and the submatrices of the input
  where
    parsed = parse input -- this selects the non-comment lines and converts to an array of Bool's
    foundPatterns = countOccurrences partitioned subArrays
    subArrays     = allSubArrays parsed
    partitioned   = modPartition compressed 428 4 -- this partitions the compressed patterns into the form [name number, x length, x length * y length, packed integer]

countOccurrences patterns subArrays = [pattern | pattern <- patterns, subArray <- allSubArrays q, unpack pattern == subArray]

subArray m offsetX subSizeX offsetY subSizeY = [[m ! y ! x | x <- [offsetX..offsetX + subSizeX]] | y <- [offsetY..offsetY + subSizeY]]

allSubArrays m = [subArray m offsetX subSizeX offsetY subSizeY | subSizeX <- range, subSizeY <- range, offsetX <- [0.. (length $ head m) - subSizeX - 1], offsetY <- [0..(length m) - subSizeY - 1]]

tallyByFirst names list = [ (names ! (a ! 0), sum [1 | a <- list, (head a) == (head b)]) | b <- list]

parse string = [map (=='O') line | line <- lines string, head line /= '!']

modPartition list chunksize = [ [list ! position | position <- [offset..offset + chunksize - 1]] | offset <- [0, chunksize..(length list) - chunksize]]

পিপিসিজিতে আপনাকে স্বাগতম! আমি এটি এখনও চেষ্টা করি নি তবে এটি অবশ্যই চিত্তাকর্ষক বলে মনে হচ্ছে। +1 টি!
একটি স্প্যাগেটে

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