কত যুক্তি পাস হয়েছে?


33

আপনার পছন্দের ভাষাটি ব্যবহার করে এমন একটি ফাংশন লিখুন যা একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট গ্রহণ করে এবং এটির সাথে যুক্ত হওয়া আর্গুমেন্টের সংখ্যা প্রদান করে।

সুনির্দিষ্ট:

  • আপনার ভাষায় বৈচিত্রপূর্ণ আর্গুমেন্ট ফাংশনগুলি সমর্থন করতে হবে: কলযোগ্য এমন কিছু যা একটি স্বেচ্ছাসেবী সংখ্যার আর্গুমেন্ট নেয় এবং একটি মান দেয়।
  • প্যারামিটারগুলি পৃথকভাবে পাস করতে সক্ষম হতে হবে। এর অর্থ একটি অ্যারে পাস করা কেবল একটি প্যারামিটারের জন্য গণনা করবে। আপনার ভাষা যদি এটি সমর্থন করে তবে আপনি একটি "সমস্ত পাস হওয়া যুক্তি" অ্যারে ব্যবহার করতে পারেন; সীমাবদ্ধতাটি কীভাবে ফাংশন বলা হয় তার উপর।
  • কোড এই ফাংশন কল যে আর্গুমেন্টের সংখ্যা পাস করা প্রয়োজন করা আবশ্যক তার সোর্সে । যদি কোনও সংকলক একটি কলিং কনভেনশনের অংশ হিসাবে যুক্তিগুলির সংখ্যা সন্নিবেশ করায় তবে তা অনুমোদিত।
  • আর্গুমেন্টগুলি আপনার যে কোনও ধরণের হতে পারে। আপনি শুধুমাত্র একটি একক টাইপ (যেমন শুধুমাত্র সমর্থনকারী সমর্থন করতে পারে না intএখনও বৈধ নয়), নির্বিচারে প্রকার (যুক্তি কোন প্রকার অনুমতি দেওয়া হয়), অথবা আর্গুমেন্ট প্রকার কোনো সমন্বয় (যেমন প্রথম ARG হয় int, বাকি স্ট্রিং আছে)।
  • আপনার ফাংশনে সর্বাধিক সংখ্যক যুক্তি থাকতে পারে (বিশেষত যেহেতু সংস্থানগুলি সীমাবদ্ধ) তবে কমপক্ষে 2 টি আর্গুমেন্টকে সমর্থন করতে হবে ।

নমুনা:

  • f() আয় 0
  • f(1)বা f("a")প্রত্যাবর্তন1
  • f([1, 2, 3])1এটি 3 টি আর্গুমেন্ট নয়, একটি অ্যারে পাস হওয়ার সাথে সাথে ফিরে আসে
  • f(1, 10)বা f(1, "a")প্রত্যাবর্তন2

যেহেতু এটি কোড-গল্ফ, উইনিং সলিউশনটি হ'ল সবচেয়ে কম সংখ্যক বাইট ব্যবহার করে।


4
এটি একটি "ফাংশন", "রিটার্ন মান" বা "ভিন্নতর আর্গুমেন্ট" কী তা সম্পূর্ণ পরিষ্কার নয় (উদ্দেশ্যমূলক) objective উদাহরণস্বরূপ, ডোডোস ফাংশনটি মোনাডিক বা বৈকল্পিক হিসাবে বিবেচিত হবে?
ব্যবহারকারী 202729

24
@ user202729 আপনার ভাষা যদি ফাংশন সমর্থন করে না তবে অন্য একটি ভাষা ব্যবহার করুন। এটি এমন কোনও প্রয়োজন নয় যে সমস্ত ভাষাগুলি প্রতিযোগিতা করতে পারে, কোড গল্ফিংয়ের একটি অংশ কাজের জন্য সঠিক সরঞ্জামটি সন্ধান করে।
Sanchises

5
@ ইউজার ২২২ 29 29 traditionalতিহ্যবাহী / উচ্চ-স্তরের ভাষাগুলির লক্ষ্য করে মাঝে মধ্যে চ্যালেঞ্জ নিয়ে আমার কোনও সমস্যা নেই, যেমন আমাদের মাঝে মাঝে চ্যালেঞ্জ থাকে যা কেবলমাত্র অস্বাভাবিক ভাষাগুলিতেই সম্ভব।
Sanchises

6
জানতাম না যে ভাষা বৈশিষ্ট্যগুলির স্পষ্ট চ্যালেঞ্জের জন্য আমাদের থামানো সমস্যাটি সমাধান করতে হবে ....
কনর ওব্রায়ান

5
যদি আপনার ভাষাতে আর্গুমেন্ট / কলিং কনভেনশন ধারণা না থাকে তবে এটি নির্বিচার সংখ্যক আর্গুমেন্টকে সমর্থন করার মানদণ্ডে ফিট করে না।
গ্লেন স্মিথ

উত্তর:


15

বেসিকের আমস্টারড সিপিসি জেড 80 বাইনারি কল, 1 বাইট, হেক্স এনকোডযুক্ত

C9          : RET

(এছাড়াও 2 এবং 5 বাইট সংস্করণ, নীচে দেখুন)

কলটিতে প্রবেশের পরে, পাস হওয়া পরামিতিগুলির সংখ্যা Aরেজিস্টারে থাকবে। কোডটি কেবল অবিলম্বে ফিরে আসে returns জেড 80 এ রিটার্ন মানগুলির কোনও ধারণা নেই, কেবল প্রবেশ এবং প্রস্থান স্থিতি। কোডটি PC(প্রোগ্রামের কাউন্টার) এবং SP(স্ট্যাক পয়েন্টার) ব্যতীত কোনও ইনপুট শর্ত পরিবর্তন না করায় মানটি কেবল "সেখানে" অ্যাক্সেসযোগ্য । তবে, মানটি Aবেসিকের অ্যাক্সেসযোগ্য নয় এবং প্রায় সাথে সাথেই ওভাররাইট হয়ে যায়।

