ক্রেডিট কার্ড নম্বরগুলি যাচাই করার জন্য Luhn অ্যালগরিদম


49

চ্যালেঞ্জ

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

Luhn অ্যালগরিদম ব্যাখ্যা

রোসেটটা কোড থেকে, এই চ্যালেঞ্জের উদ্দেশ্যে এই অ্যালগরিদম এর উদাহরণ ইনপুট সহ যেমন নির্দিষ্ট করা হয়েছে 49927398716:

Reverse the digits, make an array:
    6, 1, 7, 8, 9, 3, 7, 2, 9, 9, 4
Double the numbers in odd indexes:
    6, 2, 7, 16, 9, 6, 7, 4, 9, 18, 4
Sum the digits in each number:
    6, 2, 7, 7, 9, 6, 7, 4, 9, 9, 4
Sum all of the numbers:
    6 + 2 + 7 + 7 + 9 + 6 + 7 + 4 + 9 + 9 + 4 = 70
If the sum modulo 10 is 0, then the number is valid:
    70 % 10 = 0 => valid

আইও বিধি

ইনপুট : আপনার ভাষার ইনপুট / পছন্দের আউটপুট বিন্যাসে একটি স্ট্রিং বা সংখ্যা (আপনার পছন্দ)

আউটপুট : যথাযথ বা মিথ্যা মান , যথাক্রমে, উপরের পরীক্ষা অনুযায়ী ইনপুটটি বৈধ কিনা তা নির্দেশ করে।

নোটস / টিপস

  • আপনি যদি পরীক্ষার জন্য এগুলি ব্যবহার করেন তবে ভুলক্রমে নিজের ক্রেডিট কার্ড বা অ্যাকাউন্ট নম্বর পোস্ট করার চেষ্টা করবেন না :)

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

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

উদাহরণ

নিম্নলিখিত পাইথন স্ক্রিপ্টের সাহায্যে বৈধতা দেওয়া হয়েছিল ; যদি আপনি মনে করেন যে কোনওটি ভুল হয়েছে বা আপনার কাছে প্রশ্ন রয়েছে, কেবল @ বিড়ালকে পিং করুন।

49927398716      True
49927398717      False
1234567812345670 True    
1234567812345678 False
79927398710      False
79927398711      False
79927398712      False
79927398713      True
79927398714      False
79927398715      False
79927398716      False
79927398717      False
79927398718      False
79927398719      False
374652346956782346957823694857692364857368475368 True
374652346956782346957823694857692364857387456834 False
8 False **
0 True  **

** পাইথন বাস্তবায়ন অনুসারে, তবে আপনি যে কোনও কিছু করতে পারেন কারণ স্পেসিফিকেশনটির একটি কঠোর আনুগত্যের দ্বারা এগুলি যোগ্যতার পক্ষে খুব কম।


উপরের যে কোনও যদি বিদ্যমান উত্তরগুলি অকার্যকর করে (যদিও আমি বিশ্বাস করি যে এটি সম্ভব হওয়া উচিত নয়), তবে সেই উত্তরগুলি কঠোরভাবে বৈধ। তবে, নতুন উত্তরগুলি, বৈধ হওয়ার জন্য, উপরের স্পেসিফিকেশনটি অনুসরণ করা উচিত।

লিডারবোর্ড

উত্তর:


21

গল্ফস্ক্রিপ্ট - 24 অক্ষর

-1%{2+0!:0)*109%+}*10%8=

ব্যাখ্যা:

  1. -1% স্ট্রিং বিপরীত
  2. {একটি ব্লক শুরু হয় (যা আমরা লুপ হিসাবে ব্যবহার করি)। স্ট্রিংগুলির প্রতিটি অক্ষরকে এটির মূল্য হিসাবে ধাক্কা দেওয়া হয়।
    1. 2+ 2 যোগ করুন (একটি সংখ্যার ascii মান 48 + n, সুতরাং আমাদের এখন 50 + n আছে এবং শেষ সংখ্যাটি n)
    2. 0!:0 0 এর মান উল্টায় এবং এটি সংরক্ষণ করে (সবকিছুই একটি পরিবর্তনশীল), সুতরাং আমাদের প্রথম পুনরাবৃত্তির উপর 1 আছে, দ্বিতীয়টিতে 0 ইত্যাদি etc.
    3. )* এই মানটিতে একটি যোগ করে এবং এটি গুণ করে, সুতরাং আমরা 2, তারপরে 1, তারপরে 2 ইত্যাদি দ্বারা গুণ করি
    4. 109% এটি মডুলোর বাকি 109।
    5. + চলমান যোগফলে এই মান যুক্ত করে
  3. }*ব্লকটি শেষ করে একটি 'ভাঁজ' অপারেশন করে। প্রথমত, প্রথম অক্ষরটি পুশ করা হয় (যেহেতু আমরা বিপরীত হয়েছে, এটি চেক ডিজিট)। তারপরে, বিকল্প ধাক্কা দেওয়া এবং ব্লকটি কার্যকর করা। সুতরাং, আমরা প্রথম অক্ষরের আসকি মান চলমান যোগফলের প্রারম্ভিক মান হিসাবে ব্যবহার করছি।
  4. 10% বাকি 10 টি মডিউল নেয়।
  5. 8= মান 8 হলে 1টি ফিরে আসবে use আমরা এটি ব্যবহার করি কারণ আমরা প্রথম ধাক্কা দেওয়া অক্ষরটি (চেক ডিজিট) স্বাভাবিক করি নি।

