2-বর্ণের সংমিশ্রণগুলি ভিজ্যুয়ালাইজ করা


10

এসও-তে এই প্রশ্নের উত্তরগুলি প্রায় 125 এক-থেকে দ্বি-বর্ণের নামের একটি সেট ফেরত দিয়েছে: /programming/6979630/ কি -1-2-letter-object-names-conflict-with- existing -r-বস্তু

  [1] "Ad" "am" "ar" "as" "bc" "bd" "bp" "br" "BR" "bs" "by" "c"  "C" 
 [14] "cc" "cd" "ch" "ci" "CJ" "ck" "Cl" "cm" "cn" "cq" "cs" "Cs" "cv"
 [27] "d"  "D"  "dc" "dd" "de" "df" "dg" "dn" "do" "ds" "dt" "e"  "E" 
 [40] "el" "ES" "F"  "FF" "fn" "gc" "gl" "go" "H"  "Hi" "hm" "I"  "ic"
 [53] "id" "ID" "if" "IJ" "Im" "In" "ip" "is" "J"  "lh" "ll" "lm" "lo"
 [66] "Lo" "ls" "lu" "m"  "MH" "mn" "ms" "N"  "nc" "nd" "nn" "ns" "on"
 [79] "Op" "P"  "pa" "pf" "pi" "Pi" "pm" "pp" "ps" "pt" "q"  "qf" "qq"
 [92] "qr" "qt" "r"  "Re" "rf" "rk" "rl" "rm" "rt" "s"  "sc" "sd" "SJ"
[105] "sn" "sp" "ss" "t"  "T"  "te" "tr" "ts" "tt" "tz" "ug" "UG" "UN"
[118] "V"  "VA" "Vd" "vi" "Vo" "w"  "W"  "y"

এবং আর আমদানি কোড:

nms <- c("Ad","am","ar","as","bc","bd","bp","br","BR","bs","by","c","C","cc","cd","ch","ci","CJ","ck","Cl","cm","cn","cq","cs","Cs","cv","d","D","dc","dd","de","df","dg","dn","do","ds","dt","e","E","el","ES","F","FF","fn","gc","gl","go","H","Hi","hm","I","ic","id","ID","if","IJ","Im","In","ip","is","J","lh","ll","lm","lo","Lo","ls","lu","m","MH","mn","ms","N","nc","nd","nn","ns","on","Op","P","pa","pf","pi","Pi","pm","pp","ps","pt","q","qf","qq","qr","qt","r","Re","rf","rk","rl","rm","rt","s","sc","sd","SJ","sn","sp","ss","t","T","te","tr","ts","tt","tz","ug","UG","UN","V","VA","Vd","vi","Vo","w","W","y")

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

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

এটি কীভাবে সবচেয়ে স্পষ্টভাবে এবং দক্ষতার সাথে ভিজ্যুয়ালাইজড হতে পারে?

ভিজ্যুয়ালাইজেশন যা নীচের যেকোন একটিকে এই প্রশ্নের আত্মায় ফিট করে:

  • প্রাথমিক লক্ষ্য: ডেটাতে নিদর্শনগুলি প্রকাশ করে নামগুলির সেটটির স্মরণীয়তা বৃদ্ধি করুন

  • বিকল্প লক্ষ্য: নামের সেটগুলির আকর্ষণীয় বৈশিষ্ট্যগুলি হাইলাইট করুন (উদাহরণস্বরূপ যা বিতরণটি দৃশ্যমান করতে সহায়তা করে, সর্বাধিক সাধারণ অক্ষর ইত্যাদি)

আর-তে উত্তরগুলি অগ্রাধিকার দেওয়া হয় তবে সমস্ত আকর্ষণীয় ধারণা স্বাগত welcome

একক-বর্ণের নামগুলি উপেক্ষা করার অনুমতি রয়েছে, কারণ এগুলি কেবল আলাদা তালিকা হিসাবে দেওয়া সহজ।

