কালি ব্লকগুলিকে প্রশমিত করতে কাগজ ভাঁজকে অনুকূলিত করুন


19

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

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

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

আরএন গ্রিডের বাম প্রান্তটি ডানদিকে ভাঁজ করে বোঝায়, নবম কলামের পরে শুরু হচ্ছে। ডিএন গ্রিডের উপরের প্রান্তটি নিম্নমুখী ভাঁজ ভাঁজ করে বোঝাচ্ছে, নবম সারিটির পরে শুরু হবে। (এন 1-সূচকযুক্ত)

উদাহরণ

এই গ্রিড দেওয়া

0 1 1 1
0 0 0 0
0 0 0 0

একটি ডি 1 ভাড়ার অর্থ "পুরো উপরের সারিটি নীচে ভাঁজ করুন তারপর ফোল্ড করা"।

0 0.5 0.5 0.5
0 0.5 0.5 0.5
0   0   0   0

তারপরে একটি আর 2 তৈরি করবে

0.25 0.5 0.5 0.25
0.25 0.5 0.5 0.25
   0   0   0    0

এবং অন্য আর 2 এর কোনও পরিবর্তন হবে না।

লক্ষ্য

আপনার লক্ষ্য হ'ল একটি অ্যালগরিদম লিখুন যা প্রতি বারে 8 টি ভাঁজ করে সঠিকভাবে চারটি গ্রিডের জন্য সেরা কালি-ছড়িয়ে পড়া ভাঁজ ক্রম খুঁজে পায় । ভাঁজগুলি কোনও রুপির বা ডিএস এর সংমিশ্রণ হতে পারে।

স্কোরিং

আপনার জমা দেওয়ার স্কোর প্রতিটি গ্রিডের জন্য আপনার স্কোরগুলির যোগফল sum গ্রিডের স্কোর হ'ল তার প্রতিটি মান এবং এর গড় (এর ক্ষেত্রফল দ্বারা বিভক্ত তার যোগফল) এর মধ্যে পরম পার্থক্যগুলির যোগফল। নিম্ন স্কোরগুলি আরও ভাল। 0 এর স্কোর নিখুঁত, তবে এটি কেবল 8 টি ভাগে অসম্ভব।

আপনার উত্তরে আপনার কোড সহ আপনার চারটি 8-পদক্ষেপের ভাঁজক্রমের সিকোয়েন্সগুলি অবশ্যই রিপোর্ট করতে হবে। এটি তাই আমরা আপনার অ্যালগরিদমটি সত্যই কাজ করে যাচাই করতে পারি।

দয়া করে এগুলি এই ফর্মটিতে রাখুন:

20*20R1D2R3D4R5D6R7D8
40*20R1D2R3D4R5D6R7D8
40*40R1D2R3D4R5D6R7D8
20*80R1D2R3D4R5D6R7D8

এখানে একটি পাইথন স্ক্রিপ্ট যা আপনার ভাঁজ অনুক্রমগুলি দেওয়া আপনার স্কোর গণনা করবে।

স্বাভাবিকভাবেই আপনার অন্য কারোর ক্রম জমাটি অনুলিপি করা উচিত নয়। প্রতিটি গ্রিডের সিকোয়েন্সগুলি কেবল সেই ব্যক্তির অন্তর্ভুক্ত যিনি সেগুলি প্রথম তৈরি করেছিলেন।

ব্যাখ্যা

  • আদর্শভাবে আপনার অ্যালগরিদম যে কোনও গ্রিডে ভাল কাজ করবে, যদিও আপনি এটিকে নির্দিষ্ট নির্দিষ্টগুলির সাথে তৈরি করতে পারেন।

  • আপনার কোডটি আপনার ক্রম সহ জমা দিতে হবে। জয়ের জন্য আপনার 8-পদক্ষেপের ভাঁজযুক্ত সিকোয়েন্সগুলির সর্বাধিকতম স্কোরিং সেট দরকার যা ইতিমধ্যে পোস্ট করা হয়নি, এবং একটি অ্যালগরিদম যা জনসাধারণের তদন্তে দাঁড়ায়। আপনার কোডটি ব্যাখ্যা করুন, এটিকে অবহেলা করবেন না।

  • গ্রিডে কখনও নেতিবাচক সংখ্যা থাকা উচিত নয়।

  • স্ট্যান্ডার্ড লুফোলস প্রযোজ্য।


1
আমি মনে করি আপনার কাছে কিছু পরীক্ষার কেস থাকলে এটি ভাল।
justhalf