উদাহরণ:

CALL &8000, "Hello", "World"

A = 2

CALL &8000, 42

A = 1

CALL &8000

A = 0


অনুরোধ করে, এখানে এমন কিছু কোড রয়েছে যা মানকে বেসিকের মধ্যে অ্যাক্সেসযোগ্য করে তুলেছে। আমি মাত্র 5 বাইটে এটি সম্পন্ন করতে পেরে খুব অবাক হয়েছিলাম !:

মেশিন কোড:

12          : LD   (DE), A
13          : INC  DE
AF          : XOR  A
12          : LD   (DE), A
C9          : RET

প্রবেশের সময়:

  • AF - সংগ্রহকারী এবং পতাকা নিবন্ধগুলি (দুটি 8-বিট রেজিস্ট্রার হিসাবে বিবেচিত)
    • A সর্বোচ্চ 32 টি পরামিতি পর্যন্ত পাস হওয়া প্যারামিটারগুলির সংখ্যা রয়েছে contains
    • আমি নিশ্চিত না কি আছে F। এটিতে 0দুটি পতাকাবিহীন পতাকা বাদে সমস্ত রিসেটের রিসেট রয়েছে বলে মনে হয় 1Zপতাকা (শূন্য) দেওয়া আছে 1সেখানে পাস কোন প্যারামিটার হলে
  • BC
    • B- প্যারামিটারের সংখ্যা 32 বিয়োগ ( A+ B= 32)
    • C - &FF
  • DE - শেষ প্যারামিটারের ঠিকানা, বা কোনও প্যারামিটার পাস না করা হলে কলিং ঠিকানা
  • HL - টোকেনাইজড বেসিক কমান্ডের পরে প্রথম বাইটের ঠিকানা বর্তমানে কার্যকর করা হচ্ছে (হয় প্রোগ্রাম হিসাবে বা তাত্ক্ষণিক কমান্ড মোডে)
  • IX - পয়েন্টারের শেষ প্যারামিটারের স্ট্যাক ঠিকানা
  • IY - &0000

কোড

  1. Lওএ Dঠিকানার DEসাথে মান সহ নির্দেশ করেA
  2. INCrements DE
  3. XORs A(সহ A), দান করা&00
  4. Loa ঠিকানার দিকে নির্দেশিত Dমানটির মানADE
  5. RETurns

প্রস্থান করার সময়:

  • Aধ্বংস হয় (এটি সর্বদা &00)
  • DE ধ্বংস হয় (এটি প্রবেশের চেয়ে সর্বদা এক উচ্চতর)
  • অন্যান্য সমস্ত নিবন্ধগুলি সংরক্ষিত আছে

মৌলিক

অ্যামাস্ট্রড বেসিকটিতে কেবল তিনটি ডেটা টাইপ, প্লাস সহজ অ্যারে রয়েছে। ডিফল্টরূপে, সমস্ত বেসিক ভেরিয়েবলগুলি হ'ল বাস্তব (স্বাক্ষরিত, 32 বিট ম্যান্টিসা, 8 বিট এক্সপোজনার), যা দিয়ে স্পষ্ট করা যায় !। একটি INTEGER (স্বাক্ষরিত, 16 বিট) ব্যবহারের %জন্য এবং একটি STRING (1 বাইট স্ট্রিং দৈর্ঘ্য, 255 বাইট অব অক্ষর ডেটা, বাইনারি নিরাপদ) ব্যবহারের জন্য $:

  • x - বাস্তব (অন্তর্নিহিত)
  • x! - বাস্তব (স্পষ্ট)
  • x% - পরিচয়
  • x$ - STRING

এছাড়াও আপনি ব্যবহার করতে পারেন DEFINT, DEFREALএবং DEFSTRএকটি একক অক্ষর, বা দুই একক অক্ষর একটি সীমার সঙ্গে যে অক্ষর, ফোরট্রান অনুরূপ দিয়ে শুরু হওয়া সকল ভেরিয়েবল জন্য ডিফল্ট প্রকার।

  • DEFSTR a
  • DEFINT x-z

এখন:

  • a - STRING (অন্তর্নিহিত)
  • i - বাস্তব (অন্তর্নিহিত)
  • x - স্বাক্ষরকারী (অন্তর্ভুক্ত)
  • x$ - STRING (স্পষ্ট)

এর সাথে কাজ করার সবচেয়ে সহজ ধরণটি হল পূর্ণসংখ্যা। মেশিন কোডটি প্রত্যাশা করে যে শেষ প্যারামিটারটি ঠিকানা দ্বারা পাস হবে, মানটি নয়, এ কারণেই @ভেরিয়েবলের উপসর্গ করা হয়েছে। রিটার্ন ভেরিয়েবলকে একটি CALLপরামিতি হিসাবে গণনা করা হয় ।

বেসিকের কাছ থেকে মেশিন কোডটি নীচে কল করা হয়েছে (ধরে নিলে এটি ঠিকঠাকের মেমোরিতে লোড হয় &8000):

CALL &8000, "Hello", "World", 42, @n%

n% = 4

এর প্রাথমিক মান নির্বিশেষে এটি সর্বদা সঠিক ফলাফল দেবে n%

2-বাইট সংস্করণের জন্য যা সমস্ত ইনপুট রেজিস্টার সংরক্ষণ করে:

CALL &8003, "Hello", "World", 42, @n%

n% = 4

এই প্রথম তিন বাইট অগ্রাহ্য, এবং শুধুমাত্র সঠিক ফলাফল দেয় যদি প্রাথমিক মান n%হয় 0- 255। এটি কাজ করে কারণ জেড 80 স্বল্প-এডিয়ান।

