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


133

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

দ্রষ্টব্য: ECMAScript 6 এবং উপরের গল্ফিংয়ের জন্য টিপসগুলিও দেখুন


আমি আসলেই ভাবছিলাম, এটি কী বৈশ্বিক (সংরক্ষণে var) পরিবর্তনশীল রাখার অনুমতি দেয় ? এবং জাভাস্ক্রিপ্ট গল্ফ কোড কোনও ফাংশন বা আউটপুট থেকে সরাসরি কিছু হওয়া উচিত? আমি সত্যই মনে করি এটি অনেক বেশি পার্থক্য আনতে পারে।
pimvdb

1
@ প্রাইমভিডিবি: এটি অনুমোদিত, তবে আপনাকে সতর্ক হতে হবে কারণ কোনও ফাংশনকে একাধিকবার ডেকে আনে এবং এটি বৈশ্বিক চলকগুলিতে হেরফের করছে, বা যদি এটি পুনরাবৃত্ত ফাংশন হয় তবে এটি পার্শ্ব-প্রতিক্রিয়া সৃষ্টি করতে পারে।
মেল্লামোকব

উত্তর:


108

লুপগুলির জন্য অভিনব

আপনি অ-মানক উপায়ে লুপের জন্য মানকটি ব্যবহার করতে পারেন

for ( a; b; c )

মূলত এর সমতুল্য:

a;
while ( b )
{
  ...
  c;
}

তাই একটি ভাল কৌতুক একটির সাথে আপনার কোড লিখতে হয় whileলুপ, এবং তারপর এটি বিভক্ত a,b,cএকটি অংশের forলুপ।

আমি কয়েকটি উদাহরণ লিখেছি :

for(x=y=n;!z;x--,y++)z=i(x)?x:i(y)?y:0
for(a=b=1;b<n;c=a+b,a=b,b=c);

আপনার সেটারগুলিকে শিকল দিন

আপনি যদি একাধিক মান সূচনা বা পুনরায় সেট করে থাকেন তবে প্রয়োজনীয় সমস্ত ভেরিয়েবলের মানটি শৃঙ্খলাবদ্ধ করুন:

a=b=1;

অন্তর্নিহিত কাস্টিং

আপনার প্রকারগুলি যাচাই করবেন না, কেবল সেগুলি হিসাবে তাদের ব্যবহার করুন। অক্ষর parseInt()ব্যয় 10। আপনার যদি স্ট্রিং থেকে বেরিয়ে আসতে হয় তবে সৃজনশীল হোন:

a='30';
b='10';
c = a + b; //failure
c = parseInt(a) + parseInt(b) //too long

c = -(-a-b); //try these
c = ~~a+~~b;
c = +a+ +b;
c = a- -b;

সেমিকোলনগুলি এড়িয়ে চলুন

জাভাস্ক্রিপ্টটিতে স্বয়ংক্রিয় অর্ধ-কোলন সন্নিবেশ রয়েছে। এটি প্রায়শই এবং ভালভাবে ব্যবহার করুন।

এক-liners,

একক লাইনে বা প্যারামিটারগুলিতে যথাসম্ভব কমিয়ে ব্র্যাকেটগুলিতে সংরক্ষণ করুন:

a( realParam1, realParam2, fizz='buzz' )

বৃদ্ধি / হ্রাস অপারেটর

a = a - 1;
foo(a);

এবং

foo(a);
a = a - 1;

সহজেই আবার লিখতে পারেন

foo(--a);

এবং

foo(a--);

যথাক্রমে।

বৈশ্বিক প্রসঙ্গে thisবা selfপরিবর্তে ব্যবহার করুনwindow

স্ব বর্ণনামূলক 2 চরিত্রের সঞ্চয়।

পুনরায় সম্পত্তি অ্যাক্সেসের জন্য বন্ধনী স্বরলিপি ব্যবহার করুন

সম্পত্তির নামের দৈর্ঘ্য এবং অ্যাক্সেসের সংখ্যার মধ্যে এটি অবশ্যই একটি ভারসাম্যমূলক কাজ। a.longFunctionName()ডট স্বরলিপি দিয়ে দু'বার কল করার পরিবর্তে নামটি সংরক্ষণ করা এবং বন্ধনী স্বরলিখনের মাধ্যমে ফাংশনটি কল করা সংক্ষিপ্ত:

a.longFunctionName(b)
a.longFunctionName(c)
//42

বনাম

a[f='longFunctionName'](b)
a[f](c)
//34

document.getElementByIdএটি হ্রাস করা যেতে পারে এমন ফাংশনগুলির সাথে বিশেষভাবে কার্যকর d[e]

বিঃদ্রঃ:

বন্ধনী চিহ্নিতকরণ সহ, ব্যয়টি 6 + name.lengthপ্রথমবারের অক্ষর। প্রতিটি পরবর্তী অ্যাক্সেসের 3অক্ষরের একটি ব্যয় থাকে ।

বিন্দু চিহ্নিতকরণের জন্য, সমস্ত অ্যাক্সেসের name.length + 1জন্য (+1 .) অক্ষরগুলি ব্যয় হয়।

এই পদ্ধতিটি ব্যবহার করুন যদি 6 + name.length + (3 * (accesses - 1)) < accesses * (name.length + 1)

লেন = সম্পত্তি নামের দৈর্ঘ্য
i = ন্যূনতম অ্যাক্সেস নিতে take

len | i 
========
1   |  
2   |  
3   | 7 
4   | 4 
5   | 3 
6   | 3 
7   | 3 
8+  | 2 

অ্যাক্সেসের সংখ্যাটি একাধিক অবজেক্টকেও ছড়িয়ে দিতে পারে। আপনি যদি .lengthবিভিন্ন অ্যারেতে 4 বা ততোধিক বার অ্যাক্সেস করেন তবে আপনি স্ট্রিং ধারণ করে একই চলকটি ব্যবহার করতে পারেন 'length'


