একটি প্রিস্টাইন ওয়ার্ল্ড কুইনিং


16

এই চ্যালেঞ্জের বন্ধ ভিত্তি করে Helka Homba এর প্রশ্ন প্রোগ্রামিং একটি আদিম পৃথিবী । এই প্রশ্ন থেকে, একটি প্রাথমিক প্রোগ্রামের সংজ্ঞাটি হ'ল:

এর একটি সংজ্ঞায়িত করা যাক আদিম প্রোগ্রাম একটি প্রোগ্রাম যা কোনো ত্রুটি নিজেই নেই কিন্তু আপনি তা এন অক্ষরের কোনো সংলগ্ন সাবস্ট্রিং সরানোর, যেখানে দ্বারা সংশোধন ত্রুটি হবে 1 <= N < program length

উদাহরণস্বরূপ, পাইথন 2 প্রোগ্রামের তিনটি চরিত্র

`8`

একটি প্রাথমিক প্রোগ্রাম ( ধন্যবাদ, স্প ) কারণ দৈর্ঘ্য 1 এর সাবস্ট্রিংগুলি অপসারণের ফলে সমস্ত প্রোগ্রাম ত্রুটি ঘটায় (আসলে সিনট্যাক্স ত্রুটি, তবে কোনও ধরণের ত্রুটি করবে):

8`
``
`8

এবং দৈর্ঘ্য 2 এর সাবস্ট্রিংগুলি অপসারণের ফলে প্রাপ্ত সমস্ত প্রোগ্রাম ত্রুটি সৃষ্টি করে:

`
`