উত্তর:


12

এখানে একটি শুরু: প্রথম এবং দ্বিতীয় বর্ণের গ্রিডে এগুলি দেখুন:

combi <- c("Ad", "am", "ar", "as", "bc", "bd", "bp", "br", "BR", "bs", 
"by", "c",  "C",  "cc", "cd", "ch", "ci", "CJ", "ck", "Cl", "cm", "cn", 
"cq", "cs", "Cs", "cv", "d",  "D",  "dc", "dd", "de", "df", "dg", "dn", 
"do", "ds", "dt", "e",  "E",  "el", "ES", "F",  "FF", "fn", "gc", "gl", 
"go", "H",  "Hi", "hm", "I",  "ic", "id", "ID", "if", "IJ", "Im", "In", 
"ip", "is", "J",  "lh", "ll", "lm", "lo", "Lo", "ls", "lu", "m",  "MH", 
"mn", "ms", "N",  "nc", "nd", "nn", "ns", "on", "Op", "P",  "pa", "pf", 
"pi", "Pi", "pm", "pp", "ps", "pt", "q",  "qf", "qq", "qr", "qt", "r",  
"Re", "rf", "rk", "rl", "rm", "rt", "s",  "sc", "sd", "SJ", "sn", "sp", 
"ss", "t",  "T",  "te", "tr", "ts", "tt", "tz", "ug", "UG", "UN", "V",  
"VA", "Vd", "vi", "Vo", "w",  "W",  "y")

df <- data.frame (first = factor (gsub ("^(.).", "\\1", combi), 
                                  levels = c (LETTERS, letters)),
                  second = factor (gsub ("^.", "", combi), 
                                  levels = c (LETTERS, letters)),
                  combi = combi))

library(ggplot2)
ggplot (data = df, aes (x = first, y = second)) + 
   geom_text (aes (label = combi), size = 3) + 
   ## geom_point () +
   geom_vline (x = 26.5, col = "grey") + 
   geom_hline (y = 26.5, col = "grey")

(ছিল দুটি চিঠি:) চিঠি সহ গ্রিড

ggplot (data = df, aes (x = second)) + geom_histogram ()

দ্বিতীয় চিঠি

ggplot (data = df, aes (x = first)) + geom_histogram ()

প্রথম অক্ষর

আমি জড়ো করা:

  • একটি বর্ণের নাম,

    • সৌভাগ্যবশত i, j, k, এবং lউপলব্ধ (তাই আমি 4D অ্যারে সূচক আপ করতে পারেন)
    • দুর্ভাগ্যক্রমে t(সময়), c(ঘনত্ব) চলে গেছে। সুতরাং m(ভর), V(আয়তন) এবং F(বল) ব্যাসার্ধ rবা ব্যাস নেই d
    • যদিও আমার চাপ ( p), পদার্থের পরিমাণ ( n) এবং দৈর্ঘ্য থাকতে পারে l
    • হতে পারে আমাকে গ্রীক নামে পরিবর্তন করতে হবে: εঠিক আছে, তবে তা করা উচিত নয়

      π <- pi

      ?

  • আমি যা lowerUPPERখুশি নাম রাখতে পারি।

  • সাধারণভাবে, বড় হাতের অক্ষর দিয়ে শুরু করা ছোট হাতের চেয়ে নিরাপদ বাজি।

  • cবা দিয়ে শুরু করবেন নাd


দুর্দান্ত শুরু। উচ্চ / নিম্নের অক্ষরগুলি কোথায় যায় সে সম্পর্কে আরও ভাল ধারণা দেওয়ার জন্য 2 ডি প্লটের মাধ্যমে চতুর্ভুজরেখাগুলি (একটি বড় + তে) যুক্ত করুন?
এরি বি ফ্রেডম্যান

ভেবেছিলাম আমি তা করেছি। যাইহোক, এখানে। @ gsk3: ছবি আপলোড করার জন্য ধন্যবাদ!
এসবিএল-এর সাথে অসন্তুষ্ট কিবেলাইটস