5
c = ~~a-~~bহওয়া উচিত c = ~~a+~~b। এছাড়াও, আপনি |0উদাহরণস্বরূপ নির্ভুলভাবে পূর্ণসংখ্যার জন্য কাস্ট করতে পারেন Math.random()*6|0
মেল্লামব্যাক

7
আনারি প্লাস অপারেটরের সাথে একটি সংখ্যায় স্ট্রিং জোর করা সস্তা। যদি aএবং bস্ট্রিং +a+bহয় তবে আপনি সংখ্যায় রূপান্তর করতে এবং সেগুলি যুক্ত করতে পারেন।
পিটার ওলসন 21

8
আমি শপথ করছি আমি d- -bকোনও দিন আমার কোডটি ব্যবহার করব ...
জন ডিভোরাক

4
+ এ + বি কাজ করে না (কমপক্ষে আমার উপর ...) // এ = "1", বি = "1", + এ + বি // "11" দেয়
ইমমা

2
"পুনরাবৃত্তি ফাংশন কলগুলির জন্য অ্যারে-অ্যাক্সেস ব্যবহার করুন" এর জন্য যদি আপনি একই বস্তুতে দ্বিগুণ চেয়ে বেশি ফাংশনটি ব্যবহার করেন তবে নতুন সদস্যকে ফাংশনটি নির্ধারণ করা কিছুটা খাটো হ'লa.f=a.longfunctionname;a.f(b);a.f(c);a.f(d)
মার্টিন ইন্ডার

131

2
এটি কাজ করে এবং আমি এটি একাধিক অঙ্কের জন্য ব্যবহার করেছি।
ইসিয়া মিডোস

12
লোল এটি আসলে বেশ সৃজনশীল
নিকক নিউম্যান

9
ES6 এ এগুলি আর গুরুত্বপূর্ণ নয়, আপনি কেবল করতে পারেন.split`...`
ডেভিড আর্চিবাল্ড


56

ধনুর্বন্ধনী এড়ানোর জন্য কমা অপারেটরটি ব্যবহার করুন (সিটিতে এটি প্রযোজ্য ):

if(i<10)m+=5,n-=3;

পরিবর্তে

if(i<10){m+=5;n-=3}

যা একটি চরিত্র দীর্ঘ।


2
প্রথম নমুনার শেষে কি সেমিকোলনটি প্রয়োজনীয়?
wjl

4
@ ওয়াজলাফ্রান্স: এটি কেবলমাত্র যদি ওয়ান-লাইনারের শেষে হয় তবে এটির প্রয়োজন হবে না।
মেল্লামব্যাক

48

সংক্ষিপ্ত র্যান্ডম সংখ্যা প্রজন্ম

আপনার যদি এলোমেলো বুলিয়ান প্রয়োজন হয় ( 0বা 1):

new Date&1 // equivalent to Math.random()<0.5

আপনার যদি এলোমেলো পূর্ণসংখ্যার প্রয়োজন হয় 0 <= n < 1337:

new Date%1337 // equivalent to Math.floor(Math.random()*1337))

এটি কাজ করে কারণ একটি Dateজাভাস্ক্রিপ্টে একটি মহাকাশকাল থেকে মিলসেকেন্ডের পরিমাণ হিসাবে অভ্যন্তরীণভাবে সঞ্চিত আছে, সুতরাং আপনি যখন এটিতে পূর্ণসংখ্যার গণিত করার চেষ্টা করছেন তখন new Dateতাতে জোর করা হচ্ছে 123somebignumber456

অবশ্যই, এই "এলোমেলো" সংখ্যাগুলি এতটা এলোমেলো হবে না, বিশেষত আপনি যদি তাদের একাধিকবার দ্রুত উত্তরাধিকারে কল করেন, তবে এটি মনে রাখবেন।


1
আরও মিথ্যা প্রোগ্রামার পড়ার সময় এই উত্তরটি স্মরণে রেখেছিলেন সময় সম্পর্কে বিশ্বাসী : "21। যদি আপনি একে অপরের পাশে দুটি তারিখের অবজেক্ট তৈরি করেন তবে তারা একই সময় উপস্থাপন করবেন। (একটি দুর্দান্ত হাইজেনব্যাগ জেনারেটর) "
সেবাস্তিয়ান সাইমন 13

39

আপনি কীওয়ার্ডটি ব্যবহার এড়াতে get / set এর অবজেক্টের আক্ষরিক ফর্মটি ব্যবহার করতে পারেন function

var obj = {
  get f(){
    console.log("just accessing this variable runs this code");
    return "this is actually a function";
  },
  set f(v){
    console.log("you can do whatever you want in here, passed: " + v);
  }
};

1 && obj.f; // runs obj.[[get f]]
obj.f = Infinity; // runs obj.[[set f]](Infinity)

গিটার / সেটার অংশটি সত্যই সহায়ক ছিল। thx
gion_13

1
আসলে, এটি আরও ভাল একটি অবজেক্ট পদ্ধতি, যদি আপনি কেবল এটি <= 2 বার ব্যবহার করেন। অন্যদিকে, তীর ফাংশনগুলি অক্ষরগুলি কেটে ফেলার ক্ষেত্রে আরও ভাল, কারণ তারা প্রায় একই উদ্দেশ্যে কাজ করে এবং ক্লাসগুলি গল্ফ কোডে খুব কমই কার্যকর হয়।
ইসিয়া মিডোস

সমর্থন যদি গুরুত্বপূর্ণ তীর ফাংশন fx সমর্থন করা হয় না। ie11
জিম ওল্ফ

35

এইটি কম পরিচিত এবং কম ব্যবহৃত হয়, তবে সঠিক পরিস্থিতিতে ব্যবহার করা গেলে চিত্তাকর্ষক হতে পারে। কোনও ফাংশন বিবেচনা করুন যা কোনও আর্গুমেন্ট গ্রহণ করে না এবং ডাকা হলে সর্বদা আলাদা নম্বর দেয় এবং প্রত্যাবর্তিত নম্বরটি গণনায় ব্যবহৃত হবে:

