আইএসবিএন -13 চেক ডিজিট গণনা করুন


28

কোনও ফাংশন লিখুন, কোনও আইএসবিএন -13 কোডের প্রথম 12 সংখ্যা দেওয়া, একটি উপযুক্ত চেক ডিজিট গণনা এবং সংযোজনের মাধ্যমে পুরো আইএসবিএন গণনা করবে।

আপনার ফাংশনটির ইনপুটটি স্ট্রিং যা আইএসবিএন এর প্রথম 12 টি সংখ্যার সমন্বিত। এর আউটপুটটি 13 টি সংখ্যার সমন্বিত একটি স্ট্রিং।

সাধারণ স্পেসিফিকেশন

একটি ফাংশন যা, যখন একটি স্ট্রিং প্রদত্ত লিখুন গুলি ঠিক 12 দশমিক সংখ্যা (এবং অন্য কোন অক্ষর) সম্পূর্ণভাবে গঠিত একটি স্ট্রিং ফেরৎ টি নিম্নলিখিত বৈশিষ্ট্য সঙ্গে:

  • টিতে হ'ল 13 দশমিক অঙ্ক (এবং অন্য কোনও অক্ষর নেই);
  • s টি এর একটি উপসর্গ ;
  • অদ্ভুত অবস্থানকে ভাবে সংখ্যা বসিয়ে এর সমষ্টি টি (অর্থাত প্রথম, তৃতীয়, পঞ্চম, ইত্যাদি), প্লাস তিনবার এমনকি অবস্থানকে ভাবে সংখ্যা বসিয়ে এর সমষ্টি টি একটি (অর্থাত দ্বিতীয়, চতুর্থ, ষষ্ঠ, ইত্যাদি), হয় 10 এর একাধিক

উদাহরণ / পরীক্ষার কেস

ইনপুট
978030640615

আউটপুট
9780306406157

বিজয় শর্ত

হিসেবে চ্যালেঞ্জ, সবচেয়ে কম উত্তর ধিক্কার জানাই।


1
ইনপুট এবং আউটপুটটিতে ড্যাশ বা কেবলমাত্র অঙ্কগুলি রয়েছে?
sepp2k

1
বিবরণটি আপডেট হয়েছে, ইনপুট এবং আউটপুটটি কেবলমাত্র অঙ্কগুলি
কেভিন ব্রাউন

সম্পূর্ণ আইএসবিএন -13 আউটপুটিং কি গ্রহণযোগ্য?
মিঃ লালমা

6
নোট করুন যে প্রশ্নগুলি সত্যই স্ব-অন্তর্ভুক্ত হওয়া উচিত, সুতরাং এখানে অ্যালগরিদমের বিবরণ অন্তর্ভুক্ত করা সহায়ক হবে।
ফ্লিপট্যাক

আমার জন্য উপরের পোস্টটি পরীক্ষার পক্ষে দুর্বল ... এখানে শেষ 10 ইএসবিএন হবে এবং এর মধ্যে একটিতে শেষ সংখ্যা হিসাবে 0 ফিরতে হবে ...
রোজলুপ

উত্তর:


14

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