1
অন্য বিকল্পটি হ'ল লোকেরা তাদের কোডটি সহ যে ক্রম পেয়েছিল তা দিতে বলে, তবে তাদের কোডের একটি হ্যাশ সরবরাহ করতে বলুন (SHA-256 বলুন) প্রমাণ হিসাবে তারা আসলে তাদের নিজস্ব কাজটি ব্যবহার করে এটি উত্পাদন করে। আমি কিছুক্ষণ আগে এই ধরণের প্রক্রিয়াটি দেখেছি মনে আছে তবে মনে করতে পারছি না। কেউ কি সেই চ্যালেঞ্জের দিকে ইঙ্গিত করতে পারে?
justhalf

1
হার্ড-কোডিং নিষিদ্ধ করার আরেকটি উপায় হ'ল চ্যালেঞ্জটিকে অন্য পরীক্ষার ক্ষেত্রেও উন্মুক্ত করা।
হাওয়ার্ড

1
@ ক্যালভিনের শখগুলি আমিও সত্যবাদী হওয়ার জন্য পরীক্ষার কেসগুলির একটি বৃহত্তর সেট পছন্দ করতাম, কারণ কিছু অ্যালগরিদম অন্য গ্রাহকদের চেয়ে কিছু নির্দিষ্ট গ্রিডে আরও ভাল ভাড়া দিতে পারে। আপনি যা করতে পেরেছিলেন তা ভেক্টর রেসিংয়ের সাথে আমি করেছি যা প্রতিটি অংশগ্রহণকারীই বেঞ্চমার্ক সেটে একটি পরীক্ষার কেস যুক্ত করতে পারে। সেক্ষেত্রে আপনাকে সমস্ত সাবমিশন পরীক্ষা ও স্কোর করার জন্য আপনাকে এটি নিতে হবে, কারণ আপনি প্রাথমিক অংশগ্রহণকারীদের পরে পরীক্ষার কেস যুক্ত করার সাথে তাদের কোডটি পুনরায় চালু করার আশা করতে পারবেন না।
মার্টিন ইন্ডার

1
@ ক্যালভিনের শখগুলি ব্রুট ফোর্স (19 + 39) ^ 8 (মাইনাস কিছু প্রতিসাম্য) যা অনেক বেশি সম্ভাব্য।
হাওয়ার্ড

উত্তর:


8

পাইথন

প্রথম কয়েকটি ভাঁজগুলির জন্য এক্সট্রিভালি ভাঁজগুলির বিভিন্ন সংমিশ্রণ চেষ্টা করে, তারপরে লোভী পদ্ধতির সাহায্যে বাকী ভাঁজগুলি করে।

বিস্তৃত পদ্ধতির কেন্দ্রে ভাঁজগুলির যুক্তিসঙ্গত সীমার মধ্যে আবদ্ধ থাকে, যেমন এটি চিরকাল লাগে না, যখন খুব ভাল ন্যূনতম ফলন পাওয়ার জন্য খুব বেশি সম্ভাব্য ভাঁজগুলি উপেক্ষা করে না।

আমার ম্যাকবুক এয়ারে পাইপির সাহায্যে দৌড়ান

উত্তর:

20*20D9R15R6D11R10R9D10R11
40*20D6D13D9R19R21R20D11D10
40*40D21R21R11D19R23R20D23D15
20*80D33D47D40R10D39D41R9R11

আউটপুট:

Exhaustive folds levels: 3
Percentage pruned from sides from exhaustive folds: 0.2
Time taken: 4.016076s
Score: 7.91125
20*20D9R15R6D11R10R9D10R11

Exhaustive folds levels: 3
Percentage pruned from sides from exhaustive folds: 0.2
Time taken: 28.529278s
Score: 16.34375
40*20D6D13D9R19R21R20D11D10

Exhaustive folds levels: 3
Percentage pruned from sides from exhaustive folds: 0.25
Time taken: 98.430465s
Score: 42.13
40*40D21R21R11D19R23R20D23D15

Exhaustive folds levels: 3
Percentage pruned from sides from exhaustive folds: 0.25
Time taken: 234.873787s
Score: 32.30875
20*80D33D47D40R10D39D41R9R11

মোট স্কোর: 7.91125 + 16.34375 + 42.13 + 32.30875 = 98.69375

কোড:

import time, math
from collections import deque

numberOfFolds = 8 # Total number of folds

startTime = time.clock()