var a = [ 
    Math.random()*12|0,
    Math.random()*11|0,
    Math.random()*10|0,
    /* etc... */ 
];

আপনি সাধারণত একক-বর্ণের পরিবর্তনশীল নামটি ব্যবহার করে এই ফাংশনটি সংক্ষিপ্ত করতে পারেন:

var r=Math.random,a=[r()*12|0,r()*11|0,r()*10|0,r()*9|0,r()*8|0,r()*7|0,r()*6|0,r()*5|0];

দৈর্ঘ্য হ্রাস করার একটি আরও ভাল উপায় হ'ল গালি দেওয়া valueOf, যা আপনাকে অনুরোধ অনুযায়ী 2 টি অক্ষরের সাশ্রয় দেয়। আপনি যদি 5 বারের বেশি ফাংশনটি কল করেন তবে দরকারী:

var r={valueOf:Math.random},a=[r*12|0,r*11|0,r*10|0,r*9|0r*8|0,r*7|0,r*6|0,r*5|0];

8
বা, আপনি এটিগুলির মধ্যে এটির মতো করতে পারেন: let a=[5,6,7,8,9,10,11,12].map(x=>x*Math.random()|0)বা let a=Array(7).map((_,i)=>i*Math.random()|0+5), যথাক্রমে 36 বা 42 বাইট সংরক্ষণ করা।
ইসিয়া মিডোস

এটি প্রতিস্থাপন করা r()বা এটি আরও খাটো করা সম্ভব?
নিকক নিউম্যান

3
r={valueOf:Math.random}এটি কেবল প্রতিভা: ডি
ইটিএইচ প্রোডাকশনগুলি

1
@Isiah, ভাল হ্যাঁ, আপনি তা করতে পারে এখন :-D
অ্যান্ডি ই

32

শর্ট সার্কিট অপারেটরদের সুবিধা গ্রহণ করা

দীর্ঘ ifবিবৃতি বা টার্নারি অপারেটর ব্যবহার করার পরিবর্তে , আপনি আপনার কোডটি ব্যবহার করতে &&এবং ||ছোট করতে পারেন । এই ক্ষেত্রে:

var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);

return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : null;

হতে পারে

var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);

return match && decodeURIComponent(match[1].replace(/\+/g, ' '));

||অপারেটর প্রায়ই অক্ষমতা সেট করার জন্য এই ভাবে ব্যবহার করা হয়:

evt = evt || window.event;

এটি লেখার মতোই

if (!evt)
    evt = window.event;

অ্যারে ব্যবহার করে পুনরাবৃত্ত স্ট্রিং তৈরি করা হচ্ছে

আপনি যদি কোনও নির্দিষ্ট চরিত্রের দীর্ঘ স্ট্রিংটি শুরু করতে চান, আপনি n + 1 দৈর্ঘ্য সহ একটি অ্যারে তৈরি করে এটি করতে পারেন , যেখানে n অক্ষরটি পুনরাবৃত্তি করতে চান এমন সংখ্যা:

// Create a string with 30 spaces
str = "                              ";

// or
str = Array(31).join(" ");

বড় স্ট্রিং, বড় সঞ্চয়।

সংখ্যার পার্সিং

ব্যবহার করুন +এবং ~পরিবর্তে অপারেটরদের parseFloat()বা parseInt()যখন একটি স্ট্রিং টাইপ যে কোয়ালেসিং মাত্র একটি সংখ্যা একটি সংখ্যা টাইপ:

var num = "12.6";
parseFloat(num) === +num;  // + is 10 characters shorter than parseFloat()

var num2 = "12"
parseInt(num2) === +num2;   // + is 8 characters shorter than parseInt()

var num3 = "12.6"
parseInt(num3) === ~~num3;  // ~~ is 7 characters shorter than parseInt()

var num4 = "12.6"
parseInt(num4) === num4|0;  // |0 is 7 characters shorter than parseInt()

সতর্ক থাকুন, অন্য ধরণের এই অপারেটরগুলির সাথে একত্রিত করা যেতে পারে (উদাহরণস্বরূপ, trueহয়ে উঠবে 1) একটি খালি স্ট্রিং বা কেবল সাদা স্থানযুক্ত স্ট্রিং হয়ে যাবে 0। তবে এটি নির্দিষ্ট পরিস্থিতিতে কার্যকর হতে পারে।


6
অ্যারে ব্যবহার করে পুনরাবৃত্ত স্ট্রিং তৈরির জন্য +1 - এটি সম্পর্কে ভাবেন নি।
মেল্লামোকব

4
পুনরাবৃত্ত স্ট্রিংগুলি তৈরি করতে, ES6 এ আপনি ব্যবহার করতে পারেনstr.repeat(count)
ওরিওল

26

ব্যবহারকারী ইনপুট পাওয়ার জন্য প্রম্পটে () কলটিতে ভেরিয়েবল ইনিশিয়ালাইজেশন স্নিক করুন

n=prompt(i=5);     // sets i=5 at the same time as getting user input

পরিবর্তে ব্যবহার

n=prompt();i=5;

পার্শ্ব-প্রতিক্রিয়া হিসাবে, এটি 1 টি অক্ষর সংরক্ষণ করার সময় প্রম্পট উইন্ডোতে ইনপুট মানটি প্রদর্শন করে।


12
এটি আর্গুমেন্ট গ্রহণ না করে এমন কোনও ফাংশনেও প্রয়োগ করা যেতে পারে।
কেসি চু

3
এমনকি যদি ফাংশনটি আর্গুমেন্ট গ্রহণ করে তবে এটি কার্যকর হতে পারে, যেমন [1,2,3].join('',i=5)এটি ক্ষেত্রে এক জোড়া ধনুর্বন্ধনী সংরক্ষণ করে।
ডকম্যাক্স

3
@ ডকম্যাক্স: আপনি এর জন্য কমা অপারেটর ব্যবহার করতে পারেন - i=5,[1,2,3].join()
কনরাড বোরোস্কি

