प्रोग्राम जो एक स्ट्रिंग (क्वीन-वैरिएंट) को एनकोड करने की अनुमति देता है


16

एक प्रोग्राम लिखें जो निम्नलिखित 80-वर्ण रेखा को प्रिंट करता है:

Codegolf.stackexchange.com का यह कार्यक्रम स्वयं को एक स्ट्रिंग को एनकोड करने की अनुमति देता है।

फिर इनपुट की एक पंक्ति को स्वीकार करता है, फिर अपने स्रोत कोड को अपने कोड बिंदुओं के साथ प्रिंट करता है जो संभवतः पुन: व्यवस्थित किया जाता है (कोई भी जोड़ा नहीं जाता है और हटाया नहीं जाता है)। जब उस कोड को निष्पादित किया जाता है, तो ऐसा ही होना चाहिए, मुद्रित लाइन को छोड़कर इनपुट की सबसे हाल की रेखा होगी।

पर्ल-स्टाइल रेगेक्स ^[A-Za-z0-9. ]{80}$इनपुट की किसी भी रेखा से मेल खाएगा। आप कोई अतिरिक्त धारणा नहीं बना सकते।

सबमिशन का स्कोर इसके स्रोत कोड में 94 कम कोड बिंदुओं की संख्या है । नीचा बेहतर है।

कोड को कुछ भी नहीं करना चाहिए जो कि एक क्वीन ( जैसे फ़ाइल पढ़ने) में अस्वीकार्य होगा । विशेष रूप से, किसी भी नकारात्मक अंक के साथ किसी भी जमा को 93 के रूप में धोखा देना चाहिए! 64 80 से कम है ।

जोड़ा गया 2014-04-21: आपके प्रोग्राम का संपूर्ण स्रोत कोड कैरेक्टर एन्कोडिंग में अच्छी तरह से बना होना चाहिए जिसके तहत आप कोड पॉइंट्स गिनते हैं। उदाहरण के लिए, आप UTF-8 अनुगामी बाइट रेंज (80..BF) में 80 लगातार बाइट्स का उपयोग नहीं कर सकते हैं और प्रत्येक को एक U + FFFD REPLACEMENT CHARACTER के रूप में गिना जा सकता है (या इससे भी बुरा, जैसा कि कोड बिंदु नहीं है)।

इसके अतिरिक्त, यदि एन्कोडिंग किसी कोड बिंदु ( जैसे SCSU ), आपके प्रोग्राम के साथ-साथ सभी प्रोग्रामों को सीधे या परोक्ष रूप से उत्पन्न करने के लिए कई तरीकों से एनकोड करने की अनुमति देता है, तो उनमें से केवल एक का उपयोग करना चाहिए (या कम से कम सभी को पूरे कोड में समान रूप से व्यवहार करना चाहिए। )।


आपके प्रश्न का पुनर्मूल्यांकन करने के बाद, मुझे यकीन नहीं है कि अगर मेरा जवाब वही है जो आपके मन में था। क्या प्रोग्राम को नया स्ट्रिंग पाइप करना ठीक है या क्या इसे एक इंटरैक्टिव प्रॉम्प्ट लॉन्च करना है?
डेनिस

@ डेनिस: यही कारण है कि आपका उत्तर स्वीकार्य नहीं है। बल्कि, यह "इस प्रोग्राम को [...]" प्रिंट करने से पहले इनपुट पढ़ता है ।
कृप्या

यही मेरा मतलब है, मैंने इसे अच्छी तरह से व्यक्त नहीं किया। गोल्फस्क्रिप्ट दुभाषिया वह सब कुछ पढ़ता है जो स्क्रिप्ट निष्पादित करने के लिए शुरू करने से पहले उस पर लगाया जाता है। इससे बचने का एकमात्र तरीका एक शीघ्र लॉन्च करना है, जो पाइपिंग को असंभव बनाता है।
डेनिस