কেউ মনে করতে পারে যে আমরা পরিবর্তিত করে একটি অক্ষর সংরক্ষণ করার 8-পরিবর্তে ব্যবহার করতে পারি , তারপরে আমাদের একটি স্থান যুক্ত করতে হবে যাতে এটি বিয়োগফল (পরিবর্তে ) হয়।2+109%89%--0


11

গল্ফস্ক্রিপ্ট, 44 টি অক্ষর

-1%{16%}%2/1,\+{(\.{0=2*.9>9*-+}{;}if+}*10%!

নির্বাচিত ভাষ্য

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

  1. -1%স্ট্রিং বিপরীত। অঙ্কের জোড়গুলি ডান থেকে গণনা করা এটি গুরুত্বপূর্ণ।
  2. {16%}% সমস্ত এএসসিআইআই ডিজিটকে সংখ্যায় রূপান্তর করে, 16 দিয়ে তাদের সংশোধন করে।
  3. 2/ অ্যারেটিকে 2 টি গ্রুপে বিভক্ত করে।
  4. 1,করার একটি সস্তা উপায় [0]
  5. \+অঙ্কগুলি অ্যারেতে কার্যকরভাবে 0 টি প্রেন্ডেন্ড করে। এটি অদলবদল করে তারপর সম্মিলিত করে এটি করে।

0 পরবর্তীটি যে ভাঁজ আসে তার জন্য প্রস্তুতিতে চাপ দেওয়া হয়। সুস্পষ্ট প্রাথমিক মান গ্রহণের পরিবর্তে গল্ফস্ক্রিপ্টের ভাঁজটি অ্যারের প্রথম আইটেমটিকে প্রাথমিক মান হিসাবে ব্যবহার করে।

এখন আসুন ভাঁজ ফাংশনটি দেখুন। এই ফাংশনটি দুটি আর্গুমেন্ট গ্রহণ করে: ভাঁজ করা মান এবং অ্যারের বর্তমান আইটেম (যা এই ক্ষেত্রে 2 বা (অস্বাভাবিক) 1 এর অ্যারে হবে, কারণ আগেরটির কারণে 2/)। আসুন ধরে নিই আর্গুমেন্টগুলি 1 [2 3]

  1. (\.বামতম অ্যারে উপাদানটি বিভক্ত করে, অবশিষ্ট অ্যারেটিকে সামনে নিয়ে যায়, তারপরে অনুলিপি করে। স্ট্যাক এখন মনে হচ্ছে: 1 2 [3] [3]
  2. ifচেক যদি অ্যারের খালি (যা গত গ্রুপ যখন একটি বিজোড় আকারের অ্যাকাউন্ট নম্বর সঙ্গে তার আচরণ ক্ষেত্রে দেখা যায়)। যদি তা হয় তবে কোনও বিশেষ প্রক্রিয়াজাতকরণ ঘটে না (খালি অ্যারেটি কেবল পপ অফ করুন)।
  3. এমনকি একটি গোষ্ঠীর জন্য:
    1. 0= অ্যারের প্রথম (কেবল, এই ক্ষেত্রে) উপাদানটি ধরে gra 1 2 3
    2. 2* সংখ্যা দ্বিগুণ করে 1 2 6
    3. .9>9*- সংখ্যাটি ৯-এর চেয়ে বড় হলে 9টি বিয়োগ করে এটি হিসাবে প্রয়োগ করা হয়েছে: সংখ্যাটি অনুলিপি করুন, 9 এর সাথে তুলনা করুন, ফলাফলটি (যা 0 বা 1 হয়) 9 দিয়ে গুণিত করুন, তারপরে বিয়োগ করুন। 1 2 6
    4. + অবশেষে প্রথম সংখ্যায় যোগ করুন। 1 8
  4. +(এর পরে if) ifমূল ফলাফলটিতে ফলাফল যুক্ত করে , ফলস্বরূপ নতুন ভাঁজ করা মান।

ভাঁজটি সম্পূর্ণ হওয়ার পরে, আমরা কেবল 10 ( 10%) দিয়ে মোড করি এবং ফলাফলটিকে ( !) উপেক্ষা করি, যাতে যোগফল 10 এর একাধিক হলে আমরা 1 ফিরিয়ে দেব।


এটি উইকিপিডিয়ায় উদাহরণস্বরূপ (49927398716) 0 ফেরত বলে মনে হচ্ছে
gnibbler

NM। আমি ব্যবহার করতে ভুলে গেছিecho -n
gnibbler

1
@gnibbler: হাহা, ব্যর্থ :- পি (গুরুতরভাবে, আমার প্রথম পরীক্ষায় আমিও এটির দ্বারা স্তূপিত হয়েছি))
ক্রিস জেস্টার-ইয়ং

1
এখানে কয়েকটি সহজ অক্ষর সংরক্ষণের জন্য কয়েকটি জায়গা। -1% 2/একত্রিত করা যেতে পারে -2/1,এর সাথে প্রতিস্থাপন করা যায় 0(0 টি অ্যারেতে জোর করা হয়, তারপরে +সংমিশ্রণ করা হয়)। 9>9*-এর সাথে প্রতিস্থাপন করা যেতে পারে 9>+(যেহেতু আমরা কেবল শেষ সংখ্যাটি নিয়ে উদ্বিগ্ন)। এছাড়াও, বিজোড় দৈর্ঘ্যের জন্য চেকিংটি কিছুটা দীর্ঘ, ব্যবহার করে .,2%,\+সংক্ষিপ্ত। এই কাজ করার পর, আমরা আরো পরিবর্তন করতে পারেন {16%}%এবং (\0=মধ্যে {16}/(লুপ ভিতরে)। একবার আপনি যে সব কাজ করেছি, এটা ভালো কিছু সন্ধান করব: .,2%,\+-2/0\+{{16%}/2*.9>+++}*10%!
নবাব

@ নবাব: ধন্যবাদ! আমি এগুলিকে আমার সমাধানে অন্তর্ভুক্ত করব, যদিও দেখে মনে হচ্ছে আপনার কাছে ইতিমধ্যে গুরুতর গাধাটিকে লাথি মারছে one :-)
ক্রিস জেস্টার-ইয়াং


10

পাইথন 3, 77 বাইট

c=lambda a:sum(sum(divmod(int(a[-e-1])<<e%2,10))for e in range(len(a)))%10==0

9

সি # 119 টি অক্ষর:

bool l(string n){return(String.Join("",n.Reverse().Select((x,i)=>(x-48)*(i%2<1?1:2)+"").ToArray()).Sum(x=>x-48))%10<1;}

স্থিতিযুক্ত ভাষায় কোড গল্ফ n00b এর পক্ষে খুব খারাপ নয় , আমি আশা করি।

এটি হ্রাস করা যেতে পারে 100 :

bool l(string n){return String.Join("",n.Reverse().Select((x,i)=>(x-48)*(i%2+1))).Sum(x=>x+2)%10<1;}

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

আমি কেবল আমার ক্রেডিট কার্ডের একটি পরীক্ষা করেছি এবং এটি থেকে টিবিএইচ থেকে একটি ত্রুটি করে কিছু বন্ধ ছিল। (ভিএস ২০০৮ ডিবাগার ব্যবহার করে) অ্যালগরিদমটি সর্বনিম্ন সংখ্যাটি দিয়ে শুরু করে প্রতি দ্বিতীয় সংখ্যা দ্বিগুণ করার কথা। আমি যদি স্ট্রিংটি বিপরীত না করি তবে বিজোড় দৈর্ঘ্যের স্ট্রিংগুলির ক্ষেত্রে এটি ভুল হবে।
মটিনেটর

দেখা যাচ্ছে আমার i%2<1?1:2পেছনের ফলাফল ছিল । ধন্যবাদ।
মটিনেটর

8

গল্ফস্ক্রিপ্ট - 34 অক্ষর

{15&}%.-2%\);-2%{.+(9%)}%+{+}*10%!