@ গ্লিচএমআর: আমি পারতাম, তবে এটি কোনও অক্ষর সংরক্ষণ করে না। আমি সম্মত হই যে বেশিরভাগ সময় পরিষ্কার থাকে। আমি মনে করি এখনও এমন কিছু ঘটনা ঘটতে পারে যেখানে আমার অর্ডারটি একটি চর বাঁচাতে পারে, যদিও আমি এই মুহুর্তে কোনওটির সামনে আসতে পারি না (এবং আমি ভালও হতে পারি)।
ডকম্যাক্স

@ ডকম্যাক্স কেবলমাত্র যদি আপনি এএসআইর সুবিধা নিচ্ছেন।
ইসিয়া মিডোস

24

লুপগুলির জন্য নেস্টেড একত্রিত করুন:

// before:
for(i=5;i--;)for(j=5;j--;)dosomething(i,j)

// after:
for(i=25;i--;)dosomething(0|i/5,i%5)

i/ এর জন্য বিভিন্ন মান সহ উদাহরণ j:

// before:
for(i=4;i--;)for(j=7;j--;)dosomething(i,j)

// after:
for(i=28;i--;)dosomething(0|i/7,i%7)

(আমি একটি সম্পাদনা করেছি) গৌণ টাইপো, তবে খুব চালাক! নোট করুন যে এটি কেবল একই দৈর্ঘ্যের নেস্টেড লুপগুলিতে কাজ করবে (যদি আমি ভুল না করি)।
ক্যামিলো মার্টিন

1
@ ক্যামিলোমার্টিন না, লুপগুলি সমান দৈর্ঘ্যের হওয়ার দরকার নেই। পুনরাবৃত্তিও ফলে সংখ্যা i*jএবং বিভাগ / মডুলাস অপারেটরের পৃথক মান পুনরুদ্ধার iএবং j
চুপচাপ

@ user113215 আপনি ঠিক, দুর্দান্ত! :) আমি একটি উদাহরণ অন্তর্ভুক্ত উত্তর সম্পাদনা করেছি।
কামিলো মার্টিন

23

ইউনিকোড শর্টকাট

যদি আপনি একটি বড় গল্ফিং চ্যালেঞ্জের মধ্যে বিল্ট-ইন প্রপার্টিটির নরক ব্যবহার করেন তবে আপনি প্রতিটি সম্পত্তি একটি চরিত্রের সমতুল্য করতে পারেন:

[Math,Number,S=String,Array].map(b=>
    Object.getOwnPropertyNames(b).map((p,i)=>
        b.prototype[S.fromCharCode(i+248)]=b[p]
    )
)

উপরের কোডটি কার্যকর করার পরে আপনি এটি ব্যবহার করতে পারেন:
"foo".Č(/.*/,'bar') // replaces foo with bar

এটির দাম 118 বাইট, সুতরাং এটি কিছু পরিস্থিতিতে কার্যকর নাও হতে পারে

এটি ব্রাউজার নির্ভর হতে পারে এবং আমি নিশ্চিত নই যে এটি with(Array){join(foo),...}ব্যবহারকারীর বৈশিষ্ট্য হিসাবে ভেরিয়েবলের চেয়ে সংক্ষিপ্ত বা সংজ্ঞায়িত কিনা with(Array){j=join,m=map...}তবে তবুও এটি উল্লেখ করার মতো।

    Math        Number              String              Array

ø   toSource    prototype           prototype           prototype
ù   abs         NaN                 quote               join
ú   acos        POSITIVE_INFINITY   substring           reverse
û   asin        NEGATIVE_INFINITY   toLowerCase         sort
ü   atan        MAX_VALUE           toUpperCase         push
ý   atan2       MIN_VALUE           charAt              pop
þ   ceil        MAX_SAFE_INTEGER    charCodeAt          shift
ÿ   clz32       MIN_SAFE_INTEGER    contains            unshift
Ā   cos         EPSILON             indexOf             splice
ā   exp         isFinite            lastIndexOf         concat
Ă   floor       isInteger           startsWith          slice
ă   imul        isNaN               endsWith            filter
Ą   fround      toInteger           trim                isArray
ą   log         parseFloat          trimLeft            lastIndexOf
Ć   max         parseInt            trimRight           indexOf
ć   min         length              toLocaleLowerCase   forEach
Ĉ   pow         name                toLocaleUpperCase   map
ĉ   random      arguments           normalize           every
Ċ   round       caller              match               some
ċ   sin                             search              reduce
Č   sqrt                            replace             reduceRight
č   tan                             split   
Ď   log10                           substr  
ď   log2                            concat  
Đ   log1p                           slice   
đ   expm1                           fromCharCode    
Ē   cosh                            fromCodePoint   
ē   sinh                            localeCompare   
Ĕ   tanh                            length  
ĕ   acosh                           name    
Ė   asinh                           arguments   
ė   atanh                           caller  
Ę   hypot           
ę   trunc           
Ě   sign            
ě   cbrt            
Ĝ   E           
ĝ   LOG2E           
Ğ   LOG10E          
ğ   LN2         
Ġ   LN10            
ġ   PI          
Ģ   SQRT2           
ģ   SQRT1_2         

আমি গুগল ক্রোম ব্যবহার করছি এবং এগুলি সমস্তই সংজ্ঞায়িত হচ্ছে।
সুপারজেডি ২২৪

এটি অবশ্যই খুব ফায়ারফক্স নির্দিষ্ট হতে হবে। অসুবিধার জন্য দুঃখিত.
bebe

কেন এই সমস্ত বিশেষ চরিত্র? কেন কেবল ছাপার যোগ্য এএসসিআইআই ব্যবহার করবেন না? (টাইপ করা সহজ, আরও নির্ভরযোগ্য, এবং গল্ফিংয়ের জন্য শুধুমাত্র 1 বাইট)
সাইয়েস

