পিএইচপি গল্ফ করার জন্য টিপস


37

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


দাঁড়াও, আমি কি ঠিক করছি? ... যাইহোক, আমি এই সম্পর্কে সত্যিই কৌতূহল বোধ করছি। পিএইচপি অনেক লোক এবং গল্ফার দ্বারা ব্যবহৃত হয়, তবে পিএইচপি কোডটি কীভাবে গল্ফ করতে হয় তা আমার প্রায় কোনও ধারণা নেই।
জিমিনপি

সংক্ষিপ্ত ট্যাগগুলি ব্যবহার করুন <??> এটি কয়েকটি বাইট সংরক্ষণ করতে পারে।
মোব

উত্তর:


22

কীভাবে ভেরিয়েবল এবং হোয়াইটস্পেস পিএইচপি এর ভাষা নির্মানের সাথে ইন্টারেক্ট করে tand

আমার (স্বীকারোক্তিকভাবে সংক্ষিপ্ত) সময় গল্ফিংয়ের মধ্যে, আমি খুঁজে পেয়েছি যে পিএইচপি এর ভাষা রচনাগুলি (যেমন প্রতিধ্বনি, প্রত্যাবর্তন, যদিও, যখন ইত্যাদি) ভেরিয়েবল এবং হোয়াইটস্পেসের সাথে আলাপচারিতা করার সময় স্বল্প-স্বজ্ঞাত পদ্ধতিতে আচরণ করে।

echo$v;উদাহরণস্বরূপ, পুরোপুরি বৈধ, যেমনটি return$v;এবং অন্যান্য অনুরূপ নির্মাণগুলি। হোয়াইটস্পেসে এই ছোট ছোট হ্রাস দৈর্ঘ্যের উল্লেখযোগ্য পরিমাণে হ্রাস পেতে পারে।

যদিও মনে রাখবেন যে ভাষা রচনাগুলির আগে ভেরিয়েবলগুলির পরে একটি স্থান প্রয়োজন, যেমন নিম্নলিখিত উদাহরণ হিসাবে:

foreach($a AS$b){}

কারণ ASএকটি ভাষা কনস্ট্রাক্ট, একটি স্থান পরিবর্তনশীল সামনে প্রয়োজন হয় না $b, কিন্তু যদি এক স্থান বাদ ছিল এটা আগে , ফলে $aAS, এই একটি বাক্য গঠন ত্রুটি করার জন্য একটি পরিবর্তনশীল নাম এবং নেতৃত্ব যেমন পার্স করা হবে।


3
foreach($a[1]as$b)কোন সাদা জায়গা প্রয়োজন। এটি ভাষা গঠন এবং ভেরিয়েবল সম্পর্কে নয়, বিভিন্ন শব্দের শব্দের অক্ষরগুলির মধ্যে ফাঁকা স্থান সম্পর্কে।
তিতাস

1
আরেকটি উদাহরণ যেখানে আপনার সাদা জায়গা দরকার তা স্ট্রিং কনটেনটেশন। উদাহরণস্বরূপ, echo $a+5." text"কাজ করবে না কারণ পিএইচপি মনে করে যে .এটি একটি দশমিক পয়েন্ট 5। এটি কার্যকর করার জন্য, আপনাকে এই জাতীয় স্থান যুক্ত করতে হবে:echo $a+5 ." text"
বিজনেস বিড়াল

@ বেসিকসুনসেট এই বিবৃতি হিসাবে লেখা যেতে পারে echo$a+5," text";echoকনস্ট্রাক্ট আপনি একাধিক প্যারামিটার পাস করতে পারবেন। যেখানে একটি লিখতে হবে echo"result: ".($a+5)."!";, আপনি লিখতে পারেন echo"result: ",$a+5,"!";। আসলে, একের কাছে একাধিক প্যারামিটারগুলি echoহ'ল একটি মাইক্রো-অপ্টিমাইজেশন, যেহেতু কোডটি একটি সামান্য বিট দ্রুত চলবে (যেহেতু আপনি আউটপুটটিকে সম্মতি জানায় না, তবে পৃথকভাবে প্রেরণ করবেন)। দ্রুততম কোডটি লেখার বিষয়ে চ্যালেঞ্জগুলির জন্য, এটি একটি ক্ষুদ্র ক্ষুদ্র ক্ষুদ্রকে কিছুটা সহায়তা করতে পারে।
ইসমাইল মিগুয়েল