উদাহরণস্বরূপ, `8যদি একটি অ-ত্রুটিযুক্ত প্রোগ্রাম হয়ে থাকে তবে আধ্যাত্মিকতা `8`না থাকায় সাবস্ট্রিং অপসারণের সমস্ত ফলাফল অবশ্যই ত্রুটিযুক্ত হওয়া উচিত।

মন্তব্য:

  • সংকলক সতর্কতা ত্রুটি হিসাবে গণনা করা হয় না।
  • ত্রুটিযুক্ত সাবপ্রগ্রামগুলি ইনপুট নিতে পারে বা আউটপুট দিতে পারে বা যতক্ষণ না ত্রুটি করে ততক্ষণ অন্য কিছু করতে পারে।

আপনার কাজটি হ'ল শূন্য দৈর্ঘ্যের এমন একটি প্রোগ্রাম তৈরি করা যা এর নিজস্ব উত্স কোডটি হুবহু প্রিন্ট করে, যথাযথ কুইনের নিয়ম অনুসরণ করে এবং আধ্যাত্মিক

প্রতিটি ভাষার জয়ের জন্য বাইটের মধ্যে সংক্ষিপ্ত উত্তর।


আমি এমন ভাষা ধরে নিচ্ছি যা ত্রুটি প্রতিযোগিতা করতে পারে না?
এটাকো

@ATaco দুর্ভাগ্যক্রমে হ্যাঁ অন্যান্য ভাষাগুলি, যেমন লিস্পের সিন্ট্যাক্সটি এমনভাবে কাঠামোযুক্ত করা হয়েছে যে একটি কার্যকর আদি প্রোগ্রাম তৈরি করা অসম্ভব।
শেলভাকু

আসল / গুরুতরভাবে আরআইপি
এটাকো

'প্রতিটি ভাষার জয়ের জন্য বাইটের মধ্যে সংক্ষিপ্ত উত্তর' ' সংক্ষিপ্তটি কোনও প্রাথমিক প্রোগ্রামের সেরা মাপকাঠি হওয়ার বিষয়ে আমি নিশ্চিত নই।
পি। সিহর

@ পি.সিহর এর পরিবর্তে আপনি কী উপার্জন করবেন?
শেলভাকু

উত্তর:


6

হাস্কেল , 132 বাইট

q x=if length x==132then putStr x else fail[];main=q$(++)<*>show$"q x=if length x==132then putStr x else fail[];main=q$(++)<*>show$"

এটি অনলাইন চেষ্টা করুন!

এটি কুইনের একটি এক্সটেনশন

main=putStr$(++)<*>show$"main=putStr$(++)<*>show$"

যা showনিজেই একটি উদ্ধৃত সংস্করণ (ব্যবহার করে ) এর সাথে ডেটা স্ট্রিংকে সংযুক্ত করে এবং ফলাফল মুদ্রণ করে কাজ করে। যাইহোক, এটি আধ্যাত্মিক নয় কারণ ডেটা স্ট্রিংয়ের কোনও অক্ষর ব্যর্থ না হয়ে মুছে ফেলা যায় এবং প্রোগ্রামটি না ভেঙে $(++)<*>show$বা (++)<*>অংশটি বাদ দেওয়া যেতে পারে।

এটির সমাধান করতে, একটি কাস্টম মুদ্রণ ফাংশন qসংজ্ঞায়িত করা হয়, যা চেক দেওয়া পংক্তি এবং কলের দৈর্ঘ্য failযদি এটা খাটো চেয়ে 132. এই ক্যাচ ডেটা স্ট্রিং থেকে কোন ক্রম সরানোর এবং এর সরানো হচ্ছে $(++)<*>show$বা (++)<*>, উভয় ক্ষেত্রেই ফল হিসেবে স্ট্রিং qসংক্ষিপ্ত হয়।

ইন qসংখ্যা 132থেকে সংক্ষিপ্ত করা যেতে পারে 1, 13, 32বা 2, কিন্তু প্রতিটি ক্ষেত্রে আবার failবলা হয়।

যতদূর আমি বলতে পারি, অন্য যে কোনও স্ট্রিংগুলি অপসারণের ফলে সিন্ট্যাক্স বা টাইপ ত্রুটি হয়, তাই প্রোগ্রামটি প্রথম স্থানে সংকলন করে না। (হাস্কেলের কঠোর প্রকারের ব্যবস্থাটি এখানে কাজে আসবে))

সম্পাদনা করুন: ত্রুটিগুলি নির্দেশ করার জন্য আরজান জোহানসেন এবং শেলভাকুকে ধন্যবাদ!


আমি ভয় পাচ্ছি fail[]|length x/=122যে সরিয়ে ফেলা যায়। fail[]:[putStr x|length x==122]আরও ভাল কাজ করতে পারে।
janর্জন জোহানসেন

আরগ, না, তারপর |length x==122সরানো যেতে পারে। if length x==122 then putStr x else fail[]সম্ভবত?
janর্জন জোহানসেন

@ আরজান জোহেনসেন ভাল ক্যাচ, আমার আগে একটা ছিল if then elseকিন্তু আমি ভেবেছিলাম আমি এটি ছোট করতে পারব।
লাইকনি

2
putStr xহয়ে উঠতে পারে p x, যখন আমি এটির হত্যার আগে যখন আমি আমার সিস্টেমে চেষ্টা করেছি খুব দীর্ঘ সময় ধরে, তখন আমি সন্দেহ করি যে টেল কল পুনরাবৃত্তিটি অনুকূলিত হয়েছিল, সুতরাং এটি একটি অসীম লুপ। কীভাবে এটি ঠিক করা যায় সে সম্পর্কে কোনও পরামর্শ দেওয়ার জন্য আমি পর্যাপ্ত হ্যাশেল জানি না।
শেলভাকু

পছন্দ করুন নাম পরিবর্তন pকরে qএটি ঠিক করা উচিত।
janর্জন জোহানসেন

4

পাইথন 3 , 113 বাইট

for[]in{113:[]}[open(1,"w").write((lambda s:s%s)('for[]in{113:[]}[open(1,"w").write((lambda s:s%%s)(%r))]:a'))]:a

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

দ্বিতীয়টি মুছে ফেলা হতে পারে বলে আমরা সহজেই একাধিক বিবৃতি ব্যবহার করতে পারি না, তাই আমরা একক-এক্সপ্রেশন কুইন দিয়ে শুরু করি:

print((lambda s:s%s)('print((lambda s:s%%s)(%r))'))

এটিকে সাবস্ট্রিং মোছার হাত থেকে রক্ষা করতে আমরা এর open(1,"w").writeপরিবর্তে ব্যবহার করি print। পাইথন 3-তে, writeলিখিত অক্ষরের সংখ্যা প্রদান করে, যা আমরা যাচাই করব তা 113নিশ্চিত করে স্ট্রিংয়ের কোনও অংশ মুছে ফেলা হয়নি। আমরা অভিধানে রিটার্ন মানটি অনুসন্ধান {113:[]}করে এবং ফলাফলটি for[]in…:aফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফিরে যাচ্ছি যদি আমরা একটি খালি পুনরাবৃত্তি না পেয়ে বা forবিবৃতি মুছে ফেলা হয় তবে তা ব্যর্থ হবে ।


1
আপনার কোড কীভাবে কাজ করে তার একটি ব্যাখ্যা আপনি দিতে পারেন?
শেলভাকু

@ শেলভাকু হ্যাঁ, যোগ করা হয়েছে।
অ্যান্ডারস ক্যাসরগ

3

রুবি, 78 বাইট

eval(*[($>.write((s=%{eval(*[($>.write((s=%%{%s})%%s)-78).chr])})%s)-78).chr])

আমি এটি লিখেছিলাম যখন আমি সম্ভব হয়েছিল কিনা তা নিশ্চিত করার চ্যালেঞ্জটি ভেবেছিলাম। এটি মূল আদি চ্যালেঞ্জের আমার উত্তরগুলির মধ্যে থেকে একই "র‍্যাপার" ব্যবহার করে।

ব্যাখ্যা:

  • eval(*[ expr ])

    এটি রুবি প্রোগ্রাম হিসাবে যা কিছু কোড ফেরত দেয় তা মূল্যায়ন করে । এটি কার্যকরভাবে পরীক্ষা করে যে কোডটি দেয় যে স্ট্রিংটি একটি বৈধ রুবি প্রোগ্রাম। সুবিধামতভাবে, রুবি প্রোগ্রামগুলি ফাঁকা হতে পারে, বা কেবল সাদা স্থান থাকতে পারে।

    "স্প্ল্যাট" অপারেটর *আপনাকে কোনও ক্রিয়াকলাপের আর্গুমেন্ট হিসাবে অ্যারে ব্যবহার করতে দেয়। এর অর্থ হ'ল যদি evalঅপসারণ করা হয়, ফলাফল প্রোগ্রামটি (*[ এক্সপ্রেস হয় ]) , যা বৈধ রুবি নয়।

  • ($>.write( Str )-78).chr

    $> STDOUT এর জন্য একটি সংক্ষিপ্ত পরিবর্তনশীল।

    $>.write(foo) STDOUT এ foo লিখে এবং, গুরুত্বপূর্ণ এই কোডটির জন্য, লিখিত বাইটের সংখ্যা প্রদান করে।

    $>.write(foo)-78: এখানে 78প্রোগ্রামটির দৈর্ঘ্য রয়েছে, এবং তাই যদি প্রোগ্রামটি ম্যাঙ্গেল করা না হয় তবে লিখিত বাইটের সংখ্যাও হবে। অতএব, নিরবচ্ছিন্ন ক্ষেত্রে, এটি শূন্য ফিরে আসবে।

    num.chrএকটি অক্ষর হিসাবে num দেয়, উদাহরণস্বরূপ 0.chrএকটি নাল বাইট সমন্বিত একটি স্ট্রিং প্রদান করবে। নিরবিচ্ছিন্ন প্রোগ্রামে এটি একক নাল বাইটের সাথে একটি স্ট্রিং দেবে eval, এটি একটি বৈধ রুবি প্রোগ্রাম যা কোনও অন -আপ।

    এছাড়াও, প্রোগ্রামটিতে এমন একটি স্ট্রিংিং মুছে ফেলা হতে পারে যা এটি কেবলমাত্র eval(*[(78).chr])বা eval(*[(8).chr])যার অর্থ হল যে সংখ্যার ধ্রুবক কোনও সংখ্যার সাথে শেষ হতে পারে না (0, 4, 9, 10, 11, 12, 13, 26, 32, 35, 48 , 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 64, 95) কারণ তারা বৈধ একক-চরিত্রের রুবি প্রোগ্রামগুলির জন্য এসকি কোড।

  • %{ Str }

    এটি রুবিতে স্ট্রিং আক্ষরিক জন্য একটি কম পরিচিত সিনট্যাক্স। এটি এখানে ব্যবহার করার কারণটি হ'ল ভারসাম্যযুক্ত জোড়গুলির {}স্ট্রিংয়ের মধ্যে ব্যবহার করা যেতে পারে যার অর্থ এই বাক্য গঠনটি নিজেই ধারণ করতে পারে। উদাহরণস্বরূপ, %{foo{bar}}হিসাবে একই "foo{bar}"

  • (s=%{ উপাত্ত })%s

    এটি sপ্রিন্টফ স্ট্রিং হিসাবে এই ভেরিয়েবলের ডেটা যা ভেরিয়েবলকে সংজ্ঞায়িত করে ।

    রুবি ফেরতের ক্ষেত্রে অ্যাসাইনমেন্টগুলি যা বরাদ্দ করা হয়েছিল, তাই এটি প্রথম নিয়োগ sএবং তারপরে চলার মতোs%s

    %স্ট্রিং এ রুবীর সমতুল্য স্প্রিন্টের জন্য সিনট্যাটিক চিনি। %sপ্রকাশ করে যেখানে ডাটা মধ্যে তথ্য নিজেই এমবেড করা উচিত নয়।

    এই বিট কোডটি কোয়েনের ডেটা অংশটি সংজ্ঞায়িত করে এবং সম্পূর্ণ কোড তৈরি করতে এটি নিজের মধ্যে এম্বেড করে।


3

স্ট্যান্ডার্ড এমএল (এমএলটন) , 204 182 189 বাইট

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-এরও কম দৈর্ঘ্য হয়, ফলে একটি ব্যতিক্রম ছুঁড়ে ফেলা হয়।fnprint(...)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: একটি ভিন্ন কুইন পদ্ধতির জন্য এবং "দুর্বলতা" দেখানোর জন্য আন্ডারস কাসের্গকে ধন্যবাদ জানাই।


"\""সরাসরি লিখে এবং String.toStringপালানোর জন্য ব্যবহার করে −2 বাইট
অ্যান্ডারস ক্যাসরগ

অপেক্ষা করুন, এটি ভয়াবহ: এমএলটন "খালি আউটপুট ( টিআইও ) তৈরি করে প্রোগ্রামটি গ্রহণ করবে বলে মনে হচ্ছে ।
অ্যান্ডারস ক্যাসরগ

@ আন্ডারস ক্যাসরগ হুহ, এটি আশ্চর্যজনক। তবে অন্যটি ব্যবহার করে এই সমস্যাটি সমাধান করা সম্ভব হওয়া উচিত let ... in ... end
লাইকনি

@ অ্যান্ডারস ক্যাসরগ আমি আশা করি নতুন "দুর্বলতা" প্রবর্তন না করেই বিষয়টি সমাধান করেছি।
লাইকনি

প্রকৃতপক্ষে আমি এমএলটনকে "একটি প্রোগ্রাম হিসাবে গ্রহণ করে দেখেছি এবং মনে হচ্ছে যে এই প্রতিশ্রুতিতে বাগটি স্থির হয়ে গেছে , সুতরাং আপনি 182 বা আমার 180 ততক্ষণ ঠিক আছেন যতক্ষণ আপনি এমএলটনের অপ্রকাশিত গিট সংস্করণ উল্লেখ করেন।
অ্যান্ডারস ক্যাসরগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.