মাত্র 5 টি প্রতীক সহ জেএসএফ ** কে?


47

এটি কোনও চ্যালেঞ্জ নয়, তবে একটি প্রশ্ন, আমি অনুভব করেছি যে এটি কারণে ছিল

প্রোগ্রামিং ধাঁধা সমাধানের সাথে সম্পর্কিত বা একটি নির্দিষ্ট ধরণের চ্যালেঞ্জ সম্পর্কিত নন-চ্যালেঞ্জ প্রশ্নগুলিও বিষয়টিতে রয়েছে।

এখন প্রশ্ন:

জাভা স্ক্রিপ্ট কোডটি কি কেবল 5 টি অক্ষর দিয়ে লেখা সম্ভব? জেএসফাক ইতিমধ্যে 6 টি চিহ্ন সহ এটি করেছে !+[]()তবে আমি ভাবছি !চরিত্রটির প্রয়োজন আছে কিনা।

জেএসফাক স্ট্রিংয়ে কাস্টিংয়ের সংমিশ্রণ (একটি ফাঁকা অ্যারে যোগ করে), সংখ্যায় কাস্টিং (সামনের দিকে + লিখে) এবং অবহেলা করে বুলিয়ানে কাস্টিংয়ের কাজ করে। উদাহরণ স্বরূপ:

[]        \\ Empty array
+[]       \\ Cast to number -> 0
!+[]      \\ Negate -> true
!+[]+[]   \\ Cast to string -> "true"

এই স্ট্রিং থেকে আমরা এর ভিতরে থাকা একটি সংখ্যার সাথে বর্গাকার বন্ধনী ব্যবহার করে এর সমস্ত অক্ষর বের করতে পারি এবং যে কোনও সংখ্যা বহুবার একসাথে সত্য যুক্ত করে তৈরি করা যায়।

এটির মতো প্রচুর অক্ষর পাওয়া যাবে এবং স্ট্রিংগুলিতে সংমিশ্রিত হতে পারে। তৈরি করতে সক্ষম হওয়া সর্বাধিক গুরুত্বপূর্ণ স্ট্রিংটি হ'ল "constructor"এটি Functionকোনও ফাংশন থেকে পাওয়ার জন্য ব্যবহার করা যেতে পারে এবং জাভাস্ক্রিপ্ট হিসাবে এই স্ট্রিংটি স্ট্রিংগুলি কার্যকর করতে ব্যবহার করা যেতে পারে:

[]["find"]                          \\ the function Array.prototype.find
[]["find"]["constructor"]           \\ the Function object
[]["find"]["constructor"](string)() \\ same as eval(string)

আপনি দেখতে পাচ্ছেন, !এখানে 2 টি ব্যবহার রয়েছে:

  • স্ট্রিং থেকে বর্ণ নির্বাচন করতে সংখ্যা তৈরি করা হচ্ছে।
  • বুলিয়ান পেতে কাস্টিং "true"এবং "false"

এই 2 ++টির মধ্যে প্রথমটি সরাসরি ইনক্রিমেন্টার ব্যবহার করেও করা 0যেতে পারে, তবে এটি অ্যারের অভ্যন্তরের উপাদানগুলিতে ব্যবহার করা যেতে পারে:

+[]          \\ 0
[+[]]        \\ [0]
[+[]][+[]]   \\ [0][0] -> 0
++[+[]][+[]] \\ ++[0][0]-> 1
++[[]][+[]]  \\ also works because ++ casts to number

সুতরাং সমস্ত সংখ্যা ছাড়া তৈরি করা যেতে পারে !

দ্বিতীয়টি আরও কঠিন। গুরুত্ব "true"এবং "false"অক্ষরে টিম সীমানা "r"এবং "s", যা উভয় প্রদর্শিত "constructor"। আমি ইতিমধ্যে সব অন্য অক্ষর পাওয়া যায় "constructor"মাধ্যমে "undefined", "Infinity", "NaN"এবং স্ট্রিং ফাংশন কাস্ট করে।

সুতরাং চূড়ান্ত প্রশ্ন: (কীভাবে) আপনি কেবল ব্যবহার করে বুলিয়ান বা বর্ণগুলি "r"এবং "s"জাভাস্ক্রিপ্টে তৈরি করতে পারেন +[]()?