ফেরতের প্যারামিটারটি পাস করার আগে শুরু করতে হবে, অন্যথায় বেসিক একটি Improper argumentত্রুটি ফেলে দেবে । নীচের চিত্রটিতে, আমি শর্টকাটটি মুদ্রণ করছি ( ?যেহেতু আমিও বিক্ষোভটি গল্ফ করেছি!) মান পরিবর্তনটি দেখানোর জন্য কলটির ঠিক আগে এবং পরে রিটার্ন মানগুলি। আমি মানটি ব্যবহার করছি &FFFFকারণ এটি -1স্বাক্ষরিত পূর্ণসংখ্যার জন্য বাইনারি উপস্থাপনা । এটি প্রমাণ করে যে 5-বাইট প্রোগ্রামটি সঠিকভাবে উভয় বাইট লিখে দেয়, যেখানে 2-বাইট প্রোগ্রামটি কেবলমাত্র কম বাইট লিখে এবং ধরে নেয় যে উচ্চ বাইটটি ইতিমধ্যে রয়েছে &00

এখানে চিত্র বর্ণনা লিখুন


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

@ পিটারকর্ডস না আমাস্ট্রড বেসিক বা জেড 80 এর স্কোপের ধারণা নেই। সমস্ত মান বিশ্বব্যাপী এবং ধ্বংস হওয়া অবধি অবিলম্বে অ্যাক্সেসযোগ্য। নির্দেশের সাথে Aসাথেই এর মান একই হয় RETAএটির সঞ্চালক হিসাবে একটি মানের জীবনকাল খুব ছোট। এর মতো কোনও জিনিস নেই x = CALL &8000, 42। এটি হতে হবে CALL &8000, x, 42এবং অতিরিক্ত জেড 80 কোড xহবে তবে তা হবে 2, না 1
সিজে ডেনিস

আমি মনে করি এটি ঠিক আছে যদি আপনি গণনাতে আউটপুট আর্গ অন্তর্ভুক্ত করেন, অন্যথায় 1 বাইট হ্রাস নির্দেশ নেই? আমি এমন একটি সংস্করণটি দেখতে আগ্রহী যেটি নূন্যতম হওয়ার পরিবর্তে বেসিক থেকে আসলে ব্যবহারযোগ্য able
পিটার কর্ডেস

1
@ পিটারকর্ডস হয়ে গেছে! ওহ, যাইহোক, আমি কোনও প্যারামিটার ছাড়াই এটি কল না করার কথা উল্লেখ করতে ভুলে গেছি কারণ এটি তার নিজস্ব &00- দুটি-নির্দেশিকা দিয়ে প্রথম দুটি নির্দেশকে ওভাররাইট করবে NOP। এটিকে আরও নিরাপদ করে তুলতে অন্য একটি বাইট যুক্ত করা যেতে পারে, তবে অবশ্যই কোনও রিটার্ন প্যারামিটার ছাড়াই এটি কিছু সেট করতে পারে না।
সিজে ডেনিস

32

29
জাভা স্ক্রিপ্ট জাভা স্ক্রিপ্ট বিরল বিরল লক্ষ করা যায়
এলোমেলো লোক

3
@ থেরানডমগুয়ের interface x{void f(Object...a);}জন্য এটি সংজ্ঞায়িত করার মতো কিছু দরকার , এবং এই ল্যাম্বডা অবশ্যই সেই ইন্টারফেস প্রকারের একটি ভেরিয়েবলের মধ্যে সংরক্ষণ করা উচিত, বা সেই ইন্টারফেসের ধরণের প্রত্যাশার কোনও পদ্ধতিতে পাস করা উচিত, তাই আমি নিশ্চিতভাবে জানি না যে এটি এই চ্যালেঞ্জটির জন্য গণনা করে (এমনকি এটিও) যদিও সাধারণত জাভা ল্যাম্বডাস কোডগল্ফ চ্যালেঞ্জগুলিতে অনুমোদিত হয়)
সামায়োনু

3
@ সামায়ন্নু অন্যান্য ল্যাম্বডাসের সাথে কোনও পার্থক্য নেই এবং যেমনটি আপনি উল্লেখ করেছেন, ল্যাম্বডাস ভাল আছেন
অলিভিয়ার গ্রাগোয়ার 16

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

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

25

জাভাস্ক্রিপ্ট, 15 বাইট

[].push.bind(0)

Array.prototype.pushফাংশন আর্গুমেন্ট যে কোন সংখ্যার লাগে, তাদের তার অ্যারের যোগ এবং অ্যারে আকার ফেরৎ। অতএব, pushএকটি খালি অ্যারে ব্যবহৃত ফাংশন সরবরাহ করা আর্গুমেন্টের সংখ্যা প্রদান করেpush

f = [].push.bind(0)

f(10,2,65,7)
> 4

f()
> 0

.bind(0)কেবল দেয় pushফাংশন একটি নির্দিষ্ট thisযাতে এটি একটি পরিবর্তনশীল সংরক্ষণ করা যাবে মান। আসলে, 7-বাইট শনাক্তকারীটি [].pushআক্ষরিকভাবে ব্যবহার করা যেতে পারে (তবে বরাদ্দ নয়) bind:

[].push(10,2,65,7)
> 4

[].push()
> 0


18

হাস্কেল , 108 107 95 94 বাইট

class T r where z::Int->r
instance T Int where z=id
instance T r=>T(a->r)where z n _=z$n+1
z 0

এটি অনলাইন চেষ্টা করুন!

এটি কাজ করা আশ্চর্যজনকভাবে কঠিন ছিল, তবে আমি কী অপরিহার্য ভাষায় তুচ্ছ কিছু বাস্তবায়িত করতে পারি তা জানার চেষ্টা করে মজা পেয়েছি।


অভিশাপ, আপনি আমাকে এটি মারধর। falচ্ছিক যদি আপনি বলেন z 0যে বাঁধাই ছাড়াই ফাংশন, তাই main = print $ ((z 0) pi 0 () [] :: Int)কাজ করে।
Angs

