পলিস্ট্রিপ গণনা করা হচ্ছে


18

পলিস্ট্রিপগুলি নিম্নোক্ত নিয়ম মেনে চলার পলিওমিনোজগুলির একটি উপসেট:

  • প্রতিটি টুকরা 1 বা একাধিক কোষ গঠিত
  • কোনও কোষে দু'জনের বেশি প্রতিবেশী থাকতে পারে না
  • কোষগুলির একটি গর্ত আবদ্ধ করা উচিত নয়

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

উদাহরণস্বরূপ, 30 টি ফ্রি হেপস্টাস্ট্রিপস রয়েছে (7 দৈর্ঘ্যের পলিসট্রিপস)। 14x15 গ্রিডে প্যাক করা এগুলি সমস্ত এখানে।

Heptastrips

চিত্রের কৃতিত্ব: মিরোস্লাভ ভাইচার

লক্ষ্য

একটি প্রোগ্রাম / ফাংশন লিখুন যা nইনপুট হিসাবে ধনাত্মক পূর্ণসংখ্যার গ্রহণ করে এবং স্বতন্ত্র ফ্রি- nপলিস্ট্রিপগুলি গণনা করে ।

  • n = 1 -> 1 (একটি একক বর্গ)

  • n = 2 -> 1 (2 টি স্কোয়ার দিয়ে তৈরি কেবল একটি সম্ভাব্য 2-পলিস্ট্রিপ রয়েছে)

  • n = 3 -> 2 (একটি লাইনে যোগ হওয়া 3 টি স্কোয়ারের সমন্বয়ে গঠিত এবং অন্যটি এল-আকারের)

  • n = 4 -> 3 (একটি সোজা, একটি এল-আকারের এবং একটি জেড-আকারের)

  • । । ।

পরীক্ষার কেস:

n   polystrips

1   1
2   1
3   2
4   3
5   7
6   13
7   30
8   64
9   150
10  338
11  794
12  1836
13  4313
14  10067
15  23621

স্কোরিং

এটি , তাই সংক্ষিপ্ত কোডটি আরও ভাল। আমি অ্যালগরিদম এবং কোডটির বিস্তারিত ব্যাখ্যাগুলি অত্যন্ত প্রশংসা করব।

জে আংশিক রেফারেন্স বাস্তবায়ন

আমি প্রতিটি টুকরোটি "ভেক্টর" ফর্ম্যাটে বর্ণনা করার সিদ্ধান্ত নিয়েছি এবং একটি এন-পলিস্ট্রিপ টুকরো বর্ণনা করার জন্য আমার কেবল এন -2 ব্লক প্রয়োজন (কেবলমাত্র 1 2-পলিস্ট্রিপ রয়েছে এবং এটি স্পষ্টভাবে ফিরে এসেছে)। ব্লকগুলি আপেক্ষিক দিকটি বর্ণনা করে: 0 - কোনও পরিবর্তন নেই; 1 - বাম দিকে ঘুরুন; 2 - ডান দিকে ঘুরুন। কোনটি কোন দিকে শুরু হবে তা বিবেচনা করে না তবে কেবল পরবর্তী ঘরটি কোথায় স্থাপন করা হবে তা কেবল তা নির্দেশ করে। একটানা 0s এর যে কোনও সংখ্যা থাকতে পারে তবে 1s এবং 2s সর্বদা একা থাকে। এই প্রয়োগটি আংশিক, কারণ এটি গর্তগুলির জন্য অ্যাকাউন্ট করে না - n> 6 এর সমাধানগুলি গর্তগুলির সাথে টুকরোগুলিও গণনা করে।

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


1
প্রাসঙ্গিক OEIS। (তবে গর্তগুলি বাদ দেয় না))
মার্টিন এন্ডার

@ মার্টিন ইন্দর আপনাকে ধন্যবাদ, আমি এটি জানতাম না।
গ্যালেন ইভানভ

2
কেবল নিশ্চিতভাবেই, আমি ধরে নিচ্ছি যে আপনি যদি কেন্দ্র এবং একটি কোণ ছাড়াও একটি 3x3 গ্রিড পূরণ করেন যা গর্ত হিসাবেও গণনা করা হয় ( 101010আপনার নমুনা স্বরলিপিতে)?
টন হসপেল

@ টন হসপেল হ্যাঁ, ঠিক - এটি হোল যুক্ত একমাত্র হেপাস্ট্রিপ টুকরা।
গ্যালেন ইভানভ

1
গণিতের জন্য সম্ভবত একটি ভাল প্রশ্ন.এসই
জোনা

উত্তর:


12

পাইথন 3 , 480 433 406 364 309 299 295 বাইট

আমার পিপিসিজি ক্যারিয়ার শুরু করার জন্য (বা না?) ভাল পয়েন্টের মতো লাগছিল।