नमस्ते, मैं जावास्क्रिप्ट में यह कोशिश कर रहा हूँ। <Script> टैग के बीच पाठ को पढ़े बिना क्वीन बनाना असंभव लगता है? स्रोत कोड को अनुमति देने का उद्देश्य क्या है? आप कहते हैं 'संभवत: पुन: व्यवस्थित किया गया'; यदि आवश्यक हो तो क्या इसका मतलब केवल परमिट है?
बेचुस्बेले

जवाबों:


5

गोल्फस्क्रिप्ट, 231 162 131

'1àâ4ÿaVo5GùpZBtiXOürsóNîMmWåKHc09JdñúêyzíECäYïhDU ãáIFõ6é8òRìjTv23ønuðLwxfSkôbëAelqý.çèPQ
öûg7'{0@.$[{}/]:&\{@2$,*2$2$?+@@^}/{;65base}:b~{&=}%''+puts'"#{`head -1`}"'~{&?}%)b[94,{)1$1$%@@/}/;]-1%&\[{1$=.@^}/]"'".@+\+\'.~'}.~

यह काम किस प्रकार करता है

हम 94 अलग-अलग वर्णों को चुनकर शुरू करते हैं जो एक स्ट्रिंग को एनकोड करने की अनुमति मिल जाएगी। कोई भी 94 वर्ण काम करेंगे, लेकिन हम गोल्फिंग उद्देश्यों के लिए निम्नलिखित चुनते हैं:

\n .0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
àáâãäåçèéêëìíîïðñòóôõöøùúûüýÿ

चलो इन वर्णों के सरणी को "&" कहते हैं।

इनपुट लाइन में हमेशा 81 वर्ण (LF सहित) होंगे। वे सभी पात्र “और” के पहले 65 वर्णों में मौजूद हैं। ऊपरी 128 बाइट्स में वर्ण चुनने का एकमात्र कारण यही है।

हम स्ट्रिंग के प्रत्येक वर्ण को "&" में इसके सूचकांक द्वारा प्रतिस्थापित करते हैं, इसलिए LF 0 हो जाता है, अंतरिक्ष 1 हो जाता है, आदि।

हम 81 प्राप्त संख्याओं को एकल आधार 65 संख्या के अंक मानते हैं। इस नंबर को “N” कहते हैं।

अब, हम “&” के सभी संभावित क्रमों की गणना करते हैं और ऊपर से संख्या के अनुरूप क्रमांकन को पुनः प्राप्त करते हैं। यह निम्नलिखित तरीके से प्राप्त किया जाता है:

  1. सेट c = 1और A = []
  2. के लिए प्रेप N % cकरें A
  3. सेट N = N / cऔर c = c + 1
  4. यदि c < 95, 2 पर वापस जाएं।
  5. सेट i = 0और s = ""
  6. चार्टर को पुनः प्राप्त करें &[A[i]], इसे "s" में जोड़ें और इसे "&" से हटा दें।
  7. सेट करें i = i + 1
  8. यदि i < 946 पर वापस जाएं।

मान लीजिए कि हमारे पास कोड ब्लॉक "ई" और "डी" हैं जो ऊपर बताए गए अनुसार एक स्ट्रिंग को एन्कोड और डिकोड करते हैं।

अब, हमें उन कोड ब्लॉक के लिए एक आवरण की आवश्यकता है जो प्रश्न की आवश्यकताओं का अनुपालन करते हैं:

'encoded string'{\.$[{}/]:&; D puts '"#{`head -1`}"'~ E "'".@+\+\'.~'}.~

