অষ্টাভে গল্ফ করার টিপস


18

অক্টাভে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা কমপক্ষে কিছুটা নির্দিষ্টভাবে অক্টোটাভে নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)। দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।


2
সম্পর্কিত, তবে কোনও সদৃশ নয়: ম্যাটল্যাবে গল্ফ করার টিপস
ডেনিস জাহেরউদ্দিন

উত্তর:


9
  1. একবার আপনি জানতে পারলে a, এটি শূন্য মানের থেকে মুক্ত, nnz(a)তুলনায় তুলনায় আপনাকে ২ টি চর ব্যবহার করে numel(a)
  2. পছন্দ a(a==0)করার a(find(a==0))
  3. ~tএর চেয়ে খাটো t==0এবং এর চেয়েও ~~tছোট t!=0
  4. 0*(1:n) এর চেয়ে কম zeros(1,n)
  5. সাধারণত ||এবং &&অন্যান্য অপারেটরগুলির বিপরীতে, প্রথম যুক্তিটি স্কেলার হলে ফলাফলটি স্কেলারি করুন। ম্যাট্রিক্সের জন্য শূন্যের সমান উপাদান ছাড়া খালি খালি ম্যাট্রিকগুলিতে সত্যের লজিক্যাল মান থাকে ।

সুতরাং, আমরা কোনও ম্যাট্রিক্সের 0||mপরিবর্তে করতে পারি all(all(m))

চেষ্টা করুন 0||[1 1;1 0]এবং 0||[1 1;1 1]নিজেকে বোঝানোর জন্য।

  1. যখন আপনি একটি বিল্টিন বেশ কয়েকবার ব্যবহার করছেন, উদাহরণস্বরূপ অক্ষরকে ছাড়ানোর জন্য একটি ফাংশন হ্যান্ডেল করুন। f=@find। সংক্ষিপ্ত ফাংশন নামের জন্য কমপক্ষে 3 টি উপস্থিতি এটিকে ন্যায্যতা দেয়, দীর্ঘস্থায়ীদের জন্য - এমনকি দুটি উপস্থিতিও।

  2. যখন একটি ফাংশন একটি একক বিবৃতি হয়, একটিতে f=@(n)dosomething(n)স্বরলিপি পছন্দ করুন function r=f(n)r=dosomething(n);end

  3. দুর্ভাগ্যক্রমে, গ্লোবাল ভেরিয়েবলগুলি উভয়ই বিশ্বব্যাপী স্কোপ এবং তাদের ব্যবহার করে প্রতিটি কার্যক্রমে ঘোষণা করতে হবে। তবে একটি ব্যতিক্রম রয়েছে: বেনাম @(n)...ফাংশনগুলি সমস্ত ভেরিয়েবলগুলি যে জায়গা থেকে ডাকা হয়েছিল সেখান থেকে "দেখায়"।

  4. f(a=0,b=0)পরিবর্তে এটি করা সম্ভব a=0;b=0;f(a,b)

  5. এটি অননুমোদিত বৈশিষ্ট্য বলে মনে হয়, তবে মূল্যায়নের zeros(a=n,b=a*a)ক্রমটি বাম থেকে ডানে (v। 3.8.1 এ চেক করা হয়েছে), আপনি দুজনেই এনজেন ^ 2 ম্যাট্রিক্স তৈরি করতে এবং এর সারি এবং কলাম নম্বর aএবং bভেরিয়েবল সংরক্ষণ করতে পারেন।

  6. অপারেটর অগ্রাধিকার টেবিলটি আপনার বন্ধু। করবেন না b=(a==0)যেহেতু b=a==0একই।


7

কেউ কোন চ্যালেঞ্জটি ব্যবহার করে দেখেছেন তা আমি মনে করি না (দয়া করে আমাদের বলুন =) তবে আমি এটি একটি পরিষ্কার কৌশল বলেছি:

সাধারণত আপনি যদি ম্যাট্রিক যোগ করেন তবে আপনার একই আকার থাকতে হবে তবে একটি মাত্রিক (1xn এবং nx1) ম্যাট্রিকের জন্য একটি শর্টকাট রয়েছে (এটি মতলবটিতে কাজ করে না):

z = (1:5)+(6:10)';

হিসাবে একই প্রভাব উত্পাদন

[x,y]=meshgrid(1:5,6:10);
z = x+y;

তারপরে প্যাভেল.বোকসার্কি ইতিমধ্যে উল্লিখিত কিছু: অক্টোবায় আপনি ফাংশন হ্যান্ডলগুলির মধ্যে সহায়ক ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারেন, এবং একটি পরিবর্তনশীল অ্যাসাইনমেন্টের মধ্যেই অ্যাসাইনমেন্টের মান থাকে যাতে আপনি কোডটি সংক্ষিপ্ত করতে পারেন (ভাল এটি একটি অকেজো উদাহরণস্বরূপ তবে আপনি কৌশলটি পাবেন):

