ত্রিভুজগুলি হারানো ছাড়াই ত্রিভুজাকার অ্যারে থেকে পয়েন্টগুলি সরিয়ে ফেলা হচ্ছে


17

আমার একটি সংযুক্তি সমস্যা আছে যা আমি OEIS- এ রাখতে চাই। সমস্যাটি হ'ল আমার পর্যাপ্ত শর্ত নেই। এই কোড চ্যালেঞ্জটি হ'ল আমাকে আরও শর্তগুলি গণনা করতে সহায়তা করবে এবং বিজয়ী সর্বাধিক সংখ্যক শর্তাদি জমা সহ ব্যবহারকারী হবে।


সমস্যাটি

ধরুন আমি আপনার সাথে পাশ দৈর্ঘ্য আলোর বাল্ব একটি ত্রিকোণ অ্যারের দিতে এন :

     o
    o o
   o o o
  o o o o
 o o o o o
o o o o o o
1 2  ...  n

আমি তিনটি লাইটব্লব চালু করতে যাচ্ছি যা নিম্নলিখিত উদাহরণের মতো একটি "খাড়া" সমান্তরাল ত্রিভুজ গঠন করে:

     o
    o x
   o o o
  o o o o
 o x o o x
o o o o o o

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

উদাহরণস্বরূপ, আপনি যদি নিম্নলিখিত বাল্বগুলি সরিয়ে ফেলেন (চিহ্নিত করে .) আপনি কেবল নীচের দুটি লাইট চালু দেখতে পেয়েছেন (চিহ্নিত করেছেন x) যা তৃতীয় (আনলিট) অবস্থানটি অনন্যভাবে কাটাতে যথেষ্ট:

     .              .
    . o            . x
   . . o          . . o
  o o o .   =>   o o o .
 o o o o .      o x o o . <- the third unlit position
o . . . o o    o . . . o o

দিন a(n)যে কোনো অস্পষ্টতা উপস্থাপক ছাড়া মুছে ফেলা হতে পারে বাল্ব সর্বোচ্চ সংখ্যক হও।


উদাহরণ

নিখরচায় অ্যালগরিদম সহ, আমি নীচে দেখানো হিসাবে পাশের দৈর্ঘ্য 7 সহ ত্রিভুজ পর্যন্ত মানগুলি পরীক্ষা করেছি:

                                                                      .
                                                      .              . o
                                        .            . o            o . o
                           .           . .          . . o          . o o .
              .           . .         . o o        o o o .        o o . o .
 .           . .         . o o       o o . o      o o o o .      o . o . o o
. .         . o o       . o o o     o . . o o    o . . . o o    o . o . o o o

a(2) = 3    a(3) = 4    a(4) = 5    a(5) = 7     a(6) = 9       a(7) = 11

স্কোরিং

[a(2), a(3), ..., a(n)]সবচেয়ে বড় এন জয়ের জন্য ক্রমটি গণনা করে এমন জমা দেওয়া । যদি দুটি সাবমিশনগুলির অভিন্ন ক্রম থাকে তবে তার আগে পোস্ট করা একটি জিতে w

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


1
এটি কি দ্রুততম কোডের চেয়ে কোড-চ্যালেঞ্জ নয়?
ডন হাজার হাজার

6
আমি মনে করি আপনার একটি সময়সীমা বাছাই করা উচিত (বলুন, 60 এর দশক) যাতে প্রতিযোগিতা কেউ তাদের কোড চালাতে কত সময় ব্যয় করে সে সম্পর্কে নয়।
dylnan

চমৎকার সমস্যা। "খাড়া" ত্রিভুজ বলতে কী বোঝ?
ড্যামিয়েন

উত্তর:


10

পাইথন 3 ,n=8

import itertools
from ortools.sat.python import cp_model