এটি সত্যিকার অর্থে কাজ করে না Mathকারণ এর কোনও .prototypeবৈশিষ্ট্য নেই। অপসারণ Math, যদিও, আমি এটিকে 114-বাইট স্নিপেটে গল্ফ করতে পেরেছি যা তাদের সকলকে একক-বাইট চিঠিগুলিতে নিয়োগ করে। আপনি এটি এখানে খুঁজে পেতে পারেন ।
ETH প্রোডাকশনগুলি

1
এই সমস্ত সম্পত্তি সীমাতে স্থানান্তরিত করার ব্যয়ে আপনি আমার সমাধানটি 106 বাইটে গল্ফ করতে পারেন À- ÿযা এখনও আইএসও -8859-1 এনকোডিংয়ের (যা জেএস সমর্থন করে) প্রতিটি বাইট। ফায়ারফক্স 50-এ, দুর্ভাগ্যক্রমে এই .localeCompareপদ্ধতিটি চালু করে ×, তবে এটি সাধারণত সমস্যা হওয়া উচিত নয়। উত্স
ETH প্রোডাকশনগুলি

22

একটি whileলুপকে একটি লুপে রূপান্তর forকরা প্রায়শই সমতুল্য:

while(i--);
for(;i--;);

তবে দ্বিতীয় ফর্মের সাথে ভেরিয়েবল ইনিশিয়েশন থাকতে পারে:

i=10;while(i--);
for(i=10;i--;);

লক্ষ্য করুন দ্বিতীয় ফর্মটি প্রথম ফর্মের চেয়ে একটি চরিত্রের চেয়ে ছোট।


6
বা, আরও ভাল, কেবল লুপগুলির জন্য ব্যবহার করুন। আমি যতদূর অভিজ্ঞতা পেয়েছি সেখানে বৃহত্তর কোডে লুপ ফলাফলের জন্য কোনও ব্যবহার করার সত্যিই কোনও ঘটনা নেই।
ইসিয়া মিডোস

22

আপত্তি আপত্তি

যদি স্ট্রিং / চরিত্রের অক্ষরগুলি নিষিদ্ধ করা হয়, আপনি চেষ্টা করে ব্লক ব্যবহার করতে পারেন:

try{something0}catch(e){str=e.message.split(0)[0]}

এখন strসমান"something"

যদি আরও স্ট্রিংয়ের প্রয়োজন হয় তবে আপনি এটি একটি সংখ্যার সাথে শৃঙ্খলাবদ্ধ করতে পারেন (উদাঃ শূন্য)

try{something0foo0bar0}catch(e){arr=e.message.split(0)}

এখন arrসমান["something", "foo", "bar", " is not defined"]


18

যদি আপনি 1কোনও লুপের প্রতিটি পুনরাবৃত্তিতে কোনও ভেরিয়েবলের সূচনা করে থাকেন (উদাহরণস্বরূপ, কোনও অভ্যন্তরীণ লুপের জন্য বাইরের লুপে একটি ভেরিয়েবলটি পুনরায় সেট করা), নীচের মত ( এই প্রশ্নের আমার উত্তর থেকে ):

for(j=n-2;p=1,j++<=n;r|=p)for(i=1;++i<j;)p=j%i?p:0;
          ^^^^

মত একটি শর্ত ফল যেহেতু j++<=nহয় 1যখনই তার সত্যিকারের, আপনি শুধু শর্ত সরাসরি পরিবর্তনশীল নির্ধারিত করতে পারেন (কারণ যখন একে মিথ্যা হয়ে, লুপ হবে আর ব্যাপার নির্বাহ করা থামান এবং থাকবে):

for(j=n-2;p=j++<=n;r|=p)for(i=1;++i<j;)p=j%i?p:0;
          ^^^^^^^^

আপনি এই পদ্ধতিটি ব্যবহার করে সাধারণত 2 টি অক্ষর সংরক্ষণ করতে পারেন । @ugorenএই উত্তরের মন্তব্যে ধারণার জন্য শ্রদ্ধা জানাই ।


অন্য একটি উদাহরণের জন্য, আমি লুপের জন্য আমার বাহ্যিক অংশে প্রকাশের সাথে এই উত্তরটি প্রয়োগ করে w=r=++c<S.lengthমোট 4 টি অক্ষর সংরক্ষণ করেছি।


18

আপনি যদি স্পাইডারমনকি (এখন জন্য) নির্দিষ্ট স্ক্রিপ্টগুলি গ্রহণ করতে পারেন তবে আপনি ECMAScript 6 টি তীর ফাংশন ব্যবহার করতে পারেন । নীচের মত কোড লেখার পরিবর্তে।

a.map(function(x){return x*2}) // function? return?

আপনি এটি এইভাবে সংক্ষিপ্ত করতে পারেন।

a.map(x=>x*2)

17

আপনার যদি NaN পরীক্ষা করার প্রয়োজন হয় isNaN(x)তবে ব্যবহার করবেন না তবে ব্যবহার করুন x!=xযা খাটো এবং এটিও কার্যকর।