চিঠিটিও "l"সাহায্য করতে পারে। এটি ফর্মটি পাওয়া যেতে পারে nullতবে আমি সেই 5 টি চিহ্নের সাথে সেই মানটি পেতে সক্ষম হইনি। উদাহরণস্বরূপ, এটি ইতিমধ্যে আমাদের কাছে থাকলে বুলিয়ানগুলি পেতে ব্যবহার করা যেতে পারে "s":

[]["includes"]()       \\ false
[+[]]["includes"](+[]) \\ true

চিঠিটি "l"এবং "k"একসাথে এতে প্রবেশাধিকার দেবে "r":

([]+[])["link"]() \\ "<a href="undefined"></a>"

বুলিয়ান পাওয়ার কোনও উপায়, nullবা কোনও চিঠিই r s l kখুব কার্যকর হবে!

আমাদের যা আছে তার একটি গ্রন্থাগার:

অ্যারে.প্রোটোটাইপ.ফাইন্ড: [] [[([[] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++, [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + ( ++, [[]] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]])])]

অনন্ত: + ((++ [[]] [+ []] + []) + (([[] [[]] + []) [(++ [[]] [+ []]) + (+ [[]] [[]]) + + (++, [[]] [[]])]) + + (++, [[]] [[]] []) + + ([]) + + ([]) + + (+, []))

নাএন: + [] [[]]

অপরিবর্তিত: [] [[]]

0: + []

1: ++ [[]] [+ []]

2: (++ [[]] [+ []]) + (++ [[]] [+ []])

3: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

4: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [[]])

5: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [[]]) + + (++, [[]] [[]])

6: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])

7: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])

8: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])

9: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])

এ: (+ [] [[]] + []) [++ [[]] [+ []]

সি: ([] [([[[] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [] ) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]

ডি: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])]

ই: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ []])]

চ: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ []]) + + (++, [[]] [[]])]

আমি: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ []]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]

