জুলিয়ায় গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা জুলিয়ার অন্তত কিছুটা নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)।
জুলিয়ায় গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা জুলিয়ার অন্তত কিছুটা নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)।
উত্তর:
দ্রষ্টব্য: নীচে কিছু পুরানো টিপস থাকতে পারে, কারণ জুলিয়া কাঠামোর দিক থেকে এখনও বেশ স্থিতিশীল নয়।
কয়েকটি চরিত্র সংরক্ষণ করার জন্য কয়েকটি কৌশল
\ =div
এবং আপনি তার a\b
পরিবর্তে টাইপ করতে পারেন div(a,b)
। স্থানটি নোট করুন - এটি "\ =" অপারেটর হিসাবে পার্সিং এড়ানোর জন্য এটি প্রয়োজনীয়। আরও মনে রাখবেন যে, আরপিএল প্রম্পট পর্যায়ে যদি ওভারলোড হয় তবে এটি ব্যবহার করুন (\)=Base.(\)
বা \ =Base. \
পুনরায় সেট করতে। উল্লেখ্য: কিছু ফাংশন হল UTF-8 অপারেটর, যেমন পূর্ব নির্ধারিত বিদ্যমান আছে ÷
জন্য div
, যেমন অ্যালেক্স উ দ্বারা লক্ষনীয়a>0?"Hi":""
, "Hi"^(a>0)
একটি বাইট বাঁচাতে বা বুলিয়ান এ এর "Hi"^a
জন্য তিনটি বাইট সংরক্ষণ করুন।a=split("Hi there"," ")
, আপনি অ্যাসাইনমেন্টে মাত্র দুটি অতিরিক্ত অক্ষরের ব্যয় করে প্রতিটি ব্যবহারের জন্য তিনটি বাইট সংরক্ষণ করতে এবং যা ব্যবহার হিসাবে চিহ্নিত করতে পারেন a[1]
এবং a[2]
ব্যবহার করে এড়াতে সক্ষম হতে a,b=split("Hi there"," ")
পারেন । স্পষ্টতই, যদি আপনি ভেক্টর অপারেশনগুলির সাথে কাজ করতে পারেন তবে এটি করবেন না।a
b
[]
- অ্যারেগুলির জন্য, এক্সপ্রেশনটি A[]
সমান A[1]
। মনে রাখবেন যে আপনি যদি প্রথম চরিত্রটি পেতে চান বা টিপলসের পক্ষে স্ট্রিংসের পক্ষে কাজ করে না।==[]
অ্যারে এবং টিপলসগুলির জন্য ব্যবহার করুন ==()
; একইভাবে, নেতিবাচক জন্য, ব্যবহার !=[]
এবং !=()
। স্ট্রিংয়ের ==""
জন্য, খালি জন্য ব্যবহার করুন , তবে >""
শূন্য নয়, কারণ "" অন্য কোনও স্ট্রিংয়ের আগে অভিধানের মতো রয়েছে।x<=1&&"Hi"
হিসাবে এটি লেখা যেতে পারে x>1||"Hi"
(এতক্ষণ বুলেটিয়ান ফেরানো গুরুত্বপূর্ণ নয়)।in('^',s)
পরিবর্তে ব্যবহার করুন contains(s,"^")
। আপনি যদি অন্য অক্ষরগুলি ব্যবহার করতে পারেন তবে আপনি আরও কিছুটা সাশ্রয় করতে পারেন '^'∈s
তবে নোট করুন যে ∈
ইউটিএফ -8 এ 3 বাইট।minimum(x)
বা maximum(x)
ব্যবহারের চেয়ে সর্বনিম্ন বা সর্বাধিক ব্যবহার করবেন না , যদি আপনি জানেন তবে কমপক্ষে দুটি উপাদান থাকবে। বিকল্পভাবে, আপনি যদি জানেন তবে সমস্ত উপাদান অ-নেতিবাচক হবে, ব্যবহার করুন বাmin(x...)
max(x...)
x
x
minabs(x)
maxabs(x)
r"(?m)match^ this"
, টাইপ করবেন না r"match^ this"m
, তিনটি অক্ষর সংরক্ষণ করবেন।reverse(x)
চেয়ে এক বাইট বেশি দীর্ঘ flipud(x)
এবং একই অপারেশনটি সম্পাদন করবে, সুতরাং পরবর্তীটি আরও ভাল।{[1,2]}
নয়, {1,2}
) - জুলিয়া ০.৪ এর জন্য আপনার প্রয়োজন হবে Any[[1,2]]
।end
অ্যারে ইনডেক্সিংয়ের মধ্যে ব্যবহার করলে এটি স্বয়ংক্রিয়ভাবে অ্যারে / স্ট্রিংয়ের দৈর্ঘ্যে রূপান্তরিত হয়। তার চেয়ে বরং 3 টি অক্ষর সংরক্ষণ করতে k=length(A)
ব্যবহার করুন A[k=end]
। মনে রাখবেন যে আপনি অবিলম্বে কে ব্যবহার করতে চাইলে এটি উপকারী হতে পারে না be এটি একটি বহুমাত্রিক ক্ষেত্রেও কাজ করে - A[k=end,l=end]
এর প্রতিটি মাত্রার আকার পাবেন A
- তবে (k,l)=size(A)
এই ক্ষেত্রে এক বাইট দ্বারা সংক্ষিপ্ত হয়, তাই আপনি যদি একই সাথে শেষ উপাদানটি অবিলম্বে অ্যাক্সেস করতে চান তবে এটি ব্যবহার করুন।A[k=1:end]
ক্ষেত্রে k
একটি পুনরাবৃত্তি ম্যাচটি ধরে রাখবে 1:length(A)
। আপনি যখন A
একই সাথে অ্যারে ব্যবহার করতে চান তখন এটি কার্যকর হতে পারে ।collect(A)
, ব্যবহার করুন [A...]
যা একই কাজ করবে এবং 4 বাইট সংরক্ষণ করবে।"$(s[i])"
বা dec(s[i])
ব্যবহার করুন "$i"
।?:
পরিবর্তে &&
বা ||
শর্তাধীন অ্যাসাইনমেন্টের জন্য - যে, যদি তোমরা শুধুমাত্র কিছু শর্তে একটি কাজ সম্পাদন করতে চান, আপনি লিখে এক বাইট সংরক্ষণ করতে পারবেন cond?A=B:1
বদলে cond&&(A=B)
, অথবা cond?1:A=B
বরং cond||(A=B)
। নোট করুন যে 1
, এখানে, একটি ডামি মান।union
বা এর ∪
পরিবর্তেunique
- union(s)
একই কাজ করবে unique(s)
এবং প্রক্রিয়াটিতে একটি বাইট সংরক্ষণ করবে। আপনি যদি নন-এএসসিআইআই অক্ষর ব্যবহার করতে পারেন ∪(s)
তবে একই কাজটি করবে এবং ∪
কেবলমাত্র 5 বাইটের মধ্যে 5 বাইটের পরিবর্তে ব্যয় হবে union
।split("Hi there")
প্যাটার্ন আর্গুমেন্টটি কোনও স্পেসের ডিফল্ট হওয়ায় আপনি কেবল ফাঁকা জায়গায় বিভক্ত করতে পারেন ।
পুনরায় সংজ্ঞায়িত অপারেটরগুলি বন্ধনী এবং কমাগুলিতে প্রচুর বাইট সংরক্ষণ করতে পারে।
অবিচ্ছিন্ন উদাহরণের জন্য, ফিবোনাচি অনুক্রমের নিম্নলিখিত পুনরাবৃত্তিমূলক বাস্তবায়নগুলির সাথে তুলনা করুন:
F(n)=n>1?F(n-1)+F(n-2):n # 24 bytes
!n=n>1?!~-n+!(n-2):n # 20 bytes
!n=n>1?!~-n+!~-~-n:n # 20 bytes
পুনরায় সংজ্ঞায়িত অপারেটর তার প্রাথমিক অগ্রাধিকার ধরে রাখে।
মনে রাখবেন যে আমরা ইতিমধ্যে পূর্ণসংখ্যার জন্য সংজ্ঞায়িত করা হয়েছে, কেবলমাত্র বুলিয়ানদের জন্যই সংজ্ঞায়িত হওয়ার পরে আমরা !
পক্ষে যেতে পারিনি favor~
~
!
এমনকি পুনরাবৃত্তি ছাড়াই অপারেটরের নতুন সংজ্ঞা দেওয়া বাইনারি ফাংশন সংজ্ঞায়নের চেয়ে কম। একটি সাধারণ বিভাজ্যতা পরীক্ষার নিম্নলিখিত সংজ্ঞাগুলি তুলনা করুন।
f(x,y)=x==0?y==0:y%x==0 # 23 bytes
(x,y)->x==0?y==0:y%x==0 # 23 bytes
x->y->x==0?y==0:y%x==0 # 22 bytes
x\y=x==0?y==0:y%x==0 # 20 bytes
অ্যাকারম্যান ফাংশন গণনা করতে বাইনারি অপারেটরটিকে কীভাবে পুনরায় সংজ্ঞায়িত করতে হবে তা নীচে বর্ণনা করা হয়েছে:
A(m,n)=m>0?A(m-1,n<1||A(m,n-1)):n+1 # 35 bytes
^ =(m,n)->m>0?(m-1)^(n<1||m^~-n):n+1 # 36 bytes
| =(m,n)->m>0?m-1|(n<1||m|~-n):n+1 # 34 bytes
m\n=m>0?~-m\(n<1||m\~-n):n+1 # 28 bytes
নোট করুন যে ^
নিয়মিত শনাক্তকারী ব্যবহার করার চেয়েও বেশি দীর্ঘ, কারণ এর প্রাধান্য খুব বেশি।
যেমনটা পূর্বে বর্ণিত
m|n=m>0?m-1|(n<1||m|~-n):n+1 # 28 bytes
|
ইতিমধ্যে এই ক্ষেত্রে সংজ্ঞায়িত হিসাবে পূর্ণসংখ্যার যুক্তিগুলির জন্য কাজ করবে না । পূর্ণসংখ্যাগুলির জন্য সংজ্ঞাটি পরিবর্তিত হতে পারে
m::Int|n::Int=m>0?m-1|(n<1||m|~-n):n+1 # 38 bytes
তবে তা নিষিদ্ধ দীর্ঘ long তবে, বাম আর্গুমেন্ট হিসাবে একটি ফ্লোট এবং ডান আর্গুমেন্ট হিসাবে একটি পূর্ণসংখ্যা পাস করলে এটি কাজ করে ।
খুব সহজেই ফ্যাক্টর দ্বারা প্রলুব্ধ হবেন না (এন) প্ররোচিত বেস লাইব্রেরি factor(n)
ফাংশনটিতে একটি মারাত্মক ত্রুটি রয়েছে: এটি একটি বিন্যস্ত পদ্ধতিতে আপনার পূর্ণসংখ্যার গুণককে ফিরিয়ে দেয় Dict
। সুতরাং, আপনার যে ডেটাটি চেয়েছিলেন তা পেতে এটির জন্য ব্যয়বহুল collect(keys())
এবং collect(values())
সম্ভাব্য এছাড়াও একটি cat
এবং একটি sort
প্রয়োজন। অনেক ক্ষেত্রে ট্রায়াল বিভাগ দ্বারা কেবল ফ্যাক্টর থেকে সস্তা হতে পারে। দুঃখের হলেও সত্য.
map
লুপিংয়ের জন্য মানচিত্রের ব্যবহার একটি দুর্দান্ত বিকল্প। মধ্যে পার্থক্য সচেতন হতে হবে map
এবং map!
এবং পরেরটির এর ইন-জায়গা কার্যকারিতা যখন আপনি করতে পারেন গ্রহণকারী।
ম্যাপ্রেডস ব্যবহার mapreduce
মানচিত্রের কার্যকারিতা আরও প্রসারিত করে এবং একটি উল্লেখযোগ্য বাইট-সেভার হতে পারে।
বেনামে ফাংশন দুর্দান্ত! .. বিশেষত যখন উপরোক্ত map
ফাংশনগুলিতে পাস করা হয় ।
সংশ্লেষিত অ্যারে ফাংশনগুলি cumprod
, cumsum
স্বাদযুক্ত cummin
এবং অন্যান্য অনুরূপ নামযুক্ত ফাংশন একটি এন-ডাইমেনশনাল অ্যারের নির্দিষ্ট মাত্রায় বর্ধিত ক্রিয়াকলাপকে সক্ষম করে। (বা অ্যারে 1-ডি হয় তবে * আন * নির্দিষ্ট করা হয়েছে)
যে কোনওটির জন্য সংক্ষিপ্ত স্বরলিপি যখন আপনি একটি বহুমাত্রিক অ্যারে (বা ডিক্ট) এর একটি নির্দিষ্ট মাত্রার সমস্ত নির্বাচন করতে চান, উদাহরণস্বরূপ A[Any,2]
, আপনি ব্যবহার করে বাইট সংরক্ষণ করতে পারেনA[:,2]
ফাংশনগুলির জন্য একক-লাইন স্বরলিপি ব্যবহার করুন এর পরিবর্তে function f(x) begin ... end
আপনি প্রায়শই সরল করতে পারেনf(x)=(...)
টার্নারি অপারেটরটি ব্যবহার করুন এটি যদি-তারপরে-অন্য কোনও নির্মাণের জন্য একক-প্রকাশের জন্য স্পেস-সেভার হতে পারে। ক্যাভেটস: অন্য কয়েকটি ভাষায় সম্ভব হওয়ার পরেও আপনি জুলিয়ায় কোলনের পরে অংশটি বাদ দিতে পারবেন না। এছাড়াও, অপারেটর জুলিয়ায় প্রকাশের স্তরের, তাই আপনি কোডের পুরো ব্লকের শর্তসাপেক্ষ কার্যকর করার জন্য এটি ব্যবহার করতে পারবেন না।
if x<10 then true else false end
বনাম
x<10?true:false
এটি অন্যান্য ভাষায়ও সম্ভব, তবে সাধারণত সোজা পদ্ধতির চেয়ে দীর্ঘ হয়। যাইহোক, জুলিয়া এর unary এবং বাইনারি অপারেটরদের নতুন সংজ্ঞায়িত করার ক্ষমতা এটিকে বেশ আভাস দেয়।
উদাহরণস্বরূপ, 1 থেকে 10 পর্যন্ত প্রাকৃতিক সংখ্যার জন্য সংযোজন, বিয়োগ, গুণ এবং বিভাগ সারণি তৈরি করতে, কেউ ব্যবহার করতে পারে
[x|y for x=1:10,y=1:10,| =(+,-,*,÷)]
যা redefines বাইনারি অপারেটর |
হিসাবে +
, -
, *
এবং ÷
, তারপর নির্ণয় x|y
প্রতিটি অপারেশন জন্য এবং x
এবং y
আকাঙ্ক্ষিত রেঞ্জ।
এটি ইউনারি অপারেটরদের জন্যও কাজ করে। উদাহরণস্বরূপ, জটিল সংখ্যার 1 + 2i , 3-4i , -5 + 6i এবং -7-8i গণনা করতে , তাদের নেতিবাচক, তাদের জটিল সংযোগগুলি এবং তাদের গুণক বিপরীতগুলি ব্যবহার করতে পারে
[~x for~=(+,-,conj,inv),x=(1+2im,3-4im,-5+6im,-7-8im)]
যা redefines ইউনারী অপারেটর ~
হিসাবে +
, -
, conj
এবং inv
, তারপর নির্ণয় ~x
মোটেই কাম্য জটিল সংখ্যার জন্য।
মহিলা এবং পুরুষ সিকোয়েন্সেস (বাইনারি)
কেস পারমিটেশন (অমান্য)
কীওয়ার্ডগুলি কখনও কখনও স্থান বা সেমিকোলনের প্রয়োজন ছাড়াই অবিলম্বে ধ্রুবকগুলিকে অনুসরণ করতে পারে। উদাহরণ স্বরূপ:
n->(for i=1:n n-=1end;n)
1
এবং এর মধ্যে কোনও জায়গার অভাব নোট করুন end
। এটি end
নিকটতম পেরেনের পরে ঘটার ক্ষেত্রেও সত্য )end
।
কোনও অপারেটর বা ওভারলোডিংয়ের ÷
পরিবর্তে পূর্ণসংখ্যা বিভাগ সম্পাদন করুন div()
। নোট করুন যেটি ÷
ইউটিএফ -8 এ 2 বাইটের মূল্যবান।
যখনই সম্ভব সম্ভব না হয়ে ব্যবহার করুন vec()
বা A[:]
(কিছু অ্যারের জন্য A
) reshape()
।
চ্যালেঞ্জ বিধিগুলিতে অনুমোদিত হওয়ার সময় পূর্ণ প্রোগ্রামের চেয়ে ফাংশন তৈরি করুন। স্টিডিন থেকে পড়ে ভেরিয়েবলগুলি সংজ্ঞায়িত করার পরিবর্তে কোনও ফাংশন সংজ্ঞায়িত করা কম যা ইনপুট গ্রহণ করে। উদাহরণ স্বরূপ:
n->(n^2-1)
n=read(STDIN,Int);n^2-1
ভেরিয়েবলগুলি কোনও ফাংশনে যুক্তির ভিতরে বাড়ানো যায়। উদাহরণস্বরূপ, নিম্নোক্ত আমার উত্তর করার খুঁজুন পরবর্তী 1-বিরল বাইনারি সংখ্যাকে চ্যালেঞ্জ:
n->(while contains(bin(n+=1),"11")end;n)
এটি n
লুপের ভিতরে বাড়ানোর চেয়ে কম ।
জুলিয়া ০.০ তে পরিচয় করিয়ে দেওয়া। এটি মানচিত্রের মতো, তবে কম অক্ষর ব্যবহার করে এবং এর তর্কগুলি নিয়ে সম্প্রচার আচরণ করে - যার অর্থ আপনি জিনিসগুলি মোকাবেলায় কম ল্যাম্বডা লিখতে পারেন।
বরং:
map(f,x)
-- 8 অক্ষর.f.(x)
- 5 টি অক্ষরএখনও ভাল:
map(a->g(a,y),x)
- 16 অক্ষরg.(x,[y])
- 9 টি অক্ষর