@IsmaelMiguel এটা সঙ্গে কাজ করে echo, কিন্তু সাথে print(যা আপনার প্রয়োজন যদি আপনি এটি একটি অভিব্যক্তি ভিতরে রাখা: echoকোন রিটার্ন মান যখন সঙ্গে একটি বিশুদ্ধ কনস্ট্রাক্ট হয় print পারেন একটি ফাংশন হিসাবে কাজ: এটা কোন প্রথম বন্ধনী প্রয়োজন, কিন্তু এটা সবসময় আয় int(1)
তিতাস

@ টিটাস আমি এ বিষয়ে কিছু বলিনি print
ইসমাইল মিগুয়েল

22

স্ট্রিংগুলি বুদ্ধিমানের সাথে ব্যবহার করুন।

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

@$s=string;

@সতর্কবার্তা এই উত্পাদন করা হবে ওভাররাইড করা প্রয়োজন। সামগ্রিকভাবে, আপনি এক-চরিত্র হ্রাস সঙ্গে শেষ।

এটি যে কখনও কখনও, প্রায়শই ব্যবহৃত ফাংশনটির নামে ভেরিয়েবল সেট করা স্থান কার্যকর হতে পারে। সাধারণত, আপনার থাকতে পারে:

preg_match(..);preg_match(..);

তবে গল্ফ করার সময় এটিকে সহজেই ছোট করা যেতে পারে:

@$p=preg_match;$p(..);$p(..);

"Preg_match" এর মাত্র দুটি উদাহরণ দিয়ে আপনি কেবল একটি একক অক্ষর সংরক্ষণ করছেন, তবে আপনি যত বেশি একটি ফাংশন ব্যবহার করবেন তত বেশি স্থান আপনি সংরক্ষণ করবেন।


10
@ কোডগল্ফের প্রয়োজন নেই; বিজ্ঞপ্তি এবং সতর্কতা (সহ E_DEPRECATED) গ্রহণযোগ্য
তিতাস

3
@ টিটাস তবে পিএইচপি-তে সতর্কতাগুলি স্ট্যান্ডার্ড ফাইল আউটপুটকে আউটপুট দেয়, তাই তাদের প্রয়োজন হয়।
brianush1

1
@ টিটাস আমি বিশ্বাস করি আপনি php.iniফাইলে তাদের দমন করতে পারবেন
স্ট্যান স্ট্রাম

12

আপনার সর্বদা শর্তসাপেক্ষ চেকগুলি লেখার দরকার নেই। উদাহরণস্বরূপ, কিছু ফ্রেমওয়ার্কগুলি অ্যাক্সেস ব্লক করতে তাদের ফাইলগুলির শীর্ষে এটি ব্যবহার করে:

<?php defined('BASE_PATH')||die('not allowed');

বা স্বাভাবিক ফাংশনে

$value && run_this();

পরিবর্তে

if($value) { run_this(); }

এটি জেএস
Новиков

8

সংক্ষিপ্ত অ্যারে সিনট্যাক্স ব্যবহার করুন

পিএইচপি 5.4 থেকে আরেগুলি array()ফাংশনের পরিবর্তে স্কোয়ার ব্র্যাকেটগুলি (জাভাস্ক্রিপ্টের মতো) ব্যবহার করে ঘোষণা করা যেতে পারে :

$arr=['foo','bar','baz'];
// instead of
$arr=array('foo','bar','baz');

এটি পাঁচটি বাইট সাশ্রয় করবে।


তবে আপনার যদি কোনও সহযোগী অ্যারেতে "গর্ত" থাকে তবে এটিতে বাইটের দাম পড়তে পারে:

$arr=array(,1,,3,,5);
// is one byte shorter than
$arr=[1=>1,3=>3,5=>5];

অসুবিধাটি হিট হয়ে যায় যদি আপনি "খালি" মানগুলি দিয়ে গর্তগুলি পূরণ করতে পারেন:

$arr=[0,1,0,3,0,5,0,7,0,9,10,11];
// costs two byte more than
$arr=array(,1,,3,,5,,7,,9,,11);

2
পিএইচপি 7.1 এছাড়াও সংক্ষিপ্ত তালিকা নিয়োগ চালু: [,$a,$b,$c]=$argv;
টাইটাস

7

$ [0}, $ {1}, $ {2}, ... ব্যবহার করুন ... [এ [0], $ এ [1], $ এ [2], ... এর পরিবর্তে ...

আপনি যদি অ্যারে ম্যানিপুলেশনটি না করেন তবে একটি অ্যারে সূচকের সর্বাধিক উল্লেখগুলি $a[$i]সহজভাবে প্রতিস্থাপন করা যেতে পারে $$i। সূচকটি পূর্ণসংখ্যা হলে এটি এমনকি সত্য, কারণ পিএইচপি-তে পূর্ণসংখ্যার বৈধ পরিবর্তনশীল নাম (যদিও আক্ষরিকের জন্য বন্ধনী প্রয়োজন হবে, যেমন ${0})।

রাবোনিউইজ ওয়াগন স্পিগোটের নিম্নলিখিত প্রয়োগটি বিবেচনা করুন:

3.<?for(;$g?$d=0|($a[$g]=$d*$g--/2+($a[$g]?:2)%$g*1e4)/$g--:238<<printf($e?'%04d':'',$e+$d/$g=1e4)^$e=$d%$g;);

এই 6 বাইট, সহজভাবে উভয় অ্যারে রেফারেন্স প্রতিস্থাপন উন্নত করা যায় $a[$g]সঙ্গে $$gপরিবর্তে:

3.<?for(;$g?$d=0|($$g=$d*$g--/2+($$g?:2)%$g*1e4)/$g--:238<<printf($e?'%04d':'',$e+$d/$g=1e4)^$e=$d%$g;);

1
আমি এটির সাথে 3 বাইট সংরক্ষণ করেছি: শোকেস
টাইটাস

6

লাইব্রেরির ফাংশনগুলির একটি বৃহত উপসেট শিখুন

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


6
এটি অনেকগুলি মুখস্ত করে, বিশেষত পুরো ফাংশনের পুরোপুরি পরিবর্তনের সাথে অসামঞ্জস্যপূর্ণ নামকরণ দেওয়া ;-)
জোয়

@ জোয়ে রাজি। জাভা গ্রন্থাগারটি মুখস্থ করার জন্য আকিন, এটি আরও ভার্জোজ হওয়ার কারণে এটি যুক্তিযুক্তভাবে কম কার্যকর হবে।
ম্যাথু

3
আমি দেখতে পেয়েছি যে চ্যালেঞ্জগুলি আমি এখনও পর্যন্ত এসেছি তার জন্য সবচেয়ে গুরুত্বপূর্ণ কাজগুলি হ'ল স্ট্রিং ম্যানিপুলেশন এবং অ্যারে ম্যানিপুলেশন ফাংশন। এগুলির ক্রিয়েটিভ ব্যবহার সত্যিই কোডটি কেটে ফেলতে পারে।
মাইগিমারু

6

স্ট্রিংয়ের ভিতরে ফাংশন চলমান।

এটা চেষ্টা কর:

$a='strlen';
echo "This text has {$a('15')} chars";

অথবা এটি চেষ্টা করুন:

//only php>=5.3
$if=function($c,$t,$f){return$c?$t:$f;};
echo <<<HEREDOCS
    Heredocs can{$if(true,' be','not be')} used too and can{$if(<<<BE
{$if(true,1,0)}
BE
,'','not')} be nested
HEREDOCS;
//Expected output: Heredocs can be used too and can be nested

এটি কেবল স্ট্রিং ""এবং হেরডোকস ব্যবহার করে কাজ করে (এখনকার ডকগুলির সাথে বিভ্রান্তি তৈরি করবে না)।

নেস্টেড ফাংশনগুলি ব্যবহার করা কেবল নেস্টেড হেরেডোকসের ভিতরেই সম্ভব (বা আপনি পার্স ত্রুটিতে চলে যাবেন)!


you will run into parse errorsআমি নিজে পড়তে পারি না? পেস্কি জেন্ড ইঞ্জিন কীভাবে এটি একসাথে রাখে
স্ট্যান স্ট্রাম

পরের বার যখন আমি "পিএইচপি একটি ভাল প্রোগ্রামিং ভাষা" যুক্তিতে থাকি, আমি এটিকে কাউন্টার-পয়েন্ট হিসাবে ব্যবহার করতে যাচ্ছি। কি দারুন.
প্রিমো

@ প্রিমো এটা কি খারাপ? : ও
ইসমাইল মিগুয়েল

5

টাইপকাস্ট সঙ্গে মজা

  • !!$fooকোনও সত্যবাদী মান true(বা 1আউটপুটে), মিথ্যা মানগুলিতে (0, খালি স্ট্রিং, খালি অ্যারে) falseবা (ফাঁকা আউটপুট)
    এ পরিণত করবে এটি কোড গল্ফের ক্ষেত্রে খুব কমই প্রয়োজন হবে কারণ বেশিরভাগ ক্ষেত্রে যেখানে আপনার বুলিয়ান প্রয়োজন, সেখানে রয়েছে যাইহোক একটি অন্তর্নিহিত কাস্ট।

  • (int)$fooহিসাবে $foo|0বা হিসাবে লিখিত হতে পারে foo^0, কিন্তু প্রথম বন্ধনী প্রয়োজন হতে পারে।
    বুলিয়ান এবং স্ট্রিংগুলির জন্য $foo*1বা ইনটকে +$fooকাস্ট করতে ব্যবহার করা যেতে পারে।

  • অন্যান্য ভাষার মতো নয়, পিএইচপি সংখ্যার মান হিসাবে স্ট্রিংগুলি পরিচালনা করে। সুতরাং আপনার যদি এমন কোনও স্ট্রিং থাকে যাতে একটি নম্বর থাকে তবে আপনাকে গণনা করতে হবে, কেবল গণনা করুন।
  • অন্য উপায়ে কাজ করে না : ভেরিয়েবলের সাথে যে কোনও সংখ্যাকে গুণিত করতে 10আপনি একটি শূন্য যুক্ত করতে পারেন: *10-> .0। তবে এই ক্ষেত্রে, পিএইচপি ডটকে দশমিক পয়েন্ট হিসাবে গ্রহণ করবে এবং অভিযোগ করবে। (এটি যদি আপনার স্ট্রিংয়ে ভেরিয়েবল পরিমাণে জিরো থাকে তবে ভিন্ন)
  • একটি অ্যারেটিকে স্ট্রিংয়ে পরিণত করতে joinপরিবর্তে ব্যবহার করুন implode
    আপনার যদি ডিলিমিটারের প্রয়োজন হয় না, এটি ব্যবহার করবেন না: join($a)যেমনটি করেjoin('',$a)
  • ক্রমবর্ধমান স্ট্রিং: সবচেয়ে আশ্চর্যজনক বৈশিষ্ট্য ইমো যা $s=a;$s++;উত্পাদন করে $s=b;। এটি বড় হাতের এবং ছোট হাতের অক্ষরের সাথে কাজ করে। $s=Z;$s++;ফলাফল $s=AA;
    এই মিশ্র ক্ষেত্রে কাজ করে: aZথেকে bA, A1থেকে A2, A9থেকে B0এবং z99Zথেকে aa00A
    হ্রাস স্ট্রিংয়ে কাজ করে না । (এবং এটি চালু হয় না NULL)।
    পিএইচপি 3 ফিরে, $n="001";$n++;উত্পাদিত $n="002";। আমি কিছুটা দু: খিত তারা এটিকে সরিয়ে দিয়েছে।

আপনি যেই গল্ফ করুন: সর্বদা অপারেটরের অগ্রাধিকার টেবিলটি হাতের কাছে রাখুন।


4

শর্টট্যাগ ব্যবহার করুন

সাধারণ কোডে এটি ব্যবহার করার ভাল অনুশীলন <?phpএবং ?>। যাইহোক, এই হল না স্বাভাবিক কোড - আপনাকে একটি কোড গলফ কোড লিখছে। পরিবর্তে <?php, লিখুন <?। পরিবর্তে <?php echo, লিখুন <?=?>শেষে টাইপ করবেন না - এটি সম্পূর্ণ alচ্ছিক। আপনার যদি ?>কোনও কারণে প্রয়োজন হয় (উদাহরণস্বরূপ পাঠ্য পাঠ্য, এবং এটি কোনওরকমে ছোট বা কোনও কিছুর জন্য, সেমিকোলনটি এর আগে রাখবেন না - এটির প্রয়োজন নেই, যা ?>বোঝা যাচ্ছে সেমিকোলনটি।

ভুল (অবশ্যই খুব দীর্ঘ):

<?php echo ucfirst(trim(fgets(STDIN)));?>s!

সঠিক:

<?=ucfirst(trim(fgets(STDIN)))?>s!

সঙ্গে -rপতাকা ( যেটিতে বিনামূল্যে আসে ), আপনি সব সময়ে এমনকি কোনো ট্যাগ চি (এবং ব্যবহারের অনুমতি দেওয়া হয় না শস্য)।
তিতাস

4

স্ট্রিং মাধ্যমে লুপিং

26 বাইট বা 24 নিচে 18 দ্বারা করা যেতে পারে:

foreach(str_split($s)as$c)  # A) 26 - general
for($p=0;a&$c=$s[$p++];)    # B) 24 - general
for($p=0;$c=$s[$p++];)      # C) 22 - if $s has no `0` character
for(;a&$c=$s[$p++];)        # D) 20 - if $p is already NULL or 0 (does NOT work for false)
for(;$c=$s[$p++];)          # E) 18 - both C and D

for(;$o=ord($s[$p++]);)     # F) 23 - work on ASCII codes, if $s has no NULL byte and D
for(;~$c=$s[$p++];)         # G) 19 - if $s has no chr(207) and D

$a&$bএকটি bitwise ও (ASCII এর কোড) অক্ষর উপর আছে $aএবং $b
এবং একটি স্ট্রিং এর খাটো মত একই দৈর্ঘ্যের আছে ফলাফল $aএবং $b


আপনি যোগ দয়া করে করতে পারেন ord($s[$p++])বিকল্প হিসেবে for(;$s+=ord($argv[++$i])%32?:die($s==100););বিরুদ্ধে for(;$c=$argv[++$i];)$s+=ord($c)%32;echo$s==100;এই প্রশ্নে codegolf.stackexchange.com/questions/116933/...
Jörg Hülsermann

~আপনি কেবল অঙ্কগুলি নিয়ে কাজ করছেন এমন ক্ষেত্রে দয়া করে যুক্ত করুন
জর্জি হ্যালসারম্যান

নোট করুন যে পিএইচপি 7.2 ~$cপদ্ধতির জন্য সতর্কতা প্রদান করে ।
তিতাস

4

টার্নারি অপারেটর ব্যবহার করুন

if(a==2){some code;}else{some other code;}

এটি সংক্ষেপে বলা যেতে পারে:

(a==2?some code:some other code);

খাটো, হাহ?


"শর্তসাপেক্ষ শর্টহ্যান্ডস"? এর আসল নামটি বলা ভাল, যাতে আরও বিশদে আগ্রহী তারা নথিতে এটি খুঁজে পেতে পারেন: টার্নারি অপারেটর
manatwork

3
প্রশ্নটি পিএইচপি সম্পর্কিত কিছু টিপসগুলির জন্য জিজ্ঞাসা করে for এটি সমস্ত ভাষার টিপসের অন্তর্ভুক্ত ।
পিটার টেলর

3
আপনি যদি এটিকে বাসা বেঁধে থাকেন তবে পিএনএইচপিতে টের্নারি অপারেটরের একটি অদ্ভুত আচরণ রয়েছে। বা এর মতো কিছু a?aa:ab?aba:abb:bমূল্যায়ন করে (a?aa:ab)?(aba):(abb)
তিতাস

1
এবং পিএইচপি 5.3 দিয়ে শুরু করে, আপনি দ্বিতীয় অপারেটরটিকে বাদ দিতে পারেন: $a?:$bএকই $a?$a:$b
তিতাস

1
@ কোয়েস ||পিএইচপি-তে বুলিয়ান করতে প্রস্তুত।
তিতাস

3

অন্য কোনও নাম দ্বারা ... ফাংশন উপনাম

ব্যবহার করুন ...

  • join পরিবর্তে implode
  • chopপরিবর্তে rtrim( chopPERL এ আলাদা!)
  • die পরিবর্তে exit
  • fputs পরিবর্তে fwrite
  • is_intপরিবর্তে is_integerবাis_long
  • is_realপরিবর্তে is_floatবাis_double
  • key_exists পরিবর্তে array_key_exists
  • mysql পরিবর্তে mysql_db_query

... সর্বাধিক গুরুত্বপূর্ণ নামকরণ করার জন্য। কটাক্ষপাত http://php.net/aliases আরো অনেক কিছুর জন্য।


ওহ ... এবং আপনি কি জানেন যে dieপরামিতিগুলির সাথে এবং ছাড়াও কাজ করে? die(1)ত্রুটি কোড সহ প্রোগ্রামটি থেকে বেরিয়ে আসবে 1(এটি সম্পর্কে পুরোপুরি নিশ্চিত নয়; পরীক্ষার প্রয়োজন রয়েছে); dieকোড সহ প্রস্থান করবে 0এবং মুদ্রণের পরে die("Hello")কোড সহ প্রস্থান করবে । 0Hello
তিতাস

3

সহযোগী অ্যারেগুলি +অপারেটরের সাথে একত্রীকরণ করা যায় ।

পরিবর্তে:

$merged = array_merge($a, $b);

ব্যবহার করুন:

$merged = $a + $b;

নোট করুন +অপারেটর সূচকযুক্ত অ্যারেগুলির সাথেও কাজ করে তবে সম্ভবত আপনি যা চান তা করেন না।


প্রকৃতপক্ষে, প্রায়শই একটি ভাল প্রতিস্থাপন, যদিও ঠিক একই নয়: পেস্টবিন.
com

আহ্ হ্যাঁ, এটি ডাং করুন, আমি প্রথমে শিরোনাম পেয়েছিলাম "এসোসিয়েটিভ অ্যারে ..." এবং তারপরে এটি মুছে ফেলা হয়েছিল। আমি স্পষ্ট করব, ধন্যবাদ।
অ্যালেক্স হাওয়ানস্কি

+সূচকগুলি যতক্ষণ আলাদা থাকে ততক্ষণ সংখ্যাসূচক অ্যারেগুলিও ব্যবহার করে মার্জ করা যায় । যদি তা না হয় তবে প্রথম অ্যারে থেকে মানগুলি দ্বিতীয়টির (যেমন অ্যারে_ডমাইজের মতো) ওভাররাইট করা হবে। পার্থক্য: +সূচকগুলি পুনরায় অর্ডার করে না।
তিতাস

3

অ্যারে_ফ্লিপ বনাম অ্যারে_সার্চ

ব্যবহার

array_flip($array)[$value]

পরিবর্তে

array_search($value,$array)

অ্যারেতে 1 বাইট সংরক্ষণ করতে যেখানে প্রতিটি মানের উপস্থিতিটি অনন্য


3

ভেরিয়েবলের কিছু আকর্ষণীয় তথ্য

আমাকে কেবল তাদের ভাগ করে নিতে হয়েছিল (আমি যাচাই করার আগেই তাদের মধ্যে কমপক্ষে একজন গল্ফিংয়ে সহায়তা করে):

  • চিঠিগুলি ব্যবহার করুন: $x=a;$$x=1;$x++;$$x=2;echo"$a,$b";প্রিন্ট করে 1,2
    তবে অন্যান্য গাণিতিক ক্রিয়াকলাপগুলি অক্ষরের সাথে কাজ করে না।
  • প্রিমো যেমন পূর্বে উল্লিখিত হয়েছে , আপনি খাঁটি সংখ্যাগুলি ভেরিয়েবল নাম হিসাবে ব্যবহার করতে পারেন:
    $a=1;$$a=5;$a++;$$a=4;${++$a}=3;echo${1},${2},${3};মুদ্রণ 543
  • আপনি কেবল [0-9a-zA-Z_]পরিবর্তনশীল নামের জন্যই ব্যবহার করতে পারবেন না , তবে প্রতিটি স্ট্রিং:
    $x="Hello!";$$x="Goodbye.";echo${"Hello!"};মুদ্রণ Goodbye.
  • তবে: পরিবর্তিত [a-zA-Z_][a-zA-Z_0-9]*নাম হিসাবে সমস্ত কিছুই আক্ষরিক ব্যবহারের জন্য ধনুর্বন্ধনী প্রয়োজন।
  • কোনও ভেরিয়েবল সংজ্ঞায়িত না করে, $$x=1সেট ${NULL}, যা একই ${false}এবং একই রকম ${""}
  • $a=1;$$a=5;সেট করে না শুধুমাত্র ${1}, কিন্তু ${true}

  • আরেকটি, এখনও অবধি সবচেয়ে অদ্ভুত একটি পাওয়া গেছে: চেষ্টা করুন $a=[];$$a=3;echo${[]};। হ্যাঁ, এটি প্রিন্ট 3!

এর বেশিরভাগ কারণ: পরিবর্তনশীল নামগুলি সর্বদা স্ট্রিংয়ে মূল্যায়ন করা হয়।
(ধন্যবাদ, ক্রিসটফকে নির্দেশ করার জন্য।)
সুতরাং আপনি printবা echoঅভিব্যক্তিটি পেলে যা কিছু পান, তা ভেরিয়েবলের নাম হিসাবে পেয়ে যাবেন ´


1
পরিবর্তনশীল নামগুলি স্ট্রিংয়ে রূপান্তরিত হয় যা আপনার তালিকার শেষ তিনটি পয়েন্ট ব্যাখ্যা করে। []রূপান্তরিত Array: ${[]} = 5;echo $Array;প্রিন্ট 5। আমি নিশ্চিত যে আপনি এটি জানেন তবে এটি সবার কাছে প্রকাশিত নাও হতে পারে :)
ক্রিস্টোফ

@ জেফ আমি টাইপ ঠিক করলাম। লক্ষ্য করার জন্য ধন্যবাদ।
তিতাস

2

বিরতি লাইন
যদি আউটপুট লাইন ব্রেক প্রয়োজন, একটি শারীরিক লাইন বিরতি (1 বাইট) পরিবর্তে ব্যবহার "\n"
একক এবং ডবল কোট মধ্যে বেছে নেওয়া হয়েছে এই এছাড়াও আপনি একটি সম্ভাব্য সুবিধা দেয়।


2

যেখানে সম্ভব উদ্ধৃতি এড়ানো

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

$foo=foo;এটির মতোই $foo='foo';(ধরে নিলে তা fooমূল শব্দ বা সংজ্ঞায়িত ধ্রুবক নয়): কার্যকর $foo=echo;হয় না।

বাট: $p=str_pad;না; এবং $p(ab,3,c)মূল্যায়ন abc

উদ্ধৃতি ব্যতীত স্ট্রিং লিটারেল ব্যবহার করার জন্য একটি বিজ্ঞপ্তি পাওয়া যাবে Use of undefined constant; তবে আপনি যদি error_reporting(সিএলআই প্যারামিটার -n) জন্য ডিফল্ট মান ব্যবহার করেন তবে তা দেখাবে না ।


আমি কেবল লক্ষ্য করেছি: এই উত্তরটি কোডগল্ফ.স্ট্যাকেক্সেঞ্জাও.এ / 29/16/55735 এর কিছুটা বর্ধিত / আপডেট হওয়া সদৃশ ।
তিতাস

দ্রষ্টব্য: পিএইচপি 7.2 ফলিত বিজ্ঞপ্তিগুলির পূর্বে (যা আপনি -nপতাকাটি দিয়ে প্রকাশ করতে পারেন ); 7.2 সতর্কতা দেয়; পরবর্তী সংস্করণগুলি ত্রুটি ছুঁড়ে ফেলবে!
তিতাস

2

পিএইচপি 7.4 এ তীর ফাংশন

পিএইচপি 7.4 এখন আরসি 2 সংস্করণে রয়েছে এবং আশা করা যায় প্রায় 2 মাসের মধ্যে প্রকাশিত হবে। নতুন বৈশিষ্ট্যগুলির তালিকা এখানে রয়েছে (7.4 প্রকাশিত হলে এই পৃষ্ঠাটি আসলে আপডেট করা যেতে পারে)। .4.৪-তে, শেষ পর্যন্ত পিএইচপি তীর ফাংশন পেয়েছে, সুতরাং কেবল ফাংশন উত্তরগুলি এখনই ছোট করা যায় না, তবে অন্যান্য ফাংশনে ক্লোজারগুলি পাস করাও খুব কম হতে পারে। এখানে কিছু উদাহরণ আছে:

ইনপুট +1 ফেরান:

বেনামে ফাংশন (বন্ধ) - 25 বাইট - এটি অনলাইনে চেষ্টা করুন!

function($n){return$n+1;}

তীর ফাংশন - 12 বাইট - এটি অনলাইনে চেষ্টা করুন!

fn($n)=>$n+1

প্রথম ইনপুট (ints এর অ্যারে) এর আইটেমগুলিকে দ্বিতীয় ইনপুট (ইনট) দ্বারা গুণান:

বেনামে ফাংশন (বন্ধ) - 72 বাইট - এটি অনলাইনে চেষ্টা করুন!

function($a,$n){return array_map(function($b)use($n){return$b*$n;},$a);}

তীর ফাংশন - 38 বাইট - এটি অনলাইনে চেষ্টা করুন!

fn($a,$n)=>array_map(fn($b)=>$b*$n,$a)

আপনি কি লক্ষ্য করেছেন যে $nকোনও use $nবিবৃতি ছাড়াই অভ্যন্তরীণ ফাংশনে অ্যাক্সেসযোগ্য ? হ্যাঁ এটি তীরের অন্যতম বৈশিষ্ট্য function


পার্শ্ব নোট হিসাবে, আমি পুনরাবৃত্তভাবে কাজ করার জন্য তীর ফাংশনগুলি পাইনি (নিজের ভিতরে একই তীর ফাংশনটি কল করুন), কারণ আমরা তাদের কোনও নাম দিতে পারি না এবং এটিকে একটি চলক হিসাবে বন্ধ হিসাবে স্টোর করে নিজেই অ্যাক্সেস $fকরতে পারি না $f(দুঃখজনক )। সুতরাং এই উদাহরণটি কাজ করে না এবং $fপ্রথম লাইনে ব্যবহার করা মারাত্মক ত্রুটির কারণ:

$f=fn($n)=>$n?$f($n-1):0;
$f(5); // Causes error: "PHP Notice: Undefined variable: f" + "PHP Fatal error: Uncaught Error: Function name must be a string"

তবে ভিন্ন একটি তীর ফাংশন সহ একটি তীর ফাংশন কল করে:

$f1=fn($n)=>$n+1;
$f2=fn($n)=>$f1($n-1);
$f1(2) // Returns 3
$f2(2) // Returns 2

আপনার পরিবর্তে $f=fn($n)=>$n?$f($n-1):0;যদি না হয় $f=$F=fn($n)=>$n?$F($n-1):0;? কাজ করবে? এবং তারপরে আপনি $(5)যথারীতি কল করেন।
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল এটি এখনও একই ত্রুটি বলে মনে হচ্ছে। আপনি আসলে tio.run # php এ নিজে চেষ্টা করতে পারেন কারণ ডেনিস কিছুক্ষণ আগে তার পিএইচপি 7.4 আরসি 2 তে আপডেট করেছে।
রাত

এটি কাজ করতে পারে না। দেখে মনে হয় যে কেবলমাত্র আগে বর্ণিত ভেরিয়েবলগুলি উপলব্ধ।
ইসমাইল মিগুয়েল


1

সরাসরি ডেরিফারেন্স অ্যারেগুলি ফাংশন থেকে ফিরে আসে।

যেমন এর পরিবর্তে:

$a = foo();
echo $a[$n];

আপনি করতে পারেন:

echo foo()[$n];

এটি পদ্ধতিগুলির সাথেও কাজ করে:

echo $obj->foo()[$n];

আপনি সরাসরি অ্যারে ঘোষণাগুলি ডেরিফারেন্সও করতে পারেন:

echo [1, 2, 3, 4, 5][$n];

1

end()পরিবর্তে ব্যবহার করুনarray_pop()

end()ফাংশনটি কেবল অ্যারের শেষের দিকে অভ্যন্তরীণ পয়েন্টারকে সরিয়ে দেয় না, এটি শেষ মানটিও দেয়। অবশ্যই নোট করুন যে এটি সেই মানটি সরিয়ে দেয় না , সুতরাং যদি অ্যারেটি পরে থাকে তা যদি আপনি যত্ন না করেন তবে আপনি এটি পরিবর্তে এটি ব্যবহার করতে পারেন array_pop()


1

ডাবল অ্যারে_ফ্লিপ বনাম ইন_আরে বনাম অ্যারে_উনিক

এই বিশেষ ক্ষেত্রে একটি ডাবল অ্যারে_ফ্লিপ 10 বাইট সংরক্ষণ করে

($f=array_flip)($k=$f($c)))অ্যারের মধ্যে সব ডবল মান অপসারণ এবং আমি এই বাদ $c=[],, |in_array($o,$c)এবং প্রতিস্থাপন array_keys($c)সঙ্গে$k

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)
$x[$i]==$o?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo strtr($x,($f=array_flip)($k=$f($c)))==$y # boolean replacement string 1 equal to string 2
    ?join($k)." ".join($c) # output for true cases