খুশী হলাম। এবং বিপরীতে, প্রম্পট # 2 এর একটি আকর্ষণীয় উত্তর দেওয়ার জন্য ধন্যবাদ। :-)
আরি বি ফ্রেডম্যান

আপনার 2 ডি প্লটটির দিকে তাকানোর জন্য, অন্য একটি পরামর্শ হতে পারে এটি একটি 27x26 গ্রিডে হ্রাস করা এবং প্রদত্ত চিঠির নিম্ন / উচ্চ / উভয় অক্ষর থাকলে চিহ্ন বা রং (বা আলফা সহ জিটার) পরিবর্তন করা। এটিকে দৃশ্যত পৃথক করার জন্য এনএ সারিটিকে আলাদা রঙ করতে পারে।
এরি বি ফ্রেডম্যান

1
উত্তর পোস্ট করার আগে আমার 27 x 26 এ নজর ছিল (প্রথম এবং দ্বিতীয় বর্ণ অনুসারে রঙ এবং আকারের সাথে আপার ক্ষেত্রে থাকবে)। তবে এটি কোনও সহজ বার্তা দেয়নি, তাই আমি তত্ক্ষণাত বৃহত্তর গ্রিডে ফিরে গেলাম।
এসবিএক্স 8:40 '

8

ঠিক আছে, এসও প্রশ্ন এবং অন্যের মন্তব্যের ভিত্তিতে একটি "পর্যায় সারণী" -র মতো ভিজ্যুয়ালাইজেশনের জন্য আমার খুব তাড়াতাড়ি। মূল সমস্যা হ'ল প্যাকেজগুলির মধ্যে ভেরিয়েবলের সংখ্যার মধ্যে বড় পার্থক্য, কোন ধরণের দৃশ্যধারণাকে বাধা দেয় ... আমি বুঝতে পারি এটি অত্যন্ত রুক্ষ, সুতরাং দয়া করে আপনার ইচ্ছামত এটি পরিবর্তন করতে দ্বিধা বোধ করুন।

এখানে বর্তমান আউটপুট (আমার প্যাকেজ তালিকা থেকে) উদাহরণ প্লট

এবং কোড

# Load all the installed packages
lapply(rownames(installed.packages()), require, 
       character.only = TRUE)
# Find variables of length 1 or 2
one_or_two <- unique(apropos("^[a-zA-Z]{1,2}$"))
# Find which package they come from
packages <- lapply(one_or_two, find)
# Some of the variables may belong to multiple packages, so determine the length 
# of each entry in packages and duplicate the names accordingly
lengths <- unlist(lapply(packages, length))
var.data <- data.frame(var = rep(one_or_two, lengths), 
                   package = unlist(packages))

এখন, আমাদের এর মতো একটি ডেটা ফ্রেম রয়েছে:

> head(var.data, 10)
   var           package
1   ar     package:stats
2   as   package:methods
3   BD    package:fields
4   bs      package:VGAM
5   bs   package:splines
6   by      package:base
7    c      package:base
8    C     package:stats
9   cm package:grDevices
10   D     package:stats

আমরা এখন প্যাকেজ দ্বারা ডেটা বিভক্ত করতে পারেন

 data.split <- split(var.data, var.data$package)

আমরা দেখতে পাচ্ছি যে বেশিরভাগ ভেরিয়েবলগুলি বেস এবং পরিসংখ্যান প্যাকেজ থেকে আসে

> unlist(lapply(data.split, nrow))
     package:base  package:datasets    package:fields 
               16                 1                 2 
  package:ggplot2 package:grDevices  package:gWidgets 
                2                 1                 1 
  package:lattice      package:MASS    package:Matrix 
                1                 1                 3 
  package:methods      package:mgcv      package:plyr 
                3                 2                 1 
     package:spam   package:splines     package:stats 
                1                 2                14 
 package:survival     package:utils      package:VGAM 
                1                 2                 4 

