val()=hd[(fn s=>let val$ =s^"\""^String.toString s^"\"]"val(189,%)=(size$,$)in print%end)"val()=hd[(fn s=>let val$ =s^\"\\\"\"^String.toString s^\"\\\")\"val(189,%)=(size$,$)in print%end)"]
এটি অনলাইন চেষ্টা করুন!
এমএলটনের জন্য, সম্পূর্ণ এসএমএল প্রোগ্রামগুলি হয় হয় সীমানা ছাড়াই এবং সমাপ্ত ;
(যেমন print"Hello";print"World";
) বা ঘোষণাপত্রগুলি var
এবং fun
কীওয়ার্ডগুলি (উদাহরণস্বরূপ var _=print"Hello"var _=print"World"
) যেখানে _
একটি ওয়াইল্ড কার্ড যেখানে কোনও পরিবর্তনশীল নাম দ্বারা প্রতিস্থাপন করা যেতে পারে।
প্রথম বিকল্পটি আধ্যাত্মিক প্রোগ্রামিংয়ের জন্য অকেজো কারণ ;
এটি নিজস্ব বৈধ প্রোগ্রাম (যা কিছুই করে না, তবে ত্রুটিও করে না)। দ্বিতীয় পদ্ধতির সমস্যাটি হ'ল এর মতো ঘোষণাগুলি var _=print"Hello"
কেবল ছোট var _="Hello"
(বা এমনকি var _=print
) ছোট করা যেতে পারে কারণ var
ডান হাতের ডিক্লারেশনটি যতক্ষণ কাজ করে ততক্ষণ একটি বৈধ এসএমএল এক্সপ্রেশন বা মান হয় (এসএমএল একটি কার্যকরী ভাষা, তাই ফাংশনগুলি হতে পারে) মান হিসাবেও ব্যবহৃত হয়)।
এই মুহুর্তে, আমি অসম্ভব এসএমএলে মূল প্রোগ্রামিং ঘোষণা করতে প্রস্তুত ছিলাম, যখন সুযোগে আমি - বিবৃতিতে প্যাটার্নের সাথে মিল রেখে হোঁচট val
খেয়েছিলাম। এটা পরিনত হয় যে ঘোষণা জন্য সিনট্যাক্স নয় val <variable_name> = <expression>
কিন্তু val <pattern> = <expression>
যেখানে একটি প্যাটার্ন পরিবর্তনশীল নাম, ধ্রুবক এবং কন্সট্রাকটর দ্বারা গঠিত হতে পারে। হিসাবে print
ফাংশন প্রকার হয়েছে string -> unit
, আমরা একটি প্যাটার্ন ম্যাচ ব্যবহার করতে পারেন unit
-value ()
জোরদার করা যে মুদ্রণ ফাংশন আসলে স্ট্রিং প্রয়োগ করা হয়: val()=print"Hey"
। এই পদ্ধতির সাহায্যে, হয় অপসারণ print
বা "Hey"
একটি Pattern and expression disagree
এরর ফলাফল ।
হাতে আদিম মুদ্রণের এই পদ্ধতিটির সাথে, পরবর্তী পদক্ষেপটি একটি কুইন লিখতে হবে, অবশেষে আরও কিছু সেভ-গার্ডিং যুক্ত করা দরকার। আমি আগে একটি সহজ এসএমএল কুইন কৌশল ব্যবহার করেছি ( পুনর্বিবেচনার ইতিহাসটি দেখুন ), তবে অ্যান্ডারস কাসারগ একটি ভিন্ন পদ্ধতির নির্দেশ করেছিলেন যা তার ক্ষেত্রে কিছু বাইট সংরক্ষণ করতে পারে। এটি String.toString
স্ট্রিং এস্কেপিং পরিচালনা করতে অন্তর্নির্মিত ফাংশনটি ব্যবহার করে এবং এটি সাধারণ ফর্মের <code>"<data>"
, যেখানে "<data>"
পূর্বের একটি পালিয়ে যাওয়া স্ট্রিং রয়েছে code
:
val()=(fn s=>print(s^"\""^String.toString s^"\""))"val()=(fn s=>print(s^\"\\\"\"^String.toString s^\"\\\"\"))"
এটি একটি কার্যকরী কুইন তবে এখনও প্রাচীন নয়। সবার আগে অ্যান্ডারস কাসের্গ জানতে পেরেছিলেন যে এমএলটন "
ত্রুটি তৈরি না করেই কোড হিসাবে একটি একক উদ্ধৃতি গ্রহণ করে , যার অর্থ আমরা উপরের মত একটি উদ্ধৃতিতে কোড এন্ডিং করতে পারি না। এটি প্রতিরোধের সবচেয়ে সংক্ষিপ্ততম উপায় val()=
হ'ল একজোড়া প্রথম বন্ধনীর পরে সমস্ত কিছু মোড়ানো , তবে তারপরে কোডটি কমিয়ে আনা যায় val()=()
। দ্বিতীয় সংক্ষিপ্ততম উপায়টি আমি খুঁজে পেলাম এটি হ'ল val()=hd[ ... ]
আমরা হ'ল সবকিছুকে একটি তালিকায় মোড়ানো এবং প্রকারের চেকারকে খুশি করার জন্য এর প্রথম উপাদানটি ফিরে আসি ।
ডেটা স্ট্রিংয়ের কোনও অংশ নজরে না val
ফেলেই মুছে ফেলা যায় না তা নিশ্চিত করার জন্য- ডিস্ক্লায়ারেশনগুলিতে প্যাটার্ন-ম্যাচিং আবার কাজে আসে: মুদ্রণযোগ্য চূড়ান্ত স্ট্রিংয়ের দৈর্ঘ্য ১৯৫ এর সমান হওয়া উচিত, সুতরাং পরিবর্তে বিমূর্তির let val t=... val 195=size t in print t end
শরীরে আমরা লিখতে পারি । স্ট্রিংয়ের একটি অংশ অপসারণের ফলে 189-এরও কম দৈর্ঘ্য হয়, ফলে একটি ব্যতিক্রম ছুঁড়ে ফেলা হয়।fn
print(...)
Bind
এখনও একটি সমস্যা বাকি আছে: পুরো val 195=size t
চেকটি কেবল বাদ দেওয়া যেতে পারে। আমরা একটি টিউপলের সাথে মেলে চেকটি প্রসারিত করে এটি প্রতিরোধ করতে পারি: val t=... val(216,u)=(n+size t,t)in print u end
যেমন চীন ফলাফলগুলি আনবাউন্ডেবল ভেরিয়েবলে সরিয়ে দেয় u
।
সামগ্রিকভাবে, এটি নিম্নলিখিত 195 বাইট সমাধান পান:
val()=hd[(fn s=>let val t=s^"\""^String.toString s^"\")"val(195,u)=(size t,t)in print u end)"val()=hd[(fn s=>let val t=s^\"\\\"\"^String.toString s^\"\\\")\"val(195,u)=(size t,t)in print u end)"]
মত অপারেটর পরিবর্তনশীল নামের ব্যবহারের golfing কৌতুক প্রয়োগ করা হচ্ছে !
, $
এবং %
পরিবর্তে n
, t
এবং u
অর্ডার কিছু সাদা স্থান সংরক্ষণ করার জন্য (দেখুন এই ডগা চূড়ান্ত 182 বাইট সংস্করণে) বাড়ে।
অন্যান্য সমস্ত স্ট্রিং-রিমুভালগুলি যেখানে স্পষ্টভাবে ব্যাখ্যাটিতে বর্ণিত হয়নি সেখানে সিনট্যাক্স বা টাইপ ত্রুটির ফলাফল হওয়া উচিত।
সম্পাদনা 1: length(explode t)
ঠিক size t
।
সম্পাদনা 2: একটি ভিন্ন কুইন পদ্ধতির জন্য এবং "দুর্বলতা" দেখানোর জন্য আন্ডারস কাসের্গকে ধন্যবাদ জানাই।