:0; #Output false cases

অনলাইন সংস্করণ

বিরুদ্ধে

for($c=[],[,$x,$y]=$argv;a&$o=$y[$i];$i++)
  $x[$i]==$o|in_array($o,$c)?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo strtr($x,$c)==$y # boolean replacement string 1 equal to string 2
  ?join(array_keys($c))." ".join($c) # output for true cases
  :0; #Output false cases

অনলাইন সংস্করণ

অ্যারে_উনিকের বিপরীতে এটি 2 বাইট সংরক্ষণ করে

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)
  $x[$i]==$o?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo strtr($x,array_unique($c))==$y # boolean replacement string 1 equal to string 2
  ?join(array_keys($c))." ".join($c) # output for true cases
  :0; #Output false cases

অনলাইন সংস্করণ

এই প্রোগ্রামে একটি বাগ এবং প্রতিস্থাপন খোঁজার পর $x[$i]==$o?:$c[$x[$i]]=$oথেকে ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$pডবল array_flip আর প্রয়োজনীয় ছিল না


মিশুক নিরাপদ array_unique। হ্যাঁ!
তিতাস

@ টিটাস আমি আপনার পরামর্শ যুক্ত করেছি
জার্গ হালসারম্যান

1

ছেদযুক্ত স্ট্রিং