অবশেষে, অঙ্কনের রুটিন

plot(0, 0, "n", xlim=c(0, 100), ylim=c(0, 120), 
     xaxt="n", yaxt="n", xlab="", ylab="")

side.len.x <- 100 / length(data.split)
side.len.y <- 100 / max(unlist(lapply(data.split, nrow)))
colors <- rainbow(length(data.split), start=0.2, end=0.6)    

for (xcnt in 1:length(data.split))
    {
    posx <- side.len.x * (xcnt-1)

    # Remove "package :" in front of the package name
    pkg <- unlist(strsplit(as.character(data.split[[xcnt]]$package[1]), ":"))
    pkg <- pkg[2]

    # Write the package name
    text(posx + side.len.x/2, 102, pkg, srt=90, cex=0.95, adj=c(0, 0))

    for (ycnt in 1:nrow(data.split[[xcnt]]))
        {
        posy <- side.len.y * (ycnt-1)
        rect(posx, posy, posx+side.len.x*0.85, posy+side.len.y*0.9, col = colors[xcnt])
        text(posx+side.len.x/2, posy+side.len.y/2, data.split[[xcnt]]$var[ycnt], cex=0.7)
        }
    }

1
নিস! এটি গ্রহণের একটি আকর্ষণীয় উপায় হ'ল তাদের বিভাগ অনুসারে ভাগ করা (যেমন গ্রাফিক্স প্যাকেজ, ডেটা ম্যানিপুলেশন অনুশীলন ইত্যাদি), তাদের রঙিন কোড এবং তারপরে সামগ্রিক আকারটিকে হিস্টোগ্রামের মতো না করে আরও বাক্সের মতো করে তোলা।
আরি বি ফ্রেডম্যান

+1 কি ট্রিট! :) খুব সুন্দর কাজ। আমি অনুমান করি যে একমাত্র জিনিস যা পর্যায় সারণীর কার্যকারিতা পেতে প্রয়োজনীয় হবে তা হ'ল টেবিল বিন্যাস। স্ট্যান্ডার্ড পিটিটিতে 2 টি গ্রিড রয়েছে, কয়েকটি উপাদান শীর্ষ 1 এ অনুপস্থিত রয়েছে এবং গোষ্ঠীগুলি বিভক্ত / পুনরায় সাজানো হয়েছে (1 গ্রুপ = 1 উল্লম্ব কলামের বিপরীতে)। সত্যি কথা বলতে কি, যে অংশটি আমি ভেবেছিলাম তা কঠিন নয় not কালারিং এবং ব্লক বিন্যাস হ'ল সেই অংশ যা আমাকে সবচেয়ে উজ্জীবিত করে এবং এর জন্য gpplot2 কোডটি দেখে ভাল লাগছে।
Iterator

আমার কফি লাগবে। আমি দেখতে পাচ্ছি যে gsc3 এর কম শব্দ দিয়ে একই মন্তব্য ছিল। :) আমি মনে করি আমি রঙ দ্বারা মন্ত্রিত হয়েছিল।
Iterator

1
@ ইটেটর: নোট করুন যে এটি সমস্ত আর স্ট্যান্ডার্ড প্লট ফাংশন, কোনও জিপিপ্লট 2 জড়িত নয় :)
নিকো

পবিত্র ম্যাকেরেল তুমি ঠিক বলছো! আরও চিত্তাকর্ষক। আমার উপসংহার: আমি কোফিউইআইইইইইইইইইইইইইইইইইইডি।
ইটেট্রেটর

4

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