উইকিপিডিয়া পৃষ্ঠা 4992739871 থেকে উদাহরণ নম্বর

{15&}%  does a bitwise and of each ascii digit with 00001111
        now I have a list of digits 
        [4 9 9 2 7 3 9 8 7 1 6]
.       makes a copy of the list, now I have two identical lists
        [4 9 9 2 7 3 9 8 7 1 6] [4 9 9 2 7 3 9 8 7 1 6]
-2%     like [::-2] in python takes every second element in reverse
        [4 9 9 2 7 3 9 8 7 1 6] [6 7 9 7 9 4]
\       swap the two lists around
        [6 7 9 7 9 4] [4 9 9 2 7 3 9 8 7 1 6]
);      drop the last digit off the list
        [6 7 9 7 9 4] [4 9 9 2 7 3 9 8 7 1]
-2%     same as before
        [6 7 9 7 9 4] [1 8 3 2 9]
{       for each item in the list ...
.+      ... double it ...
(       ... subtract 1 ...
9%      ... mod 9 ...
)}%     ... add 1 ...
        [6 7 9 7 9 4] [2 7 6 4 9]
+       join the two lists
        [6 7 9 7 9 4 2 7 6 4 9]
{+}*    add the elements up
        70
10%     mod 10
        0
!       invert the result
        1