আপনি কি কখনও
join("DELIMITER",str_split($s))(31 বাইট) বা এমনকি
preg_replace(".","DELIMITER",$s)(32 বাইট) ব্যবহার করেছেন
?

এর জন্য অন্তর্নির্মিত:

chunk_split($s,1,"DELIMITER")(29 বাইট) চেষ্টা করুন ।


আপনি যদি তৃতীয় প্যারামিটার বাদ দেন chunk_splitতবে ব্যবহার করবেন \r\n; এটি আপনাকে 7 বা 8 বাইট সংরক্ষণ করতে পারে।

তবে সাবধান থাকুন: chunk_splitস্ট্রিমটিতে ডিলিমিটারও যুক্ত করে,
তাই আপনি যা চান ঠিক তেমন না পেতে পারেন।

(যদি আপনি এই দৈর্ঘ্যের দৈর্ঘ্য সরবরাহ না করেন তবে এটি 76 টি ব্যবহার করবে code কোড গল্ফের জন্য বরং অস্বাভাবিক, তবে কে জানে))


strtrআমি এই ধারণাটি ভালবাসি এর সাথে আপনার মিশ্রণে একটি উদাহরণ যুক্ত করা উচিত ।
জার্গ হালসারম্যান

1

আনসেট () বনাম আইএনএফ