এন: ([] [[]] + []) [++ [[]] [+ []]

ও: ([] [(([[] [[]] + []) [[++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [] ) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]

টি: (+ ((++ [[]] [+ []] + []) + (([[] [[]] + []) [(++ [[]] [+ []]) + ( ++, [[]] [[]]) + + (++, [[]] [[]])]) + + (++, [[]] [[]] []) + + (+, [] ) + + ([]) + + (+, [])) []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[] ])]

আপনি: ([] [[]] + []) [+ []]

ভি: ([] [(([[] [[]] + [])] [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [] ) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) [] ((++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]))]

y: (+ ((++ [[]] [+ []] + []) + (([[] [[]] + []) [(++ [[]] [+ []]) + ( ++, [[]] [[]]) + + (++, [[]] [[]])]) + + (++, [[]] [[]] []) + + (+, [] ) + + ([]) + + (+, [])) []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[] ]) + + (++, [[]] [[]])]

আমি: (+ ((++ [[]] [+ []] + []) + (([[] [[]] + []) [(++ [[]] [+ []]) + ( ++, [[]] [[]]) + + (++, [[]] [[]])]) + + (++, [[]] [[]] []) + + (+, [] ) + + ([]) + + (+, [])) []) [[]]

এন: (+ [] [[]] + []) [+ []]

"": ([] [([[] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [+ + []]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [ ]) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [+ + (++, [[]] [[] ] [] ((++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (+ + [[]] [[]]) + + (++, [[]] [[]])))]

(: ([] [(([[] [[]] + [])] [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [] ) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [+ + (++, [[]] [[]] [] ((++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])))]

): ([] [([[] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [] ) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [+ + (++, [[]] [[]] [] ((++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])))]

{: ([] [(([[] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [] ) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [+ + (++, [[]] [[]] [] ((++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])))]

}: ([+] [(([[] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] [] ) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [+ + ((++, [[]] [[] ]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) [] ((++, [[]] [[]]) + + ( ++, [[]] [[]])))]

।: (+ (++ [[]]] [+ []] + [] + (++ [[]] [+ []]) + ([]] [[]] + []) [(++ [ []] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])] (++, [[]] [[] ] [] ([]) + + ([]))) []) [++, [[]] [[]]]

:[[]] [([] [(([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + ( ++, [[]] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [(++, [[]] [[ ]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])] ([] [(([] [[]] []) [ (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [ []])]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + ( ++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[] ] []) [++, [[]] [[]]]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]])])] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [ []] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]] )] ([] [[]] []) [++, [[]] [[]]] ([] [(([] [[]] []) [(++, [[ ]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) ]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[] ] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]) + + (([] [[]] []) [++, [[]] [[]]]) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [ []])])] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])] (+, [] [[]] []) [++, [[]] [[]]] (+ + ((++, [[]] [[]] []) + + (([] [[]] []) [(++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]])]) + + ( ++, [[]] [[]] []) + + ([]) + + ([]) + + (+, [])) []) [(++, [[]] [[] ]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[]] [[]]) + + (++, [[ ]] [[]]) + + (++, [[]] [[]])]] ([[]]) +, []

এটি কোডগলফ.স্টাকেকেক্সচেঞ্জ / কিউ 111190/194 এর সাথে খুব ঘনিষ্ঠভাবে সম্পর্কিত এবং যদি এই প্রশ্নের জেএস উত্তর থাকে তবে আমি বন্ধ করার পক্ষে ভোট দিতাম। যেমনটি হ'ল, এই প্রশ্নের উত্তর সম্ভবত পূর্ববর্তী প্রশ্নের উত্তরে সরাসরি অনুবাদ করতে পারে, তবে পার্থক্যটি এটিকে পর্যাপ্ত সীমান্তরেখায় পরিণত করে যে আমি একতরফাভাবে বন্ধ করতে চাই না।
পিটার টেলর

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

1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
অ্যালেক্স এ।

4
এই জাতীয় প্রশ্নগুলি আমাকে জিজ্ঞাসা করে যে কোনও প্রশ্নের অনুদান দেওয়ার কোনও বৈশিষ্ট্য ছিল।
xnor

1
আমি অনুমতি evalসহ 2453 অক্ষর পেয়েছি window
ক্যালকুলেটরফ্লাইন

উত্তর:


23

মন্ত্রমুগ্ধের পরে , ফলাফলটি মনে হয়, আধুনিক ব্রাউজারগুলিতে কমপক্ষে, এটি করার কোনও উপায় নেই।

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

লিটারেল

শুধুমাত্র তাৎক্ষণিক লিটারেল আপনার সাথে করতে পারেন +()[]নেস্টেড খালি অ্যারে হয় [], [[]], [[[]]], ইত্যাদি সেখানে থেকে, আমরা ভোটদান ব্যবহার মান শুরু করতে পারেন +:

  • +[]শূন্য হয়, যা জেনসের কৌশলটি ব্যবহার করে স্বেচ্ছাচারিত ইতিবাচক পূর্ণসংখ্যায় প্রসারিত হয় ++

  • []+[]হয় ""। আসলে, []+xআমাদের xসাধারণভাবে একটি স্ট্রিং প্রতিনিধিত্ব পায় ।

[]এর পরবর্তী ব্যবহারটি সূচীকরণ। সীমানার বাইরে কোনও বস্তুর ইনডেক্সিং ( [][[]]) আপনাকে পেয়ে যায় undefined। এটিকে একটি স্ট্রিংে কাস্ট করা এবং ফলাফলকে সূচীকরণ করা আপনাকে চিঠিগুলি পাওয়া যায় d e f i n u; এটি ব্যবহার করে প্রথমে পূর্ণসংখ্যায় কাস্ট করা +আপনাকে পেয়ে যায় NaN, যা থেকে অক্ষরগুলি a Nঅনুসরণ করে।

++কোনও অ-পূর্ণসংখ্যার মান পর্যন্ত ট্রিকটি ব্যবহার করা এতদূর পর্যন্ত পৌঁছেছে NaNবা একটি ত্রুটি। এছাড়াও, আমরা যে বস্তুগুলি তৈরি করতে পারি তার কোনওটিই কলযোগ্য (এখনও) নয়, সুতরাং সহায়তা ()করে না (গ্রুপিং বাদে)।

আমাদের হাতের বাকী কৌশলগুলি কাস্টিং এবং ইনডেক্সিং। সুতরাং প্রশ্নটি হল: কোন স্ট্রিং আমরা অক্ষরগুলি ব্যবহার করে তৈরি করতে পারি 0123456789adefinuNeither

  • নম্বরগুলি আক্ষরিক হ'ল আমরা নতুন স্ট্রিং পেতে পূর্ণসংখ্যায় কাস্ট করতে পারি or
  • আমরা ইতিমধ্যে পৌঁছে যেতে পারে বস্তুর সম্পত্তি নাম?

আক্ষরিক সংখ্যা

দ্বিতীয় বিকল্প একটি উদাহরণ হিসাবে, আমরা স্ট্রিং করতে পারেন "1e1000", এবং তারপর পেতে Infinityথেকে +"1e1000"হয়ে কাস্ট যে ফিরে স্ট্রিং আমাদের চিঠি পায় yএবং I

এছাড়াও, আমরা "11e100"সংখ্যায় কাস্ট করতে পারি এবং স্ট্রিংয়ে ফিরে যেতে পারি "1.1e+101", যা থেকে আমরা এক্সট্র্যাক্ট করি .এবং করি +

এটি ব্যবহার করে ., পরিবর্তে, আমরা স্ট্রিংটি তৈরি করতে পারি ".0000001", এটি নম্বর এবং পিছনে ফেলে দিতে পারি "1e-7", আমাদের জিততে -

যে মূলত সব ভাসে আপনি পাবেন আছে: কোন ব্যতীত অন্য আরো আকর্ষণীয় মান নয় Infinityএবং NaN, এবং কোন তাদের স্বাভাবিক স্ট্রিং ছাড়া অন্য উপস্থাপনা ব্যবহৃত অক্ষর নয় -+.0123456789e

প্রোপার্টি

সুতরাং আমরা চিঠিপত্র আছে -+.0123456789adefinuyIN। আমরা কোন সম্পত্তি পৌঁছে দিতে পারি? আসুন জাভাস্ক্রিপ্ট জিজ্ঞাসা করুন।

>>> R = /^[-+.0123456789adefinuyIN]+$/
>>> [Array, Object, String, Number].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'find' ], Object: [], String: [], Number: [] }

শুধুমাত্র [].find, যা জেনস ইতিমধ্যে খুঁজে পেয়েছে। আসুন এটি স্ট্রিংয়ে ফেলে দিন, এর সমস্ত অক্ষর কাটুন এবং আবার চেষ্টা করুন। ব্রাউজার জুড়ে স্ট্রিং প্রতিনিধিত্ব কিছুটা আলাদা। ক্রোম এবং এজ এ, "function find() { [native code] }"রয়েছে acdefinotuv()[]{}এবং একটি স্পেস; আমাদের পূর্ণ বর্ণমালা এখন +-.()[]{}0123456789INacdefinotuvy। ফায়ারফক্সে আরও স্পেস এবং নিউলাইন রয়েছে তবে চিঠিগুলি একই রকম।

আমরা আমাদের অনুসন্ধান পুনরাবৃত্তি:

>>> R = /^[+-.()\[\]{}0123456789INacdefinotuvy]+$/
>>> [Array, Object, String, Number, Function].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'concat', 'find' ],
  Object: [],
  String: [ 'concat' ],
  Number: [],
  Function: [] }