এবং এর অর্থ আমার অর্থ এই যে প্রকারগুলি বেনামী ফাংশন হিসাবে ব্যবহৃত হয় তাই আপনি শেষ দুটি সারি বাদে সমস্ত কিছু সরিয়ে ফেলতে পারেনz 0
অ্যাঙ্গস

সুন্দর ধন্যবাদ! দেখা যাচ্ছে যখন আমি বেনামে ফাংশনটি পরীক্ষা করছিলাম তখন আমি কিছু ভুল করছি। আপনার উদাহরণ চেষ্টা করে দেখুন এবং এটি ঠিক কাজ করেছে।
ব্যবহারকারী 9549915

আমি অনুমান করি যে ::Intবাইট গণনায় গণনা করা উচিত, যেহেতু উত্তরটির ধরণটি খুব শীঘ্রই বা পরে ঘোষণা করা উচিত, যেমন এর মতো main = print $ ((z 0 :: Double -> Integer -> () -> [a] -> (Int->Int->Int) -> IO () -> Int) pi 0 () [] (+) main)। আমি আরও মনে করি যে এটি কেবল সংকলনের সময় কাজ করে তাই এর মতো কিছু foldl(\a b->a b) (z 0) $ [1..5])::Intকাজ করতে পারে না। যেভাবেই হোক না কেন, এটি দুর্দান্ত জিনিস।
অ্যাঙ্গস

2
s/imperative/non-curry/
ব্যবহারকারী 202729


12