f=@(n)(z=n+1)*z; %returns (n+1)^2

তারপরে আর একটি কৌশল (মতলব-এও প্রযোজ্য) সংখ্যার স্টোরিং (হার্ডকোডযুক্ত) এর জন্য স্ট্রিংগুলিকে অপব্যবহার করছে (এই ঝরঝরে কৌশলটি ফিয়ার্সাম থেকে চুরি করা হয়েছে) , আপনার কেবল এমন কিছু দরকার যা স্ট্রিংটিকে সংখ্যার মতো ব্যাখ্যা করবে, যেমন শূন্য যুক্ত করার মতোই সহজ:

a = 'abc';
a+0 %returns
[97 98 99]

অথবা

sum('abc') == 294

আমি বিশ্বাস করি এটি হওয়ার কথা a+0, তা নয় a+'0'। টিপসগুলি দুর্দান্ত তবে ব্যতীত =)
স্টিভি গ্রিফিন

ঠিক আছে, ধন্যবাদ! পিএস: আপনি কি += -= /=নীচে আপনার তালিকায় ইত্যাদি অপারেটর যুক্ত করতে পারেন ?
flawr

1
+aএর চেয়ে সংক্ষিপ্তa+0
লুইস মেন্ডো

7

যুক্তি তালিকা ব্যবহার করে:

অষ্টাভে ডিফল্ট আর্গুমেন্টগুলি পেতে সক্ষম তাই অভিব্যক্তির যুক্তি তালিকায় মূল্যায়ন করা যায়।

এই বৈশিষ্ট্যটি কার্যকর যখন আমরা একটি এক্সপ্রেশন গণনা করতে এবং একাধিকবার ব্যবহার করতে চাই:

f = @(x,a=sort(x))a(a>.5);

একটি ব্যবহারের ক্ষেত্রে হ'ল আমরা যখন কোনও অ্যারের অংশ পরিবর্তন করতে একটি ইনডেক্সড অ্যাসাইনমেন্ট ব্যবহার করি এবং আমরা অ্যারেটি ব্যবহার করতে চাই:

a=[1 2 3 4]
a(2)=5;

তবে অভিব্যক্তি (a(2)=5)ফিরে আসে a(2), বা অভিব্যক্তি (a([1 3])=4)দুটি উপাদান অ্যারে প্রদান করে। পুরো অ্যারেও ফেরত দেয় না। আমরা যুক্তি তালিকাটি ব্যবহার করতে পারি:

f=@(a=[1 2 3 4],b=a(2)=5)a;

এখানে ইনডেক্সড অ্যাসাইনমেন্টের ফলাফলটি একটি ডামি ভেরিয়েবলে সংরক্ষণ করা হয় bএবং ফাংশনটি অ্যারে প্রদান করে।


6

-অকটাভে-তে অস্থায়ী অভিব্যক্তিতে সূচি প্রয়োগ করা সম্ভব, এমন একটি বৈশিষ্ট্য যা ম্যাটল্যাব-এ নিষিদ্ধ ছিল এবং এই বৈশিষ্ট্যটি গল্ফের জন্য খুব দরকারী। উদাহরণ:

অক্টাভা: [1 23 4 5 7](3:4) এবং এর ম্যাটল্যাব সমতুল্য: a=[1 23 4 5 7];a(3:4)
অক্টাভা: hilb(4)(4:5,4:5) এবং এর ম্যাটল্যাব সমতুল্য: h=hilb(4);h(4:5,4:5)
অক্টাভা: {1,4,{4 5 6},[7 ;3]}{3}এবং এর ম্যাটল্যাব সমতুল্য: a={1,4,{4 5 6},[7 ;3]};a{3}
অক্টাভা: num2cell([1 2 3 4]){:}কমা দ্বারা পৃথক তালিকা তৈরির জন্য
অক্টাভে:a'(:)'

-অনেক সময় একটি অনামিকার ফাংশন হিসাবে আমাদের সাধারণ ফাংশন হিসাবে একাধিক এক্সপ্রেশন মূল্যায়ন করতে হবে, যার মধ্যে অ্যাসাইনমেন্ট অন্তর্ভুক্ত থাকে, একটি পন্থা হ'ল আমরা প্রতিটি অভিব্যক্তিটি একটি ঘরে স্থাপন করতে পারি (যেহেতু সেলটিতে একাধিক ধরণের অবজেক্ট থাকতে পারে) এবং যখন আমাদের মান দরকার হয় প্রতিটি অভিব্যক্তিগুলির আমরা সেই উপাদানটি বের করতে সূচি ব্যবহার করতে পারি।