{...+(;2%+{+}*3-~10%`+}:f

পুরো প্রোগ্রাম সংস্করণটি কেবল 19 টি অক্ষর

...+(;2%+{+}*3-~10%

পরে বিশ্লেষণের জন্য এখানে আবার চেক করুন। ইতিমধ্যে আমার পুরানো অপ্রয়োজনীয় উত্তরটি দেখুন

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

Luhn সংখ্যা গণনার অনুরূপ

{.{2+}%.(;2%{.+}%+{+}*~)10%`+}:f

978030640615 এর জন্য বিশ্লেষণ

{...}:f this is how you define the function in golfscript
.       store an extra copy of the input string
        '978030640615' '978030640615'
{2+}%   add 2 to each ascii digit, so '0'=>50, I can get away with this instead
        of {15&}% because we are doing mod 10 math on it later
        '978030640615' [59 57 58 50 53 50 56 54 50 56 51 55]
.       duplicate that list
        '978030640615' [59 57 58 50 53 50 56 54 50 56 51 55] [59 57 58 50 53 50 56 54 50 56 51 55]
(;      trim the first element off
        '978030640615' [59 57 58 50 53 50 56 54 50 56 51 55] [57 58 50 53 50 56 54 50 56 51 55]
2%      select every second element
        '978030640615' [59 57 58 50 53 50 56 54 50 56 51 55] [57 50 50 54 56 55]
{.+}%   double each element by adding to itself
        '978030640615' [59 57 58 50 53 50 56 54 50 56 51 55] [114 100 100 108 112 110]
+       join the two lists together
        '978030640615' [59 57 58 50 53 50 56 54 50 56 51 55 114 100 100 108 112 110]
{+}*    add up the items in the list
        '978030640615' 1293
~       bitwise not
        '978030640615' -1294
)       add one
        '978030640615' -1293            
10%     mod 10
        '978030640615' 7
`       convert to str
        '978030640615' '7'
+       join the strings
        '9780306406157'

একজন দোভাষীর মাধ্যমে কোড চালানোর পরে, আমি মনে করি আপনি প্রথম {এবং শেষ তিনটি অক্ষর থেকে মুক্তি পেয়ে কিছু অক্ষর (আপনার 32 অক্ষর Luhn- ভিত্তিক সমাধানে) সংরক্ষণ করতে পারবেন ; }:f। আমি ভাবছি প্রথম সমাধানের জন্য যদি একই জিনিসটি করা যায় ...
রব

@ মাইকডট্রিক, এই চরিত্রগুলি হ'ল জিএস কীভাবে কোনও ফাংশন সংজ্ঞায়িত করে। 19 চর সংস্করণটি আপনার পরামর্শ অনুসারে কাজ করে তবে প্রশ্নটি একটি "ফাংশন" করার জন্য জিজ্ঞাসা করেছিল
gnibbler

ওহ ঠিক আছে, ব্যাখ্যার জন্য আপনাকে ধন্যবাদ।
রব

আপনার দরকার নেই :f(হ্যাঁ, আমি জানি ফাংশনগুলি সাধারণত তখন নামকরণ করা হয়েছিল)।
এরিক আউটগল্ফার

8

পাইথন - 44 টি অক্ষর

f=lambda s:s+`-sum(map(int,s+s[1::2]*2))%10`

পাইথন - 53 টি অক্ষর

def f(s):d=map(int,s);return s+`-sum(d+d[1::2]*2)%10`

আমার মনে হয় চ ('9780306406159') '97803064061598' এর পরিবর্তে '9780306406157'
এভেলেক্স

@ ইয়েলেক্স, ইনপুট স্ট্রিংটি সর্বদা 12 ডিজিটের হওয়া উচিত
gnibbler

আহা, কোনওভাবে '9'
লুকিয়ে আছে

7

হাস্কেল - 54 টি অক্ষর

i s=s++show(sum[-read[c]*m|c<-s|m<-cycle[1,3]]`mod`10)

এর জন্য সমান্তরাল তালিকা অনুধাবনের জন্য সমর্থন প্রয়োজন , যা জিএইচসি ( -XParallelListCompপতাকা সহ) এবং হাগস (পতাকা সহ) দ্বারা সমর্থিত -98


আপনার কি সেই পতাকাটিকে গণনায় অন্তর্ভুক্ত করার দরকার নেই? যে এছাড়া, আপনি প্রতিস্থাপন করতে পারেন [1,3]দ্বারা [9,7]এবং অপসারণ -যা আপনি একটি বাইট :) সংরক্ষণ
ბიმო

7

এপিএল (২ characters টি অক্ষর)

F←{⍵,⍕10|10-(12⍴1 3)+.×⍎¨⍵}

আমি ডায়ালগ এপিএলকে আমার দোভাষী হিসাবে ব্যবহার করছি। এখানে বেশিরভাগ ডান থেকে বামে (ফাংশন সংজ্ঞায়নের মধ্যে F←{ ... }) একটি দ্রুত ব্যাখ্যা দেওয়া হয়েছে :

  • ⍎¨⍵: কার্যকর / মূল্যায়ন (¨ সঠিক যুক্তিতে ( ) প্রতিটি প্রদত্ত ( ) অক্ষরকে কার্যকর ।
  • (12⍴1 3): পুনর্নির্মাণ ( ভেক্টরকে 1 3একটি- 12এলিমেন্ট ভেক্টরে পুনরায় আকার দিন (শূন্যস্থান পূরণের জন্য পুনরাবৃত্তি করা হচ্ছে)।
  • +.×: +.×এর বাম আর্গুমেন্টের ডট পণ্য ( (12⍴1 3)) এবং তার ডান যুক্তি ( ⍎¨⍵) নিন।
  • 10-: 10 থেকে বিয়োগ করুন।
  • 10|: বিভাগ দ্বারা পরে অবশিষ্ট খুঁজে 10
  • : সংখ্যাটি ফর্ম্যাট করুন (অর্থাত্ একটি চরিত্রের উপস্থাপনা দিন)।
  • ⍵,: আমাদের গণনাঙ্ক অঙ্কটি ,সঠিক যুক্তিতে যুক্ত করুন App

6

পিএইচপি - 86 85 82 অক্ষর

function c($i){for($a=$s=0;$a<12;)$s+=$i[$a]*($a++%2?3:1);return$i.(10-$s%10)%10;}

পুনরায় ফর্ম্যাট এবং ব্যাখ্যা:

function c($i){                     // function c, $i is the input

    for($a=$s=0;$a<12;)             // for loop x12 - both $a and $s equal 0
                                    // notice there is no incrementation and
                                    // no curly braces as there is just one
                                    // command to loop through

        $s+=$i[$a]*($a++%2?3:1);    // $s (sum) is being incremented by
                                    // $ath character of $i (auto-casted to
                                    // int) multiplied by 3 or 1, depending
                                    // wheter $a is even or not (%2 results
                                    // either 1 or 0, but 0 == FALSE)
                                    // $a is incremented here, using the
                                    // post-incrementation - which means that
                                    // it is incremented, but AFTER the value
                                    // is returned

    return$i.(10-$s%10)%10;         // returns $i with the check digit
                                    // attached - first it is %'d by 10,
                                    // then the result is subtracted from
                                    // 10 and finally %'d by 10 again (which
                                    // effectively just replaces 10 with 0)
                                    // % has higher priority than -, so there
                                    // are no parentheses around $s%10
}

আমার সি # উত্তরটিতে হুবহু পন্থাটি নিয়েছি। দেখে মনে হচ্ছে পিএইচপি হ'ল ~ 9 টি অক্ষর আরও দক্ষ!
নেলিয়াস


5

হাস্কেল, 78 71 66 টি অক্ষর

i s=s++(show$mod(2-sum(zipWith(*)(cycle[1,3])(map fromEnum s)))10)

5

রুবি - 73 65 অক্ষর

f=->s{s+((2-(s+s.gsub(/.(.)/,'\1')*2).bytes.inject(:+))%10).to_s}

"\\1"-> '\1'?
নিমো 157

@ নেমো, ধন্যবাদ, আমার রুবি কিছুটা মরিচা
gnibbler

রুবি 1.9 সিনট্যাক্স ব্যবহার করুন f=->s{...}। 6 টি অক্ষর সংরক্ষণ করুন এছাড়াও s<<(...).to_s48 যোগ করার পরিবর্তে লিখুন এবং ব্যবহার করুন Fixnum#chr
হাউলেথ

4

সি # (94 টি অক্ষর)

string I(string i){int s=0,j=0;for(;j<12;)s+=(i[j]-48)*(j++%2<1?1:3);return i+((10-s%10)%10);}

পঠনযোগ্যতার জন্য লাইনব্রেক / সাদা স্থান সহ:

string I(string i) 
{ 
    int s = 0, j = 0;
    for (; j < 12; )
        s += (i[j] - 48) * (j++ % 2 < 1 ? 1 : 3); 
    return i + ((10 - s % 10) % 10); 
}

আমার তাকের বই থেকে বেশ কয়েকটি আইএসবিএন পরীক্ষিত, তাই আমি জানি এটি কাজ করছে!


4

পাইথন - 91 , 89

0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
|         |         |         |         |         |         |         |         |         |
 def c(i):return i+`(10-(sum(int(x)*3for x in i[1::2])+sum(int(x)for x in i[::2]))%10)%10`

তালিকার বোধগমিতে প্রথম যুক্তি এবং for(এবং inতৃতীয়) এর মধ্যে স্পেসগুলি longচ্ছিক হয় যতক্ষণ না এটি পার্সার দ্বারা বিভক্ত করা যায় (ভেরিয়েবল নাম ব্যবহার করে না)। -2 চর সেখানে।
নিক টি

4

পার্ল, 53 টি অক্ষর

sub i{$_=shift;s/(.)(.)/$s+=$1+$2*3/ge;$_.(10-$s)%10}

4

সি # - 89 77 টি অক্ষর

string I(string s){return s+(9992-s.Sum(x=>x-0)-2*s.Where((x,i)=>i%2>0).Sum(x=>x-0))%10;}

পাঠযোগ্যতার জন্য ফর্ম্যাট করা:

string I(string s)
{
    return s +
            (9992
            - s.Sum(x => x - 0)
            - 2 * s.Where((x, i) => i%2 > 0).Sum(x => x - 0)
            ) % 10;
}

আমরা এক বা তিন দ্বারা গুণিত করি না, আমরা কেবল সমস্ত কিছু যুক্ত করি, এবং আমরা আরও একবারে সমস্ত সম-স্থানযুক্ত অক্ষরগুলিকে আরও দু'বার যোগ করি।

9992 যথেষ্ট বড় যাতে সমস্ত ASCII অক্ষরের যোগফল এর চেয়ে কম হয় (যাতে আমরা 10 দ্বারা সংশোধন করতে পারি এবং ফলাফলটি ইতিবাচক তা নিশ্চিত হতে পারে, 10 বার দুবার মোড করার দরকার নেই), এবং শূন্য দ্বারা বিভাজ্য নয় কারণ আমরা যুক্ত করি এই সমস্ত অতিরিক্ত 2 * 12 * 48 (বারো ASCII সংখ্যা, ওজন 1 এবং 3) == 1152, যা আমাদের একটি অতিরিক্ত অক্ষর বাঁচাতে দেয় (48 বার দু'বার বিয়োগের পরিবর্তে, আমরা 0 কে কেবল চার থেকে ইনট এ রূপান্তর করতে, তবে 990 এর পরিবর্তে আমাদের 9992 লিখতে হবে)।

তবে তারপরেও, যদিও খুব কম সুন্দর ;-) সত্ত্বেও, এই পুরাতন-স্কুল সমাধানটি আমাদের 80 টি অক্ষরে পৌঁছে দেয় (তবে এটি প্রায় সি-সামঞ্জস্যপূর্ণ):

string T(string i){int s=2,j=0;for(;j<12;)s+=i[j]*(9-j++%2*2);return i+s%10;}

4

জে - 55 45 38

f=:3 :'y,":10|10-10|+/(12$1 3)*"."0 y'

যেমন

f '978030640615'
9780306406157

পুরানো উপায়:

f=:,":@(10(10&|@-)(10&|@+/@((12$1 3)*(i.12)&(".@{))))

1
(i.12)(".@{)yএর সাথে প্রতিস্থাপন করা যেতে পারে"."0 y
জে গাই

3

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

def f s;s+(10-s.bytes.zip([1,3]*6).map{|j,k|(j-48)*k}.inject(:+)%10).to_s[0];end

3

ডিসি, 44 অক্ষর

[d0r[I~3*rI~rsn++lndZ0<x]dsxx+I%Ir-I%rI*+]sI

হিসাবে ডাকা lIxযেমন:

dc -e'[d0r[I~3*rI~rsn++lndZ0<x]dsxx+I%Ir-I%rI*+]sI' -e '978030640615lIxp'


2

ডি - 97 টি অক্ষর

auto f(string s){int n;foreach(i,c;s)n+=((i&1)*2+1)*(c-48);return s~cast(char)((10-n%10)%10+48);}

আরও সুস্পষ্টভাবে ফর্ম্যাট করা:

auto f(string s)
{
    int n;

    foreach(i, c; s)
        n += ((i & 1) * 2 + 1) * (c - 48);

    return s ~ cast(char)((10 - n % 10) % 10 + 48);
}

ডি এর castালাই অপারেটরের ভার্বোসটি অবশ্যই অবসেসেটিভ শর্ট কোড লিখতে শক্ত করে তোলে।


2

জাভা - ১1১ টি অক্ষর :(

int b[]=new int[a.length];
int d=0,n=0,j=1;
for(char c:a.toCharArray())b[d++]=Integer.valueOf(c+"");
for(int i:b)n+=(j++%2==0)?(i*3):(i*1);
return a+(10-(n%10));

এই উত্তরটি প্রথম প্রয়োজনীয়তা পূরণ করে না, কারণ এটি কোনও ক্রিয়া নয়।
হান

1

প্রশ্ন (৪৪ টি চর)

f:{x,string 10-mod[;10]0+/sum@'2 cut"I"$/:x}

এটি আসলে ভুল আমি মনে করি
skeevey


1

সি, 80 79 টি অক্ষর

ফাংশনটি জায়গায় স্ট্রিংটি পরিবর্তন করে তবে সমস্যার প্রয়োজনীয়তাগুলি পূরণ করতে মূল স্ট্রিং পয়েন্টারটি দেয় returns

s;char*f(char*p){for(s=2;*p;s+=7**p++)s+=9**p++;*p++=48+s%10;*p=0;return p-13;}

কিছু ব্যাখ্যা: 0প্রতিটি ইনপুট অক্ষর থেকে 48 (অঙ্কের ASCII মান ) বিয়োগের পরিবর্তে সঞ্চায়ককে sআরম্ভ করা হয় যাতে এটি 48 + 3 * 48 + 48 + 3 * 48 এর সমান মডিউল 10 ... + 48 + 3 * 48 = 24 * 48 = 1152. পদক্ষেপটি সংযোজনের পরিবর্তে বিয়োগ 10-sumদ্বারা জমে এড়ানো যায় s। তবে %সি এর মডিউল অপারেটর যদি sনেতিবাচক হয় তবে ব্যবহারযোগ্য ফলাফল দেয় না , সুতরাং s-=গুণক 3 এবং 1 ব্যবহারের পরিবর্তে যথাক্রমে -3 = 7 মডিউল 10 এবং -1 = 9 মডিউল 10 দ্বারা প্রতিস্থাপন করা হয়।

পরীক্ষার জোতা:

#include <stdio.h>
#define N 12
int main()
{
     char b[N+2];
     fgets(b, N+1, stdin);
     puts(f(b));
     return 0;
}

1

গ্রোভি 75 , 66 টি অক্ষর

i={int i;it+(10-it.inject(0){t,c->t+(i++&1?:3)*(c as int)}%10)%10}

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

String z = "978030640615"
println i(z)

-> 9780306406157


1

সুতরাং বেস 1 যোগফলের বিকল্প হিসাবে ব্যবহার করা যেতে পারে? মজাদার!
জো কিং

2
@ জোকিং এটি এপিএল এবং জে জগতের বিশ্বের আসলেই খুব পুরানো কৌশল
বুবলার

978186197371 এর জন্য ভুল ফলাফলটি 8 টি 9 টির মতো নয় বলে মনে হচ্ছে ...
রোজলুপ

মাফ করবেন আমার মনে হয় আমি ভুল নম্বরটি পেস্ট করেছি
রোজলুপ

1

পাইথন 2 , 78 76 বাইট

lambda n:n+`10-(sum(int(a)+3*int(b)for a,b in zip(n[::2],n[1::2]))%10or 10)`

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

যুক্তি হিসাবে একটি স্ট্রিং লাগে।

ব্যাখ্যা:

পাইথন স্লাইস নোটেশন ব্যবহার করে স্ট্রিংকে অক্ষর জোড়ের তালিকায় রূপান্তর করে। ("978030640615" -> [("9", "7"), ("8", "0"), ("3", "0"), ("6", "4"), ("0" "," 6 "), (" 1 "," 5 ")])

জোড়ার তালিকার জন্য, প্রতিটি আইটেমকে পূর্ণসংখ্যায় রূপান্তর করে এবং একটি + 3 বি প্রদান করে।

সমস্ত ফলাফলের যোগফল।

বাকিগুলি যদি 0 হয় তবে যোগফল 10, বা 10 পান (এটি চূড়ান্ত অঙ্কটিকে 0 এর পরিবর্তে 10 হতে বাধা দেয়)

চেক ডিজিট পেতে বাকীটি 10 ​​থেকে সরান।

গণনা করা চেক ডিজিটকে অবহেলিত ব্যাকটিক এক্সপ্রেশন দিয়ে একটি স্ট্রিংয়ে রূপান্তর করে।

মূল সংখ্যাটি প্লাস গণনা করা চেক ডিজিট প্রদান করে।

সম্পাদনা:

স্পেসগুলি সরিয়ে 2 বাই রক্ষা করা হয়েছে (ধন্যবাদ জো কিং !)


আপনি স্পেস সামনে অপসারণ করতে পারেন forএবংor
জো রাজা

আমার কাছে ফলাফলটি যে 978186197371 এর সর্বশেষ সংখ্যা 8 এবং 9 নয় ... আমি আমার এপিএল সমাধানটিতে প্রিন্ট করা একমাত্র লিঙ্ক থেকে এই নম্বরটি পেয়েছি
রোজলুপ

মাফ করবেন আমার মনে হয় আমি ভুল নম্বরটি পেস্ট করেছি ...
রোজলুপ

1

এপিএল (ডায়ালগ ইউনিকোড) , 18 বাইট এসবিসিএস

আর্গুমেন্ট হিসাবে স্ট্রিং গ্রহণ করে বেনামে টাসিট উপসর্গ ফাংশন। বুবলারের পদ্ধতির ব্যবহার ।

⊢,∘⍕10|⍎¨+.×9 7⍴⍨≢

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

 যুক্তির দৈর্ঘ্য (12)

9 7⍴⍨ চক্রাকারে [9,7]যে দৈর্ঘ্য পুনরায় আকার

+.× এটির সাথে নিম্নলিখিতগুলির বিন্দু পণ্য:

⍎¨ each প্রতিটি চরিত্র মূল্যায়ন

10| Mod-10 এর

,∘⍕ নিম্নলিখিতটির স্ট্রিংফিকেশনটি পূর্বে যুক্ত করুন:

 অপরিবর্তিত যুক্তি


1

ডিসি , 25 বাইট

dn[A~9z^8+*rd0<M+]dsMxA%p

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

আমি জানি এখানে ইতিমধ্যে একটি ডিসি উত্তর রয়েছে, তবে 25 <44 তাই আমি অনুমান করি যে এটি সম্পর্কে আমার 19 বাইট ঠিক আছে। এটি z বা 8+9^zসমান বা বিজোড় কিনা তার উপর নির্ভর করে 10 -3বা -1Mod 10 এর সমতুল্য সেই সত্যটি ব্যবহার করে । সুতরাং আমি A~স্ট্যাকের অঙ্কগুলিতে অঙ্ক ভাঙতে ব্যবহার করি , তবে আমি স্ট্যাকটি তৈরি করার সাথে সাথে আমি প্রতিটি অঙ্ককে 8+9^zযেখানে এখনকার স্ট্যাকের আকার বলে তার গুণ করি। তারপরে আমি সমস্তগুলিকে ফাংশন স্ট্যাক আনারোলস হিসাবে যুক্ত করব এবং শেষ অঙ্কটি মুদ্রণ করব।


0

ম্যাটল্যাব - 82 টি অক্ষর

function c(i)
[i num2str(mod(10-mod(sum(str2num(i(:)).*repmat([1;3],6,1)),10),10))]

0

আর, 147 টি অক্ষর

f=function(v){s=as.numeric(strsplit(v,"")[[1]]);t=0;for(i in 1:12)if(i%%2==0)t=t+s[i]*3 else t=t+s[i];paste(v,(10-(t%%10))%%10,collapse="",sep="")}

ব্যবহার:

f("978030640615")
[1] "9780306406157"

0

জে, 25

,[:":10|0(-+/)"."0*1 3$~#
   f =:, [: ": 10 | 0 (- + /)"। "0 * 1 3 $ ~ #
   f '978030640615'
9780306406157
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.