ऑक्टेव में गोल्फ के लिए टिप्स


18

ऑक्टेव में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं? मैं उन विचारों की तलाश कर रहा हूं जो सामान्य तौर पर ऑक्टेव के लिए कम से कम कुछ विशिष्ट हैं जो कोड गोल्फ की समस्याओं पर लागू हो सकते हैं (उदाहरण के लिए "टिप्पणियां हटाएं" एक उत्तर नहीं है)। कृपया प्रति उत्तर एक टिप पोस्ट करें।


2
संबंधित, लेकिन एक डुप्लिकेट नहीं: MATLAB में गोल्फ के लिए युक्तियाँ
डेनिस जहरुद्दीन

जवाबों:


9
  1. एक बार जब आप जानते हैं, कि aशून्य मूल्यों से मुक्त है, nnz(a)तो आपको 2 वर्णों की तुलना में पुर्जों का उपयोग करना चाहिए 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. यह अनिर्दिष्ट सुविधा लगती है, लेकिन मूल्यांकन का क्रम बाएं से दाएं (v। 3.8.1 पर जांचा गया है) है, आप zeros(a=n,b=a*a)दोनों को बना सकते हैं ^ 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;

तब कुछ ऐसा है जो pawel.boczarski पहले से ही उल्लेख किया गया है: ऑक्टेव में आप (जबकि आप माटलाब में नहीं कर सकते हैं) फ़ंक्शन हैंडल के भीतर सहायक चर को परिभाषित करते हैं, और एक चर असाइनमेंट में स्वयं असाइनमेंट का मूल्य होता है ताकि आप वास्तव में कोड को छोटा कर सकें (अच्छी तरह से यह एक बेकार है) उदाहरण लेकिन आपको ट्रिक मिलेगी):

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

फिर एक और चाल ( माटलैब में भी लागू) स्ट्रिंग्स (हार्डकोड) संख्याओं के लिए स्ट्रिंग्स का दुरुपयोग कर रहा है (यह साफ चाल feersum से चोरी हो जाती है) , आपको बस कुछ की जरूरत है जो स्ट्रिंग को संख्या के रूप में व्याख्या करता है, जो कि शून्य जितना आसान है:

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

या

sum('abc') == 294

मेरा मानना ​​है कि यह माना जाता है a+0, नहीं a+'0'। इसके अलावा सुझाव अच्छे हैं =)
स्टिव ग्रिफिन

सही है, धन्यवाद! पुनश्च: आप += -= /=नीचे अपनी सूची में आदि ऑपरेटरों जोड़ सकते हैं ?
17

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

-ऑक्टेव में एक अस्थायी अभिव्यक्ति पर अनुक्रमण लागू करना संभव है, MATLAB में निषिद्ध एक विशेषता और यह सुविधा गोल्फिंग के लिए बहुत उपयोगी है। उदाहरण:

सप्टक: [1 23 4 5 7](3:4) और उसके MATLAB बराबर: a=[1 23 4 5 7];a(3:4)
सप्टक: hilb(4)(4:5,4:5) और उसके MATLAB बराबर: h=hilb(4);h(4:5,4:5)
सप्टक: {1,4,{4 5 6},[7 ;3]}{3}और उसके MATLAB बराबर: 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}


@StewieGriffin अच्छा टिप! उत्तर अपडेट किया गया!
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
सामान भी आप कोशिश नहीं करते हैं क्योंकि यह एक सिंटैक्स त्रुटि की तरह दिखता है अक्सर ऑक्टेव को संक्षेप में काम करता है
Sanchises

2

यह एक सरल, लेकिन उपयोगी है।

ऑक्टेव में, लेकिन MATLAB नहीं, आप C ++ में कर सकते हैं:

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


2

का उपयोग करें eval!

लुइस Mendo के जवाब से प्रेरित होकर यहाँ


बेनामी फ़ंक्शंस ज्यादातर मामलों में स्क्रिप्ट बनाने से कम होते हैं जिनकी एक या अधिक कॉल करने की आवश्यकता होती है 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

संबंधित, लेकिन MATLAB के लिए समान सुझाव नहीं ।

ऑक्टेव की एक छोटी और ज्ञात विशेषता यह है कि अधिकांश अंतर्निहित कार्यों को बिना कोष्ठक के कहा जा सकता है, इस मामले में वे इसे एक स्ट्रिंग के रूप में जो भी व्यवहार करेंगे (जब तक कि इसमें रिक्त स्थान नहीं है)। यदि इसमें रिक्त स्थान हैं, तो आपको उद्धरण चिह्नों की आवश्यकता है। इसका उपयोग करते समय एक बाइट या दो को बचाने के लिए अक्सर किया जा सकता है 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.