গাণিতিকায় গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা গণিতের ক্ষেত্রে কমপক্ষে কিছুটা নির্দিষ্ট কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)।
গাণিতিকায় গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা গণিতের ক্ষেত্রে কমপক্ষে কিছুটা নির্দিষ্ট কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)।
উত্তর:
নীচের টিপসগুলি সবচেয়ে অর্থনৈতিক থেকে সর্বাধিক ব্যবহৃত ব্যবহৃত পরিবর্তিত হয়:
ম্যাথমেটিকার উচ্চ-স্তরের কমান্ডগুলি যেখানে সম্ভব সেখানে ব্যবহার করুন, এমনকি বড়গুলিও:
MorphologicalComponents
: কোড-গল্ফ: গণনা দ্বীপপুঞ্জ
চিত্র ম্যানিপুলেশন ক্ষমতা: যেমন আজ (24 সেপ্টেম্বর) হন্ডার জন্মদিন
Subsets
IntegerPartitions
দূরত্ব এবং সাদৃশ্য ব্যবস্থা: যেমন EuclideanDistance
বাইট সেভার হতে পারে। তবে খেয়াল করুন, এটি লেখার Total@Abs[a-b]
পরিবর্তে a~ManhattanDistance~b
এবং Max@Abs[a-b]
পরিবর্তে সাধারণত খাটো হয় a~ChessboardDistance~b
।
Graphics and
Text
আসকি শিল্পের জন্য ব্যবহার করুন : যেমন স্টার প্রোগ্রামিং!
এবং একটি অ্যানালগ ঘড়ি তৈরি করুন
উত্সর্গীকৃত প্রতীক:
যুক্তিযুক্ত এবং তাদের দীর্ঘ ফর্ম নামের পরিবর্তে অপারেশন প্রতীক সেট করুন: ⋂, ⋃, ∧, ∨
Map
এবং Apply
: /@
, //@
। @@
,@@@
উপসর্গ এবং ইনফিক্স স্বরলিপি:
Print@"hello"
জায়গায় Print["hello"]
a~f~b
জায়গায় f[a,b]
যখন কোনও ফাংশন কেবল একবার ব্যবহার করা হয়, একটি খাঁটি ফাংশন একটি অক্ষর বা দুটিকে অর্থনীতিতে পরিণত করতে পারে।
একটি তালিকায় স্ট্রিং যোগদান। ""<>{"a","b","c"}
পরিবর্তেStringJoin@{"a","b","c"}
তালিকাভুক্ত ফাংশনগুলি শোষণ করুন। আর তালিকাগুলি আরও ভাল হয়।
{a, b, c} + {x, y, z}= {a+x, b+y, c+z}
{2, 3, 4} {5, 6, 7}= {10, 18, 28}
{{a, b}, {c, d}}^{2, 3} = {{a^2, b^2}, {c^3, d^3}}
দীর্ঘ নামের সাথে কিছু অন্তর্নির্মিত ফাংশনগুলি সংক্ষিপ্ত প্রকাশের সাথে প্রতিস্থাপন করা যেতে পারে।
উদাহরণ স্বরূপ:
Total
=> Tr
Transpose
=> Thread
বা\[Transpose]
True
=> 1<2
False
=> 1>2
Times
=> 1##&
Alternatives
=> $|##&
IntegerQ
=> ⌊#⌋==#&
a[[1]]
=> #&@@a
a[[All,1]]
=> #&@@@a
ConstantArray[a,n]
=> Array[a&,n]
বাTable[a,{n}]
Union@a
=> {}⋃a
বাa⋃a
ToExpression@n
=> FromDigits@n
যদি n
একটি সংখ্যা হয়Divisible[n,m]
=> m∣n
FromDigits[n,2]
=> Fold[#+##&,n]
যদি গুলি এবং এর n
একটি তালিকা হয়0
1
Complex@z
=> ফর্মের একটি তালিকা {1,I}.z
যেখানেz
{x,y}
Thread[{{a,b},{c,d}}]
== Thread[List[{a,b},{c,d}]]
== {List[a,c],List[b,d]}
== {{a,c},{b,d}}
==Transpose[{{a,b},{c,d}}]
Fold
জন্য কৌশলটি FromDigits
ব্যতীত অন্য কোনও বেসের জন্যও কাজ করে 10
। উদা FromDigits[n,5]
-> Fold[4#+##&,n]
(ঘাঁটিগুলির জন্য অতিরিক্ত বাইট সংরক্ষণের বোনাস সহ 100
এবং 1000
)।
U+F3C7
।
Echo
তবে আমি মনে করি না এটি একটি বিকল্প, কারণ এটি >>
প্রকৃত স্ট্রিং প্রিন্ট করার আগে স্টুডুটে (এবং একটি স্থান) প্রিন্ট করে।
Complex[x,y] => {1,I}.{x,y}
, আমি মনে করি x+y*I
একই প্রভাব সহ অনেক খাটো?
এটি কাজ করার জন্য বেশ সাধারণ ভেক্টর:
{0,0}
দেখা যাচ্ছে এটি একটি বাইট দ্বারা সংক্ষিপ্ত করা যেতে পারে:
0{,}
আরও বেশি বাইটস সংরক্ষণ করা হয় যদি ভেক্টর দুটি শূন্যের চেয়ে দীর্ঘ হয়। এটি শূন্য ম্যাট্রিক্স সূচনা করতেও ব্যবহার করা যেতে পারে, যেমন নীচেরগুলি শূন্যগুলির 2x2 ম্যাট্রিক্স দেয়:
0{{,},{,}}
এটি শূন্য-অমূল্যগুলির জন্যও ব্যবহার করা যেতে পারে যদি তারা যথেষ্ট পরিমাণে বা পর্যাপ্ত পরিমাণে বা নেতিবাচক হয়। নিম্নলিখিত জোড়া তুলনা করুন:
{100,100}
0{,}+100
{-1,-1}
0{,}-1
{3,3,3,3}
0{,,,}+3
তবে মনে রাখবেন যে values টি মান থেকে শুরু করে 1~Table~6
আপনি এই ক্ষেত্রে ভাল হতে পারেন (সম্ভাব্যতার আগে, অগ্রাধিকার প্রয়োজনীয়তার উপর নির্ভর করে)।
এই কাজটি করার কারণটি হ'ল ,
তালিকায় দুটি যুক্তি উপস্থাপন করে তবে বাদ দেওয়া যুক্তি (ম্যাথামেটিকায় যে কোনও জায়গায়) অন্তর্নিহিত Null
এস। তদুপরি, গুণটি হ'ল Listable
এবং 0*x
এটি 0
প্রায় x
কোনওর জন্য (যেমন Infinity
এবং কিছু বাদে Indeterminate
), তাই এখানে যা ঘটছে তা এখানে:
0{,}
= 0*{,}
= 0*{Null,Null}
= {0*Null,0*Null}
= {0,0}
এর তালিকাগুলির জন্য 1
, আপনি ক্ষতিকারক বিধিগুলি ব্যবহার করে অনুরূপ কৌশল ব্যবহার করতে পারেন। বাইট সংরক্ষণের দুটি ভিন্ন উপায় আছে যদি আপনার 1
তালিকায় কমপক্ষে তিনটি থাকে :
{1,1,1}
1^{,,}
{,,}^0
1^{,,,}
তার চেয়ে এক বাইট ছোট 0{,,,}+1
।
{,,}^0
। আমি পোস্টটি সম্পাদনা করব।
গল্ফিং কোড করার সময়, আপনি প্রায়শই একটি কার্যকরী পদ্ধতির নিয়োগ করেন, যেখানে আপনি &
শর্টহ্যান্ড সিনট্যাক্স সহ বেনাম (খাঁটি) ফাংশন ব্যবহার করেন । এই জাতীয় ফাংশনের আর্গুমেন্ট অ্যাক্সেস করার বিভিন্ন উপায় রয়েছে এবং আপনি প্রায়শই সম্ভাব্যতার উপর ভাল করে উপলব্ধি করে কয়েকটা বাইট ছাঁটাই করতে পারেন।
আপনি যদি আগে বিশুদ্ধ ফাংশন ব্যবহার করেন তবে আপনি সম্ভবত এটি জানেন। এন ম যুক্তি হিসাবে উল্লেখ করা হয় #n
, এবং #
জন্য একটি alias হিসাবে কাজ করে #1
। সুতরাং, যদি বলুন, আপনি এমন একটি ফাংশন লিখতে চান যা প্যারামিটার হিসাবে অন্য ফাংশন এবং তার যুক্তি (সেই ফাংশনে যুক্তিটি পাস করার জন্য) লাগে, ব্যবহার করুন
#@#2&
এটি নেতিবাচক সংখ্যাগুলির সাথে কাজ করে না (যেমন আপনি তালিকাগুলি অ্যাক্সেস করার সময় ব্যবহার করতে পারেন)।
ম্যাথমেটিকা 10-এ নতুন নতুন ভাষার বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল Association
, যা মূলত স্বেচ্ছাসেবক মূল প্রকারের সাথে মূল-মানচিত্রের মানচিত্র, যেমন লিখিত
<| x -> 1, "abc" -> 2, 5 -> 3 |>
যদি এই জাতীয় সমিতিটি খাঁটি ফাংশনটির প্রথম যুক্তি হিসাবে প্রেরণ করা হয় তবে এর কিছু যুক্তি যদি নামযুক্ত প্যারামিটার হিসাবে থাকে তবে আপনি কিছু অ্যাক্সেস করতে পারেন:
{#, #2, #3, #abc, #xyz} & [<| "abc" -> "1st", "xyz" -> "2nd", abc -> "3rd" |>, "4th", "5th"]
(* {<| "abc" -> "1st", "xyz" -> "2nd", abc -> "3rd" |>, "4th", "5th", "1st", "2nd"} *)
মনে রাখবেন যে #
প্রত্যাশা অনুযায়ী এখনও পুরো সমিতিটিকে বোঝায়। নামযুক্ত পরামিতিগুলি কাজ করার জন্য, কীগুলি স্ট্রিং থাকতে হবে (উদাহরণস্বরূপ আপনি অপরিজ্ঞাত ভেরিয়েবলগুলি ব্যবহার করলে এটি কাজ করবে না) এবং এই স্ট্রিংগুলি অবশ্যই একটি অক্ষর দিয়ে শুরু হওয়া উচিত এবং কেবল অক্ষর এবং অঙ্কগুলি থাকতে হবে।
#0
একটি কম পরিচিত বৈশিষ্ট্য হ'ল #0
এটিও বিদ্যমান এবং এটি আপনাকে ফাংশন অবজেক্টটি দেয়। এটি কুইনস এবং জেনারালাইজড কুইনে সত্যই কার্যকর হতে পারে। আসলে, সবচেয়ে সংক্ষিপ্ত ম্যাথমেটিকা কুইন (আমি জানি)
ToString[#0][] & []
কিছুটা বিরক্তিকর হ'ল এটি হ'ল এটি আপনাকে প্রবেশ করানো সঠিক অক্ষরগুলি দেয় না। উদাহরণস্বরূপ, যদি @
ফাংশন অ্যাপ্লিকেশনের জন্য ব্যবহার করা হয় তবে এটি এখনও রেন্ডার করে [...]
এবং কিছু জায়গায় স্পেস .োকানো হবে। এটি সাধারণত কুইনটিকে আপনার পছন্দ হতে চেয়ে কিছুটা দীর্ঘ করবে তবে এটি সর্বদা কাজ করবে, প্রথমে কুইনের গল্ফ করে এবং তারপরে তার অনুলিপিটি অনুলিপি করে - যা এখন সত্যিকারের রানী হওয়া উচিত।
কুইন্স বাদে এর অর্থ হ'ল আপনি নিজের ফাংশনটির নাম না রেখেই পুনরাবৃত্ত কোড লিখতে পারেন। এই তিনটি (নিষ্পাপ তবে গল্ফযুক্ত) ফিবোনাচি বাস্তবায়নের সাথে তুলনা করুন:
f@0=0;f@1=1;f@n_:=f[n-1]+f[n-2]
f@n_:=If[n<2,n,f[n-1]+f[n-2]]
If[#<2,#,#0[#-1]+#0[#-2]]&
এখন এখান থেকেই আসল যাদু শুরু হয়। গল্ফিংয়ে সিকোয়েন্সগুলি প্রায়শই ব্যবহৃত হয় না, কারণ Sequence
এটি বেশিরভাগ সময়ের পক্ষে মূল্যবান হওয়ার জন্য খুব দীর্ঘ একটি নাম। খাঁটি ফাংশনগুলিতে তারা জ্বলজ্বল করে। আপনি যদি সিকোয়েন্সগুলির সাথে পরিচিত না হন তবে এগুলি মূলত কিছু অন্যান্য ভাষায় স্প্ল্যাটের মতো হয়, যদি আপনি List
কোনও ক্রিয়াকলাপের যুক্তি বা তালিকার তালিকায় একটি সিক্যুয়েন্স ব্যবহার করেন তবে এর উপাদানগুলি স্বয়ংক্রিয়ভাবে আলাদা স্লটে প্রসারিত হবে। সুতরাং
{1, Sequence[2, 3, 4], 5} == {1, 2, 3, 4, 5}
f["a", Sequence[0, {}], "b"] == f["a", 0, {}, "b"]
এখন, খাঁটি ফাংশনে ##
বা ##1
সমস্ত আর্গুমেন্টের ক্রম। অনুরূপভাবে, ##2
দ্বিতীয় থেকে শুরু সব আর্গুমেন্ট একটি ক্রম ##3
সব আর্গুমেন্ট তৃতীয় ইত্যাদি সুতরাং একটি শুরুর জন্য থেকে শুরু, আমরা শুধু reimplement করতে Sequence
যেমন ##&
, 5 বাইট সংরক্ষণ। উদাহরণস্বরূপ ব্যবহার হিসাবে, এটি আমাদের একটি বিকল্প সরবরাহ করে Join@@list
( এই টিপটি দেখুন ), যা কোনও বাইট সংরক্ষণ করে না, তবে যেভাবেই হোক তা জেনে রাখা ভাল:
##&@@@list
এটি কার্যকরভাবে নেস্টেড তালিকার প্রথম স্তরের সমতলকরণ করে। এর সাথে আমরা আর কী করতে পারি? এখানে 2 বাইটের সংক্ষিপ্ত বিকল্প রয়েছে RotateLeft
:
RotateLeft@list
{##2,#}&@list
এই বিষয়গুলির একার জন্য এটি এই বৈশিষ্ট্যটি মাথায় রাখার উপযুক্ত। তবে, আমরা আরও ভাল করতে পারি! ক্রমগুলি সত্যই আকর্ষণীয় হয় যখন বিবেচনা করুন যে অপারেটরগুলি হুডের নীচে ফাংশন হিসাবে বাস্তবায়িত হয়। যেমন a+b
বাস্তবে মূল্যায়ন করে Plus[a,b]
। সুতরাং আমরা যদি একটি ক্রম দেয় ...
1+##&[1,2,3]
=> Plus[1,##]
=> Plus[1,1,2,3]
=> 7
এই কৌতুক ব্যবহার হয়েছে এই ডগা মধ্যে একটি বাইট সংরক্ষণ করতে Times
, কারণ সন্নিধি টেকনিক্যালি এছাড়াও শুধু একটি অপারেটর হল:
1##&[1,2,3]
=> Times[1,##]
=> Times[1,1,2,3]
=> 6
আপনি Unequal
যদি একটি একক-বর্ণের মান বা ভেরিয়েবল জানেন যা আপনার যুক্তিগুলিতে না থাকে তবে এটি N
সম্ভবত বাইট সংরক্ষণ করতে ব্যবহার করতে পারেন ( সম্ভবত 99% ক্ষেত্রে কাজ করবে):
Unequal[a,b,c]
N!=##&[a,b,c]
এটি আনরি অপারেটরগুলির সাথে আরও আকর্ষণীয় হয়ে যায় -
এবং /
- দ্বিতীয় দুটি প্রকৃতপক্ষে গুণন এবং ক্ষয়ক্ষতির ক্ষেত্রে প্রয়োগ করা হয়। এখানে আপনি যে কাজগুলি করতে পারেন তার একটি তালিকা এখানে রয়েছে, যেখানে সর্বশেষ কলামটি ধরে নিয়েছে যে ফাংশনটি আর্গুমেন্টগুলি পাস করেছিল a, b, c
:
Operator Function Expanded Equivalent to
+## Plus[##] Plus[a,b,c] a+b+c
1## Times[1,##] Times[1,a,b,c] a*b*c
-## Times[-1,##] Times[-1,a,b,c] -a*b*c
x+## Plus[x,##] Plus[x,a,b,c] x+a+b+c
x-## Plus[x,Times[-1,##]] Plus[x,Times[-1,a,b,c]] x-a*b*c
x## Times[x,##] Times[x,a,b,c] x*a*b*c
x/## Times[x,Power[##,-1]] Times[x,Power[a,b,c,-1]] x*a^b^c^-1
##/x Times[##,Power[x,-1]] Times[a,b,c,Power[x,-1]] a*b*c/x
x^## Power[x,##] Power[x,a,b,c] x^a^b^c
##^x Power[##,x] Power[a,b,c,#] a^b^c^x
x.## Dot[x,##] Dot[x,a,b,c] x.a.b.c
অন্যান্য সাধারণ অপারেটার হয় !=
, ==
, &&
, ||
। কম প্রচলিত বেশী মনে রাখা হয় |
, @*
, /*
। উপসংহারে, এখানে একটি সামান্য বোনাস কৌশল:
#### Times[##,##] Times[a,b,c,a,b,c] (a*b*c)^2
এগুলি নিয়ে পরীক্ষা চালিয়ে যান এবং আপনি যদি অন্য কোনও দরকারী বা বিশেষত আকর্ষণীয় অ্যাপ্লিকেশন খুঁজে পান তবে আমাকে জানান let
Sqrt@2
বা 2^.5
=>√2
a[[1]]
=>a〚1〛
#+#2&
=>+##&
Flatten@a
=> Join@@a
(কখনও কখনও)
Function[x,x^2]
=> xx^2
বা#^2&
a〚1;;-1;;2〛
=>a〚;;;;2〛
a〚2;;-1 ;;2〛
=>a〚2;;;;2〛
a〚All,1〛
=>a〚;;,1〛
{{1}}〚1,1〛
=>Tr@{{1}}
0&~Array~10
=>0Range@10
Range[10^3]
=>Range@1*^3
〚
এবং 〛
নেয় 3 প্রতিটি (অনুমান UTF8 হওয়া) বাইট
জুলিয়ার জন্য ডেনিসের সাম্প্রতিক আবিষ্কারের দ্বারা অনুপ্রাণিত হয়ে আমি ভেবেছিলাম ম্যাথমেটিকার জন্য আমি এটি সন্ধান করব। আমি সচেতন ছিলাম যে ম্যাথামেটিকা বিপুল সংখ্যক অব্যবহৃত অপারেটর সংজ্ঞায়িত করেছেন, কিন্তু কখনই এটির দিকে খুব বেশি মনোযোগ দেননি।
রেফারেন্সের জন্য, সমস্ত অপারেটরগুলির তালিকা এখানে একটি অগ্রাধিকার সারণীর আকারে পাওয়া যাবে । শেষ কলামের ত্রিভুজটি নির্দেশ করে যে অপারেটরের অন্তর্নির্মিত অর্থ আছে কি না। যেগুলি যেগুলি সহজে সংজ্ঞায়িত করা যায় না তাদের সবগুলি না হলেও তাদের বেশিরভাগই পারেন।
সুবিধাজনকভাবে, 256 এরও কম কোডডপয়েন্ট সহ দুটি অব্যবহৃত অপারেটর রয়েছে, যেমন তারা আইএসও 8859-1 এনকোডেড উত্স ফাইলে একক বাইট হিসাবে ব্যবহার করতে পারে:
±
(0xB1) হয় আনারি প্রিফিক্স অপারেটর বা বাইনারি ইনফিক্স অপারেটর হিসাবে ব্যবহার করা যেতে পারে।·
(0xB7) এন> 2 এর জন্য একটি ভেরিয়াদিক বা এন-অ্যারি ইনফিক্স অপারেটর হিসাবে ব্যবহার করা যেতে পারে।তবে আরও একটি ধরা আছে: এই অপারেটরগুলির সংজ্ঞা দেওয়ার সময় কিছু অদ্ভুত কারণে আপনার সামনে তাদের একটি জায়গা প্রয়োজন, নাহলে ম্যাথামেটিকা একটি গুণকে পার্স করার চেষ্টা করে। এগুলি ব্যবহার করার সময় আপনার কোনও স্পেসের প্রয়োজন নেই যদিও:
±x_:=2x
x_ ±y_:=x+y
x_ ·y_ ·z_:=x*y+z
Print[±5] (* 10 *)
Print[3±4] (* 7 *)
Print[3·4·5] (* 17 *)
এর সাথে তুলনা করুন:
f@x_:=2x
x_~g~y_:=x+y
h[x_,y_,z_]:=x*y+z
Print[f@5] (* 10 *)
Print[3~g~4] (* 7 *)
Print[h[x,y,z]] (* 17 *)
সুতরাং এটি ফাংশনটি সংজ্ঞায়িত করার সময় একটি বাইট এবং এটি ব্যবহার করার সময় দুটি বাইট সংরক্ষণ করে। নোট করুন যে সংজ্ঞাটি ·
চারটি অপারেটরের জন্য বাইট সংরক্ষণ করবে না এবং আরও অপারেটরগুলির জন্য বাইটস ব্যয় করতে শুরু করবে, তবে যুক্তিগুলিতে ব্যবহৃত অপারেটরগুলির নজির নির্ভর করে ব্যবহারটি এখনও বাইট সংরক্ষণ করতে পারে। এটি লক্ষ্য করাও ভাল যে আপনি সস্তাভাবে একটি বৈকল্পিক ফাংশনটি সংজ্ঞায়িত করতে পারেন যা আরও বেশি দক্ষতার সাথে বলা যেতে পারে:
x_ ·y__:={y}
Print[1·2·3·4·5] (* {2, 3, 4, 5} *)
তবে মনে রাখবেন যে একক যুক্তি দিয়ে এই বিচিত্র ক্রিয়াকলাপগুলি কল করা সহজেই সম্ভব নয়। (আপনি করতে পারতেন CenterDot[x]
বা ##&[]·x
তবে আপনার যদি সত্যি প্রয়োজন হয় তবে একটি ভাল সুযোগের আলাদা সমাধান দিয়ে আপনি আরও ভাল off
অবশ্যই এটি সমাধানের জন্য কোনও কিছুই সংরক্ষণ করছে না যেখানে কোনও নামহীন ফাংশনই যথেষ্ট, তবে কখনও কখনও আপনাকে পরবর্তী সময়ে ব্যবহারের জন্য সহায়ক ফাংশনগুলি সংজ্ঞায়িত করতে হবে এবং কখনও কখনও এটি বিভিন্ন পরামিতিগুলির জন্য পৃথক সংজ্ঞা স্থাপনের জন্য নামযুক্ত ফাংশনগুলি সংজ্ঞায়িত করার চেয়ে ছোট। এই ক্ষেত্রে, পরিবর্তে অপারেটর ব্যবহার করা একটি শালীন পরিমাণের বাইট সংরক্ষণ করতে পারে।
নোট করুন যে এই আইএসও 8859-1 এনকোডযুক্ত ফাইলগুলি ব্যবহার $CharacterEncoding
করার জন্য উইন্ডোজ ডিফল্টের মতো সামঞ্জস্যপূর্ণ মানটিতে সেট করা দরকার WindowsANSI
। কিছু সিস্টেমে এই ডিফল্ট UTF-8
যেখানে একক বাইট থেকে এই কোড পয়েন্টগুলি পড়তে সক্ষম হবে না।
সাদাসিধা পদ্ধতির মধ্যে নির্বাচন করতে y
এবং z
তার উপর নির্ভর করে কিনা, x
হয় 0
বা 1
হয়
If[x<1,y,z]
তবে, একটি ছোট উপায় আছে:
y[z][[x]]
এই কাজ কারণ [[0]]
দেয় Head
একটি অভিব্যক্তি, এই ক্ষেত্রে y
, যেহেতু [[1]]
শুধুমাত্র প্রথম উপাদান দেয় - প্রথম আর্গুমেন্ট এই ক্ষেত্রে, z
।
এমনকি আপনি এটি দুটিরও বেশি মানের মধ্যে চয়ন করতে ব্যবহার করতে পারেন:
u[v,w][[x]]
নোট করুন যে এটি কোনও কাজ করে না যদি u
এমন কোনও ফাংশন যা আসলে কোনও কিছুর মূল্যায়ন করে। ম্যাথমেটিকাকে u[v,w]
যেমন রাখা ঠিক তেমনি এটি গুরুত্বপূর্ণ । তবে এটি বেশিরভাগ ক্ষেত্রে কাজ করে, একটিটি যদি u
একটি সংখ্যা, একটি স্ট্রিং বা একটি তালিকা অন্তর্ভুক্ত থাকে including
এই কৌতূহলের ক্রেডিট আলেফাল্ফায় যায় - আমি তার একটি উত্তরে এটি আবিষ্কার করেছি।
যদি x
শূন্য-ভিত্তিক পরিবর্তে 1-ভিত্তিক হয় তবে কেবল ব্যবহার করুন
{y,z}[[x]]
অথবা
{u,v,w}[[x]]
কিছু বিরল ক্ষেত্রে, আপনি এমনকি সত্যটি ব্যবহার করতে পারেন যে কয়েকটি মানের জন্য গুণনটি মূল্যায়ন করা হয় না:
{"abc","def"}[[x]]
("abc""def")[[x]]
নোট যে যদিও ম্যাথামেটিকাল হবে আসলে আর্গুমেন্ট পুনর্বিন্যাস, একটি গুণ এর যদি এটা unevaluated রয়ে, তাই উপরে অভিন্ন করার
("def""abc")[[x]]
Length
এটি সম্পূর্ণরূপে লেজিওনম্যামাল978 এবং মিশা ল্যাভ্রভের কিছু পরামর্শ দিয়ে আবারও লেখা হয়েছিল। উভয়কে অনেক ধন্যবাদ।
অনেক ক্ষেত্রে Length
ব্যবহার করে কিছুটা ছোট করা যায় Tr
। মূল ধারণাটি হ'ল ইনপুটটিকে গুলিগুলির তালিকায় পরিণত করা 1
, যাতে Tr
তাদের যোগফল যোগ হয় যা তালিকার দৈর্ঘ্যের সমান হবে।
এটি করার সর্বাধিক সাধারণ উপায় হ'ল ব্যবহার 1^x
(তালিকার জন্য x
)। এই কাজ করে কারণ Power
হয় Listable
এবং 1^n
সবচেয়ে পারমাণবিক মানের জন্য n
ঠিক হয় 1
(সমস্ত সংখ্যা, স্ট্রিং এবং চিহ্ন সহ)। সুতরাং আমরা ইতিমধ্যে এটি দিয়ে একটি বাইট সংরক্ষণ করতে পারি:
Length@x
Tr[1^x]
অবশ্যই, এটি ধরে নেয় যে x
তুলনায় উচ্চতর প্রাধান্য সহ একটি অভিব্যক্তি ^
।
যদি x
কেবলমাত্র 0
গুলি এবং 1
গুলি থাকে তবে আমরা অন্য একটি বাইট ব্যবহার করে সংরক্ষণ করতে পারি Factorial
(ধরে x
নিচ্ছি যে এর চেয়ে বেশি অগ্রাধিকার রয়েছে !
):
Length@x
Tr[x!]
কিছু বিরল ক্ষেত্রে, এর x
চেয়ে কম অগ্রাধিকার থাকতে পারে ^
তবে গুণণের চেয়ে আরও বেশি অগ্রাধিকার রয়েছে। সেক্ষেত্রে এর তুলনায় কম অগ্রাধিকারও থাকবে @
, সুতরাং আমাদের সত্যিই তুলনা করা দরকার Length[x]
। যেমন একটি অপারেটর উদাহরণ .
। এই ক্ষেত্রে, আপনি এখনও এই ফর্মটি দিয়ে একটি বাইট সংরক্ষণ করতে পারেন:
Length[x.y]
Tr[0x.y+1]
এটি কী ধরণের তালিকাগুলিতে কাজ করে তা সম্পর্কে অবশেষে কিছু মন্তব্য:
উপরে উল্লিখিত হিসাবে, এটি কেবল সংখ্যা, স্ট্রিং এবং চিহ্ন সহ সমতল তালিকাতে কাজ করে। তবে এটি কিছু গভীর তালিকার উপরেও কাজ করবে, যদিও এটি আসলে কিছুটা পৃথক করে গণনা করে। একটি এন- ডি আয়তক্ষেত্রাকার অ্যারে ব্যবহার Tr
করে আপনাকে সংক্ষিপ্ত মাত্রা দেয় (প্রথমটির বিপরীতে)। আপনি যদি জানেন যে বাইরেরতম মাত্রাটি সবচেয়ে সংক্ষিপ্ত, বা আপনি জানেন যে তারা Tr
সমস্তগুলি সমান, তবে- এক্সপ্রেশনগুলি সমান Length
।
Length@x == Tr[1^x]
। সর্বাধিক তালিকার সাথে কাজ করা উচিত।
Tr[x!]
পরিবর্তে নিজেকে ব্যবহার করতে পেয়েছি Tr[1^x]
যেখানে x
কেবল শূন্য এবং একটি রয়েছে।
পুনরাবৃত্তির সমাধানগুলি সন্ধান করুন - গাণিতিক একাধিক দৃষ্টান্ত, তবে কার্যকরী পদ্ধতির প্রায়শই সবচেয়ে অর্থনৈতিক হয়। NestWhile
অনুসন্ধানের সমস্যাগুলির জন্য একটি খুব কমপ্যাক্ট সমাধান হতে পারে NestWhileList
এবং FoldList
যখন আপনাকে মধ্যবর্তী পুনরাবৃত্তির ফলাফলগুলি ফিরে আসতে বা প্রক্রিয়া করার প্রয়োজন হয় তখন শক্তিশালী হয়। Map (/@)
, Apply (@@, @@@)
, MapThread
, এবং সত্যিই উল্ফর্যাম এর উপর সবকিছু কার্যকরী প্রোগ্রামিং ডকুমেন্টেশন পৃষ্ঠাটিতে ক্ষমতাশালী উপাদান।
বর্ধিত / হ্রাসের জন্য সংক্ষিপ্ত রূপ - উদাহরণস্বরূপ, পরিবর্তে While[i<1,*code*;i++]
আপনি এটি করতে পারেনWhile[i++<1,*code*]
আপনি প্রাক-বৃদ্ধি / হ্রাস করতে পারেন তা ভুলে যাবেন না - উদাহরণস্বরূপ, --i
পরিবর্তে i--
। এটি কখনও কখনও একটি প্রস্তুতিমূলক অপারেশন বাদ দিয়ে আশেপাশের কোডে কয়েকটি বাইট সংরক্ষণ করতে পারে।
ডেভিড ক্যারাহারের # 5 এর সমাবর্তন: যখন একই ফাংশনটি বহুবার ব্যবহৃত হয়, তখন এটিতে একটি প্রতীক বরাদ্দ করা বাইট সংরক্ষণ করতে পারে। উদাহরণস্বরূপ, আপনি ToExpression
যদি কোনও সমাধানে 4 বার t=ToExpression
ব্যবহার করে থাকেন তবে t@*expression*
তারপরে আপনাকে এটি সক্ষম করে। যাইহোক, আপনি এটি করার আগে একই ফাংশনটির বারবার প্রয়োগ আরও অর্থনৈতিক পুনরাবৃত্তি পদ্ধতির জন্য কোনও সুযোগকে নির্দেশ করে কিনা তা বিবেচনা করুন।
{}
যদি ব্যবহার করছেন তবে ব্যবহার করবেন না @@@
।কিছু ক্ষেত্রে, আপনি যেমন একটি মত প্রকাশের মুখোমুখি হতে পারেন:
f@@@{{a,b},{c,d}}
লিখে লিখে বাইট হ্রাস করা সম্ভব:
f@@@{a|b,c|d}
Alternatives
খুব কম নজরে রয়েছে, সুতরাং প্রকাশটি লিখতে সাধারণত ঠিক থাকে (একটি উল্লেখযোগ্য ব্যতিক্রম খাঁটি ফাংশন; আপনি এটি কেবলমাত্র বামতম উপাদানটিতে ব্যবহার করতে পারেন Alternatives
)।
f@@@{f@a|b~g~1,#^2&@c|d@2}
মনে রাখবেন যে f@@a|b|c
(এর পরিবর্তে f@@{a,b,c}
) কাজ করে না কারণ Apply
তার চেয়ে বেশি অগ্রাধিকার রয়েছে Alternative
।
এই ক্ষেত্রে, আপনার কেবল ব্যবহার করা উচিত f@@{a,b,c}
।
অপারেটর ফর্ম
ম্যাথমেটিকা 10 তথাকথিত "অপারেটর ফর্মগুলি" সমর্থন করে যা মূলত কিছু ফাংশন কারি করা যায়। কোনও ক্রিয়াকলাপটি কারি করা হচ্ছে এর অপারেটরগুলির মধ্যে একটিকে ঠিক করে নতুন ফাংশন তৈরি করা। বলুন, আপনি SortBy[list, somereallylongfunction&]
প্রচুর বিভিন্ন ব্যবহার করছেন list
। আগে, আপনি সম্ভবত অ্যাসাইন করে থাকতে পারে SortBy
জন্য s
এবং বিশুদ্ধ ফাংশন f
তাই
s=SortBy;
f=somereallylongfunction&;
list1~s~f;
list2~s~f;
list3~s~f;
এখন আপনি তরকারী করতে পারেন SortBy
, যার অর্থ এখন আপনি করতে পারেন
s=SortBy[somereallylongfunction&];
s@list1;
s@list2;
s@list3;
অন্যান্য ফাংশন, যা সহ একটি তালিকা বা ফাংশন যুক্তি গ্রহণ (কিন্তু সীমাবদ্ধ নয়) অনেক জন্য একই কাজ Select
, Map
, Nearest
, ইত্যাদি
ম্যাথমেটিকা.এসইতে ইবেল্টুকভ ওভার এইগুলির একটি সম্পূর্ণ তালিকা তৈরি করতে সক্ষম হয়েছিল :
{"AllTrue", "AnyTrue", "Append", "Apply", "AssociationMap", "Cases",
"Count", "CountDistinctBy", "CountsBy", "Delete", "DeleteCases",
"DeleteDuplicatesBy", "Extract", "FirstCase", "FirstPosition",
"FreeQ", "GroupBy", "Insert", "KeyDrop", "KeyExistsQ", "KeyMap",
"KeySelect", "KeySortBy", "KeyTake", "Map", "MapAt", "MapIndexed",
"MatchQ", "MaximalBy", "MemberQ", "Merge", "MinimalBy", "NoneTrue",
"Position", "Prepend", "Replace", "ReplacePart", "Scan", "Select",
"SelectFirst", "SortBy", "StringCases"}
রচনা এবং রাইটকোপজিশন
Composition
( @*
) এবং RightComposition
( /*
) এর জন্য নতুন শর্টহ্যান্ড রয়েছে । এই অক্ষরগুলি সংরক্ষণ করতে পারে যেখানে একটি স্পষ্টরূপে প্রস্তাবিত উদাহরণ নিম্নলিখিত তিনটি সমতুল্য লাইনে দেখা যায়
Last@Range@# & /@ Range[5]
Last@*Range /@ Range[5]
Range /* Last /@ Range[5]
এর মতো কোডের প্রয়োজন নেই:
f[]:=DoSomething[1,2]
(*...*)
f[]
(*...*)
f[]
:=
ডান হাতের পুনরায় মূল্যায়নের জন্য জোর করে আপনি কেবল একটি পরিবর্তনশীল ব্যবহার করতে পারেন :
f:=DoSomething[1,2]
(*...*)
f
(*...*)
f
এর অর্থ হ'ল আপনি যে কোনও ক্রিয়াকলাপটি প্রায়শই সম্পাদন করতে পারেন (এটি এমনকি কিছু কিছু হলেও n++
) 5 বাইট ব্যয়ে একটি চরিত্রের কাছে। সুতরাং এটি ক্ষেত্রে n++
চতুর্থ ব্যবহারের পরে প্রদান করে:
n++;n++;n++;n++
f:=n++;f;f;f;f
%
একটি বিনামূল্যে ভেরিয়েবল পেতে ব্যবহার করুনএই টিপটি কেবল তখনই প্রযোজ্য যদি গণিতের আরপিএল পরিবেশ অনুমান করা যায়। %
কোডটি যখন স্ক্রিপ্ট হিসাবে চালিত হয় তখন সংজ্ঞায়িত হয় না।
তুমি কখন করতে REPL বৈশিষ্ট্যের ব্যবহার করতে, এটা করো না:
a=someLongExpression;some[other*a,expression@a,using^a]
পরিবর্তে, মনে রাখবেন যে ম্যাথমেটিকা সর্বশেষ মূল্যায়িত (নিউলাইন-টার্মিনেটেড) এক্সপ্রেশনটি এতে সংরক্ষণ করে %
:
someLongExpression;
some[other*%,expression@%,using^%]
যুক্ত হওয়া নতুন লাইনের জন্য একটি বাইট খরচ হয় তবে আপনি অপসারণ করে দুটি সাশ্রয় করছেন a=
, সুতরাং সামগ্রিকভাবে এটি একটি বাইট সংরক্ষণ করে।
কিছু ক্ষেত্রে (যেমন আপনি যে a
কোনও উপায়ে মুদ্রণ করতে চান ), আপনি এমনকি ;
দুটি বাইট সংরক্ষণ করে ছাড়তে পারেন :
someLongExpression
some[other*%,expression@%,using^%]
এক বা দুটি বাইট মোটামুটি নাবালক মনে হতে পারে তবে এটি একটি গুরুত্বপূর্ণ বিষয়, কারণ এটি গল্ফ করার সময় বারবার প্রকাশের (যা একটি খুব সাধারণ কৌশল) এক্সট্রাকশন করে তোলে:
পুনরাবৃত্তি প্রকাশ প্রকাশের সাধারণ কৌশলটির জন্য ওভারহেডের চারটি বাইট খরচ হয়, যা এক্সপ্রেশনটির আরও ব্যবহারের মাধ্যমে সংরক্ষণ করা দরকার। এখানে কিছু সংরক্ষণের জন্য নামযুক্ত ভেরিয়েবলে নিষ্কাশন করার জন্য একটি অভিব্যক্তির সর্বনিম্ন সংখ্যার ব্যবহারের (সংক্ষেপের দৈর্ঘ্য অনুসারে) একটি সংক্ষিপ্ত সারণি এখানে দেওয়া হয়েছে:
Length Min. Uses
2 6
3 4
4 3
5 3
6 2
... 2
নামবিহীন ভেরিয়েবলটি ব্যবহার করে, বেশ কয়েকটি বার প্রায়শই কয়েক বার বাইট সংরক্ষণ করা সম্ভব হবে:
When ; is required When ; can be omitted
Length Min. Uses Length Min. Uses
2 5 2 4
3 3 3 3
4 3 4 2
5 2 ... 2
... 2
আমি মনে করি না %%
বা %n
গল্ফিংয়ের জন্য ব্যবহার করা যেতে পারে, কারণ আপনি যদি এগুলি কমপক্ষে দু'বার ব্যবহার না করেন তবে আপনি যেখানে প্রয়োজন সেখানে কেবল ভাবটি ঠিক রাখতে পারেন। এবং আপনি যদি এটি দুটিবার ব্যবহার করেন তবে ভেরিয়েবল নামের অতিরিক্ত অক্ষর কিছু বাদ দেওয়া থেকে সঞ্চয় বাতিল করে দেয় x=
।
এটি মূলত এই টিপটির একটি বাস্তবায়ন কিন্তু এটি যথেষ্ট সাধারণ কাজ যা আমি মনে করি এটি এর নিজের উত্তরটির প্রেরণা দেয়।
কোনও তালিকা ক্রমযুক্ত কিনা তা যাচাই করার জন্য নিখুঁত উপায়টি ব্যবহার করা হচ্ছে
OrderedQ@a
আমরা আরও ভাল করে একটি বাইট করতে পারি
Sort@a==a
তবে, ইতিমধ্যে একটি ভেরিয়েবল যাচাই করতে আমাদের কাছে জিনিসটি না থাকলে এটি কাজ করে না। (আমাদের এমন কিছু দরকার Sort[a=...]==a
যা অহেতুক দীর্ঘ long) তবে, এর বাইরে আরও একটি বিকল্প রয়েছে:
#<=##&@@a
সেরা জিনিসটি হ'ল ইনপুটটি একই বাইট গণনার জন্য বিপরীতভাবে সাজানো হয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে:
#>=##&@@a
আরও একটি বাইট সংরক্ষণ করা যায় যদি ক) আমরা জানি যে তালিকার উপাদানগুলি স্বতন্ত্র এবং খ) আমরা 0 এবং 9 এর মধ্যে একটি নিম্ন সীমা জানি (অন্তর্ভুক্ত; বা বিপরীত সাজানো ক্রমের জন্য উপরের আবদ্ধ):
0<##&@@a
5>##&@@a
এটি কেন কাজ করে তা দেখতে, শীর্ষে লিঙ্কিত টিপটিতে "যুক্তির ক্রমগুলি" দেখুন।
##>0&@@a
। বাছাইয়ের জন্য উপরের-আবদ্ধের জন্য অনুরূপ।
পরিবর্তে StringRepeat[str,n]
ব্যবহার (0Range[n]+str)<>""
। অথবা যদি str
কোনো স্লট আর্গুমেন্ট উপর নির্ভর করে না, এমনকি উত্তম Array[str&,n]<>""
অনুযায়ী এই ডগা।
StringRepeat[s,n+1]
ব্যবহারের Array[s&,n]<>s
(এমনকি আপনার ইতিমধ্যে n+1
একটি ভেরিয়েবল থাকা অবস্থায়ও)।
Table[str,n]<>""
যদি আপনার বিপরীতে সাজানো সংখ্যার একটি তালিকা প্রয়োজন হয় তবে ব্যবহার করবেন না
Reverse@Sort@x
কিন্তু
-Sort@-x
ছয় বাইট সংরক্ষণ নেতিবাচক মান অনুসারে বাছাই করা SortBy
পরিস্থিতিগুলির জন্যও দরকারী :
Reverse@SortBy[x,Last]
SortBy[x,-Last@#&]
-Sort@-x
?
আপনি একটি অভিব্যক্তি আটকে রাখতে Break
পারেন যাতে এক বা দুটি অক্ষর সংরক্ষণ করতে পারে। উদাহরণ ( অন্যান্য বিবরণ স্পষ্টতার জন্য গল্ফ করা হয়নি ):
result = False;
Break[]
পরিণত হতে পারে
Break[result = False]
একটি চরিত্র সংরক্ষণ করতে। যদি প্রশ্নে অভিব্যক্তিটির ফাংশন অ্যাপ্লিকেশনটির চেয়ে কম অগ্রাধিকার না থাকে তবে আপনি অন্য একটি চরিত্রও সংরক্ষণ করতে পারবেন:
Print@x;
Break[]
পরিণত হতে পারে
Break@Print@x
অনির্ধারিত হলেও, যুক্তিটি Break
আশেপাশের লুপ দ্বারা প্রত্যাবর্তিত বলে মনে হচ্ছে, যা সম্ভবত আরও বেশি সঞ্চয় করতে পারে।
স্ট্রিং থেকে সমস্ত সাদা স্থান সরাতে s
ব্যবহার করুন
StringSplit@s<>""
এটি হ'ল StringSplit
ডিফল্ট (অ-হোয়াইটস্পেস উপাদানগুলিতে বিভক্ত) ব্যবহার করুন এবং কেবল তাদের আবার একসাথে যোগদান করুন। আপনি যদি অন্য কোনও চরিত্র বা সাবস্ট্রিং থেকে মুক্তি পেতে চান তবে একই সম্ভবত এখনও সংক্ষিপ্ত:
s~StringSplit~"x"<>""
Range
খুব সাধারণ কাজটি হ'ল 1 থেকে a n
(সাধারণত ইনপুট হিসাবে দেওয়া হয়) থেকে সমস্ত সংখ্যায় কিছু ধরণের ফাংশন প্রয়োগ করা । এটি করার জন্য মূলত 3 টি উপায় রয়েছে (উদাহরণ হিসাবে একটি নামবিহীন পরিচয় ফাংশন ব্যবহার করে):
#&/@Range@n
Array[#&,n]
Table[i,{i,n}]
আমি প্রথমটির জন্য যেতে চাই (যে কোনও কারণেই হোক) তবে এটি খুব কমই সেরা পছন্দ।
Array
পরিবর্তে ব্যবহার করা হচ্ছেউপরের উদাহরণটি দেখায় যে ব্যবহারে Array
একই বাইট গণনা রয়েছে। তবে এটির একটি সুবিধা রয়েছে যে এটি একক প্রকাশ। বিশেষত, আপনি যদি কোনও ফাংশন দিয়ে ফলাফলটি আরও প্রক্রিয়া করতে চান তবে আপনি f
উপসর্গ স্বরলিপিটি ব্যবহার করতে পারেন, যা একটি বাইট সংরক্ষণ করে Range
:
f[#&/@Range@n]
f@Array[#&,n]
তদতিরিক্ত, আপনি আপনার নামবিহীন ফাংশনটির আশেপাশে প্রথম বন্ধনীর হাতছাড়া করতে সক্ষম হতে পারেন যা আপনার প্রয়োজন হতে পারে Range
, যেমন
15/(#&)/@Range@n
15/Array[#&,n]
আপনি যদি এটিকে আর ব্যবহার করতে না চান (বা এমন অপারেটরের সাথে যার কম অগ্রাধিকার রয়েছে), আপনি তার পরিবর্তে Array
ইনফিক্স স্বরলিপিতে লিখতে এবং একটি বাইট সংরক্ষণ করতে পারেন :
#&/@Range@n
#&~Array~n
সুতরাং, Array
প্রায় অবশ্যই তুলনায় ভাল Range
।
Table
পরিবর্তে ব্যবহার করা হচ্ছেএখন টেবিলটি 3 বাইট বা কমপক্ষে 2 বর্ধিত করতে হবে যখন ইনফিক্স নোটেশন একটি বিকল্প:
#&/@Range@n
i~Table~{i,n}
ইনফিক্স স্বরলিপি ব্যবহার না করার সময় , Table
যদি আপনার ফাংশনটিতে বেশ কয়েকটি বিবৃতি থাকে:
(#;#)&/@Range@n
Table[i;i,{i,n}]
এটি এখনও দীর্ঘ, তবে নীচে উল্লিখিত ক্ষেত্রে অতিরিক্ত সঞ্চয় দেয়।
আসল সঞ্চয়গুলি স্টেমটি যে Table
চলমান চলকটিকে একটি নাম দেয় তা খারিজ করা উচিত নয়। প্রায়শই, আপনি অনিচ্ছাকৃত ফাংশনগুলি নেস্টেড করতে পারেন যেখানে আপনি অভ্যন্তরীণ ফাংশনগুলির মধ্যে একটির ভিতরে বাইরের ভেরিয়েবল ব্যবহার করতে চান। যখন এটি হয়, Table
তার চেয়ে কম হয় Range
:
(i=#;i&[])&/@Range@n
Table[i&[],{i,n}]
i&[]~Table~{i,n}
আপনি কেবল বরাদ্দকরণের জন্য অক্ষরগুলি সংরক্ষণ করেন না i
, আপনি প্রক্রিয়াটির একক বিবৃতিতে ফাংশনটি হ্রাস করতেও সক্ষম হতে পারেন, যা আপনাকে এটির উপরে ইনফিক্স স্বরলিপি ব্যবহার করতে দেয়। রেফারেন্সের জন্য, Array
এই ক্ষেত্রে আরও দীর্ঘ, তবে এখনও এর চেয়ে ছোট Range
:
(i=#;i&[])&~Array~n
Range
?যখনই আপনার মানগুলি প্রক্রিয়াকরণের জন্য কোনও ফাংশন কলের প্রয়োজন হয় না, উদাহরণস্বরূপ যখন কোনও ভেক্টরাইজড ক্রিয়াকলাপের মাধ্যমে ম্যাপিং করা যায়। এই ক্ষেত্রে:
5#&~Array~n
5Range@n
#^2&~Array~n
Range@n^2
অবশ্যই আপনি যদি কোনও ফাংশন ম্যাপ করতে না চান তবে এটিও খাটো
Mean@Array[#&,n]
Mean@Range@n
f/@Range[x]
নিয়মিত ব্যবহার করেন ...
কিছু নির্মাণ যেমন i=1;While[cond[i],i++]
ঠিক আছে ঠিক তেমন, তবে একটি বিকল্প রয়েছে যা দুটি বাইট সংক্ষিপ্ত:
1//.i_/;cond[i]:>i+1
উপরের কোডটি শর্তটি পূরণ করার i
সাথে সাথে একটি সংখ্যাকে বারবার প্রতিস্থাপন i+1
করে cond[i]
। এই ক্ষেত্রে, এ i
শুরু হয় 1
।
দ্রষ্টব্য যে পুনরাবৃত্তির ডিফল্ট সর্বাধিক সংখ্যা 2 ^ 16 (= 65536)। আপনার যদি এর চেয়ে বেশি পুনরাবৃত্তি প্রয়োজন হয় While
তবে ভাল would ( MaxIterations->∞
খুব দীর্ঘ)
আপনি কখনও কখনও If
একটি লজিকাল অপারেটর দিয়ে প্রতিস্থাপন করতে পারেন ।
উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনি এমন একটি ফাংশন তৈরি করতে চান যা কোনও নম্বর প্রধান কিনা তা পরীক্ষা করে এবং প্রিন্টটি 2*(number) - 1
যদি এটি সত্য হয়:
If[PrimeQ@#,Print[2#-1]]&
আপনি যদি এর &&
পরিবর্তে ব্যবহার করেন তবে এটি খাটো :
PrimeQ@#&&Print[2#-1]&
এমনকি আপনার একাধিক এক্সপ্রেশন থাকলেও আপনি এখনও বাইট (গুলি) সংরক্ষণ করেন:
If[PrimeQ@#,a++;Print[2#-1]]&
PrimeQ@#&&a++&&Print[2#-1]&
(* or *)
PrimeQ@#&&(a++;Print[2#-1])&
আপনি ||
যখন চান শর্তটি চান তখন আপনি ক্ষেত্রে ব্যবহার করতে পারেন False
:
If[!PrimeQ@#,Print[2#-1]]&
(* or *)
If[PrimeQ@#,,Print[2#-1]]&
(* can become *)
PrimeQ@#||Print[2#-1]&
এই কৌশলগুলি কাজ করে কারণ লজিকাল অপারেটরগুলি সংক্ষিপ্ত-প্রচারিত হতে পারে ; দ্বিতীয় যুক্তি এবং তারপরেও বৈধ বুলিয়ান এক্সপ্রেশন হওয়ার দরকার নেই।
অবশ্যই, যদি আপনার রিটার্ন ভ্যালু If
বা আপনার সত্য এবং মিথ্যা উভয় যুক্তির প্রয়োজন হয় তবে এটি কাজ করে না If
।
অপারেটর ইনপুট ফর্মগুলির লোড সহ এখানে একটি তালিকা রয়েছে যা প্রচুর পরিমাণে সংক্ষিপ্ত করতে পারে। এর মধ্যে কয়েকটি অন্যান্য পোস্টে উল্লেখ করা হয়েছে, তবে তালিকাটি দীর্ঘ এবং সেখানে আমি কয়েকটি নতুন জিনিস খুঁজে পেয়ে সর্বদা অবাক হয়েছি:
Optional (:)
Optional (:)
বিস্তারের জন্য পৃথক নিয়ম সংজ্ঞায়িত না করে প্রতিস্থাপনগুলিতে তালিকাগুলি সম্প্রসারণ করতে ব্যবহার করা যেতে পারে।
আমার এই উত্তর এবং @ উত্তরিজিসের এই উত্তর উদাহরণ examples
ব্যবহার
... /. {p___, a_: 0, b_, q___} /; cond[b] :> ...
উপরের প্রতিস্থাপনটি প্রথমে প্যাটার্ন ব্যবহার করে {p___, a_, b_, q___}
এবং এমন একটি মিল খুঁজে পায় যা b
একটি নির্দিষ্ট শর্ত পূরণ করে।
যখন এর মতো কোনও মিল খুঁজে পাওয়া যায় না, এটি বাদ দেয় a_
এবং পরিবর্তে অনুসন্ধান করে {p___, b_, q___}
। a
অনুসন্ধানে অন্তর্ভুক্ত নেই এবং মান রয়েছে বলে মনে করা হয় 0
।
মনে রাখবেন যে দ্বিতীয় প্যাটার্ন অনুসন্ধান কেবলমাত্র b
তালিকার শুরুতে ঘটে এর জন্য কাজ করবে ; b
কোনও শর্তকে সন্তুষ্ট করার মান যদি মাঝখানে থাকে তবে {p___, a_, b_, q___}
তার পরিবর্তে (যার উচ্চতর প্রাধান্য রয়েছে) এটি মিলবে।
তালিকার শুরুতে সন্তুষ্টিজনক শর্ত 0
যখন b
আসে তখন প্রতিস্থাপনটি একটি প্রেন্ডিংয়ের সমতুল্য । (অর্থাত্ পৃথক নিয়ম সংজ্ঞায়িত করার দরকার নেই, {b_, q___} /; cond[b] :> ...
)
কোড গল্ফের জন্য, খাঁটি Function
যুক্তি সর্বাধিক সাধারণভাবে Slot
s ব্যবহার করে উল্লেখ করা হয় ; যেমন #
প্রথম যুক্তির #2
জন্য, দ্বিতীয়টির জন্য ইত্যাদি for ( আরও তথ্যের জন্য এই উত্তরটি দেখুন)।
অনেক ক্ষেত্রে, আপনি বাসাতে চাইবেন Function
। উদাহরণস্বরূপ, 1##&@@#&
এটি একটি Function
যা তার প্রথম যুক্তি হিসাবে একটি তালিকা গ্রহণ করে এবং এর উপাদানগুলির ফলাফলকে আউটপুট করে। এখানে সেই ফাংশনটি এখানে TreeForm
:
শীর্ষ স্তরে পাস হওয়া আর্গুমেন্টগুলি Function
কেবলমাত্র শীর্ষ স্তরগুলিতে উপস্থিত Slot
গুলি এবং SlotSequence
গুলি পূরণ করতে পারে, এক্ষেত্রে এর অর্থ এই যে SlotSequence
অভ্যন্তরীণ অভ্যন্তরীণ Function
অংশটি শীর্ষ স্তরে আর্গুমেন্ট অ্যাক্সেস করার কোনও উপায় রাখে না Function
।
কিছু ক্ষেত্রে, তবে, আপনি Function
অন্যের মধ্যে নেস্টেড থাকতে চাইতে পারেন যাতে বাহ্যিকের Function
সাথে যুক্তিগুলি উল্লেখ করতে সক্ষম হয় Function
। উদাহরণস্বরূপ, আপনি এমন কিছু চাইতে পারেন Array[fun,...]&
যেখানে ফাংশনটি fun
শীর্ষ স্তরের একটি যুক্তির উপর নির্ভর করে Function
। সংক্ষিপ্ততার জন্য, আসুন আমরা বলি যে এর fun
ইনপুটটির স্কোয়ারের বাকি অংশটি ইনপুটটিকে শীর্ষ স্তরের ইনপুট দেওয়া উচিত Function
। এটি সম্পাদন করার একটি উপায় হ'ল ভেরিয়েবলের উপরে শীর্ষ স্তরের যুক্তি নির্ধারণ করা:
(x=#;Array[Mod[#^2,x]&,...])&
x
অভ্যন্তরে যেখানেই প্রদর্শিত Function
Mod[#^2,x]&
হবে, এটি প্রথম যুক্তিকে বাইরের দিকে নির্দেশ করবে Function
, যেখানে #
অভ্যন্তরের প্রথম যুক্তিকে বোঝাবে Function
। আরও ভাল পদ্ধতির সাথে Function
দুটি যুক্তি ফর্ম রয়েছে এমন সত্যটি ব্যবহার করা হয় যেখানে প্রথম যুক্তিটি প্রতীক বা চিহ্নগুলির তালিকা যা নামযুক্ত যুক্তিগুলির প্রতিনিধিত্ব করবে Function
(নামবিহীন Slot
এর বিপরীতে )। এটি এই ক্ষেত্রে আমাদের তিনটি বাইট সংরক্ষণ করে:
xArray[Mod[#^2,x]&,...]
U+F4A1
বাইনারি ইনফিক্স অপারেটরের প্রতিনিধিত্বকারী তিন বাইট বেসরকারী ব্যবহারের অক্ষর \[Function]
। আপনি Function
অন্যটির মধ্যে বাইনারি ফর্মটি ব্যবহার করতে পারেন Function
:
Array[xMod[x^2,#],...]&
এটি উপরের সমতুল্য। কারণটি হ'ল, যদি আপনি নামধারী আর্গুমেন্ট ব্যবহার করেন তবে Slot
এর উপরের SlotSequences
অংশে অন্তর্ভুক্ত বলে ধরে নেওয়া হয় Function
যা নামযুক্ত আর্গুমেন্ট ব্যবহার করে না।
এখন কেবল কারণ আমরা এইভাবে বাসা বাঁধতে পারি Function
, এর অর্থ এই নয় যে আমাদের সর্বদা করা উচিত। উদাহরণস্বরূপ, আমরা যদি কোনও তালিকার সেই উপাদানগুলিকে বেছে নিতে চাই যা ইনপুটটির চেয়ে কম হয় তবে আমরা নীচের মতো কিছু করতে প্ররোচিত হতে পারি:
Select[...,xx<#]&
এটি ব্যবহার করা Cases
এবং Function
সম্পূর্ণভাবে নেস্টেডের প্রয়োজনীয়তা এড়াতে আরও খাটো হবে :
Cases[...,x_/;x<#]&
আপনি চারপাশে কাজ করে Prepend
বা বাইট সংরক্ষণ করতে পারেন PrependTo
:
l~Prepend~x
{x}~Join~l
{x,##}&@@l
অথবা
l~PrependTo~x
l={x}~Join~l
l={x,##}&@@l
দুর্ভাগ্যক্রমে, এটি আরও সাধারণের পক্ষে সহায়তা করে না Append
, যা Array.push()
অন্য ভাষাগুলির সাথে সংক্ষিপ্ততম সমতুল্য বলে মনে হয় ।
BlockMap
হয় Partition
+Map
এই টিপটির শিরোনামও হতে পারে, "রিলিজ নোটগুলি পড়ুন, তাদের সবকটি"। (রেফারেন্সের জন্য, এখানে 10.2 এর জন্য প্রকাশিত নোটগুলি এবং আজকের 10.3 প্রকাশের জন্য এখানে রয়েছে ))
যাইহোক, এমনকি ছোটখাট প্রকাশগুলিও নতুন বৈশিষ্ট্যগুলির প্রচুর পরিমাণে ধারণ করে এবং 10.2 থেকে আরও কার্যকর (গল্ফের জন্য) একটি নতুন BlockMap
ফাংশন। এটি মূলত একত্রিত হয় Partition
এবং Map
যা গল্ফারদের জন্য দুর্দান্ত, কারণ Partition
এটি প্রায়শই ব্যবহৃত হয় এবং এটি একটি বিরক্তিকর দীর্ঘ ক্রিয়া নাম। নতুন ফাংশনটি Partition
নিজেই সংক্ষিপ্ত হবে না , তবে আপনি যখনই পার্টিশনগুলিতে কোনও ফাংশন মানচিত্র করতে চান (যা সম্ভবত প্রায়শই বেশি ঘটে থাকে) আপনি এখন একটি বা দুটি বাঁচাতে পারবেন:
#&/@l~Partition~2
BlockMap[#&,l,2]
#&/@Partition[l,3,1]
BlockMap[#&,l,3,1]
যখন নামবিহীন ফাংশনের নতুন অবস্থান আপনাকে নিজের কিছু বন্ধনী সংরক্ষণ করতে দেয় তখন সঞ্চয়গুলি আরও বড় হয়:
#&@@(#&/@Partition[l,3,1])
#&@@BlockMap[#&,l,3,1]
দুর্ভাগ্যক্রমে, আমি জানিনা কেন BlockApply
তারা যখন সেখানে ছিল তখন তারা কেন যোগ করে নি ...
এছাড়াও নোট করুন যে BlockMap
চতুর্থ Partition
তালিকা পেতে আপনি যে 4 তম প্যারামিটারটি ব্যবহার করতে পারেন তা সমর্থন করে না :
Partition[Range@5, 2, 1, 1]
(* Gives {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 1}} *)
BlockMap[f, Range@5, 2, 1, 1]
(* Nope... *)
যদি আপনার উত্তর একই ফাংশন বা এক্সপ্রেশনগুলি একাধিকবার ব্যবহার করে শেষ হয় তবে আপনি এগুলি ভেরিয়েবলগুলিতে সঞ্চয় করার বিষয়টি বিবেচনা করতে পারেন।
যদি আপনার অভিব্যক্তি দৈর্ঘ্য হয় l
এবং আপনি এটি n
বার ব্যবহার করেন তবে এটি সাধারণত l * n
বাইটগুলি ব্যবহার করে ।
তবে, আপনি যদি এটি দৈর্ঘ্য -১ ভেরিয়েবলে সংরক্ষণ করেন তবে এটি কেবল 3 + l + n
বাইটস (বা 2 + l + n
বাইটস, যদি আপনি ভেরিয়েবলটি যেখানে আপনার প্রয়োজন হয় না CompoundExpression (;)
বা প্রথম বন্ধনী প্রয়োজন হয় ) লাগবে ।
উদাহরণস্বরূপ, আসুন একটি সাধারণ সমস্যা বিবেচনা করুন, এন এর চেয়ে কম যমজ প্রাইমগুলি সন্ধান করুন
কেউ এই 54 বাইট সমাধান লিখতে পারে:
Select[Range@#,PrimeQ@#&&(PrimeQ[#+2]||PrimeQ[#-2])&]&
এই উদাহরণে, ফাংশনটি PrimeQ
তিনবার ব্যবহৃত হয়।
PrimeQ
একটি ভেরিয়েবলের নাম নির্ধারণ করে , বাইট গণনা হ্রাস করা যায়। নিম্নলিখিত দুটিই 48 বাইট (54 - 6 বাইট):
Select[p=PrimeQ;Range@#,p@#&&(p[#+2]||p[#-2])&]&
Select[Range@#,(p=PrimeQ)@#&&(p[#+2]||p[#-2])&]&
Sort
পরিবর্তে ব্যবহার করুনSortBy
যেমন তালিকার জন্য list = {{1, "world"}, {0, "universe"}, {2, "country"}}
, নিম্নলিখিত তিনটি বিবৃতি প্রায় সমতুল্য।
SortBy[list,#[[1]]&]
list~SortBy~First
Sort@list
Select
এবংSortBy
কখনও কখনও আমাদের বৃহত্তর সেট থেকে এন্ট্রি বাছাই করতে হবে এবং ন্যূনতম / সর্বাধিক সন্ধান করার জন্য তাদের বাছাই করতে হবে। কিছু পরিস্থিতিতে দুটি অপারেশন এক সাথে একত্রিত হতে পারে।
উদাহরণস্বরূপ, সর্বনিম্ন জন্য, নিম্নলিখিত দুটি বিবৃতি প্রায় সমতুল্য।
SortBy[Select[l,SomeFormula==SomeConstant&],SortValue&]
SortBy[l,SortValue+99!(SomeFormula-SomeConstant)^2&]
এবং
SortBy[Select[l,SomeFormula!=SomeConstant&],SortValue&]
SortBy[l,SortValue+1/(SomeFormula-SomeConstant)&]
1/0
হয় ComplexInfinity
যা সব বাস্তব সংখ্যার চেয়ে "বৃহত্তর"।
একটি মূল-মান তালিকার জন্য, উদাহরণস্বরূপ:
{SortValue,#}&/@SortBy[Select[l,SomeFormula==SomeConstant],SortValue&]
Sort[{SortValue+99!(SomeFormula-SomeConstant)^2,#})&/@l]
Array
সঙ্গে সমতল করা##&
ফলস্বরূপ হওয়া দরকার এমন ফলাফলগুলির একটি গণনা করার জন্য একটি বহুমাত্রিক অ্যারে ব্যবহার ##&
করার সময়, চতুর্থ যুক্তি হিসাবে ব্যবহার করুন । এটি অ্যারের প্রধানগুলি পরিবর্তে ##&
(সমতুল্য Sequence
) দিয়ে প্রতিস্থাপন করে List
, তাই চূড়ান্ত ফলাফল ফলাফলের একটি (ফ্ল্যাট) হবে Sequence
।
দুটি মাত্রায়, তুলনা করুন
{Array[f,dims,origin,##&]}
Join@@Array[f,dims,origin]
অবশ্যই,
Join@@Array[f,dims]
এখনও 2 (বা 3, যদি ইনফিক্স স্বরলিপি ব্যবহার করা যায়) বাইটের চেয়ে কম হয়
{Array[f,dims,1,##&]}
।
তিন বা ততোধিক মাত্রায়, {Array[f,dims,origin,##&]}
বিকল্পটি সর্বদা সংক্ষিপ্ত হয়, এমনকি যদিও এটি উত্স 1 হয়।
{Array[f,dims,1,##&]}
f~Array~dims~Flatten~2
ডিফল্ট মানগুলি দক্ষ পদ্ধতিতে নিখুঁত প্যাটার্ন আর্গুমেন্টগুলির সাথে ডিল করে। উদাহরণস্বরূপ, আমরা যদি Exp[c_*x]
কোনও ভ্যালু এর কোনও নিয়মের জন্য কোনও নিয়মে মেলে c
ধরতে চাই
Exp[x] + Exp[2x] /. {Exp[c_*x] -> f[c], Exp[x] -> f[1]}
(* f[1] + f[2] *)
c
এটি যখনই অনুপস্থিত হয় তার জন্য আমরা ডিফল্ট মানটি ব্যবহার করি তার চেয়ে অনেক বেশি বাইট ব্যবহার করে :
Exp[x] + Exp[2 x] /. Exp[c_.*x] -> f[c]
(* f[1] + f[2] *)
একটি ডিফল্ট ব্যবহার প্যাটার্ন পর একটি বিন্দু দিয়ে নির্দেশিত হয়: c_.
।
ডিফল্ট মান অপারেশন সাথে সংযুক্ত করা হয়: উপরের উদাহরণে, অপারেশন Times
মধ্যে c_.*x
, এবং একটি অনুপস্থিত মান c_
এইভাবে সঙ্গে যুক্ত ডিফল্ট মান থেকে নেওয়া হয় Times
, যা 1. জন্য, Plus
ডিফল্ট মান 0 হয়:
Exp[x] + Exp[x + 2] /. Exp[x + c_.] -> f[c]
(* f[0] + f[2] *)
জন্য Power
বহিঃপ্রকাশ, ডিফল্ট 1:
x + x^2 /. x^n_. -> p[n]
(* p[1] + p[2] *)
(Norm[#-#2]&)
EuclideanDistance