একটি ক্ষেত্রে একটি অ্যারেতে সর্বনিম্ন সন্ধান করুন আপনি এর পরিবর্তে ব্যবহার করতে পারেন

unset($var[$k]);

$var[$k]=INF;

3 বাইট সংরক্ষণ করতে


1

str_repeat

কিছু ক্ষেত্রে আপনার অক্ষরের একটি ইনপুট থাকে এবং আপনার প্রতিটি অক্ষরের জন্য বৃহত্তর শূন্য একটি ইনপুট দিয়ে সেগুলি পুনরাবৃত্তি করা উচিত।

for(;--$z?:($c=$argn[$i++]).$z=$argn[$i++];)echo$c;

(52 বাইট) এর চেয়ে কম হয়

for(;~$c=$argn[$i++];)echo str_repeat($c,$argn[$i++]);

অথবা

for(;~$c=$argn[$i++];)echo str_pad($c,$argn[$i++],$c);

(প্রতিটি 54 বাইট)

এটি উদাহরণস্বরূপ ইনপুটটির জন্য কীভাবে কাজ করে a1b2c1

$zসেট করা হয়নি (অন্তর্নিহিত NULL), তাই --$zকিছুই করে না এবং মিথ্যাও হয়;

$c="a", $z="1"এবং $i=2-> $c.$z="a1"সত্য -> আউটপুট"a"