यह निम्न कार्य करता है:

  • {…}.~एक ब्लॉक को परिभाषित करता है, इसे डुप्लिकेट करता है और दूसरी कॉपी निष्पादित करता है। पहली प्रति ढेर पर रहेगी।

  • \.$ ब्लॉक के साथ एन्कोडेड स्ट्रिंग को स्वैप करता है और सॉर्ट किए गए वर्णों के साथ एन्कोडेड स्ट्रिंग की एक प्रति बनाता है।

  • [{}/]:&; एक सरणी में ऊपर से स्ट्रिंग को धर्मान्तरित करता है, इसे "और" में सहेजता है और इसे छोड़ देता है।

  • D puts एन्कोडेड स्ट्रिंग को डीकोड करता है और परिणाम को प्रिंट करता है।

  • '"#{`head -1`}"'~head -1खोल में निष्पादित करके इनपुट की एक पंक्ति पढ़ता है ।

  • E "'".@+\+ स्ट्रिंग को एनकोड करता है और एक ही उद्धरण को प्रस्तुत करता है और जोड़ता है।

  • \'.~'एन्कोडेड स्ट्रिंग और ब्लॉक को स्वैप करता है और स्ट्रिंग को जोड़ता है '.~'

  • ब्लॉक निष्पादित होने के बाद, गोल्फस्क्रिप्ट स्टैक (एन्कोडेड स्ट्रिंग, ब्लॉक '.~') की सामग्री प्रिंट करता है और बाहर निकलता है।

"ई" को इस प्रकार परिभाषित किया जा सकता है:

{&?}%        # Replace each character by its index in “&”.
);           # Remove the last integer from the array, since it corresponds to the LF.
65base       # Convert the array to an integer “N” by considering it a base 65 number.
[            #
  94,        # For each integer “c” in 0 … 93:
  {          #
    )        # Increment “c”.
    1$1$%    # Push “N % c”.
    @@/      # Rotate “N % c” below “N” and “c” and divide the first by the latter.
  }/;        # Discard “N”.
]            # Collect the results of “N % c” in an array “A”.
-1%          # Reverse “A”.
&\           # Push “&” and swap it with “A”.
[            #
  {          # For each “j” in “A”:
    1$=.[]+  # Push “&[j] [&[j]]”.
    @^       # Rotate “&” on top of “[&[j]]” and take their symmetric difference.
  }/         #
]            # Collect the charcters into an array.

"डी" को इस प्रकार परिभाषित किया जा सकता है:

0&           # Push 0 (initial value of the accumulator “A”) and “&”.
@            # Rotate the encoded string on top of “&”.
{            # For each character “c” of the encoded string:
    @2$,*    # Rotate “A” on top of the stack and multiply it by the length of “&”.
    2$2$?+   # Get the index of “c” in “&” and add it to “A”.
    @@^      # Rotate “A” below “&” and “c” and take their symmetric difference.
}/;          # Discard “&”.
65base       # Convert “A” into the array of its digits in base 65.
{&=}%        # Replace each digit by the corresponding character in “&”.
''+          # Convert the resulting array into a string.

अंतिम गोल्फिंग:

  • दो वर्णों को सहेजने के \.$[{}/]:&;0&@साथ बदलें 0@.$[{}/]:&\

  • {;65base}:bएक चरित्र को बचाने के लिए फ़ंक्शन को परिभाषित करें ।

  • स्ट्रिंग में पीछे चल रहे एलएफ और एलएफ को छोड़कर सभी व्हाट्सएप को हटा दें।

उदाहरण