# "Load" data
nms <- c("Ad","am","ar","as","bc","bd","bp","br","BR","bs","by","c","C","cc","cd","ch","ci","CJ","ck","Cl","cm","cn","cq","cs","Cs","cv","d","D","dc","dd","de","df","dg","dn","do","ds","dt","e","E","el","ES","F","FF","fn","gc","gl","go","H","Hi","hm","I","ic","id","ID","if","IJ","Im","In","ip","is","J","lh","ll","lm","lo","Lo","ls","lu","m","MH","mn","ms","N","nc","nd","nn","ns","on","Op","P","pa","pf","pi","Pi","pm","pp","ps","pt","q","qf","qq","qr","qt","r","Re","rf","rk","rl","rm","rt","s","sc","sd","SJ","sn","sp","ss","t","T","te","tr","ts","tt","tz","ug","UG","UN","V","VA","Vd","vi","Vo","w","W","y") #all names
two_in_base <- c("ar", "as", "by", "cm", "de", "df", "dt", "el", "gc", "gl", "if", "Im", "is", "lh", "lm", "ls", "pf", "pi", "pt", "qf", "qr", "qt", "Re", "rf", "rm", "rt", "sd", "ts", "vi") # 2-letter names in base R
vowels <- c("a","e","i","o","u")
vowels <- c( vowels, toupper(vowels) )

# Constants
yoffset.singles <- 3

# Define a function to give us consistent X coordinates
returnX <- function(vec) {
  sapply(vec, function(x) seq(length(all.letters))[ x == all.letters ] )
}

# Make df of 2-letter names
combi <- nms[ sapply( nms, function(x) nchar(x)==2 ) ]
combidf <- data.frame( first = substr(combi,1,1), second=substr(combi,2,2) )
library(plyr)
combidf <- arrange(combidf,first,second)

# Add vowels
combidf$first.vwl <- (combidf$first %in% vowels)
combidf$second.vwl <- (combidf$second %in% vowels)

# Flag items only in base R
combidf$in_base <- paste(combidf$first,combidf$second,sep="") %in% two_in_base

# Create a data.frame to hold our plotting information for the first letters
combilist <- dlply(combidf,.(first),function(x) x$second)
combi.first <- data.frame( first = names(combilist), n = sapply(combilist,length) ,stringsAsFactors=FALSE )
combi.first$y <- 0
all.letters <-  c(letters,LETTERS) # arrange(combi.first,desc(n))$first to go in order of prevalence (which may break the one-letter name display)
combi.first$x <- returnX( combi.first$first )

# Create a data.frame to hold plotting information for the second letters
combidf$x <- returnX( combidf$first )
combidf$y <- unlist( by( combidf$second, combidf$first, seq_along ) )

# Make df of 1-letter names
sngldf <- data.frame( sngl = nms[ sapply( nms, function(x) nchar(x)==1 ) ] )
singles.y <- max(combidf$y) + yoffset.singles
sngldf$y <- singles.y
sngldf$x <- returnX( sngldf$sngl )

# Plot
library(ggplot2)
ggplot(data=combidf, aes(x=x,y=y) ) +
  geom_text(aes( label=second, size=3, colour=combidf$in_base ), position=position_jitter(w=0,h=.25)) +
  geom_text( data=combi.first, aes( label=first, x=x, y=y, size=4 ) ) +
  geom_text( data=sngldf, aes( label=sngl, x=x, y=y, size=4 ) ) +
  scale_size(name="Order (2-letter names)",limits=c(1,4),breaks=c(1,2),labels=c("Second","First")) +
  scale_x_continuous("",breaks=c(13,39),labels=c("lower","UPPER")) +
  scale_y_continuous("",breaks=c(0,5,singles.y),labels=c("First letter of two-letter names","Second letter of two-letter names","One-letter names") ) +
  coord_equal(1.5) +
  labs( colour="In base R" )

একই প্লটে এক এবং দুই-অক্ষরের নাম সহ সংস্করণ

চিঠি-ভিত্তিক হিস্টগ্রাম


2