--$z=0; সুতরাং আমরা সেট করেছি $c="b", $z="2"(এবং $i=4) -> $c.$z="b2"সত্যবাদী -> আউটপুট"ab"

--$z=1 -> আউটপুট "abb"

--$z=0; সুতরাং আমরা সেট $c="c"এবং $z=1 $c.$z="c1"সত্য আউটপুট"abbc"

--$z=0সুতরাং $c=""এবং $z=""-> $c.$z=""মিথ্যা -> লুপ বিরতি


1

সংযুক্ত forলুপগুলি

ধরুন আপনার নীচের ফর্মের কোড রয়েছে:

for($pre1; $cond1; $post1) for($pre2; $cond2; $post2) $code;

এটি সাধারণত নিম্নলিখিত আকারে পুনরায় ঘূর্ণিত করা যেতে পারে:

for($pre1; $cond2  $post2 || $cond1  $pre2  $post1; ) $code;

যেখানে একটি জেনেরিক সংমিশ্রণকারী অপারেটর উপস্থাপন করে। এটি সাধারণত বাইট গণনা হ্রাস করে, তবে সম্ভবত কিছু সৃজনশীলতার প্রয়োজন হবে। $cond2এটি লিখতে হবে যাতে এটি প্রথমবারের মধ্যে ব্যর্থ হয়। $post1এছাড়াও প্রথমবার কার্যকর করতে ব্যর্থ হওয়া উচিত, যদিও রিফ্যাক্টরটি আগে থাকা এত সহজ হতে পারে যে $post1এটি উপস্থিত নেই।