$ # Create GolfScript file using base64 to avoid encoding issues.
$ base64 > permute.gs -d <<< JzHg4jT/YVZvNUf5cFpCdGlYT/xyc/NO7k1tV+VLSGMwOUpk8frqeXrtRUPkWe9oRFUg4+FJRvU26TjyUuxqVHYyM/hudfBMd3hmU2v0YutBZWxx/S7n6FBRCvb7ZzcnezBALiRbe30vXTomXHtAMiQsKjIkMiQ/K0BAXn0vezs2NWJhc2V9OmJ+eyY9fSUnJytwdXRzJyIje2BoZWFkIC0xYH0iJ357Jj99JSliWzk0LHspMSQxJCVAQC99LztdLTElJlxbezEkPS5AXn0vXSInIi5AK1wrXCcufid9Ln4K
$
$ # Set locale to en_US (or any other where one character is one byte).
$ LANG=en_US
$
$ # Go back and forth between two different strings.
$ # Second and sixth line are user input, not output from the script.
$
$ golfscript permute.gs | tee >(tail -n+2 > tmp.gs) && golfscript tmp.gs && rm tmp.gs
This program from codegolf.stackexchange.com permutes itself to encode a string.
Permuting source code code points to encode a string is a certain quine variant.
'18äJoS3sgV9qdçëxm0ÿKMNe5íPî.Htn2ciâIuøbRZéð4AwB7áìUüöôWõèûfñåLàóDrhQlO6
pTaýzòkùYCyFêïãG júEvX'{0@.$[{}/]:&\{@2$,*2$2$?+@@^}/{;65base}:b~{&=}%''+puts'"#{`head -1`}"'~{&?}%)b[94,{)1$1$%@@/}/;]-1%&\[{1$=.@^}/]"'".@+\+\'.~'}.~
Permuting source code code points to encode a string is a certain quine variant.
This program from codegolf.stackexchange.com permutes itself to encode a string.
'1àâ4ÿaVo5GùpZBtiXOürsóNîMmWåKHc09JdñúêyzíECäYïhDU ãáIFõ6é8òRìjTv23ønuðLwxfSkôbëAelqý.çèPQ
öûg7'{0@.$[{}/]:&\{@2$,*2$2$?+@@^}/{;65base}:b~{&=}%''+puts'"#{`head -1`}"'~{&?}%)b[94,{)1$1$%@@/}/;]-1%&\[{1$=.@^}/]"'".@+\+\'.~'}.~
$
$ # Sort all characters from the original source code and hash them.
$ fold -1 permute.gs | sort | md5sum
b5d978c81df5354fcda8662cf89a9784  -
$
$ # Sort all characters from the second output (modified source code) and hash them.
$ golfscript permute.gs | tail -n+2 | fold -1 | sort | md5sum
Permuting source code code points to encode a string is a certain quine variant.
b5d978c81df5354fcda8662cf89a9784  -
$
$ # The hashes match, so the characters of the modified source code are a permutation
$ # of the character of the original one.

224 माइनस 94 130 है।
mbomb007 20

क्या आप विस्तृत कर सकते हैं?
डेनिस

1

पर्ल, 1428 1099

इसमें 1193 ASCII वर्ण (960 अनुमत बाइनरी अंक सहित) हैं। 1193 - 94 = 1099

$s='010011100001100010101100111111101001101011101000100000101011011010100110111111011111101011101000100110111111011100101000011101011110100000101000100101011111111110101100101101011010011100100100011110110001011100100001011010100111100000011110111110011100101000100110111111101001011110101011100110101110101101011110101100111111100010101101101100011110100101011111111111101101101000111111011110100111011100101000011101011110111111011010111111101100101101101011100010100111100000111110';$_=q{$i=join'',A..Z,a..z,0..9,'. ';print map({substr$i,oct'0b'.$_,1}$s=~/.{6}/g),$/;chop($s=<>);$s=join'',map{sprintf"%06b",index$i,$_}$s=~/./g;$t=join'',map{$_ x(480-(()=$s=~/$_/g))}0,1;print"\$s='$s';\$_=q{$_};eval#$t"};eval#000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

मेरा पहला डिजाइन

इससे पहले कि मैं डेनिस से बाइनरी में जाने का सुझाव लेता, मेरे कार्यक्रम ने ऑक्टल अंकों की अनुमति दी।