.+(9%)খুব উদ্ভাবনী (আমার জন্যে, যাহাই হউক না কেন) হয়। আমি পছন্দ করি! +1
ক্রিস জেস্টার-ইয়াং

তবুও গল্ফস্ক্রিপ্টের একটি বিভাজন অপারেটর প্রয়োজন, সুতরাং আপনার এই "ড্রপ এন্ড আইটেমটি বন্ধ করে পুনরাবৃত্তি করুন" বাজে কথা বলার দরকার নেই। :-)
ক্রিস জেস্টার-ইয়াং

1
@ ক্রিস, আমি প্রায় বহু বছর আগে "নায়িকাগুলি নিক্ষেপ করা" নামে পরিচিত ছিলাম learned
লম্বা হাত

3
এটি 0 টির দ্বিগুণ হয়ে যাওয়া ( 0(9%)9 এবং 0 নয়) এর জন্য কাজ করবে না ।
নবাব

8

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

<?function v($s,$t=0){for($i=strlen($s);$i>=0;$i--,$c=$s[$i])$t+=$c+$i%2*(($c>4)*-4+$c%5);return!($t % 10);}

7

রুবি - 85 টি অক্ষর

def f s
l=s.size
s.chars.map{|k|(i=k.to_i*((l-=1)%2+1))%10+i/10}.inject(:+)%10==0
end

আপনি সম্ভবত এটি সম্পর্কে জানেন, তবে আপনি 7 বাইট বাঁচাতে ইনজেক্ট (: +) এর পরিবর্তে .সুম করতে পারেন
হাভার্ড নাইগার্ড

7

হাস্কেল, 96 বাইট

আরও ভাল / খাটো উপায় থাকতে হবে তবে এখানে আমার হাসેલ সমাধানটি 96 টি অক্ষরে রয়েছে :

l=(==0).(`mod`10).sum.zipWith($)(cycle[id,\x->x`mod`5*2+x`div`5]).reverse.map((+(-48)).fromEnum)

দুঃখজনকভাবে digitToIntফাংশনটি কেবলমাত্র যদি আপনি import Data.Charপ্রথমে ব্যবহার করতে পারেন । তা না হলে আমি প্রতিস্থাপন 88 অক্ষর নিচে পেতে পারে ((+(-48)).fromEnum)সঙ্গে digitToInt


6

উইন্ডোজ পাওয়ারশেল, 82

filter f{!((''+($_[($_.length)..0]|%{+"$_"*($i++%2+1)})-replace'.','+$&'|iex)%10)}

ইতিহাস:

  • 2011-02-13 03:08 (84) প্রথম প্রচেষ্টা।
  • 2011-02-13 12:13 (82) স্পেসগুলি আঘাত না করায় আমার যোগদানের দরকার নেই। +1 + +3এখনও মূল্যায়ন করা যেতে পারে।

5

প্রশ্ন, 63

{0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}

ব্যবহার

q){0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}"79927398711"
0b
q){0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}"79927398712"
0b
q){0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}"79927398713"
1b