def solve(n):
    model = cp_model.CpModel()
    solver = cp_model.CpSolver()
    cells = {
        (y, x): model.NewBoolVar(str((y, x)))
        for y in range(n) for x in range(y + 1)}
    triangles = [
            {cells[v] for v in ((y1, x1), (y2, x1), (y2, x1 + y2 - y1))}
            for (y1, x1) in cells.keys() for y2 in range(y1 + 1, n)]
    for t1, t2 in itertools.combinations(triangles, 2):
        model.AddBoolOr(t1.symmetric_difference(t2))
    model.Minimize(sum(cells.values()))
    solver.Solve(model)
    return len(cells) - round(solver.ObjectiveValue())


for n in itertools.count(2):
    print('a(%d) = %d' % (n, solve(n)))

ব্যবহার Google বা-tools 'সিপি-স্যাট সমাধানকারী।

30 সেকেন্ডের জন্য দৌড়ানোর পরে, এটি নিম্নলিখিতগুলি ছাড়িয়ে যায়:

a(2) = 3
a(3) = 4
a(4) = 5
a(5) = 7
a(6) = 9
a(7) = 11
a(8) = 13

n=9এন6a(9)=15n=8

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

টি1টি2টি1টি2

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

পিএস: আমি এর জন্য একটি উদাহরণ অন্তর্ভুক্ত করতে চাই n=8, তবে আমার স্যাট সলভারের সাথে সমস্যা রয়েছে যা স্পষ্টতই সমাধানগুলি নিজেরাই সমাধান করতে চায়।


আমি সমাধানটি ম্যাথমেটিকায় বন্দরের সিদ্ধান্ত নিয়েছি , যা দুর্ভাগ্যক্রমে ধীর।
ব্যবহারকারী 202729

2

@ ডেলফ্যাড0r এর প্রোগ্রাম থেকে সমাধানগুলি পাওয়া

আমি @ ডেল্ফ্যাড ০ এর প্রোগ্রাম আউটপুট সমাধানগুলিতে প্রসারিত করেছি। এটি মধ্যবর্তী ফলাফলও দেয়, সুতরাং আপনি এরকম আউটপুট পান:

Solving n = 8:
a(8) >= 9
a(8) >= 10
a(8) >= 11
a(8) >= 12
a(8) >= 13
       o
      . o
     . o o
    . o o .
   o o . o o
  o o o o . .
 o . . o o o .
o . . o . o o o
a(8) = 13

Solving n = 9:
a(9) >= 10
a(9) >= 13
a(9) >= 14
a(9) >= 15
        o
       o o
      o . .
     o . o o
    . o . o o
   . o o o o o
  o o o . o . .
 o o o . . . o o
. o o o o o o . .
a(9) = 15

এই গণনাটি বেশ কয়েক ঘন্টা সময় নিয়েছে।

আপনি যদি অধৈর্য হয়ে যান এবং Ctrl-Cকিছু সম্ভাব্য-অনুকূল-সমাধান না পাওয়ার পরে চাপ দেন, প্রোগ্রামটি সেই সমাধানটি প্রদর্শন করবে। সুতরাং এটি পেতে খুব বেশি সময় লাগে না:

                   .
                  o o
                 . o o
                . o o o
               o o . o o
              o . o o o .
             o . o . o o o
            . o o o o o . o
           o . . o o o o o o
          o o o o o o o o o .
         o o . o o o o . o o o
        o o o o o o . o . o o o
       o . o o . o o o o o o o o
      o o o . o o o o o . o o o o
     o o o . o o o o o o o o . . o
    o o o o o o o o o o o . o . . o
   o o o o . o o o o . o o o o o . o
  o o o o o o o o . o o . . o o o o .
 o o o o . o o . o . o o o o o o . o o
o o . o o . o o o o . o o o . o o o o o
a(20) >= 42

এখানে বর্ধিত প্রোগ্রাম:

import itertools
from ortools.sat.python import cp_model

class ReportPrinter(cp_model.CpSolverSolutionCallback):

    def __init__(self, n, total):
        cp_model.CpSolverSolutionCallback.__init__(self)
        self.__n = n
        self.__total = total

    def on_solution_callback(self):
        print('a(%d) >= %d' %
              (self.__n, self.__total-self.ObjectiveValue()) )