String.prototype.concatঅবচিত করা হয়: এটি ঠিক যা +করে তা করে, যা আমরা ইতিমধ্যে করতে পারি। সুতরাং আমরা পেয়েছি Array.prototype.concatএবং Array.prototype.find। আমরা তাদের সাথে কী করতে পারি?

ক্রিয়াকলাপ

concat()আমাদের প্রথমবারের মতো দীর্ঘতর অ্যারে তৈরি করতে দিন। [[]].concat([[]])হয় [[], []], এবং একটি স্ট্রিং এ কাস্টিং আমাদের পায় ","। (এটি আমাদের নতুন বৈশিষ্ট্য সন্ধান করতে সহায়তা করে না)) তবে .concatআমাদের মানগুলিকে সংশোধন করে না এবং এটি কখনই ফিরে আসতে পারে না nullবা এর মতো কিছুই হতে পারে না ।

কল করা find()আমাদের কোনও কাজে দেয় না: এমডিএন ডকুমেন্টেশন বলে says

find()পদ্ধতি, অ্যারের মধ্যে একটি মান ফেরায় যদি অ্যারের সন্তুষ্ট মধ্যে একটি উপাদান প্রদান করা পরীক্ষা ফাংশন। অন্যথায় undefinedফেরত দেওয়া হয়।

আমরা ইতিমধ্যে ইনডেক্সিং ব্যবহার করে যা করতে পারি তার দুটিই।