exec "grid = ("+"""
1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1
1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1
0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0
0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 0 1
0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0
1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1
0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0
1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1
1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0
0 1 1 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1
0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0
0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1
0 0 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1
1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
0 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 1
0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0
0 1 1 0 1 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0
0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 
""".replace(" ",",").replace("\n","],[")[2:-2]+")"

def getAverage(grid):
    count = total = 0
    for j in grid:
        for i in j:
            count += 1
            total += i
    return total/float(count)

def getScore(grid, average):
    score = 0
    for j in grid:
        for i in j:
            score += abs(average-i)
    return score

def downFoldedGrid(grid, row, width, height, copy=True):
    if copy: grid = [r[:] for r in grid]
    foldRange = min(row, height-row)
    for j in xrange(foldRange):
        rowRef1 = grid[row+j]
        rowRef2 = grid[row-1-j]
        for i in xrange(width):
            rowRef1[i] = rowRef2[i] = (rowRef1[i] + rowRef2[i]) * .5
    return grid

def downFoldedScore(grid, score, average, row, width, height):
    foldRange = min(row, height-row)
    average2  = 2*average
    for j in xrange(foldRange):
        rowRef1 = grid[row+j]
        rowRef2 = grid[row-1-j]
        a = b = c = 0
        for i in xrange(width):
            a = rowRef1[i] 
            b = rowRef2[i]
            c = a+b
            score += abs(average2-c) - abs(average-a) - abs(average-b)
    return score

def rightFoldedGrid(grid, column, width, height, copy=True):
    if copy: grid = [r[:] for r in grid]
    foldRange = min(column, width-column)
    for j in xrange(height):
        rowRef = grid[j]
        for i in xrange(foldRange):
            a = column+i
            b = column-1-i
            rowRef[a] = rowRef[b] = (rowRef[a] + rowRef[b]) * .5
    return grid

def rightFoldedScore(grid, score, average, column, width, height):
    foldRange = min(column, width-column)
    average2 = 2*average
    for j in xrange(height):
        rowRef = grid[j]
        a = b = c = 0
        for i in xrange(foldRange):
            a = rowRef[column+i]
            b = rowRef[column-1-i]
            c = a+b
            score += abs(average2-c) - abs(average-a) - abs(average-b)
    return score

def bestFoldsGreedy(grid, average, maxFolds, width, height):
    score  = getScore(grid, average)
    folds  = []
    append = folds.append
    for z in xrange(maxFolds):
        bestFold      = 0
        bestFoldScore = score
        bestFoldGrid  = grid
        for i in xrange(1, width): #Try all right folds
            foldScore = rightFoldedScore(grid, score, average, i, width, height)
            if foldScore < bestFoldScore:
                bestFold      = i
                bestFoldScore = foldScore
        for i in xrange(1, height): #Try all down folds
            foldScore = downFoldedScore(grid, score, average, i, width, height)
            if foldScore < bestFoldScore:
                bestFold      = -i
                bestFoldScore = foldScore
        if bestFold:
            append(bestFold)
            score = bestFoldScore
            if bestFold > 0: rightFoldedGrid(grid, bestFold, width, height, False)
            else:            downFoldedGrid(grid, -bestFold, width, height, False)
    return score, folds


# Get the height and width
height  = len(grid)
width   = len(grid[0])

# Transpose the grid if height > width for better locality of reference
transposed = False
if height > width:
    grid = [[grid[i][j] for i in range(height)] for j in range(width)]
    transposed = True
    height, width = width, height

# The exhaustive grids and folds attempted
exhaustiveGridsAndFolds = deque([(grid,[])])
popleft = exhaustiveGridsAndFolds.popleft
append  = exhaustiveGridsAndFolds.append

# Set the bounds to exhaustively test for
exhaustiveLevels   = 3
prunePadding       = [0.2, 0.25][width*height > 1000]
leftBound          = int(max(width*prunePadding, 1))
rightBound         = int(width*(1.0-prunePadding))
topBound           = int(max(height*prunePadding, 1))
bottomBound        = int(height*(1.0-prunePadding))

# Populate the exhaustive grids and folds
while 1:
    grid, folds = popleft()
    if len(folds) == exhaustiveLevels:
        append((grid, folds))
        break
    for i in xrange(leftBound, rightBound):
        if i not in folds:
            append((rightFoldedGrid(grid, i, width, height), folds+[i]))
    for i in xrange(topBound, bottomBound):
        if -i not in folds:
            append((downFoldedGrid(grid, i, width, height), folds+[-i]))