def C(s):
 S,*a={''},0,1;n=d=r=1
 for c in s:d=c*d*1jor d;n+=d;a+=n,;r*=not{n}&S;x,*a=a;S|={x+t+u*1jfor t in A for u in A}
 return r
from itertools import*;A=-1,0,1;n,y=int(input())-2,0;x={*filter(C,product(*[A]*n))}
while x:s=x.pop();S=*(-u for u in s),;x-={s[::-1],S,S[::-1]}-{s};y+=1
print(y)

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

সম্পাদনা:

  • ইনলাইনড Dএবং X, এবং কিছু গল্ফযোগ্য স্পটগুলিতে সামান্য কিছুটা টুইট করে।
  • মূলত সেট-সম্পর্কিত আরও কৌশলগুলি প্রয়োগ করা হয়েছে।
  • প্রোগ্রাম আকারে পরিবর্তিত হয়েছে এবং স্বেচ্ছাসেবী সংখ্যার পরিবর্তে জটিল সংখ্যা ব্যবহার করে পরিবর্তিত হয়েছে m। (জটিল সংখ্যাগুলি হ'ল একটি শক্তিশালী তবে প্রায়শই উপেক্ষা করা গোল্ফ বৈশিষ্ট্য; অন্য চ্যালেঞ্জের জন্য এক্সএনর এর সমাধান থেকে অভিযোজিত )
  • LFRস্ট্রিং প্রতিনিধিত্বকে -1,0,1টিপলসে পরিবর্তন করেছে এবং ক্রেজিট পরিমাণে বাইট হ্রাস (!) এর জন্য নির্ধারিত সময় কার্যকর করা হয়েছে। এখন সমাধানটি তাত্ত্বিকভাবে সঠিক তবে 15 এর ফলাফল আউটপুট দেওয়ার আগে সময়সীমা।
  • জোনাথন ফ্রেচের জন্য এক-লাইনযুক্ত লুপকে ধন্যবাদ জানাতে, তারপরে আমি গণনার জন্য আরও ভাল বিকল্প খুঁজে পেয়েছি r। শেষ পর্যন্ত 300 বাই বাছাই !!!
  • আশ্চর্যজনক 1jপার্সার (-2B) বিভ্রান্তিকর ছাড়া অন্য কিছু বিদ্ধ, এবং পারেন notঅবিশ্বাস্য কম প্রাধান্য (-2B) আছে।

অপ্রচলিত সংস্করণ (480 বাইট):

def C(s):
 m=999;a=[0,1];n=d=1
 D={'F':{},'L':{1:m,m:-1,-1:-m,-m:1},'R':{1:-m,-m:-1,-1:m,m:1}}
 X=lambda x:{x+~m,x-m,x-m+1,x-1,x,x+1,x+m-1,x+m,x-~m}
 for c in s:
  d=D[c].get(d,d);n+=d;a+=n,
  if n in set().union(*map(X,a[:-3])):return 0
 return 1
def f(n):
 if n<3:return 1
 x={*'LF'}
 for _ in range(3,n):x={s+c for s in x for c in({*'LRF'}-{s[-1]})|{'F'}}
 y={*x}
 for s in x:
  if s in y:S=s.translate(str.maketrans('LR','RL'));y-={s[::-1],S,S[::-1]}-{s}
 return sum(map(C,y))

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

মন্তব্যগুলির সাথে নিরবচ্ছিন্ন সমাধান:

t = str.maketrans('LR','RL')

# hole checking function
def check(s):
    m = 999   # (imaginary) board size enough to fit all generated polyominoes
    a = [0,1] # previous path
    n = 1     # current cell
    d = 1     # current direction
    # dict for direction change
    D = {'F':{}, 'L':{1:m, m:-1, -1:-m, -m:1}, 'R':{1:-m, -m:-1, -1:m, m:1}}
    # used to 'blur' all cells in path into 3x3
    X = lambda x: {x-m-1,x-m,x-m+1,x-1,x,x+1,x+m-1,x+m,x+m+1}
    for c in s:
        d = D[c].get(d,d) # change direction
        n += d            # move current cell
        # the polyomino has a hole if the current cell touches previous cells (including diagonally; thus the blurring function)
        if n in set().union(*map(X,a[:-2])): return False
        a.append(n)       # add current cell to the path
    return True

# main function
def f(n):
    if n < 3: return 1
    x = {*'LF'}
    # generate all polystrips using the notation similar to the reference
    for _ in range(3, n): x = {s+c for s in x for c in ({*'LRF'}-{s[-1]})|{'F'}}
    y = {*x}
    # remove duplicates (mirror, head-to-tail, mirror of head-to-tail) but retain self
    for s in x:
        if s in y:
            S = s.translate(t)
            y -= {s[::-1], S, S[::-1]} - {s}
    # finally filter out holey ones
    return sum(map(check,y))

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

m = 999এটি চয়ন করা হয়েছে কারণ এটি সমস্ত কিছু গণনা করতে তাত্পর্যপূর্ণ সময় নেয় এবং এটি ইতিমধ্যে গণনা করতে ~ 8s নিচ্ছে n = 1..15। পরিবর্তে 99 ব্যবহার করে 1 বাইট সংরক্ষণ করা ভাল। আমাদের আর এটির দরকার নেই, এবং এখন এটি নির্বিচার ইনপুট আকারের জন্য সঠিক হওয়ার গ্যারান্টিযুক্ত, অন্তর্নির্মিত জটিল সংখ্যাটির জন্য ধন্যবাদ।


5
পিপিসিজিতে আপনাকে স্বাগতম! আপনার পিপিসিजी ক্যারিয়ার শুরু করার জন্য অবশ্যই একটি চিত্তাকর্ষক উপায়। :)
মার্টিন ইন্ডার