এবং এখান থেকে, আর কোথাও যাওয়ার দরকার নেই। আমার লেখা কিছু নিয়ে যদি সন্দেহ হয় তবে আমাকে মন্তব্যে জানিয়ে দিন।


1
আমার ব্যক্তিগত পন্থা আমি একা গত ঘন্টার মধ্যে সঙ্গে কাজ করেছি সব সম্ভবপর আবিষ্কার করা গিয়েছে nullফিরে ফাংশন: String.prototype.match, RegExp.exec, এবং Array.prototype.includes। গঠনের পক্ষে এই সমস্ত অসম্ভবকে সন্ধান করা, যদি না আমি জানা না থাকি এমন একটি রেইজেক্স গঠনের বিজোড় উপায় না থাকে তবে আমি এই সিদ্ধান্তে পৌঁছেছি যে এটি করার কোনও সম্ভাব্য উপায় নেই।
কনর

চমৎকার বিশ্লেষণ! এটি সম্ভবত সঠিক উত্তর তবে আমি এখনও কিছু কৌশল আশা করছি ... সম্ভবত মিথ্যা আশা যদিও :)
জেনস রেন্ডার্স

যদি আমরা ধরা এবং নিক্ষেপের জন্য চিঠিগুলি পেতে পারি তবে আমরা কী ত্রুটির চিঠিগুলি পেতে পারি? তা হ'ল 'এইচআরআর'।
আর

3
এমনকি আমরা যদি স্ট্রিংগুলি তৈরি করি "catch"এবং "throw"যা বর্তমানে আমরা পারি না, evalআমাদের কী-ওয়ার্ড হিসাবে ব্যবহার করার মতো কিছু দরকার যা আমাদের লক্ষ্যটি প্রথম স্থানে রয়েছে।
লিন

নেতিবাচক সংখ্যাগুলি ব্যবহার -এবং নম্বর কাস্টিং সম্ভব , তবে এটি খুব সহায়ক নয়।
ক্যালকুলেটরফ্লাইন

15

লিনের উত্তরের 3 টি ফাংশন যে অকেজো ছিল না। তবে ইসমাস্ক্রিপ্ট 5- এর কড়া মোডটি আমার পরিকল্পনাটি ব্যর্থ করে দিয়েছে।

জাভাস্ক্রিপ্ট / ECMAScript এর পুরানো সংস্করণগুলিতে একটি বিচক্ষণতা রয়েছে। যদি কোনও পদ্ধতিকে কোনও বস্তু ছাড়াই ডাকা হয়, বিশ্বব্যাপী অবজেক্টটি windowধরে নেওয়া হয়। সুতরাং আমরা এটি করতে পারি:

a = {f:function(){return this}};
a.f();                            // Returns a.
g = a.f;
g();                              // Returns window.
window.g();                       // Also returns window.

এটি আধুনিক ব্রাউজারগুলির জন্য এখনও সত্য, তবে কেবলমাত্র যদি ফাংশনটি কঠোর মোডে সংজ্ঞায়িত না হয়। এবং সমস্ত অন্তর্নির্মিত ফাংশনগুলি (নেটিভ কোড সহ) মনে হয় কঠোর মোডে রয়েছে। পুরানো ব্রাউজারগুলিতে যখন এখনও কঠোর মোড নেই, এটি বিল্ট-ইন ফাংশনগুলির জন্যও কাজ করে।

ধরুন আমরা পুরানো ব্রাউজারগুলি ব্যবহার করছি। তারপরে আমরা চাইলে windowআমাদের একটি অন্তর্নির্মিত ফাংশনটি সন্ধান করতে হবে যা এতে থাকা কিছুকে ফিরিয়ে দেয় this। আমাদের কেবলমাত্র পছন্দগুলির মধ্যেই ফাংশনটি Array.prototype.concatহুবহু এটি করছে। আমরা এটির মতো এটি পরীক্ষা করতে পারি:

Number.prototype.concat = Array.prototype.concat;
1..concat(2);                     // Returns [1, 2]
concat = Array.prototype.concat;
window.concat(2);                 // Returns [window, 2]
concat(2)                         // TypeError in modern browsers while
                                  //   returning the same thing in older ones.
concat.bind(window)(2)            // A workaround in modern browsers.

সুতরাং মূলত এটি বিবেচ্য নয় যে এটিটির উপরে যে বস্তুটি আহ্বান করা হয়েছে তা একটি অ্যারে (তবে এটি অবশ্যই কমপক্ষে একটি বিষয় হতে হবে)। এটি ঠিক না থাকলে এটি একটি অ্যারেতে আবৃত করে।