# Test all the exhaustive grids and folds greedily
average             = getAverage(grid)
bestFinalScore      = getScore(grid, average)
bestFinalFolds      = []
numberOfGreedyFolds = numberOfFolds-exhaustiveLevels
while exhaustiveGridsAndFolds:
    grid, exhaustiveFolds = popleft()
    finalScore, greedyFolds = bestFoldsGreedy(grid, average, numberOfGreedyFolds, width, height)
    if finalScore <= bestFinalScore:
        bestFinalScore = finalScore
        bestFinalFolds = exhaustiveFolds + greedyFolds


# Repeat the last fold till the total number of folds if needed
if len(bestFinalFolds) < numberOfFolds:
    bestFinalFolds += [bestFinalFolds[-1]]*(numberOfFolds-len(bestFinalFolds))

# Print the best result
foldsString = ""
down  = "D"
right = "R"
if transposed:
    down,  right  = right,  down
    width, height = height, width
for fold in bestFinalFolds:
    if   fold > 0: foldsString += right+str(fold)
    elif fold < 0: foldsString += down+str(-fold)
print "Exhaustive folds levels: " + str(exhaustiveLevels)
print "Percentage pruned from sides from exhaustive folds: " + str(prunePadding)
print "Time taken: " + str(time.clock()-startTime) + "s"
print "Score: " + str(bestFinalScore)
print str(width) + "*" + str(height) + foldsString

2
ঠিক আছে, আমি এখন এটি নিয়ে কাজ বন্ধ করতে পারি। এটি ঠিক আমার অ্যালগরিদম হত।
মার্টিন ইন্ডার

@ বিটপউনার আপনি এখনও গ্রিড গড় হিসাবে 0.5 ব্যবহার করছেন তবে গ্রিডের উপর নির্ভর করে এটি আসলে কিছুটা আলাদা। আমার লিপি আইডিয়োনে / 5 ডাব্লুআরওকিউতে আপনি 103.31 মোটের জন্য 8.26, 17.71875, 44.61125 এবং 32.72 স্কোর করছেন।
ক্যালভিনের শখ 23

5

সি, 16.344 (4 মিনিট 33 সেকেন্ড)

এখনও অবধি সেরা চালগুলি পাওয়া গেছে: ডি 6, ডি 13, আর 19, ডি 9, ডি 11, আর 21, ডি 10, আর 20

মন্টি কার্লো এবং পাহাড়ী আরোহণের মিশ্রণ ব্যবহার করে। আরও দ্রুত চালানোর জন্য তৈরি করা যেতে পারে, আমি নিশ্চিত।

#include <stdio.h>
#include <stdlib.h>

/*

Best result so far: 16.344
D6,D13,R19,D9,D11,R21,D10,R20

real    4m33.027s
user    4m12.787s
sys 0m1.334s

*/

#define GRID_WIDTH   40
#define GRID_HEIGHT  20
#define GRID_SIZE    (GRID_WIDTH * GRID_HEIGHT)
#define NUM_FOLDS    8
#define MAX_VALUE    (1 << NUM_FOLDS)
#define TARGET_VALUE (MAX_VALUE / 2)

double score_grid(short *g) {
  int i, sum;
  for (i=sum=0; i<GRID_SIZE; i++) sum += abs(*g++ - TARGET_VALUE);
  return sum * 1.0 / MAX_VALUE;
}

void h_fold(short *g, int fold_row) {
  int x, y0, y1;
  if (fold_row<1 || fold_row>=GRID_HEIGHT) return;
  y1 = fold_row * GRID_WIDTH;
  y0 = y1 - GRID_WIDTH;
  while (y0>=0 && y1<GRID_SIZE) {
    for (x=0; x<GRID_WIDTH; x++) {
      g[y0+x] = g[y1+x] = (g[y0+x] + g[y1+x]) >> 1;
    }
    y0 -= GRID_WIDTH;
    y1 += GRID_WIDTH;
  }
}

void v_fold(short *g, int fold_col) {
  int y, x0, x1;
  if (fold_col<1 || fold_col>=GRID_WIDTH) return;
  x1 = fold_col;
  x0 = x1 - 1;
  while (x0>=0 && x1<GRID_WIDTH) {
    for (y=0; y<GRID_SIZE; y+=GRID_WIDTH) {
      g[y+x0] = g[y+x1] = (g[y+x0] + g[y+x1]) >> 1;
    }
    x0--;
    x1++;
  }
}