if(isNaN(x)){
if(x!=x){

মনে রাখবেন এটি কেবল তখনই কাজ করে typeof(x) === "number"; যদি এটি একটি স্ট্রিং উদাহরণস্বরূপ, isNaN("string")ফিরে আসে true, কিন্তু "string" != "string"ফিরে আসে false। এটি নির্দেশ করার জন্য সাইয়েসকে ধন্যবাদ!


2
এটি এই স্নিগ্ধের একটি প্রতিভা ব্যবহার। +1
ইটিএইচ প্রোডাকশনগুলি

সতর্কতা: এগুলি সর্বদা সমতুল্য নয়: isNaN("string")ফেরত দেয় true, যেখানে "string"!="string"আয় false(স্পষ্টতই)
সাইওস

@ কিউস ভাল পয়েন্ট, ধন্যবাদ! আমি আমার উত্তর সম্পাদনা করেছি।
প্রোগ্রামফক্স

আপনি if(!x){যদি NaNস্পষ্টভাবে সনাক্ত করে থাকেন তবে বেশিরভাগ ক্ষেত্রে, আপনি এমনকি অনুসন্ধান করতে পারেন ।
হোহমানফান

1
xসংখ্যায় কাস্ট করা, +x!=+xএটি সমান করে তোলে isNaN(x), তবুও 2 টি অক্ষর ছোট। তারপরে, +"string"!=+"string"সত্য ফিরে আসে।
টমাস ল্যাংকায়াস

15

অ্যারের যোগফল / পণ্য / ভাগফল

ES5 : 17 বাইট

eval(a.join('+'))

ES6 : 15 বাইট

eval(a.join`+`)

অবশ্যই আপনি +যা চান তার জন্য অদলবদল করতে পারেন, উদাহরণস্বরূপ, *পণ্য বা /ভাগফলের জন্য।


14

কোনও সংখ্যাকে শূন্যের দিকে গোল করতে বিটওয়াস অপারেশন ব্যবহার করুন:

// do this
T=Math.random()*6+1|0

// or do this
T=~~(Math.random()*6+1)

(উত্স: এলোমেলো ডাইস টিপিং )

অপারেটর অগ্রাধিকার নির্ধারণ করে যা আপনার প্রোগ্রামে কম হবে।


2
এটি একটি পূর্ণসংখ্যার মধ্যে একটি স্ট্রিং ইনপুট একত্রিত করতে ব্যবহার করা যেতে পারে, অর্থাত্ n=prompt()|0,।
মেল্লামোকব

1
:, bitwise এছাড়াও সুপার ফাস্ট math.floor সাথে তুলনা করা হয় jsperf.com/floor-vs-bitwise
VSync

@vsync: অদ্ভুত আমি ক্রোম 11.0.696.77 এ বিটওয়াইজের চেয়ে দ্বিগুণ দ্রুত গতিতে ম্যাথ.ফ্লোর পেয়েছি।
মেল্লামবক

খুব অদ্ভুত. আমার জন্য এগুলি ক্রোমে কম বা কম একই গতি এবং সুপার দ্রুত, তবে এফএফ এ ক্রোমের চেয়ে বিটওয়াইস অনেক দ্রুত এবং Math.floorখুব মারাত্মক ধীর হয়..আমি বলতে চাইছি খুব বেশি ব্যবহার করা উচিত নয়।
vsync

মন্তব্যগুলি আপ টু ডেট রাখার জন্য, বর্তমান এফএক্স এ তারা উভয়ই দ্রুত এবং প্রায় সমান। আশেপাশের কোডের সাথে তুলনায় এটি প্রথম স্থানে বাধা হতে পারে না ...
ফায়ারফ্লাই

14

লুপিং টিপ আই

আপনি শেষ সময় ব্যবহারের সময় 1পরিবর্তন করে লুপ করার সময় চরিত্রটি সংরক্ষণ করতে পারেন i:

//not so god
for(i=0;i<3;i++){
  alert(i);
}

//best
for(i=0;i<3;){
  alert(i++);
}

দ্রষ্টব্য:-- খুব বেশি কাজ করে (তবে সেই হিসাবে লুপটি অসীম লুপিং এড়ানোর জন্য পরিবর্তন করুন)


লুপিং টিপ II

কিছু দৃশ্যাবলী রয়েছে যেখানে আপনি ইনক্রিমেন্টিং অপারেটর এবং মানগুলির সাথে খেলতে একটি চরিত্র সংরক্ষণ করতে পারেন:

for(i=0;i++<9;)
for(i=0;++i<10;)

দ্রষ্টব্য: উদাহরণস্বরূপ আপনার মনোযোগ দিতে হবে 0 to -1। এবং 9 to 10, 99 to 100, যাতে আপনি চরিত্রটি সংরক্ষণ করার উপায় খুঁজে না পান ততক্ষণ খেলুন


13

পূর্ণসংখ্যার সাথে তুলনা করার ^পরিবর্তে !=বা ব্যবহার করুন==

//x!=3?a:b
  x^3?a:b

//x==3?a:b
  x^3?b:a

সংক্ষিপ্ত এক্সপ্রেশন সহ অন্তর্নির্মিত গণিত ফাংশনে কলগুলি প্রতিস্থাপন করুন

//Math.ceil(n)
  n%1?-~n:n

//Math.floor(n)
  ~~n
  0|n

//Math.abs(n)
  n<0?-n:n

//Math.round(n)
  n+.5|0

//Math.min(x,y)
  x<y?x:y

//Math.max(x,y)
  y<x?x:y

2
বিকল্পভাবে, আপনি কেবল পূর্ণসংখ্যার -পরিবর্তে ব্যবহার করতে পারেন !=; উদাহরণস্বরূপ, এর n!=1?a:bসমতুল্য হবেn-1?a:b
ভ্রোগেহেগেল

10

লক্ষণীয় কিছু বিষয় হ'ল লুপগুলিতে কয়েকটি বাইট সংরক্ষণ করতে আপনি কিছু ক্ষেত্রে শূন্যের জায়গায় একটি স্ট্রিং ব্যবহার করতে পারেন:

s='';for(i=0;i++<9;)s+=i
for(i=s='';i++<9;)s+=i
// s="123456789", i=10

1
আমি কনসোলে "++ চেষ্টা করে দেখেছি ভাবছি এটি কার্যকর হবে কিনা, অবশ্যই এটি প্রথমে একটি পরিবর্তনশীল হতে হবে। ধন্যবাদ!
ভার্টন

10

খুব সাধারণ একটি, তবুও, কেউ এটি উল্লেখ করেনি।

আপনি যদি ব্যবহার করছেন Math.min()বা Math.max()আপনি এটি করে 6 টি অক্ষর সংরক্ষণ করতে পারেন:

Math.min(a,b)  // 13 chars
a<b?a:b        //  7 chars

Math.max(a,b)
a>b?a:b

10

রাউন্ডইং

আমি জানি যে বিকল্প Math.floor()পোস্ট করা হয়েছে, তবে অন্যদের কী হবে?

মেঝের:

Math.floor(x) //before
0|x           //after

রাউন্ডইং:

Math.round(x) //before
0|x+.5        //after

সিলিং:

Math.ceil(x) //before
x%1?-~x:x    //after - credits to @Tomas Langkaas

1
মনে রাখবেন যে 0|x+1সিলিংটি আপনি ইতিমধ্যে একটি পূর্ণসংখ্যার সন্ধান করতে চান সেই সংখ্যাটি কেবল 1 যুক্ত করে। একটি (বেশিরভাগ) নিরাপদ বিকল্প 0|x+1-1e9, তবে এটি কেবল তিনটি বাইট কম।
ETH প্রোডাকশনস

@ ইথ প্রডাকশন বলতে কি বোঝাতে চাইছেন না 0|x+1-1e-9?
মামা ফান রোল

ওফ, হ্যাঁ যে ইশারা জন্য ধন্যবাদ। (কোনও কারণে, আমি @ (আপনার ব্যবহারকারীর নাম) করতে পারি না ...)
ইটিএইচ প্রডাকশন

সম্ভবত কারণ আমার ব্যবহারকারীর অক্ষরগুলি উল্টে রয়েছে :)
মামা ফান রোল

1
সিলিংয়ের জন্য, x%1?-~x:x(9 টি অক্ষর) একটি ভাল বিকল্প। তবে মেঝে বিকল্পগুলির মতো 0|xএবং ~~xএটি কেবল ধনাত্মক সংখ্যার জন্য কাজ করে।
টমাস ল্যাংকায়াস

9

আপনি দুটি সংখ্যার মধ্যে বেছে নিতে টার্নারি অপারেটরটি ব্যবহার করছেন এবং শর্তসাপেক্ষটি হয় একটি বুলিয়ান বা সংখ্যা 1 or 0 , আপনি পরিবর্তে গণিত ক্রিয়াকলাপ করতে পারেন:

(x ? num1 : num2) conclusions:

    1)if num1 equals num2, there ARE savings
    2)if num1 is (+1) or (-1) than num2, there ARE savings
    3)if either num1 or num2 equals to 0, there ARE savings
    4)it is MORE LIKELY to find greater savings on num1>num2 instead of num1<num2
    5)in method (*A) and (*B), savings are NOT GUARANTEED

    a)num1>num2
        i)(num1==(num2+1))
            ex1: (x?5:4) to (x+4)
            ex2: (x?8:7) to (x+7)
        ii)num2==0
            ex1: (x?3:0) to (x*3)
            ex2: (x?7:0) to (x*7)
        iii)
            (*A) or (*B) //one might be shorter

    b)num1<num2
        i)((num1+1)==num2)
            ex1: (x?4:5) to (5-x)
            ex2: (x?7:8) to (8-x)
        ii)num1==0
            ex1: (x?0:3) to (!x*3)
            ex2: (x?0:7) to (!x*7)
        iii)
            (*A) or (*B) //one might be shorter

    c)num1==num2
        i)
            ex1: (x?5:5) to (5)
            ex2: (x?-3:-3) to (-3)

    (*A) use ((x*(num1-num2))+num2)
        ex1: (x?8:4)   to ((x*4)+4)
        ex2: (x?4:8)   to ((x*-4)+8)

        ex3: (x?6:-4)  to ((x*10)-4)
        ex4: (x?-4:6)  to ((x*-10)+6)

        ex5: (x?4:-6)  to ((x*10)-6)
        ex6: (x?-6:4)  to ((x*-10)+4)

        ex7: (x?-5:-9) to ((x*4)-9)
        ex8: (x?-9:-5) to ((x*-4)-5)

    (*B) use ((!x*(num2-num1))+num1)
        ex1: (x?8:4)   to ((!x*-4)+8)
        ex2: (x?4:8)   to ((!x*4)+4)

        ex3: (x?6:-4)  to ((!x*-10)+6)
        ex4: (x?-4:6)  to ((!x*10)-4))

        ex5: (x?4:-6)  to ((!x*-10)+4)
        ex6: (x?-6:4)  to ((!x*10)-6)

        ex7: (x?-5:-9) to ((!x*-4)-5)
        ex8: (x?-9:-5) to ((!x*4)-9)