আপনি যদি তিন বা ততোধিক নেস্টযুক্ত লুপের সাথে কাজ করছেন তবে আপনি প্রথমে দুটি দুটি একত্রিত করতে পারেন এবং তারপরে এটি অন্যটির সাথে একত্রিত করতে পারেন ইত্যাদি on আমি দেখতে পাচ্ছি যে অভ্যন্তরীণ থেকে বাহিরের দিকে একত্রিত করা সাধারণত সহজ ছিল।


উদাহরণ হিসাবে, এইচ-কার্পেট ফ্র্যাক্টাল ( 97 বাইট ) এর নিম্নলিখিত সমাধানগুলি বিবেচনা করুন :

for(;$i<$n=3**$argn;$i+=print"$s\n")for($s=H,$e=1;$e<$n;$e*=3)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;

এটি নিম্নলিখিত উপায়ে সংস্কার করা যেতে পারে:

for(;($i+=$e&&print"$s\n")<$n=3**$argn;)for($s=H,$e=1;$e<$n;$e*=3)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;

$e&&printprintপ্রথম পুনরাবৃত্তিতে বাধা দেয় এবং বৃদ্ধিও করে না $i

এবং অবশেষে ( 93 বাইট ):

for(;$H>$e*=3or$e=($i+=$e&&print"$s\n")<${$s=H}=3**$argn;)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;