{0=mod[sum"J"$raze($)($)x*#:[x]#1 2]10}"I"$'(|)বিজোড় সূচকগুলি দ্বিগুণ করার জন্য একটি ভিন্ন উপায়ে 47 বাইট
রাস্তায়

5

ডি, 144 বাইট

bool f(S)(S s){int t(C)(C c){return to!int(c)-'0';}int n,v;foreach(i,c;array(retro(s))){v=i&1?t(c)*2:t(c);n+=v>=10?v%10+v/10:v;}return n%10==0;}

আরও সুস্পষ্টভাবে:

bool f(S)(S s)
{
    int t(C)(C c)
    {
        return to!int(c) - '0';
    }

    int n, v;

    foreach(i, c; array(retro(s)))
    {
        v = i & 1 ? t(c) * 2 : t(c);

        n += v >= 10 ? v % 10 + v / 10 : v;
    }

    return n % 10 == 0;
}

5

এপিএল, 28 বাইট

{0=10|+/⍎¨∊⍕¨v×⌽2-2|⍳⍴v←⍎¨⍵}

বিস্তারিত দেখুন

{                     v←⍎¨⍵}  ⍝ turn the string into a numeric vector of its digits, v
                2-2|⍳⍴v       ⍝ make a vector of the same length, with 2 in every 2nd place
             v×⌽              ⍝ multiply it with v, starting from the right
          ∊⍕¨                 ⍝ turn each component into a string and collect all the digits
      +/⍎¨                    ⍝ turn each digit again into a number and sum them
 0=10|                        ⍝ check whether the sum is a multiple of 10

উদাহরণ

      {0=10|+/⍎¨∊⍕¨v×⌽2-2|⍳⍴v←⍎¨⍵} '79927398713'
1
      {0=10|+/⍎¨∊⍕¨v×⌽2-2|⍳⍴v←⍎¨⍵} '123456789'
0

1
-2:{0=10|+/⍎¨∊⍕¨⍵×⌽2-2|⍳⍴⍵}⍎¨
অ্যাডম


4

পার্ল, 46 42 41 বাইট

এর জন্য +1 অন্তর্ভুক্ত -p

এসটিডিনে ইনপুট দিন:

luhn.pl <<< 79927398713

luhn.pl:

#!/usr/bin/perl -p
s%.%$=-=-$&-$&*1.2*/\G(..)+$/%eg;$_=/0$/

আপনি কিভাবে দয়া করে ব্যাখ্যা করতে পারেন? আপনার মনে হয় ম্যাচটি এবং তারপরে ম্যাচের সময়গুলি ১.২ দ্বারা হ্রাস পাচ্ছে তবে কেবল সঠিক অবস্থানে। ১.২ কেন? এটা করা উচিত নয় $=-=-$&-$&*/\G(..)+$/?
msh210

3
@ msh210: এটা 2. দ্বারা গুণ প্রভাব এনকোড 0..4* 2 দেয় 0, 2, 4, 6, 8কিন্তু 5..9দেয় 10,12,14,16,18যা সমষ্টি 1 3 5 7 9যা একই গত সংখ্যার হিসেবে 11 13 15 17 19যেমন যা একই মান 0..9 * 2.2যদি আপনি পূর্ণসংখ্যা থেকে অগ্রভাগ ছাঁটিয়া। প্রথমটি $&ইতিমধ্যে একটি ফ্যাক্টর অবদান রাখে 1, তাই এর দ্বারা সংশোধন করা 1.2এখনও প্রয়োজন। $=কেবল পূর্ণসংখ্যা ধরে রাখতে পারে এবং 0 দিয়ে শেষ হওয়া কোনও মান দিয়ে শুরু হয় তাই কাটা কাটা যত্ন নেয়। /\G/$&
রেগেক্স

উহু. উজ্জ্বল! এবং ব্যাখ্যা জন্য ধন্যবাদ।
এমএস 210

3

জাভাস্ক্রিপ্ট (ES6), 61 বাইট

২০১ Non সালে জাভাস্ক্রিপ্টটি খুব আলাদা ছিল বলে প্রতিদ্বন্দ্বিতা করা হয়নি।

এর সংখ্যা যোগফল 2*nহয় 2*nযদি n in 0..4, 2*n-9যদি n in 5..9। বলেছিল, সমস্ত যোগফল এক ধাপে গণনা করা যায়।

s=>!([...s].reduceRight((t,d)=>t-d-i++%2*(d>4?d-9:d),i=0)%10)

3

জেলি , 12 11 বাইট

ṚḤJḤ$¦DFS⁵ḍ

এটি অনলাইন চেষ্টা করুন! (সমস্ত পরীক্ষার কেস সহ)

কিভাবে এটা কাজ করে

ṚḤJḤ$¦DFSḍ⁵  - Main link. Argument: n (integer) e.g. 49927398716
Ṛ            - Reverse. Casts a number to digits     [6, 1, 7, 8, 9, 3, 7, 2, 9, 9, 4]
     ¦       - Sparse application. Apply the next command to the given indicies
 Ḥ           -   Command: Double
    $        -   Indicies:
  J          -     range(length)...                  [1, 2 , 3, 4, 5, 6, 7, 8, 9, 10, 11]
   Ḥ         -     doubled.                          [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
             - Doubles elements at odd indicies      [6, 2, 7, 16, 9, 6, 7, 4, 9, 18, 4]
      D      - Split each into digits                [6, 2, 7, [1, 6], 9, 6, 7, 4, 9, [1, 8], 4]
       F     - Flatten                               [6, 2, 7, 1, 6, 9, 6, 7, 4, 9, 1, 8, 4]
        S    - Sum                                   70
          ḍ  - Divisible by... 
         ⁵   -   10?                                 1

বিকল্পভাবে, 12 বাইটের জন্য:

ṚḤJḤ$¦DFSḍ@⁵

3

8086 বিধানসভা , আইবিএম পিসি ডস,29 28 25 23 বাইট

; Perform LUHN check
; Input: SI = card num string, CX = length
; Output: ZF = 1 if valid, ZF = 0 if not valid
    LUHN    MACRO
            LOCAL DIGIT_LOOP, EVEN
03 F1       ADD  SI, CX         ; start at end of input string 
FD          STD                 ; set LODSB direction to decrement 
    DIGIT_LOOP:
AC          LODSB               ; load next digit into AL, decrement SI
2C 30       SUB  AL, '0'        ; convert ASCII char to binary value 
F7 DA       NEG  DX             ; flip DX to alternate odd/even index
78 06       JS   EVEN           ; if even index, do not double and sum digits 
D0 E0       SHL  AL, 1          ; double the value 
D4 0A       AAM                 ; BCD convert to split digits (ex: 18 = 12H --> 0108H) 
02 DC       ADD  BL, AH         ; add tens digit to running sum 
    EVEN:
02 D8       ADD  BL, AL         ; add ones digit to running sum 
E2 ED       LOOP DIGIT_LOOP 
93          XCHG BX, AX         ; sum is in BL, move to AL for conversion
D4 0A       AAM                 ; BCD convert AL, set ZF=1 if low digit is 0
    ENDM

পৃথক অঙ্ক বিভাজন এবং modulo 10পরীক্ষা করার জন্য x86 এর বিসিডি-থেকে-বাইনারি নির্দেশাবলী (আপত্তি) ব্যবহার করে । দেখা যাচ্ছে যে AAMএবং AADনির্দেশাবলী বাইট মানগুলির বিসিডি / বাইনারি রূপান্তর করে (যা খুব সহজেই কার্যকর হতে পারে) সেগুলি নথিভুক্ত না করে বা সেই ফাংশনটি সাধারণভাবে সম্পাদন করে বর্ণিত না হওয়া সত্ত্বেও।

সব সরকারী আইবিএম / মাইক্রোসফট ডস সংস্করণ জন্য, AXএবং BXসক্রিয়া করা হয় 0000স্টার্টআপ (চালু সুত্র , সুত্র ) এবং DXকরতে CS, যা নন-জিরো এবং ইতিবাচক হতে নিশ্চিত একটি 12-বিট মান। এই আমরা কিভাবে গ্যারান্টি পারেন BXহয় 0এবং টুসকি / ফ্লপ করতে DXবিজোড় / এমনকি সংখ্যার স্থান নির্ধারণ।

উদাহরণ আউটপুট:

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

LUHN.COM আইবিএম পিসি ডস পরীক্ষা প্রোগ্রামটি ডাউনলোড করুন


2

স্কেলা: 132

def q(x:Int)=x%10+x/10
def c(i:String)={val s=i.reverse
(s(0)-48)==10-(s.tail.sliding(2,2).map(n=>(q((n(0)-48)*2)+n(1)-48)).sum%10)}

আবাহন:

c("79927398713")
  • বিপরীত ("79927398713") = 31789372997
  • এস (0), এস টেইল: (3) (1789372997)
  • স্লাইডিং (2,2) = (17 89 37 29 97)
  • মানচিত্র (q ((n (0) -48 * 2 + n (1) -48)) => কিউ (('1' - '0') * 2) + '7' - '0') = 1 * 2+ 7

2

জাভাস্ক্রিপ্ট 1.8: 106 টি অক্ষর

এটি একটি আসল সমাধান যা আমি এই পোস্টটি সন্ধান করার আগে নিয়ে এসেছিলাম:

function(n){return!(n.split('').reverse().reduce(function(p,c,i){return(+c&&((c*(1+i%2)%9)||9))+p},0)%10)}

পঠনযোগ্য ফর্ম:

function luhnCheck(ccNum) {
    return !(                                  // True if the result is zero.
             ccNum.split('').
               reverse().                      // Iterate over the string from rtl.
               reduce(function(prev, cur, idx) {
                 return prev +                 // Sum the results of each character.
                        (+cur &&               // If the current digit is 0, move on.
                         ((cur * (1 + idx % 2) // Double cur at even indices.
                           % 9) || 9));        // Sum the digits of the result.
               }, 0)
            % 10);                             // Is the sum evenly divisible by 10?
}


2

রেটিনা , 43 42 বাইট

এই চ্যালেঞ্জের চেয়ে রেটিনা (অনেক বেশি) নতুন।


;
r`(.);.
$1$&
\d
$*
1+
$.&
.
$*
$
$._
0$

শীর্ষস্থানীয় খালি রেখাটি তাৎপর্যপূর্ণ।

0মিথ্যা এবং 1সত্যবাদী ফলাফলের জন্য মুদ্রণ ।

এটি অনলাইন চেষ্টা করুন! (একবারে সমস্ত পরীক্ষার কেস চালানোর জন্য সামান্য সংশোধিত।)

ব্যাখ্যা


;

ঢোকান ;যে অবস্থানে আলাদা ডিজিটের হবে।

r`(.);.
$1$&

rIght থেকে আমরা বারবার দুটি অঙ্কের সাথে মেলে এবং বামটির দ্বিগুণ। এইভাবে আমরা তালিকার ব্যয়বহুল পরিবর্তন এড়াতে পারি।

\d
$*

আমরা প্রতিটি সংখ্যার সাথে মেলে এবং এটিকে অনেকগুলি 1(যেমন, আমরা প্রতিটি অঙ্ককে অ্যানারিতে রূপান্তর করি) রূপান্তর করি।

1+
$.&

এটি প্রতিটি অ্যানারি সংখ্যার সাথে মেলে এবং এর দৈর্ঘ্যের পরিবর্তে এটি দশমিকের দিকে রূপান্তর করে। পূর্ববর্তী পর্যায়ে একসাথে, এটি দ্বিগুণ অঙ্কগুলি যুক্ত করে।

.
$*

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

$
$._

শেষে, আমরা পুরো স্ট্রিংয়ের দৈর্ঘ্য সন্নিবেশ করি, অর্থাৎ ইউনারি চেকসামের দশমিক প্রতিনিধিত্ব।

0$

অবশেষে আমরা এই রেজেক্সের মিলগুলির সংখ্যা গণনা করি, অর্থাত্ দশমিক উপস্থাপনাটি 0প্রিন্টিংয়ে 0বা ততক্ষণে শেষ হয় কিনা তা আমরা পরীক্ষা করি 1


2

পাওয়ারশেল, 74 বাইট

param($s)$s[$s.Length..0]|%{(1+$i++%2)*"$_"}|%{$r+=$_-9*($_-gt9)}
!($r%10)

ব্যাখ্যা

  1. বিপরীত ক্রমে আর্গুমেন্ট স্ট্রিংয়ের প্রতিটি চর জন্য
  2. একটি অঙ্কের দ্বিগুণ মানের একটি অঙ্ক পান
  3. একটি অঙ্কের দ্বিগুণ মান 18 এর বেশি হতে পারে না Therefore সুতরাং, আমরা মান> 9 হলে একটি মান বিয়োগ 9 সংগ্রহ করি
  4. 10 দ্বারা বিভাগের বাকী 0 হলে সত্যটি প্রত্যাবর্তন করুন

পরীক্ষার স্ক্রিপ্ট

$f = {

param($s)$s[$s.Length..0]|%{(1+$i++%2)*"$_"}|%{$r+=$_-9*($_-gt9)}
!($r%10)

}

@(
    ,("49927398716"      , $True)
    ,("49927398717"      , $False)
    ,("1234567812345670" , $True)
    ,("1234567812345678" , $False)
    ,("79927398710"      , $False)
    ,("79927398711"      , $False)
    ,("79927398712"      , $False)
    ,("79927398713"      , $True)
    ,("79927398714"      , $False)
    ,("79927398715"      , $False)
    ,("79927398716"      , $False)
    ,("79927398717"      , $False)
    ,("79927398718"      , $False)
    ,("79927398719"      , $False)
    ,("374652346956782346957823694857692364857368475368" , $True)
    ,("374652346956782346957823694857692364857387456834" , $False)
    ,("8" , $False)
    ,("0" , $True)
) | % {
    $s, $expected = $_
    $result = &$f $s
    "$($result-eq$expected): $result : $s"
}

আউটপুট

True: True : 49927398716
True: False : 49927398717
True: True : 1234567812345670
True: False : 1234567812345678
True: False : 79927398710
True: False : 79927398711
True: False : 79927398712
True: True : 79927398713
True: False : 79927398714
True: False : 79927398715
True: False : 79927398716
True: False : 79927398717
True: False : 79927398718
True: False : 79927398719
True: True : 374652346956782346957823694857692364857368475368
True: False : 374652346956782346957823694857692364857387456834
True: False : 8
True: True : 0



1

জিএনইউ সেড, 140 বাইট

( -rপতাকাটির জন্য +1 সহ )

s/^(..)*.$/0&/
s/(.)./\1x&/g
s/x[5-9]/1&/g
s/[0x]//g
s/[789]/&6/g
s/[456]/&3/g
s/[369]/&11/g
s/[258]/&1/g
s/.{10}//g
s/.+/false/
s/^$/true/

শেড প্রায় কখনও গাণিতিকের পক্ষে সর্বাধিক প্রাকৃতিক ভাষা নয়, তবে আমরা এখানে যাই:

#!/bin/sed -rf

# zero-pad to even length
s/^(..)*.$/0&/
# double every other digit
s/(.)./\1x&/g
# add carry (converts mod-9 to mod-10)
s/x[5-9]/1&/g
# convert sum to unary
s/[0x]//g
s/[789]/&6/g
s/[456]/&3/g
s/[369]/&11/g
s/[258]/&1/g
# remove whole tens
s/.{10}//g
# output 'true' or false
s/.+/false/
s/^$/true/

1

এপিএল, 38 বাইট

d←10∘⊥⍣¯1⋄{0=10|+/+/d x×1+~2|⍳⍴x←⌽d ⍵}

সংখ্যাটি স্ট্রিং নয়, সংখ্যা হিসাবে প্রত্যাশা করে তবে কেবলমাত্র ট্রিপএল (বোধগম্য) প্রয়োগ করে না বলেই

আরও হ্রাসযোগ্য, আমি নিশ্চিত…


1

পিএইচপি - 136 টি অক্ষর

function t($c){foreach($a=str_split(strrev($c)) as $k=>&$v){$v=array_sum(str_split(($k % 2)!==0?2*$v:$v));}return !(array_sum($a)% 10);}

1

এমএটিএল , 23 20 বাইট (প্রতিযোগী নয়)

P!Utn:2X\!*t9>+s10\~

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

বৈধ সংখ্যার জন্য আউটপুট 1, অন্যথায় 0।

লুই মেন্ডোর পরামর্শের জন্য তিনটি বাইট সংরক্ষণ করা হয়েছে।

ব্যাখ্যা

P       % flip the order of elements
!       % transpose into column vector
U       % convert char matrix to numeric
t       % duplicate the vector
n       % find the length
:       % create a new vector length n (1, 2, 3, ... n)
2       % number literal
X\      % take it mod 2, to make the new vector (1, 2, 1, ..., (n-1) mod 2 +1)
!       % transpose
*       % element-wise product
t       % duplicate
9       % push 9
>       % 1 if it is greater than 9
+       % add the vectors, this makes the last digit of each the same as the sum of the digits
s       % add them
10      % number literal
\       % mod 10
~       % logical 'not' (element-wise)
        % (implicit) convert to string and display

1

জেলি , 14 বাইট

DUḤJḤ$¦DS$€S⁵ḍ

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

ব্যাখ্যা:

D              get digits
 U             reverse array
   JḤ$         for every other index,
  Ḥ   ¦        double the value
          €    for each value,
       D $     get the digits
        S$     and sum them
           S   sum the list
            ⁵ḍ check if it's divisible by 10

কেন এই প্রতিযোগিতা হয়?
মুডকিপ ২০১২

@ মুডকিপ ২০১২ আমি ভুল হলে আমাকে সংশোধন করুন, তবে প্রশ্ন জিজ্ঞাসা করার সময় জেলির এই সংস্করণটি উপস্থিত ছিল না, সুতরাং এটি প্রশ্নের পক্ষে বৈধ নয়।
এলি

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