দ্রষ্টব্য: এ ছাড়াও, আপনি অপ্রয়োজনীয় অপসারণ করতে হবে 0-, +0, +-ইত্যাদি

Note2: একটা বিচ্ছিন্ন ঘটনা কোথায় (x) !== (x?1:0), যেমন xহওয়া আবশ্যক typeof === "number"এটা কাজ করে। তবে এটি ক্ষেত্রে (-x)ঠিক কাজ করে।

দ্রষ্টব্য 3: আপনি যদি সঞ্চয় খুঁজে না পান তবে কেবলমাত্র পূর্বেরটি ব্যবহার করুন(x?y:z)

পূর্বে আমি ভেবেছিলাম পদ্ধতি বি কখনই এটিকে পরাজিত করতে পারে না, তবে ব্যতিক্রমগুলি বিদ্যমান:

(x?97:100) //original

(-3*x+100)
(3*!x+97)

আমি একটি গিথুব প্রকল্প তৈরি করেছি যা আমাদের জন্য সরলকরণ করে ( জেএসফিডাল ডেমো )


@ ajax333221 void 0(এটি কোনও ফাংশন নয়, তবে একটি কীওয়ার্ড) কোনও মান নয়, এটি কেবল ফিরে আসে undefined
ক্যামিলো মার্টিন

@ ক্যামিলোমার্টিন আপনি ঠিক বলেছেন, আমি এখন এই উত্তরটির মূল বিষয়টি দেখতে পাচ্ছি, তবে aএটির কাজ করার জন্য অবশ্যই 1 বা 0 হওয়া উচিত
ajax333221