$H>$e*=3 উভয় ভেরিয়েবল অপরিজ্ঞাত হওয়ায় প্রথমবার ব্যর্থ হবে।


1

একটি স্ট্রিংয়ে অক্ষর মুছে ফেলা হচ্ছে

join(explode(" ",$string));

তুলনায় 1 অক্ষর সংরক্ষণ করে

str_replace(" ","",$string);

নোট করুন যে এটি কেবল অক্ষর নয়, সমস্ত (মজাদার) স্ট্রিংয়ের জন্য কাজ করে।
ক্যালকুলেটরফলাইন

@ ক্যালকুলেটরফ্লাইন এটি খালি স্ট্রিংয়ের জন্য কেন কাজ করবে না? এটি কোনও অর্থ দেয় না বা এই ক্ষেত্রে।
Jörg Hülsermann

ঠিক আছে, প্রথম সংস্করণটি কাজ করে না ""এবং এটি কোনওভাবেই কার্যকর নয়।
ক্যালকুলেটরফলাইন

1
@ ক্যালকুলেটরফ্লাইন এবং এই ক্ষেত্রে একটি শূন্য বাইট সমাধান আরও ভাল। এটি সেভাবে এটি করার কোনও মানে নেই।
J:17rg Hülsermann

3
আপনার যোগদানের উদাহরণটি একটি অনুপস্থিত )। এবং strtr($string,[" "=>""])আরও খাটো হয়।
তিতাস


1

এর পরিবর্তে strtoupper()এবং বুলিয়ান অপারেটরগুলি ব্যবহার করুনstrtolower()

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

উদাহরণ:

// Convert lowercase to uppercase
$s = "g";
echo strtoupper($s);  // Outputs 'G', uses 20 characters
echo~" "&$s;          // Outputs 'G', uses 12 characters

// Convert uppercase to lowercase
$s = "G";
echo strtolower($s);  // Outputs 'g', uses 20 characters
echo$s^" ";           // Outputs 'g', uses 11 characters

// Switch case of each character
$s = "Gg";
echo$s^"  ";          // Outputs 'gG', uses 12 characters

থিংস নির্বিচারে দৈর্ঘ্যের স্ট্রিং জন্য একটু, trickier, কিন্তু &এবং ^অপারেটরদের খাটো ইনপুট স্ট্রিং এর দৈর্ঘ্য ফলাফলের অগ্রভাগ ছাঁটিয়া হবে। সুতরাং উদাহরণস্বরূপ, যদি $Wকোনও ইনপুট হিসাবে কমপক্ষে দীর্ঘ ফাঁকের একটি স্ট্রিং হয় $s, তবে ~$W&$sতার সমতুল্য strtoupper($s)এবং $s|$W^$sসমান strtolower($s)(যেখানে $s|$Wনিজেই অতিরিক্ত স্পেসগুলির সাথে একটি স্ট্রিং উত্পাদন করবে যদি না $sএবং $Wসমান দৈর্ঘ্যের হয়)।


0

অবহেলিত ফাংশনগুলি ব্যবহার করুন
যদি আপনি এক্সপ্রেশনটিতে 5 টির বেশি বাইট নষ্ট না করে PERL রেজেক্সের পরিবর্তে POSIX ব্যবহার করতে পারেন, ব্যবহার করুন eregবা এর eregiপরিবর্তে preg_match, splitবা splitiপ্রগ_স্প্লিটের পরিবর্তে। বেশিরভাগ সীমানারদের
splitপ্রতিশব্দ হিসাবেও ব্যবহার করা যেতে পারে explode

এই ফাংশনগুলি অবহেলিত হিসাবে চিহ্নিত হয়েছে এবং E_DEPRECATEDবিজ্ঞপ্তিগুলি ফেলে দেবে , তবে (এখনই উত্সটি খুঁজে পাবে না) আমি মনে করি আমি পড়েছি যে সতর্কতা এবং বিজ্ঞপ্তিগুলি ঠিক আছে।


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