void print_grid(short *g) {
  int i=0, checksum=0;
  while (i<GRID_SIZE) {
    checksum += *g;
    printf("%3X",*g++);
    if ((++i) % GRID_WIDTH == 0) putchar('\n');
  }
  if (checksum != GRID_SIZE * TARGET_VALUE) printf("Bad total: %d\n",checksum);
}

void init_grid(short *g) {
  int i;
  static short *start_grid=0, *sg;
  if (!start_grid) {
    char *src = "11010110100011100000001000110001001101010111000100100100000101100000101111000010"
                "10110011111011111101101011111001000010101010110111000101000001011111101000011001"
                "10000111111001111011100101101001101100001110001101001011010011011110101000011100"
                "00110010100010100010110101001100110001100100111010000110100110001000110000111101"
                "01000001110000101000110101011011101010111110101010110000001011010010000011101000"
                "11111011111100100100100010111010111111000101011110000100111111111000110101101101"
                "00110100010111101111000011011010000110001001101010010101110010110111101001011111"
                "10110001101100001110010100110100010011011110100110000100100111101101000010011001"
                "00011100110100111101000000001000010100001101001011000101101001000100111100011010"
                "00010110001110011111100011101111011100111001110011111011010010000100101111101001";
    start_grid = malloc(GRID_SIZE * sizeof(short));
    for (i=0; i<GRID_SIZE; i++) start_grid[i] = (src[i]&1)<<NUM_FOLDS;
  }
  sg = start_grid;
  for (i=0; i<GRID_SIZE; i++) *g++ = *sg++;
}

double evaluate(int *moves) {
  short *grid;
  double score;
  int i, f;
  grid = malloc(GRID_SIZE * sizeof(short));
  init_grid(grid);
  for (i=0; i<NUM_FOLDS; i++) {
    f = moves[i];
    if (f>0) v_fold(grid,f);
    else h_fold(grid,-f);
  }
  score = score_grid(grid);
  free(grid);
  return score;
}


double optimize_folding(int *moves, double score) {
  int opt_cycle, i, which_fold, new_move, f1, f2, t;
  double s;

  for (opt_cycle=0; opt_cycle<1000; opt_cycle++) {
    for (i=0; i<NUM_FOLDS; i++) {
      which_fold = random() % NUM_FOLDS;
      do {
        if (random()&1) new_move = random() % (GRID_WIDTH-1) + 1;
        else new_move = -(random() % (GRID_HEIGHT-1) + 1);
      } while (moves[which_fold]==new_move);
      t = moves[which_fold];
      moves[which_fold] = new_move;
      s = evaluate(moves);
      if (s>score) moves[which_fold] = t;
      else score = s;
    }
    for (i=0; i<NUM_FOLDS; i++) {
      f1 = random() % NUM_FOLDS;
      do {
        f2 = random() % NUM_FOLDS;
      } while (f2==f1);
      t = moves[f1];
      moves[f1] = moves[f2];
      moves[f2] = t;
      s = evaluate(moves);
      if (s>score) {
        t = moves[f1];
        moves[f1] = moves[f2];
        moves[f2] = t;
      }
      else score = s;
    }
  }

  return score;
}

void show_moves(int *moves) {
  int i, m;
  for (i=0; i<NUM_FOLDS; i++) {
    m = moves[i];
    printf("%c%d%c",(m>0)?'R':'D',abs(m),((i+1)%NUM_FOLDS)?',':'\n');
  }
}

int main() {
  int i, j, moves[NUM_FOLDS], save_moves[NUM_FOLDS];
  double score, best_score = 1.0E+99;

  srandomdev();
  for (i=0; i<400; i++) {
    for (j=0; j<NUM_FOLDS; j++) {
            if (random()&1) moves[j] = random() % (GRID_WIDTH-1) + 1;
            else moves[j] = -(random() % (GRID_HEIGHT-1) + 1);
        }
        score = optimize_folding(moves, 1.0E+99);
        if (score<best_score) {
            best_score = score;
            for (j=0; j<NUM_FOLDS; j++) save_moves[j]=moves[j];
        }
    }
  printf("%.3lf\n",best_score);
  show_moves(save_moves);
  return 0;
}

বাঃ। সবেমাত্র লক্ষ্য হয়েছে যে প্রশ্নটি পাল্টে গেছে। আমি পরে এই সমাধানের জন্য ... আছে
খুঁতখুঁতে ossifrage

বর্তমানে আমি আপনার 40 * 20 এর জন্য 16.34375 এর শালীন স্কোর পাচ্ছি।
ক্যালভিনের শখ 23
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.