मेरा पहला डिज़ाइन प्रत्येक स्ट्रिंग को 160 अष्टक अंकों में, 2 अंकों के प्रति वर्ण के साथ एन्कोड करता है। इस एन्कोडिंग में 100 8 = 64 विभिन्न वर्ण हैं। अष्टक प्रणाली के 8 अलग-अलग अंक हैं। कार्यक्रम में प्रत्येक अंक की 160 प्रतियां होनी चाहिए, इसलिए यह 8 × 160 = 1280 अंकों की अनुमति देता है।

मैं १६० अंक $sऔर अन्य ११२० अंक रखता हूं $t। मैं एक प्रोग्राम है जो एक Quine नहीं है के साथ शुरू है, लेकिन केवल करने के लिए कार्य प्रिंट $sऔर $tअगले रन के लिए। यह बात है:

$s = '2341425477515350405332467737535046773450353640504537765455323444366134413247403676345046775136534656553654774255543645377755507736473450353677327754555342474076';
$t = '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777';

# $i = character map of 64 characters, such that:
#  substr($i, $_, 1) is the character at index $_
#  index($i, $_) is the index of character $_
$i = join '', 'A'..'Z', 'a'..'z', '0'..'9', '. ';

# Decode $s from octal, print.
#  1. ($s =~ /../g) splits $s into a list of pairs of octal digits.
#  2. map() takes each $_ from this list.
#  3. oct() converts $_ from an octal string to a number.
#  4. substr() on $i converts number to character.
#  5. print() outputs the characters from map() and a final "\n".
print map({ substr $i, oct, 1 } $s =~ /../g), "\n";

# Read new $s, encode to octal.
#  1. ($s = <>) reads a line.
#  2. chop($s) removes the last character of $s, the "\n".
#  3. ($s =~ /./g) splits $s into characters.
#  4. map() encodes each character $_ as a pair of octal digits.
#  5. join() concatenates the pairs from map().
chop($s = <>);
$s = join '', map { sprintf "%02o", index $i, $_ } $s =~ /./g;

# Make new $t.
#  1. map() takes each $_ from 0 to 7.
#  2. $_ x (160 - (() = $s =~ /$_/g)) makes a string where $_ repeats
#     160 times, minus the number of times that $_ appears in $s.
#  3. join() concatentates the strings from map().
$t = join '', map { $_ x (160 - (() = $s =~ /$_/g)) } 0..7;

# Print the new assignments for $s and $t.  This is not yet a quine,
# because it does not print the rest of the program.
print "\$s = '$s';\n\$t = '$t';\n";

(() = $s =~ /$_/g))चर की एक खाली सूची के लिए एक काम है। मैं इस ट्रिक को PerlMonks के संदर्भ ट्यूटोरियल से लेता हूं । यह मैच ऑपरेटर पर सूची के संदर्भ को बल देता है =~। स्केलर के संदर्भ में, मैच सही या गलत होगा, और मुझे $i++ while ($s =~ /$_/g)मैचों की गणना करने के लिए लूप की आवश्यकता होगी । सूची के संदर्भ में,$s =~ /$_/g मैचों की एक सूची है। मैंने इस सूची को एक घटाव के स्केलर संदर्भ में रखा है, इसलिए पर्ल सूची तत्वों को गिनता है।

एक क्वीन बनाने के लिए, मैं रोजेटा कोड$_=q{print"\$_=q{$_};eval"};eval में पर्ल क्वाइन से फॉर्म लेता हूं । यह एक स्ट्रिंग q{...}को असाइन करता है $_और फिर कॉल करता है eval, इसलिए मैं अपना कोड एक स्ट्रिंग में रख सकता हूं और इसे चला भी सकता हूं। मेरे कार्यक्रम एक Quine जब मैं में पिछले लाइनों के लिए मेरे तीसरे लपेट हो जाता है $_=q{और };eval, और मेरा आखिरी बदलने printके लिए print "\$s = '$s';\n\$t = '$t';\n\$_=q{$_};eval"