যদিও এটি সম্ভবত মুড়িয়ে ফেলা উচিত:f(){ echo $#; }
মুরু

8
@ মুরু এটি আমার কাছে সম্পূর্ণ প্রোগ্রাম হিসাবে দুর্দান্ত দেখাচ্ছে।
নীল

যদিও, আমি এখন দেখতে পাচ্ছি যে ওপি কেবল একটি ফাংশন চায় ...
নীল

2
@ নীল শেল স্ক্রিপ্টগুলি হ'ল ফাংশনগুলির মতো কাজ করে। কোনও ফাংশন কী তা ওপি পরিষ্কার করে না, আমি দাবি করি আমার জমাটি কেবল ডিস্কে সংরক্ষণ করা একটি ফাংশন।
পাভেল

9

মস্তিষ্ক-ফ্লাক , 6 বাইট

আমার প্রথম ব্রেইন-ফ্ল্যাক সমাধান যোগ্য পোস্টিং, আমি অনুমান করি যে এটি এই কাজের জন্য সঠিক সরঞ্জাম:

([]<>)

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

ব্রেন-ফ্লাক প্রোগ্রাম চালানোর সময়, প্রাথমিকভাবে বাম স্ট্যাকটিতে সমস্ত যুক্তি থাকে। সেখান থেকে এটি কেবল বিষয়:

(      -- push the following..
 []    --   height of the stack (ie. # of arguments)
   <>  -- ..to the other stack  (toggles to the other stack)
)      --
       -- the right stack now contains the # of arguments which
       -- gets printed implicitly

7

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 11 বাইট

Tr[1^{##}]&

এটি অনলাইন চেষ্টা করুন!

পরামর্শ দিয়েছেন জংহওয়ান মিন। কিছু বিধিনিষেধ (ইনপুট অবশ্যই আয়তক্ষেত্রাকার হওয়া উচিত) তবে আমাদের স্বেচ্ছাচারিত ইনপুট হ্যান্ডেল করার দরকার নেই।

11 বাইট

Length@!##&

এটি অনলাইন চেষ্টা করুন!

মার্টিন ইন্ডার প্রস্তাবিত আরও 11 বাইট সমাধান solution এটি ত্রুটি বলে মনে হয় যখন একটি ইনপুট নেই তবে এটি এখনও সব ক্ষেত্রে সঠিক মান দেয়।

12 বাইট

Length@{##}&

এটি অনলাইন চেষ্টা করুন!

আমার মূল সমাধান।

ম্যাথামেটিকায় ##একটি ফাংশনে আর্গুমেন্টগুলির একটি ভ্যারিয়েডিক সংখ্যার জন্য দাঁড়িয়েছে। {এবং }এগুলিকে একটি তালিকায় মুড়িয়ে দেয় এবং Length@এই তালিকার দৈর্ঘ্য নেয়। &শেষে এটিকে একটি আসল ফাংশনে রূপান্তরিত করে।


7

আর , 30 বাইট

function(...)length(list(...))

এটি অনলাইন চেষ্টা করুন!


1
function(...)nargs()20 বাইট হয়, তবে length(...)আমি আমার পছন্দ nargsমত ফাংশনটি গুগল না করা পর্যন্ত আমার প্রাথমিক পদ্ধতির ব্যবহার ছিল ।
জিউসেপ

@ জিউসেপ হুম, আমি চেষ্টা করলাম এটিকে list(...)যুক্তিযুক্ত রূপান্তর করতে চেষ্টা sum()করতে পারি যাতে এটি ব্যবহার করা যায়, তবে এটি মুশকিল : /
জেএডি

1
হাহাহা, চেষ্টা করবেন না এবং আমাকে সেই যুক্তিতে টোপ দিন;)
ররিটি

1
@ ররিটি ওহ আসলে, ড ডকস বলেছেন সম্মিলন করুন। কিছুই নয়: ডি
জেএডি

2
...length() একই জিনিসটি করেনlength(list(...))
জিউসেপ

7

বাশ, 12 বাইট (4 বাঁচানোর জন্য প্যাক্সিডিয়াবলোর ধন্যবাদ)

n()(echo $#)

ব্যাশ প্রম্পটে কপি এবং পেস্ট করুন। তারপরে প্রম্পট থেকে এন ফাংশনটি চালান:

$ n
0
$ n 46 gr 3443 dad
4
$ n 4fwj23 wrw jdwj 00998 34 eyt q3 vg wq j qw
11

2
পিপিসিজিতে আপনাকে স্বাগতম!
মার্টিন ইন্ডার

আপনি কি বলতে পারেন এটি একটি স্ক্রিপ্ট "./n" এবং কোনও ফাংশন নয়? তবে এটি ঠিক echo $#:, 7 বাইট। (তারপরে "./n" স্ক্রিপ্টটি চালু করার জন্য আপনি যে কোনও শেল ব্যবহার করেন ie অর্থাত্ আপনি বাশ চালান? তারপরে আপনি: ./n arg1 ... argnএটি বাশ দ্বারা ব্যাখ্যা করা হবে))
অলিভিয়ার ডুলাক

@ অলিভার ডুলাক চ্যালেঞ্জটি পরিষ্কারভাবে একটি ফাংশন বলেছে।
ওয়াস্টারেল

7

সি ++ 14 (জিসিসি) , 34 বাইট

জেনেরিক বৈকল্পিক ল্যাম্বদা ফাংশন হিসাবে (সি ++ 14 প্রয়োজন):

[](auto...p){return sizeof...(p);}

এটি অনলাইন চেষ্টা করুন!

পূর্ববর্তী (ভুল) উত্তর: 32 বাইট

এটি অনুপস্থিত ছিল template<class...T>এবং(p)

int f(T...p){return sizeof...p;}

6
সি ++ 14, সি ++ 11 এর কোনও জেনেরিক ল্যাম্বডাস নেই।
কোয়ান্টিন

1
আপনি পারে প্রশ্রয়ের পতাকা যোগ প্রথম বন্ধনী প্রায় অপসারণ পাবেp (এবং -wসতর্কবার্তা বন্ধ করতে)।
nwp

@ এনডব্লিউপি: -fpermissiveযদিও এই বিকল্পটির জন্য আপনার জন্য 12 বাইট খরচ হবে না ? এটি স্ট্যান্ডার্ড আইএসও সি ++ বা জিএনইউ সি ++ না হলে।
পিটার কর্ডেস

@ পিটারকর্ডস সম্ভবত এটি কমান্ড লাইনের মাধ্যমে প্রোগ্রামটি পাস করে সবকিছুর জন্য তুচ্ছ 0-বাইট সমাধান না এড়াতে এবং লক্ষ্য করা হচ্ছে। আমি এখানে এটি সম্পর্কে কেবল ভাবিনি কারণ এটি আপত্তিজনক বলে মনে হচ্ছে না।
এনডিউপি

@ কুইন্টিন স্থির -> সি ++ 14
বিয়ার্পফুরজ


5

অক্টাভা , 9 বাইট

@()nargin

এটি অনলাইন চেষ্টা করুন!

বেনামে ফাংশন যে কোনও সংখ্যক যুক্তি গ্রহণ করে (এবং নিঃশব্দে লটটি ত্যাগ করে) এবং অন্তর্নির্মিত মাধ্যমে আর্গুমেন্টের সংখ্যা আউটপুট করে nargin। এটি ম্যাটল্যাবে কাজ করে না, যেখানে আপনাকে vararginঅনেকগুলি তর্ক-বিতর্ক করার অনুমতি দিতে হবে ।


5

পার্ল 6 , 5 বাইট

@ জোশুয়া -5 বাইট জন্য ধন্যবাদ

{+@_}

এটি অনলাইন চেষ্টা করুন!


আপনি কেবল করতে পারেন{+@_}
জোশুয়া

@ জোশুয়া> _> সত্য, ধন্যবাদ
ASCII- কেবল

আপনি subপার্ল 6 এ অপসারণ করতে পারেন (যদিও পার্ল 5 তে নয়)।
নওহ্নহোফ

ওহ, টিআইএল পার্ল 6 পার্ল 5> _>
ASCII- কেবল

4

উত্তর একটি দ্রুত sitewide অনুসন্ধান ইঙ্গিত আপনি খুঁজে চলে যাবে মনে হচ্ছে যেsub
শুধুমাত্র হওয়া ASCII

2
প্রতিলিপি: টিআইও আপনাকে পিপিসিজি পোস্ট ফর্ম্যাটে অনুলিপি করা যাক (ইসি, এস, জি)
এএসসিআইআই-

@ এএসসিআইআই-ওহ ভাল, ধন্যবাদ! :) যেমন ছেড়ে চলে যাওয়ার কথা subআমি মনে করি না। এটি ছাড়া এটি কোনও ফাংশন নয়।
ক্রিস

@ এএসসিআইআই-কেবল আমি উত্তরগুলি subঅবৈধ ছাড়াই বিবেচনা করব কারণ ফলাফলটি আপনি কোনও পরিবর্তনশীলকে কল করতে বা নির্ধারণ করতে পারবেন না
টন হসপেল

4

পিএইচপি, 34 বাইট

function(...$a){return count($a);}

সুন্দর! পিএইচপি 5.6 বা তার বেশি বয়সীদের বিকল্প হ'ল function(){return func_num_args();}(35 বাইট, নীচে পোস্ট করা হয়েছে)।
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল এটি পিএইচপি 5.6 তেও কাজ করে
axiac

1
আপনার কেবল পিএইচপি 5.6 এবং আরও নতুনতে এই কাজগুলি উল্লেখ করা উচিত ।
axiac 14

@ ম্যাকিয়াক আপনি ঠিক বলেছেন, আমার খারাপ। পিএইচপি 5.5 সম্পর্কে ভাবছিলাম
ইসমাইল মিগুয়েল

4

সি # .নেট, 11 বাইট

a=>a.Length

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

সি # .NET- objectএ একাধিক ধরণের আর্গুমেন্টের জন্য ব্যবহৃত হয়, যাকে একজনকে সম্ভাব্য ইনপুট হিসাবে পূর্ণসংখ্যা, স্ট্রিং, অক্ষর ইত্যাদির মধ্য দিয়ে যায়। উদাহরণ স্বরূপ:

// Can be called like: `F(2)`, `F("test")`, `F('a')`, etc.
void F(object arg){ ... }

সি # .NET alচ্ছিক আর্গুমেন্টগুলির একটি নির্দিষ্ট আকারও থাকতে পারে। উদাহরণ স্বরূপ:

// Can be called like: `F()`, `F(2)`, `F("test")`, `F('a')`, etc.
void F(object arg = null){ ... }

এবং এছাড়াও ভারারাগস রয়েছে যা anচ্ছিক আর্গুমেন্টগুলির একটি অপরিজ্ঞাত পরিমাণ (যা আমি এই উত্তরটিতে ব্যবহার করেছি)। উদাহরণ স্বরূপ:

// Can be called like: `F()`, `F(2)`, `F(2, "test", 'a')`, etc.
void F(params object[] args){ ... }

সাধারণত ল্যাম্বডাস এ জাতীয়ভাবে তৈরি হয়:

System.Func<object[], int> F f = a=>a.Length;
// A call like `f(new object[]{2, "test", 'a'))` will return 3 (size of the input array)

তবে দুর্ভাগ্যক্রমে ভ্যারেগগুলি System.Funcসমর্থন করে না params, সুতরাং এর delegateপরিবর্তে আমাকে একটি তৈরি করতে হবে:

delegate int F(params object[] args);
F f = a=>a.Length;
// A call like `f()` will return 0, and `f(2, "test", 'a')` will return 3

যা এই চ্যালেঞ্জের জন্য আমার উত্তর, এবং লিঙ্কযুক্ত টিআইও পরীক্ষার কোডে পাওয়া যাবে।


একমাত্র সীমাবদ্ধতা হ'ল একটি আসল object[]লাইক ইনপুট দেওয়ার f(new object[]{1,2,3})ফলাফল 1 এর পরিবর্তে 3 হবে এবং f(new int[]{1,2,3})এখনও 1 এর ফলাফল হবে, কারণ এটি int[]একক হিসাবে ব্যাখ্যা করে objectobject[]প্যারামিটারটি একটি একক বস্তু হিসাবে ব্যাখ্যা করার জন্য এটি এর মতো কোনও বস্তুতে কাস্ট করা যেতে পারে:f((object)new object[]{1,2,3})


আমার বলতে হবে, যদি কখনও উত্তর থাকে যা আমাকে সি # উত্তরগুলিতে ল্যাম্বদা-সম্পর্কিত বয়লারপ্লেট সহ সমর্থন করে তোলে তবে এটিই হবে এটি ... তবে এটি অবশ্যই একটি বৈধ সমাধান।
কামিল দ্রাকারী

@ কামিলড্রাকারি সম্ভবত টিআইও-লিঙ্কটি না খোলার পরে আমি কী করেছি তা খুব স্পষ্ট ছিল না, তাই আমি একটি ব্যাখ্যা যুক্ত করেছি।
কেভিন ক্রুইজসেন

1
@Taemyr আমি একটি সমাধান খোঁজার চেষ্টা করেছি, কিন্তু দুর্ভাগ্যবশত কোন ভোটদান ছাড়া C # এর .NET জন্য কেউ নেই, object[]প্যারামিটার object, এরকম: f((object)new object[]{1,2,3});। এর মধ্যে f(new object[]{1,2,3});এবং f(1,2,3);যতদূর আমি খুঁজে পেতাম তার মধ্যে পার্থক্য করার কোনও উপায় নেই ।
কেভিন ক্রুইজসেন 14

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

1
@ কামিলড্রাকারি হুম, তবে এটি f(1, new object[]{1,2,3})আবার ব্যর্থ হয়েছে । এই আচরণের কোনও সমাধান খুঁজে পাওয়া যায় কিনা তা নিশ্চিত নয়।
কেভিন ক্রুইজসেন 15

4

ডোডোস , 32 31 বাইট

f
	dot i f dab
i
	
	dip dot dab

এটি অনলাইন চেষ্টা করুন!

ডেনিসের ইনক্রিমেন্ট ফাংশন ব্যবহার করে।

ব্যাখ্যা

f                     # definition of f - target function
        dot i f dab   # sum of j(f(all args but first)). recurses until it has 0 args
i                     # definition of i - returns (arg, 1) given 1 arg
                      # arg
        dip dot dab   # 1 (dot dab on list of length 1 returns 0, dip returns |0 - 1|)

বিকল্পভাবে, লক্ষ্য ফাংশনে পুনরাবৃত্তি ছাড়াই 32 বাইট (ধন্যবাদ @ লিও )

	dot i
i
	dip dot dab dot
	i dab

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

        dot i             # anonymous function: sum of i(args)
                          # here this becomes implicit main
i                         # definition of i - returns a list with all arguments replaced with 1
        dip dot dab dot   # 1 (dab dot returns empty list, dot returns 0, dip returns |0 - 1|
        i dab             # list concatenated with i(all args but first)

এখানে আরও একই দৈর্ঘ্যের সমাধানটি অনলাইনে চেষ্টা করুন! আমি বুঝতে পারছি না কেন আপনার কাজ কেন, আপনি দয়া করে ব্যাখ্যা যুক্ত করতে পারেন?
লিও

আরে, আপনি আমার সমাধানে একটি ব্যাখ্যা যুক্ত করেছেন! আমি আপনার জন্য একটি চাইছিলাম, আমি জানি কীভাবে আমার এক্সডি কাজ করে
লিও

1
@ দেরী জবাবের জন্য দুঃখিত, আমি যা করছি আদর্শ, ডেনিসের ফাংশনটি অনুলিপি করেছেন, তাত্পর্যপূর্ণভাবে বোঝার চেষ্টা করবেন। ডোডোস কীভাবে কাজ করে সে সম্পর্কে আমার কোনও ধারণা ছিল না তাই আপনার প্রথমটি কী করেছে আমি তা বুঝতে পেরেছি
ASCII- কেবল

কোনও উদ্বেগ নেই, এটি ছিল একটি মজার পরিস্থিতি :)
লিও

@ লীও ঠিক আছে তো আমার ব্যাখ্যাটি কী বোঝায়? (দ্রষ্টব্য: আমি মোবাইলে আছি তাই এটিকে আরও ভাল করে তুলতে এডিট করতে নির্দ্বিধায়)
ASCII- কেবল

3

সি ++, 72 বাইট

int f(){return 0;}template<class...P>int f(int,P...p){return f(p...)+1;}

কেবল ints নিয়ে কাজ করে বাইট সংরক্ষণ করে।


আপনি ব্যবহার করতে পারেন sizeof...
এলএফ

3

মরিচা, 57 বাইট

macro_rules!f{()=>{0};($($x:expr),+)=>{[$($x),+].len()};}

ব্যাখ্যা:

macro_rules! f {         // define a macro called f
    () => {0};           // when called without arguments, expand to 0
    ($($x:expr),+) => {  // when called with 1 or more comma seperated arguments
        [                // rust uses [a, b, c] to make an array
            $($x),+      // expand to the arguments seperated with a comma
        ]                
        .len()           // take the length of that.
    };
}

টেস্ট:

fn main() {
    println!("{:?}", f!());                // prints 0
    println!("{:?}", f!(4));               // prints 1
    println!("{:?}", f!(5, 2));            // prints 2
    // works with anything, as long as you dont mix things
    println!("{}", f!("", "a", "hello"));  // prints 3
}




2

পিএইচপি, 11 বাইট

<?=$argc-1;

এটি অনলাইনে চেষ্টা করুন: 1 ইনপুট | 3 ইনপুট


আমি এই সম্পর্কে (এবং এটির বৈধতা) সম্পর্কে এতটা নিশ্চিত নই যেহেতু এটি পিএইচপি কল করতে পাস করা যুক্তিগুলির গণনা।
ইসমাইল মিগুয়েল

@IsmaelMiguel দেখুন এই ঐক্যমত্য
শেগি

1
প্রশ্ন স্পষ্টভাবে একটি প্রয়োজন ফাংশন যে আয় নম্বর, এটা প্রদর্শন করা হয় না: "। ... একটি ফাংশন যা আর্গুমেন্ট একটি পরিবর্তনশীল সংখ্যা নেয় এবং আর্গুমেন্ট সংখ্যা ফেরৎ লিখুন"
axiac 14

1
পুনরায় উদ্ধৃত প্রশ্ন: "আপনার পছন্দের ভাষা ব্যবহার করে, একটি লিখতে ফাংশন যে আর্গুমেন্ট এবং একটি পরিবর্তনশীল নেয় আয় আর্গুমেন্টের সংখ্যা এটি দিয়ে ডাকা হয়।"। আপনার কোডে ফাংশন নেই।
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল, যদি সত্যিই এটি হত তবে অন্য অনেকগুলি সমাধানও বাতিল হয়ে যেত। আদর্শ হ'ল সমাধানগুলি প্রোগ্রাম বা ফাংশন হতে দেয়।
শেগি

2

ব্যাচ, 50 49 বাইট

set n=0
for %%a in (%*)do set/an+=1
exit/b%n%

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

@echo off
call:c %*
echo %ERRORLEVEL%
exit/b
:c
set n=0
for %%a in (%*)do set/an+=1
exit/b%n%

আমি বিশ্বাস করি যে এই উত্তরটি বিধিগুলির বিপরীতে (কিছুটা) যায়। ব্যাচের কার্যকারণের কিছুটা কাছাকাছি রয়েছে। আপনি অনুরূপ কিছু করতে পারেন :a|set r=0&for %%a in (%*)do set/ar+=1( |= উইন্ডোজ-স্টাইল নিউলাইন)। এই দ্রবণটি 38 বাইট। এটি চালানো, কি call :a <args>একটি সঙ্গে goto :eofমান পরিবর্তনশীল উপলব্ধ হচ্ছে, ফাংশন সামনে r। আপনি যদি নিজের সমাধানটি রাখতে চান /aতবে প্রথমে setমুছে ফেলুন এবং সেগুলি সরিয়ে দিন @
ইসমাইল মিগুয়েল

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

হ্যাঁ, এটা ঠিক। প্রস্থান কোডটি খুব ভাল! : আমি দেখতে exitcodes অধিক মাপের 255 একটি উদাহরণ সিম্যানটেক দ্বারা উপলব্ধ তালিকা হতে পারে বিস্মিত symantec.com/connect/articles/...
ইসমাইল মিগুয়েল

2

x86 32-বিট (i386) মেশিন কোড ফাংশন, 13 বাইট

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

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

POSIX এরexecl(3) মতো ক্রিয়াকলাপগুলির জন্য কার্যত সিগুলিতে একটি নাল-টার্মিনেটেড পয়েন্টার তালিকাটি ব্যবহৃত হয় : int execl(const char *path, const char *arg, ... /* (char *) NULL */);

সি int foo(...);কোনও স্থির তর্ক ছাড়াই প্রোটোটাইপগুলিকে অনুমতি দেয় না , তবে int foo();একই জিনিসটি বোঝায়: আরোগুলি অনির্ধারিত। (এটির অর্থ সি ++ এর থেকে পৃথক নয় int foo(void))। যাই হোক না কেন, এটি একটি asm উত্তর। এই ফাংশনটি সরাসরি কল করতে একটি সি সংকলক কোক্সিং করা আকর্ষণীয় তবে প্রয়োজনীয় নয়।

nasm -felf32 -l/dev/stdout arg-count.asm কিছু মন্তব্য লাইন সরানো আছে।

24                       global argcount_pointer_loop
25                       argcount_pointer_loop:
26                               .entry:
28 00000000 31C0             xor   eax, eax  ; search pattern = NULL
29 00000002 99               cdq             ; counter = 0
30 00000003 89E7             mov   edi, esp
31                       ;    scasd           ; edi+=4; skip retaddr
32                       .scan_args:
33 00000005 42               inc   edx
34 00000006 AF               scasd            ; cmp eax,[edi] / edi+=4
35 00000007 75FC             jne  .scan_args
36                       ;    dec   edx       ; correct for overshoot: don't count terminator
37                       ;    xchg  eax,edx
38 00000009 8D42FE           lea   eax, [edx-2]    ; terminator + ret addr
40 0000000C C3               ret

size = 0D               db $ - .entry

প্রশ্নটি দেখায় যে ফাংশনটি অবশ্যই 0টিতে ফিরে আসতে সক্ষম হবে এবং আমি সিদ্ধান্তটি আরগের গণনায় শেষ হওয়া এনএলএল পয়েন্টারকে অন্তর্ভুক্ত না করে সেই প্রয়োজনীয়তাটি অনুসরণ করার সিদ্ধান্ত নিয়েছি। যদিও এটির জন্য 1 বাইট খরচ হয়। (12-বাইট সংস্করণের জন্য, এলইএটি সরিয়ে ফেলুন এবং scasdলুপ এবং এর বাইরের অংশটি নিরঙ্কিত করুন I xchgতবে dec edxআমি এলইএই ব্যবহার করেছিলাম কারণ এটি অন্য তিনটি নির্দেশাবলীর সাথে একইভাবে ব্যয় করা হলেও এটি আরও কার্যকর, সুতরাং ফাংশনটি কম uops।)

পরীক্ষার জন্য সি কলার :

এর সাথে নির্মিত:

nasm -felf32 -l /dev/stdout arg-count.asm | cut -b -28,$((28+12))- &&
 gcc -Wall -O3 -g -std=gnu11 -m32 -fcall-used-edi arg-count.c arg-count.o -o ac &&
 ./ac

-fcall-used-ediএমনকি- O0 এ জিসিসি বলার জন্য ediএটি সংরক্ষণ করতে / পুনরুদ্ধার না করে ফাংশন ক্লোবারকে ধরে নিতেও বলা প্রয়োজন , কারণ আমি একটি সি স্টেটমেন্টে ( printfকল) এমন অনেক কল ব্যবহার করেছি যা এমনকি -O0ইডিআই ব্যবহার করে। এটি mainগিগিবির সাথে লিনাক্সে, জিসিসি'র নিজস্ব কলার (সিআরটি কোডে) থেকে ক্লোবার ইডিআইয়ের পক্ষে নিরাপদ বলে মনে হয় , তবে অন্যথায় এটি মিশ্রিত / ম্যাচ কোডের সাথে আলাদা আলাদা সংকলন করা সম্পূর্ণ জাল -fcall-used-reg__attribute__এটির কোনও সংস্করণ নেই যাতে কাস্টম কলিং কনভেনশনগুলির সাথে asm ফাংশনগুলি স্বাভাবিক থেকে আলাদা ঘোষণা করি।

#include <stdio.h>

int argcount_rep_scas();       // not (...): ISO C requires at least one fixed arg
int argcount_pointer_loop();   // if you declare args at all
int argcount_loopne();

#define TEST(...) printf("count=%d = %d = %d   (scasd/jne) | (rep scas) | (scas/loopne)\n", \
        argcount_pointer_loop(__VA_ARGS__), argcount_rep_scas(__VA_ARGS__), \
        argcount_loopne(__VA_ARGS__))

int main(void) {
    TEST("abc", 0);
    TEST(1, 1, 1, 1, 1, 1, 1, 0);
    TEST(0);
}

অন্য দুটি সংস্করণও 13 বাইটে এলো: এটির ভিত্তিতে এটি loopneএকটি মান প্রদান করে যা 1 দ্বারা খুব বেশি।

45                       global argcount_loopne
46                       argcount_loopne:
47                           .entry:
49 00000010 31C0             xor   eax, eax  ; search pattern = NULL
50 00000012 31C9             xor   ecx, ecx  ; counter = 0
51 00000014 89E7             mov   edi, esp
52 00000016 AF               scasd           ; edi+=4; skip retaddr
53                       .scan_args:
54 00000017 AF               scasd
55 00000018 E0FD             loopne  .scan_args
56 0000001A 29C8             sub   eax, ecx
58 0000001C C3               ret

size = 0D = 13 bytes               db $ - .entry

এই সংস্করণটিতে লুপের পরিবর্তে রেপ স্ক্যাসড ব্যবহার করা হয় তবে এটি 256-তে আর্গ গণনা গ্রহণ করে Or (বা উপরের বাইটগুলি ecxএন্ট্রিতে 0 হয় তবে 256 এ ক্যাপড !)

63                       ; return int8_t maybe?
64                       global argcount_rep_scas
65                       argcount_rep_scas:
66                               .entry:
67 00000020 31C0             xor   eax, eax
68                           ;    lea   ecx, [eax-1]
69 00000022 B1FF             mov   cl, -1
70 00000024 89E7             mov   edi, esp
71                       ;    scasd              ; skip retaddr
72 00000026 F2AF             repne scasd        ; ecx = -len - 2 (including retaddr)
73 00000028 B0FD             mov   al, -3
74 0000002A 28C8             sub   al, cl       ; eax = -3 +len + 2
75                       ;    dec   eax
76                       ;    dec   eax
77 0000002C C3               ret

size =  0D = 13 bytes         db $ - .entry

মজাদারভাবে, inc eax/ pop edx/ test edx,edx/ এর উপর ভিত্তি করে এখনও অন্য সংস্করণটি jnz13 বাইটে এসেছিল। এটি একটি কলি-পপস কনভেনশন, যা সি বাস্তবায়নের দ্বারা বৈকল্পিক ফাংশনগুলির জন্য কখনও ব্যবহৃত হয় না। (আমি রেট সংযোজনকে এক্সেক্সে পপড করেছিলাম, এবং রেটের পরিবর্তে জেএমপি এক্সএক্স (অথবা রিটার্ন-ঠিকানা ভবিষ্যদ্বাণীকের স্ট্যাকটি না ভাঙ্গার জন্য চাপ / রেট চাপি))।




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