def solve(n):
    model = cp_model.CpModel()
    solver = cp_model.CpSolver()
    cells = {
        (y, x): model.NewBoolVar(str((y, x)))
        for y in range(n) for x in range(y + 1)}
    triangles = [
            {cells[v] for v in ((y1, x1), (y2, x1), (y2, x1 + y2 - y1))}
            for (y1, x1) in cells.keys() for y2 in range(y1 + 1, n)]
    for t1, t2 in itertools.combinations(triangles, 2):
        model.AddBoolOr(t1.symmetric_difference(t2))
    model.Minimize(sum(cells.values()))
    print('Solving n = %d:' % n)
    status = solver.SolveWithSolutionCallback(model, ReportPrinter(n,len(cells)))
    if status == cp_model.OPTIMAL:
        rel = '='
    elif status == cp_model.FEASIBLE:
        rel = '>='
    else:
        print('No result for a(%d)\n' % n)
        return
    for y in range(n):
        print(' '*(n-y-1), end='')
        for x in range(y+1):
            print('.o'[solver.Value(cells[(y,x)])],end=' ')
        print()
    print('a(%d) %s %d' % (n, rel, len(cells) - solver.ObjectiveValue()))
    print()

for n in itertools.count(2):
    solve(n)

1

পাইথন ঘ

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

examples = dict() # stores examples by key pair of n to a tuple with the triangle and number of lights turned off

for n in range(3, 8):
    tri = [] # model of the triangle, to be filled with booleans representing lights
    tri_points = [] # list of tuples representing points of the triangle
    for i in range(n):
        tri.append([True]*(i + 1))
        for j in range(i+1):
            tri_points.append((i, j))

    t_set = [] # list of all possible triangles from tri, represented by lists of points
    for i in range(n):
        for j in range(len(tri[i])):
            for k in range(1, n - i):
                t_set.append([(i, j), (i + k, j), (i + k, j + k)])

    from itertools import combinations
    import copy

    # validates whether or not a triangle of n lights can have i lights turned off, and saves an example to examples if validated
    def tri_validate(x):
        candidate_list = list(combinations(tri_points, x))
        tri_pairs = list(combinations(t_set, 2))
        for candidate in candidate_list:
            temp_tri = copy.deepcopy(tri)
            valid = False
            for point in candidate:
                (row, col) = point
                temp_tri[row][col] = False
            for pair in tri_pairs:
                valid = False
                (tri1, tri2) = pair
                for point in tri1:
                    if not valid:
                        if point not in tri2:
                            (row, col) = point
                            if temp_tri[row][col]:
                                valid = True
                for point in tri2:
                    if not valid:
                        if point not in tri1:
                            (row, col) = point
                            if temp_tri[row][col]:
                                valid = True
                if not valid:
                    break
            if valid:
                examples[n] = (temp_tri, x)
                return True
        return False

    # iterates up to the point that validation fails, then moves on to the next n
    for i in range(len(tri_points)):
        if tri_validate(i + 1):
            continue
        break

সমস্যাটি হচ্ছে, এটি খুব দক্ষ নয়। এটি সত্যিই দ্রুতগতিতে চলে n=5, তবে উল্লেখযোগ্যভাবে ধীরে ধীরে ধীরে এটি শুরু হয়। এ n=6, এটি চালানোর জন্য এক মিনিট প্রায় নেয় এবং অনেক মন্থর n=7। আমি কল্পনা করেছি যে এই প্রোগ্রামের সাহায্যে অনেকগুলি দক্ষতা সংশোধন করা যেতে পারে তবে এই পদ্ধতির অভ্যন্তরীণ কাজগুলি পরীক্ষা করার জন্য এটি আরও অনেক নমনীয়তার সাথে একটি ভাল সমাধানের একটি দ্রুত তৈরি রুক্ষ খসড়া। আমি সময়ের সাথে ক্রমে ক্রমে এই কাজ করব।

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