अंत में, मैंने अपने कार्यक्रम को पहली असाइनमेंट $tको एक टिप्पणी में बदलकर , और अतिरिक्त वर्णों को हटाकर गोल्फ किया ।

इसमें 1522 ASCII वर्ण (1280 अनुमत ऑक्टल अंक सहित) हैं।
1522 - 94 = 1428

$s='2341425477515350405332467737535046773450353640504537765455323444366134413247403676345046775136534656553654774255543645377755507736473450353677327754555342474076';#0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
$_=q{$i=join'','A'..'Z','a'..'z','0'..'9','. ';print map({substr$i,oct,1}$s=~/../g),"\n";chop($s=<>);$s=join'',map{sprintf"%02o",index$i,$_}$s=~/./g;$t=join'',map{$_ x(160-(()=$s=~/$_/g))}0..7;print"\$s='$s';#$t\n\$_=q{$_};eval"};eval

बाइनरी में स्विच

टिप्पणियों में, डेनिस ने देखा कि 960 अनुमत द्विआधारी अंक 1280 से कम अष्टाधारी अंक होंगे। इसलिए मैंने 2 से 16 तक प्रत्येक आधार के लिए अनुमत अंकों की संख्या को रेखांकन किया।

Maxima 5.29.1 http://maxima.sourceforge.net
using Lisp ECL 13.5.1
...
(%i36) n : floor(x);
(%o36)                             floor(x)
...
(%i41) plot2d(n * ceiling(log(64) / log(n)) * 80, [x, 2, 16],
              [xlabel, "base"], [ylabel, "number of permuted digits"]);
(%o41) 

x- अक्ष पर आधार के साथ ग्राफ, y- अक्ष पर अनुमत अंकों की संख्या

हालांकि बेस 8 एक स्थानीय न्यूनतम है, बेस 2 और 3 और 4 सर्वश्रेष्ठ आधार के लिए टाई, 960 अनुमत अंकों पर। कोड गोल्फ के लिए, बेस 2 सबसे अच्छा है क्योंकि पर्ल में बेस 2 के लिए रूपांतरण है।

960 बाइनरी अंकों के साथ 1280 ऑक्टल अंकों की जगह 320 वर्णों को बचाता है।

ऑक्टल से बाइनरी में स्विचिंग कोड की लागत 8 वर्ण है:

  • बदले octके लिए oct'0b'.$_लागत 7।
  • बदले /../gके लिए /.{6}/gलागत 2।
  • "%02o""% 06b" `0 में बदलें ।
  • बदले 160के लिए 480लागत 0।
  • 1 0..7को 0,1बचाने के लिए बदलें ।

मैंने कुछ पर्ल गोल्फ टिप्स सीखे । वे 14 पात्रों को बचाते हैं:

  • बदलें 'A'..'Z','a'..'z','0'..'9'करने के लिए A..Z,a..z,0..9, barewords और नंगे नंबर, का उपयोग करते हुए 12 अक्षर बचाता है।
  • 2 वर्ण सहेजने के "\n"लिए परिवर्तित करें $/

मैं #$tटिप्पणी को फ़ाइल के अंत में ले जाकर 3 अक्षर सहेजता हूं । यह टिप्पणी को समाप्त करने \nवाली न्यूलाइन और क्वीन में शाब्दिक रूप से हटा देता है।

ये परिवर्तन कुल 329 वर्णों को बचाते हैं, और मेरे स्कोर को 1428 से घटाकर 1099 कर देते हैं।


1
अष्टाधारी अंकों के बजाय द्विआधारी का उपयोग करने के लिए "केवल" 960 पारगम्य वर्णों की आवश्यकता होगी।
डेनिस

@ डेनिस टिप के लिए धन्यवाद! मैंने बाइनरी पर स्विच किया (312 वर्णों को सहेजते हुए)। यहाँ रहते हुए, मैंने १ characters और पात्रों को गोल्फ से बाहर कर दिया।
22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.