3
পিপিসিজিতে আপনাকে স্বাগতম এবং এই সমাধানের জন্য ধন্যবাদ! সমাধানটি দেখার প্রত্যাশা আমি ইতিমধ্যে ছেড়ে দিয়েছিলাম :)
গ্যালেন ইভানভ

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

1
যে লাইন @Erik অর্ধেক একটা কৌতুক ছিল :) তবে হাঁ, সমাধান এমনকি বিস্ময়কর আমাকে - আমি প্রত্যাশিত নিজেকে কখনো মূল জমা থেকে ~ 36% হ্রাস উঠিয়ে ফেলা।
বুদ্বুদ


4

এপিএল (ডায়ালগ ইউনিকোড) , 70 65 বাইট

+/{∧/2≤|(⊢-¯3↓¨,\)+\0 1\0j1*⍵}¨∪{(⊃∘⍋⊃⊢)(⊢,⌽¨)⍵(-⍵)}¨2-,⍳2↓⎕⍴3

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

নীচের কোডটির পুরো প্রোগ্রাম সংস্করণ, অ্যাডমকে ধন্যবাদ।


এপিএল (ডায়ালগ ইউনিকোড) , 70 বাইট

{+/{∧/2≤|(⊢-¯3↓¨,\)+\0 1\0j1*⍵}¨∪{(⊃∘⍋⊃⊢)(⊢,⌽¨)⍵(-⍵)}¨2-,⍳3⍴⍨0⌈⍵-2}

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

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

উপরের কোডটি নিম্নলিখিত সংজ্ঞার সমতুল্য:

gen←{2-,⍳3⍴⍨0⌈⍵-2}
canonicalize←{(⊃∘⍋⊃⊢)(⊢,⌽¨)⍵(-⍵)}
test←{(∧/⊢{∧/2≤|⍺-¯3↓⍵}¨,\)+\0 1\0j1*⍵}
{+/test¨∪canonicalize¨gen⍵}

এটি পাইথন সমাধানের মতো কাজ করে তবে একটি ভিন্ন ক্রমে। এটা তোলে generates LFRদৈর্ঘ্যের -strips n-2, canonicalizeপ্রতিটি ফালা গুলি, লাগে nique পটির, testপ্রতিটি ফালা গুলি যদি এটা নিজেই স্পর্শ (1 যদি স্পর্শ না, 0 অন্যথায়), এবং অঙ্কের +/বুলিয়ান ফলাফল।

gen

{2-,⍳3⍴⍨0⌈⍵-2}
{            }   ⍵←input number n
        0⌈⍵-2    xmax(0, n-2)
     3⍴⍨         x copies of 3
   ,⍳            multi-dimensional indexes; x-th cartesian power of [1,2,3]
                 (`⍳` gives x-dimensional hypercube; `,` flattens it)
 2-              compute 2-k for each k in the array

 in each strip, ¯1, 0, 1 corresponds to R, F, L respectively

canonicalize

{(⊃∘⍋⊃⊢)(⊢,⌽¨)⍵(-⍵)}
{                  }   ⍵←single strip
              ⍵(-⍵)    nested array of  and its LR-flip
        (⊢,⌽¨)         concatenate their head-to-tail flips to the above
 (⊃∘⍋  )               find the index of the lexicographically smallest item
     ⊃⊢                take that item

test

{(∧/⊢{∧/2≤|⍺-¯3↓⍵}¨,\)+\0 1\0j1*⍵}
{                                  }   ⍵←single strip
                              0j1*⍵    power of i; direction changes
                            ×\         cumulative product; directions
                        0 1,     initial position(0) and direction(1)
                      +\         cumulative sum; tile locations
 (  ⊢{           }¨,\)    test with current tile(⍺) and all tiles up to ⍺(⍵):
             ¯3↓⍵         x←⍵ with last 3 tiles removed
           ⍺-             relative position of each tile of x from 
        2≤|               test if each tile of x is at least 2 units away
      ∧/                  all(...for each tile in x)
  ∧/         all(...for each position in the strip)

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