জাপট, 29 28 বাইট
Japt একটি সংক্ষিপ্ত সংস্করণ জা vaScri পর্তুগীজ ভাষায় । অনুবাদক
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
নোট করুন যে তীর ফাংশনগুলির জন্য একটি ES6- কমপ্লায়েন্ট ব্রাউজারের প্রয়োজন যেমন ফায়ারফক্সের নতুন সংস্করণ। ইনপুট একটি 4 আইটেমটি অ্যারে, যেমন যেমন যায় [1,-1,4,2]
।
কিভাবে এটা কাজ করে
// Implicit: U = input array
1o5 // Create a range of integers from 1 to 5. Returns [1,2,3,4]
mZ=> // Map each item Z in this range to:
$eval$( // evaluate:
Uq'+ // U joined with "+" (equivalent to summing U)
)/2 // divided by 2,
-UgZ%4 // minus the item at Z%4 in the input. This translates to [y₁,x₂,y₂,x₁],
// which in turn tranlsates to:
// [(x₁-y₁+x₂+y₂)/2, (x₁+y₁-x₂+y₂)/2, (x₁+y₁+x₂-y₂)/2, (-x₁+y₁+x₂+y₂)/2]
// which is [Lx,Ly,Rx,Ry], or [Rx,Ry,Lx,Ly], depending on the situation.
// Implicit: Output last expression
এটি কিভাবে গল্ফ ছিল
আমি প্রথমে @ মেগোর পাইথন পদ্ধতির অনুলিপিটি অনুলিপি করার চেষ্টা করেছি। এটি আমাকে এই 48-বাইট দৈত্যের সাথে ছেড়ে দিয়েছে:
(দ্রষ্টব্য: ইনপুটটি বর্তমানে অ্যারেতে আবৃত করা উচিত নয়))
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
যেহেতু এই আইটেমগুলির প্রতিটি 2 দিয়ে বিভাজন করা দরকার, তাই এটির সাথে পুরো অ্যারেটি ম্যাপ করা খাটো mY=>Y/2
:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
এখন কি? ঠিক আছে, অ্যারে এখন কেবল ইনপুটগুলির মধ্যে তিনটি যুক্ত করছে এবং প্যাটার্নটি অনুসরণ করে চতুর্থটি বিয়োগ করছে 1,2,3,0
। সুতরাং, আমরা ইনপুটগুলিকে একটি অ্যারেতে প্যাক করতে পারি, তারপরে সেগুলি একসাথে যুক্ত করতে পারি, ২ দিয়ে ভাগ করতে পারি এবং প্রয়োজনীয় আইটেমটি বিয়োগ করতে পারি:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
ভাল, একটি বাইট সংরক্ষণ! তবে শুরুতে অ্যারে সঙ্কুচিত করা কি সম্ভব? আসুন এটি স্ট্রিংয়ে প্যাক করার চেষ্টা করুন, তারপরে এটিকে আবার অ্যারেতে বিভক্ত করুন a
:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
সেদিকে তাকাও, অন্য একটি বাইট রক্ষা পেয়েছে। তবে এর থেকেও আরও ভাল উপায় কি আছে? ঠিক আছে, আমরা এই সত্যটি ব্যবহার করতে পারি [1,2,3,0] ≡ [1,2,3,4] mod 4
:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
আরও দুটি বাইট! এখন আমরা কোথাও যাচ্ছি। তবে তা Ug0 +Ug1 +Ug2 +Ug3
অনেক জায়গাতেই হোগিং করছে। আমরা যদি যোগের সাথে অ্যারে হ্রাস করি?
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
বাহ, এটা সত্যিই সাহায্য করেছে! এখন আমরা 29 বাইটে নেমে এসেছি। এবং @ ɟ nɟuɐɯɹɐ ן oɯ এর জন্য ধন্যবাদ, আমি এমনকি হ্রাসটি বন্ধ করে অন্য একটি বাইট গল্ফ করতে সক্ষম হয়েছি। তবে যদি আমরা অ্যারের যোগফলের জন্য কোনও অন্তর্নির্মিত ব্যবহার করতে পারি, তবে এটি আরও ছোট হবে:
1o5 mZ=>Uu /2-UgZ%4
19 বাইট! অ্যামেজিং! দুর্ভাগ্যক্রমে, জাপটে এখনও এ জাতীয় কোনও বিল্ট-ইন নেই। সুযোগ পেলেই আমি এটিকে যুক্ত করব। প্রোগ্রামগুলি বা ভাষা উভয়ের জন্যই পরামর্শগুলি স্বাগত!
ঠিক আছে, ভি 1.4.4 হিসাবে, আমি মূলত যতটা পরিকল্পনা করেছি তার চেয়ে বেশি কয়েকটি বৈশিষ্ট্য জাপটে প্রয়োগ করেছি। সংক্ষিপ্ত সংস্করণের জন্য মূল পরিকল্পনাটি শুরু করে:
1o5 mZ=>Uu /2-UgZ%4
প্রথমে আমাদের কয়েকটি জিনিস পরিবর্তন করতে হবে: ফাংশনগুলি সংজ্ঞায়িত করা হয় {
, এবং যোগফলটি হয় x
। এই সংস্করণটি যেমন রয়েছে তেমন কাজ করে:
1o5 mZ{Ux /2-UgZ%4
এখন, এর @
জন্য একটি সংক্ষিপ্তকরণ XYZ{
, আমাদের থেকে স্যুইচ করে একটি বাইট সংরক্ষণ Z
করতে দেয় X
। এছাড়াও, অন্য একটি বাইট সংরক্ষণের £
জন্য একটি শর্টকাট m@
:
1o5 £Ux /2-UgX%4
সম্প্রতি আমি এমন একটি বৈশিষ্ট্য প্রয়োগ করেছি যেখানে U
প্রোগ্রামের শুরুতে একটি সাধারণত বাদ দেওয়া যায়। বাস্তবায়নের ভুলের কারণে, তবে এটি ফাংশনগুলির সাথেও কাজ করে:
1o5 £x /2-UgX%4
পরিশেষে, g
সূচকটি স্ট্রিংয়ের শেষের পরে থাকলে এখন ফাংশনটি মোড়ানো হয়, আমাদের %4
মোট 13 বাইটের জন্য সরিয়ে ফেলতে দেয় :
1o5 £x /2-UgX
এবং আমি ভেবেছিলাম 19 টি আশ্চর্যজনক ছিল ;-) এটি অনলাইনে পরীক্ষা করুন!