যদি আমাদের থাকে তবে windowপ্রথমে আমরা স্ট্রিংটিতে স্ট্রিং এ [object Window]কাস্ট করে এটি পেতে পারি । নতুন চরিত্রের সাহায্যে আমরা নিম্নলিখিত দুটি লাইন যথাক্রমে bপেতে rএবং sব্যবহার করতে পারি এবং প্রতিটি চরিত্র যা আমাদের ছিল না constructor:

window["atob"]("cuaa")[0]
window["atob"]("cyaa")[0]

তবে অন্য সমস্যাটি হ'ল অবজেক্টের রেফারেন্সটি থেকে মুছে ফেলা [].concat। এটিকে একটি অ্যারেতে মুড়িয়ে ফেলা এবং উত্তোলনের কাজ হয় না, কারণ [].concatইতিমধ্যে এর অর্থ []["concat"]। আমি জানি যে কোনটি সম্ভবত ব্যবহার করে নির্মিত হতে পারে +[]()এটি কোনও ফাংশন থেকে ফিরে আসা। Array.prototype.findএটি করতে সক্ষম বলে মনে হয়েছিল:

[[]["concat"]]["find"](x=>1)      // Returns Array.prototype.concat, where x=>1 can
                                  //   be replaced with any always truthy function.

আমাদের সর্বদা সত্যবাদী কাজ ছিল। Array.prototype.concatএবং String.prototype.concatউভয়ই সত্য হিসাবে প্রত্যাবর্তন করে window। যদি আমরা পরে ব্যবহার করি তবে আমরা তিনটি উপলব্ধ ফাংশন ব্যবহার করেছিলাম।

তবে, দুর্ভাগ্যক্রমে, Array.prototype.findআমরা যে পুরানো ব্রাউজারটি ব্যবহার করছি তাতে বিদ্যমান নেই। কমপক্ষে আমি কাজ করে এমন একটিও পাইনি। এবং আমি অবজেক্টের রেফারেন্স অপসারণের অন্য কোনও উপায় খুঁজে পাইনি।

সম্পূর্ণ কোড যে আয় আধুনিক ব্রাউজারে testable হয় rএবং sসঙ্গে, .bind(window)কার্যসংক্রান্ত:

[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cuaa")[0];
[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cyaa")[0]

দুর্দান্ত তথ্য। আপনি কোন ব্রাউজার ব্যবহার করেছেন?
লিন

@ লিন অনেকগুলি নয় ফায়ারফক্স 3.6.0 এবং 25.0। আমি থেকে পড়তে এখানে এবং এখানে যে findঅনেক পরে কঠোর মোডে চেয়ে এসেছিল কিছু পরিশ্রমী খোঁজার সম্ভাবনা কম। আমি এজ সম্পর্কে জিজ্ঞাসা করেছি কারণ আমি ভেবেছিলাম মানকটি অনুসরণ করার ক্ষেত্রে এটির পিছনে সামঞ্জস্যতা পছন্দ করার সুযোগ থাকতে পারে। আমি একই কারণে কনকয়েরারও চেষ্টা করেছি। এবং কিছু কমান্ড লাইন ব্রাউজার, কিন্তু তাদের কেউ এমনকি জাভাস্ক্রিপ্ট সমর্থন করে না।
jimmy23013

আমি সাফারি .1.১ এবং ৮ এবং ব্রাউজারের স্ক্রিনশট ওয়েবসাইটে ফোনে কিছু এলোমেলোভাবে ডিফল্ট ব্রাউজারগুলি চেষ্টা করেছি। এখন পর্যন্ত কেউ কাজ করে না।
jimmy23013

@ জিমি 23013 সাফারি 5.0 বা 5.1 ব্যবহার করে দেখুন। আমি কী ব্যবহার করতে পারি তার অনুসারে , পুরানো সাফারিতে আংশিক সমর্থন বলতে কঠোর মোড বোঝায় যা এখনও প্রচুর জেএসকে অবৈধ বলে বিবেচনা করা উচিত। যদিও findএখনও কার্যকর করা হয়নি, সম্ভবত এটি আংশিক ছিল? ... কেবল যদি এটি তাদের তালিকায়
থাকত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.