{1,4,{4 5 6},[7 ;3]}{3}
অথবা

{a=1,b=4,c={4 5 6},[b ;3]}{4}


@ স্টেভিগ্রিফিন চমৎকার টিপ! উত্তর আপডেট হয়েছে!
rahnema1

5

সেমিকোলন এড়িয়ে যান!

আমি এই উত্তরটি পয়েন্টটি বর্ণনা করার জন্য ব্যবহার করব ।

মূল কোডটি ছিল:

function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end

সেমিকোলনগুলি অপসারণের পরে, এটি তিনটি বাইট সংরক্ষণ করে নিম্নলিখিতটিতে হ্রাস করা যেতে পারে:

function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end

এটি বেশ কয়েকটি জায়গায় ব্যবহার করা যেতে পারে, এবং আপনি যে জিনিসগুলি চেষ্টা করেও না এটি একটি সিনট্যাক্স ত্রুটি প্রায়শই কাজ করে বলে মনে হয়।


1
আপনি যে জিনিসগুলি চেষ্টাও করেন না কারণ এটি একটি সিনট্যাক্স ত্রুটির মতো দেখতে প্রায়শই সংক্ষেপে
অক্টাভে

2

এটি একটি সহজ, তবে দরকারী।

অক্টাভে, তবে ম্যাটল্যাব নয়, আপনি সি ++ এর মতো করতে পারেন:

x = 0  ->  x = 0
x++    ->  ans = 0
x      ->  x = 1
++x    ->  ans = 2
x      ->  x = 2

2

আর একটি সাধারণ, তবে দরকারী একটি (এমএটিএলবিএতে সম্ভব নয়):

বিভিন্ন ভেরিয়েবলের জন্য একই মান নির্ধারণ করুন:

a=b=c=0;

2

ব্যবহার করুন eval!

এখানে লুই মেন্ডোর উত্তর দ্বারা অনুপ্রাণিত ।


অজ্ঞাতনামা ফাংশনগুলি বেশিরভাগ ক্ষেত্রে স্ক্রিপ্ট তৈরির চেয়ে কম হয় যার কাছে এক বা একাধিক কল প্রয়োজন input('')। অবক্ষয়টি হ'ল লুপস এবং ভেরিয়েবল পরিবর্তন (যেমন একটি ম্যাট্রিক্সে দুটি উপাদান অদলবদল করা) অসম্ভব জটিল।

এর সাহায্যে evalআপনি কোনও সাধারণ বেনামে ফাংশনটি করার মতো ইনপুট আনতে পারবেন এবং স্ক্রিপ্টটি আপনি যেমন কোনও সাধারণ স্ক্রিপ্টের সাথে করেন তেমন চালাতে পারেন:

এটি বিবেচনা করুন :

c=(i=@input)('');N=i('');A=i('');for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A

এর তুলনায়:

@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')

কোডটি অভিন্ন, তবে ইনপুট বিভাগটি খুব ছোট।


এটি এর মতো ইনপুট ভেরিয়েবলগুলি সংশোধন করতেও ব্যবহার করা যেতে পারে (এর জন্য লুইস মেন্ডোকে জমা দেওয়া ):

f(x)eval('x([1,4])=x([4,1])`;

3
কোডটি কেবল অদ্ভুত, ধীর এবং কম পঠনযোগ্য। আরো কি আপনার জন্য অনুরোধ করতে পারেন? :-D
লুইস মেন্ডো


1

সম্পর্কিত, তবে ম্যাটল্যাবের জন্য অভিন্ন টিপস নয় ।

অষ্টাভের একটি সামান্য জ্ঞাত এবং সামান্য ব্যবহৃত বৈশিষ্ট্য হ'ল বেশিরভাগ বিল্টিন ফাংশনগুলি প্রথম বন্ধনী ছাড়াই কল করা যায়, এক্ষেত্রে তারা যা অনুসরণ করে তা স্ট্রিং হিসাবে বিবেচনা করবে (যতক্ষণ না এতে স্পেস থাকে না)। যদি এটিতে ফাঁকা স্থান থাকে তবে আপনার উদ্ধৃতি চিহ্নের প্রয়োজন। এটি ঘন ঘন ব্যবহার করার সময় দুটি বা বাইট সংরক্ষণ করতে ব্যবহার করা যেতে পারে disp। নিম্নলিখিত সমস্ত কাজ, এবং একই ফলাফল দেয়:

disp('Hello')
disp Hello
disp"Hello"

আপনার যদি ফাঁকা স্থান থাকে তবে অবশ্যই আপনার উদ্ধৃতি চিহ্ন থাকতে হবে:

disp('Hello, World!')
disp"Hello, World!"

অন্যান্য, কম দরকারী উদাহরণ অন্তর্ভুক্ত:

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.