100 এর জন্য পর্যায় সারণী, অ্যালেক্স। যদিও এর জন্য আমার কাছে কোড নেই। :(

কেউ ভাবতে পারেন যে CRAN এ "পর্যায় সারণী" প্যাকেজ ইতিমধ্যে বিদ্যমান থাকতে পারে। রঙিন স্কিম এবং এই জাতীয় ডেটার বিন্যাসের ধারণাটি আকর্ষণীয় এবং দরকারী হতে পারে।

এগুলি প্যাকেজ দ্বারা রঙিন হতে পারে এবং ফ্রিকোয়েন্সি অনুসারে উল্লম্বভাবে বাছাই করা যায়, যেমন CRAN- এ কোডের নমুনায় বা তারা স্থানীয় কোডবেজে প্রদর্শিত হয়।


আমি আপনাকে অনুসরণ করি কিনা তা নিশ্চিত নই ... আপনি যা ভাবেন তার একটি সাধারণ স্কেচ তৈরি করতে পারবেন? আমি দেখতে পাই না যে পর্যায় সারণির বিন্যাসটি এখানে কীভাবে সহায়তা করবে ...
নিকো

@nico: আমি ভালো কিছু কথা ভাবছি: en.wikipedia.org/wiki/Periodic_table ধরুন যে আমরা বেস আর কমান্ড সঙ্গে "নোবেল উপাদান" প্রতিস্থাপন করুন। হ্যালোজেনগুলির নিজস্ব প্যাকেজ (গুলি) দ্বারা প্রতিস্থাপন করা যেতে পারে ইত্যাদি। এই ধরনের ভিজ্যুয়ালাইজেশন প্যাকেজ সহ, আমি সারি, কলাম, গোষ্ঠী এবং রঙের প্রকৃতি নির্দিষ্ট করতে এটি ব্যবহারকারীর কাছে রেখে দেব। এটি বাস্তবায়নের জন্য মোটামুটি সহজ জিনিস হওয়া উচিত, যদিও আমি এটি খুব কৃপণভাবে করতে পারি। প্লেসমেন্টটি এমন হবে যে একই গ্রুপের আইটেমগুলি (অর্থাত প্যাকেজ) একে অপরের কাছাকাছি থাকে। উল্লম্ব স্থান নির্ধারণ ব্যবহারের ফ্রিকোয়েন্সি দ্বারা নির্ধারিত হতে পারে।
Iterator

ঠিক আছে এখন বুঝতে পারছি! আমি কিছু নিয়ে বেরিয়ে আসতে পারি কিনা তা দেখার চেষ্টা করব তবে আমার প্রথমে কিছুটা
ফাঁকা

আমি এখনও এটি বেশ দেখতে পাই না, তবে এই ধারণাটি কী রূপান্তরিত হয় তা দেখে আমি উত্সাহিত :-)
এরি বি ফ্রেডম্যান

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

1

ম্যাকের আইটিআইএলএর দ্বিতীয় অধ্যায়ের প্রথম দুটি পৃষ্ঠায় দুর্দান্ত চিত্র রয়েছে যা ইংরাজী ভাষায় সমস্ত চরিত্রের জুটির শর্তাধীন সম্ভাবনা দেখায়। আপনি এটি ব্যবহার খুঁজে পেতে পারেন।

আমি বিব্রত বোধ করছি যে এগুলি তৈরি করতে কোন প্রোগ্রাম ব্যবহার করা হয়েছিল তা আমার মনে নেই।


1
এটি দুর্দান্ত, তবে আমার কাছে এগুলি দেখতে প্রতিটি লেটার-লেটার জুটির সাথে কিছু অতিরিক্ত তথ্য (প্রসার) যুক্ত থাকার উপর নির্ভর করে to সুতরাং তিনি 3 টি মাত্রা গ্রাফ করছেন যখন আমরা মূলত 2 গ্রাফ করছি ... যদিও আমি আর এর জন্য বিস্তৃত তথ্য পেতে চাই। তবে এটি একটি দিনের জন্য ডেটা মাইনিং অপারেশন।
এরি বি ফ্রেডম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.