@ অজ্যাক্স 333221 হ্যাঁ, আসলে আমার কাছে কোড গল্ফিংয়ের মজার বিষয়টি হ'ল বেশিরভাগ সেরা কৌশল কেবলমাত্র সেই বিশেষ কাজটির জন্যই কাজ করে যা একটি কোণার সমাধানগুলির সাথে এই কোণার কেস খুঁজে পেতে খুব চালাক বোধ করে: ডি দ্বারা ভাবে, আপনি না আছে ... মন্তব্যগুলিকে মুছে ফেলার জন্য
ক্যামিলো মার্টিন

9

tl; dr: ES6 বৈশিষ্ট্য ব্যবহার করুন!

তীর ফাংশন

দস্তাবেজ: https://developer.mozilla.org/en/docs/Web/ জাভা স্ক্রিপ্ট / উল্লেখ / অ্যারো_ফিউশন
উদাহরণ:

s = x => x*x
// s = function (x) {
//   return x * x;
// }

তীর ফাংশন ইতিমধ্যে 13 অক্টোবর '13 এ 15:42 তে উল্লেখ করা হয়েছিল । কিন্তু যে for.. ofদুর্দান্ত। এমনকি চেয়ে খাটো for each.. in
manatwork

2
অ্যারে বোঝার বাক্যটি ভুল বলে মনে হচ্ছে। মতে ডকুমেন্টেশন পাইথন মত হওয়া উচিত: b = [s(x) for (x of a)]
manatwork

@manatwork উপরে নমুনা Traceur এর REPL জরিমানা চালানো
ফ্লোরেন্ট

ট্রেসুর সম্পর্কে কোনও ধারণা নেই, তবে আপনি ইসিএমএসক্রিপ্টের উল্লেখ করেছেন এবং মজিলা ডকুমেন্টেশনের দিকে নির্দেশ করেছেন। এবং এগুলির কোনওটিতে অ্যারে বোঝাপড়াগুলি দেখে মনে হচ্ছে আপনি এটি লিখেছেন।
manatwork

1
অ্যারে বোধগম্যতাগুলি মাঝপথে মাঝখানে টানা হয়েছিল।
ইসিয়া মিডোস

9

আপত্তিজনক আক্ষরিক

সাম্প্রতিক নমুনা: "c"বড় হাতের বা ছোট হাতের অক্ষর কিনা তা যাচাই করুন , চিঠি না থাকলে কিছু যায় আসে না

"c"<{} // returns false, lower case
"C"<{} // returns true, upper case

3
কিভাবে কাজ করে?
গরু

2
@ কউসকয়াক String({})দেয় "[object Object]"
ডেনিস

8

কীভাবে সংখ্যাগুলি বুলিয়ানগুলিতে পরিণত হয় তার সাহায্যে কীভাবে কোনও সংখ্যার তুলনা করবেন:

যদি আপনি কোনও ধনাত্মক সংখ্যার সমান কিনা তা পরীক্ষা করতে যাচ্ছেন , আপনি সেই পরিমাণটি বিয়োগ করতে পারবেন ifএবং elseব্লকগুলির মধ্যে যা ছিল তার বিপরীতে :

//simplified examples:
x==3?"y":"n"; <- 13 Chars
x-3?"n":"y"; <- 12 Chars

//expanded examples:
if(x==3){
    yes();
}else{
    no();
}

if(x-3){
    no();
}else{
    yes();
}

আপনি যদি কোনও নেতিবাচক সংখ্যার (* এর চেয়ে আলাদা -1) সাথে তুলনা করতে চান তবে আপনাকে কেবল বিয়োগের পরিবর্তে এই সংখ্যাটি যুক্ত করতে হবে।

* ভাল, আপনি অবশ্যই ব্যবহার করতে পারেন x.indexOf(y) + 1, তবে আপনার বিশেষ ক্ষেত্রে পরিবর্তে -1ব্যবহারের সুযোগ রয়েছে ~x.indexOf(y)


8

স্ক্রিপ্টে এমন অনেকগুলি অক্ষর সংরক্ষণ করতে মজিলার নন স্ট্যান্ডার্ড "এক্সপ্রেশন ক্লোজারস" বৈশিষ্ট্যটি ব্যবহার করুন যা কেবলমাত্র স্পাইডারমনকি / ফায়ারফক্স বা রাইনো ইঞ্জিনগুলিতে কাজ করতে পারে। উদাহরণ স্বরূপ,

function foo(){return bar}

হয়ে

function foo()bar

এই জাতীয় আরও কৌশলগুলির জন্য স্ট্যাক ওভারফ্লো পৃষ্ঠাটি দেখুন।


2
এটি জাভাস্ক্রিপ্ট নয়। এটি একটি স্পেস স্টেশন !!!
টমাস এডিং

1
ইসমাস্ক্রিপ্ট 6 উদ্ধার! ->bar
রাই-

5
ECMAScript:: let foo = () => bar;, উপরের গল্ফ কোডের চেয়ে কম বিদ্রূপযুক্ত sh
ইসিয়া মিডোস

1
ECMAScript 6: foo=_=>barএমনকি আরও ছোট orter
ETH প্রোডাকশনগুলি

সেই লিঙ্কটি নষ্ট হয়ে গেছে।
সাইয়েস


8

লেখার পরিবর্তে trueআপনি ব্যবহার করতে পারেন !0


4
তেমনি, !1জন্য false
জেমস এম। লে

10
আরও ভাল, এর 1জন্য trueএবং এর 0জন্য ব্যবহার করুন false, যদি না আপনার সত্যিকারের আক্ষরিক মানগুলির প্রয়োজন হয়।
ইটিএইচ প্রোডাকশনস

8

একটি বুলিয়ান রূপান্তর :

if(b){b=true}else{b=false}
b=b?true:false;
b=b?!0:!1;
b=!!b;

নোট: পরিবর্তন করেন 0, "", false, null, undefinedএবং NaNথেকে false(থেকে অন্য সব কিছুর true)

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