স্প্যানিশ আইডি কার্ড নিয়ন্ত্রণ অক্ষর ক্যালকুলেটর


20

এটি একটি খুব সাধারণ অ্যালগরিদম, আমি নিশ্চিত যে অনেকগুলি বিভিন্ন ভাষায় সমাধান করা যেতে পারে। স্পেনে আইডি কার্ডগুলি ( ডিএনআই নামে পরিচিত ) 8 টি সংখ্যা এবং একটি নিয়ন্ত্রণ চরিত্র নিয়ে গঠিত। নিয়ন্ত্রণের অক্ষরটি নিম্নলিখিত অ্যালগরিদম দিয়ে গণনা করা হয়: সংখ্যাটি 23 দ্বারা ভাগ করুন, অপারেশনটির অবশিষ্ট অংশটি নিন এবং এই টেবিল অনুসারে একটি চরিত্রের সাথে এটি প্রতিস্থাপন করুন:

0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22  
T  R  W  A  G  M  Y  F  P  D  X  B  N  J  Z  S  Q  V  H  L  C  K  E

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

X Y Z
0 1 2

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

মন্তব্য:

  • ডিএনআই সর্বদা বড় হাতের অক্ষরে লেখা থাকে, তবে আপনার অ্যালগরিদমে আপনি ইনপুট এবং আউটপুটটিকে উচ্চ - বা লোয়ারকেস হিসাবে বেছে নিতে পারেন, কেবল সামঞ্জস্যপূর্ণ হতে হবে।
  • বাস্তব জীবনে, 2008 আগে জারি কিছু NIEs পর 8 ডিজিটের আছে X, Yবা Z, কিন্তু এই খেলা উদ্দেশ্যে, আপনি বিবেচনা করতে পারেন তারা 7 টি সংখ্যা আছে তারা আজকাল আছে।
  • আপনি বিবেচনা করতে পারেন যে ইনপুট স্ট্রিংটিতে সর্বদা 8 টি অক্ষর থাকবে তবে সেগুলি যদি "8 ডিজিট" ফর্ম্যাটে না হয় বা "[XYZ] প্লাস 7 ডিজিট" ফর্ম্যাটে না থাকে, আপনাকে অবশ্যই একটি ত্রুটি (আপনার পছন্দের) ফিরিয়ে দিতে হবে বা কেবল নিক্ষেপ করতে হবে একটি ব্যতিক্রম.

পরীক্ষার কেস:

00000010 -> X (HRM Juan Carlos I's DNI number)
01234567 -> L
98765432 -> M
69696969 -> T
42424242 -> Y
Z5555555 -> W (Z=2)
Y0000369 -> S (Y=1)
A1234567 -> <Error code or exception>
1231XX12 -> <Error code or exception>

এটি , তাই প্রতিটি ভাষার পক্ষে সংক্ষিপ্ততম কোডটি জয় পেতে পারে!



2
অবৈধ ইনপুটটিতে কোডটির একটি নির্দিষ্ট আচরণ থাকা কি সত্যই গুরুত্বপূর্ণ? সাধারণত এখানে চ্যালেঞ্জগুলি ত্রুটি পরিচালনা সম্পর্কে উদ্বিগ্ন হওয়ার প্রয়োজন হয় না।
গ্রেগ মার্টিন

3
@ গ্রেগমার্টিন আমার বক্তব্য অবিকল, আমি কেবল কোডটি ত্রুটি ইনপুটগুলিতে কিছু নির্দিষ্ট আচরণ দেখাতে চেয়েছিলাম কারণ এটি সাধারণত প্রয়োজন হয় না।
চার্লি

"সংখ্যাটি ২৩ দ্বারা ভাগ করুন, বাকী অপারেশনটি নিন", সঠিক শব্দটি বাকী রয়েছে ; বিশ্রাম খুব চালাকি।
লোকোলিউইস

2
স্প্যানিশ @Locoluis আমরা বলতে resto তারপর উপার্জন "বিশ্রাম" একটি মিথ্যা বন্ধু। কমপক্ষে আমি কোনও ভুল শব্দ ব্যবহার করিনি। :-) ধন্যবাদ!
চার্লি

উত্তর:


11

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

lambda n:'TRWAGMYFPDXBNJZSQVHLCKE'[int([n,str(ord(n[0])%4)+n[1:]][n[0]in'XYZ'])%23]

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

-5 অ্যালেক্সইনসাহার্টকে ধন্যবাদ (99 থেকে 94)। -1 জোনাথন অ্যালানকে ধন্যবাদ ।


1
আপনি প্রতিস্থাপন করতে পারেন str('XYZ'.index(n[0]))দ্বারা str(ord(n[0])-88)এবং 5 বাইট সংরক্ষণ
এ Alix Eisenhardt

1
@ অ্যালেক্সএজেনহার্ট উপরের পরামর্শটি আমাকে কৌশলটি ল্যাম্বডায় পরিবর্তন করতে অনুপ্রাণিত করেছিল, যা অবশেষে 10 বাইট সংরক্ষণ করেছিল।
মিঃ এক্সকোডার

প্রতিস্থাপন দ্বারা একটি বাইট সংরক্ষণ -88সঙ্গে%4
জোনাথন অ্যালান

8

হাস্কেল , 107 93 92 বাইট

c(x:y)="TRWAGMYFPDXBNJZSQVHLCKE"!!mod(read(("X0Y1Z2"!x):y))23
(a:b:c)!x|x==a=b|2>1=c!x
_!x=x

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


অবৈধ ইনপুটগুলির আচরণ কী?
চার্লি

তারা প্রোগ্রামটি ক্রাশ করবে, আমি উদাহরণে একটি যোগ করেছি। (অনুশীলনে এটি একটি ব্যতিক্রম ছোঁড়ে যে কেউই ধরা দেয় না)
বার্তাভেল

1
আমি ব্যতিক্রম ধরা সহ জমাটি আপডেট করেছি, যাতে সমস্ত পরীক্ষা চালানো যায়।
বার্তাভেল

5

পাইথ, 35 34 বাইট

xxdকোডটিতে কিছু অপ্রিন্টযোগ্য অক্ষর রয়েছে, সুতরাং এখানে একটি বিপরীতমুখী হেক্সডাম্প রয়েছে।

00000000: 402e 5043 22fc eeff 1ffc adc7 e614 9451  @.PC"..........Q
00000010: 2247 2573 7358 637a 5d31 3e33 4755 3320  "G%ssXcz]1>3GU3
00000020: 3233                                     23

ছোট হাতের অক্ষর ব্যবহার করে ।

এটি অনলাইনে চেষ্টা করুন। পরীক্ষা স্যুট.

মুদ্রণযোগ্য সংস্করণ

@.P305777935990456506899534929G%ssXcz]1>3GU3 23

ব্যাখ্যা

  • cz]1 ইনপুটটি 1 পজিশনে বিভক্ত করে eg "y0000369" করতে ["y", "0000369"]
  • >3G বর্ণমালার শেষ 3 টি অক্ষর পেয়েছে, "xyz" ,।
  • U3পরিসর পায় [0, 3 [ , [0, 1, 2]
  • Xমানচিত্র xyzথেকে [0, 1, 2]বিভক্ত অ্যারের মধ্যে, যেমন ["y", "0000369"]করতে[1, "0000369"] । এটি প্রথম চরিত্রটিকে যদি এটির একটি হয় তবে এটি প্রতিস্থাপন করে xyz, যখন কোনও characters অক্ষরের স্ট্রিং একক অক্ষরের সমান হতে পারে না বলে characters অক্ষরের লেজটি অচ্ছুত রেখে দেয়।
  • s খালি স্ট্রিংয়ের সাথে অ্যারের সাথে যোগ দেয় eg [1, "0000369"] করতে "10000369"
  • s এই স্ট্রিংটিকে পূর্ণসংখ্যায় কাস্ট করে "10000369" করার 10000369। কোনও অতিরিক্ত অ-অঙ্কিত অক্ষরগুলি স্ট্রিংয়ে রেখে দেওয়া থাকলে এটি ত্রুটি ছুঁড়ে দেয়।
  • %... 23মান মডিউল 23, উদাঃ পায় 10000369করার15
  • C""বাইনারি স্ট্রিংটি বেস 256 থেকে পূর্ণসংখ্যায় রূপান্তর করে (প্রায় 3.06 × 10 26 )।
  • .P...G সেই সূচির সাহায্যে বর্ণমালার ক্রমবিকাশ পাওয়া যায়।
  • @ আদেশ থেকে সঠিক অক্ষর পায়।

4

এমএটিএল , 62 59 বাইট

'RWAGMYFPDXBNJZSQVHLCKET'j'[\dXYZ]\d{7}'XXg'XYZ'I:47+XEU1))

বৈধ ইনপুট না হওয়ার ত্রুটিটি হ'ল A(I): index out of bounds(অক্টাভে চলমান সংকলক) বা Index exceeds matrix dimensions(মাতালাবের মধ্যে সংকলক চলমান)।

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

ব্যাখ্যা

'RWAGMYFPDXBNJZSQVHLCKET' % Push this string (output letters circularly shifted by 1)
j                         % Unevaluated input
'[\dXYZ]\d{7}'            % Push this string (regexp pattern)
XX                        % Regexp. Returns cell arary with matching string, or empty
g                         % Convert to standard array. Will be empty if non-valid input
'XYZ'                     % Push this string
I:47+                     % Push [47 48 49] (ASCII codes of '012')
XE                        % Transliterate
U                         % Convert to number
1)                        % Get first entry. Gives an error if empty
)                         % Index (modular, 1-based) into initial string
                          % Implicitly display

4

ES6, 83 82 81 বাইট

i=>'TRWAGMYFPDXBNJZSQVHLCKE'[(/^[XYZ]/.test(i)?i.charCodeAt()%4+i.slice(1):i)%23]

কর্মে!

কেবলমাত্র বড়হাঁটি, অবৈধ সংখ্যার জন্য ত্রুটি কোড undefined

এক বাইট জোনাথন অ্যালানকে ধন্যবাদ বাঁচিয়েছে।
আরেকটি বাইট শ্যাগিকে ধন্যবাদ রক্ষা করেছে।


এর %4চেয়ে সম্ভবত একটি বাইট ব্যবহার করে সংরক্ষণ করুন -88
জোনাথন অ্যালান

আপনি খুব এ 0থেকে ড্রপ করতে সক্ষম হওয়া উচিত charCodeAt()
শেগি

3

জাভা 8, 154 145 104 বাইট

s->{s[0]-=s[0]<88|s[0]>90?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charA‌​t(new Integer(new String(s))%23);}

-9 বাইটস @ অলিভারগ্রাগোয়ারকে ধন্যবাদ । চার্ট অ্যারে ( ) হিসাবে ইনপুট নিয়ে আবার @ অলিভারগ্রাগোয়ারকে
ধন্যবাদ -৪১ বাইটস ।char[]

যদি ইনপুটটি অবৈধ হয় তবে তা হয় একটি java.lang.NumberFormatExceptionবা এর সাথে ব্যর্থ হবেjava.lang.StringIndexOutOfBoundsException

ব্যাখ্যা:

এখানে চেষ্টা করুন। (অবৈধ পরীক্ষার কেসগুলি চেষ্টা-ঘিরে ঘিরে রয়েছে তাই এটি প্রথম ত্রুটিতে থামে না))

s->{                      // Method with char[] parameter and char return-type
  s[0]-=s[0]<88|s[0]>90?  // If the first character is not XYZ:
    0                     //  Leave the first character as is
   :                      // Else:
    40;                   //  Subtract 40 to convert it to 012
  return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(
                          //    Get the char from the String
    new Integer(          //    by converting the following String to an integer:
      new String(s)       //     by converting the char-array to a String
    )%23);                //    And take modulo-23 of that integer
}                         // End of method

1
|রেজিজেসে আপনার দরকার নেই । এছাড়াও int t=s.charAt(0)-88এবং t<0?t+40:tআপনাকে একটি বাইট ছাড়াই।
অলিভিয়ার গ্রাগোয়ার

1
শেষ অবধি, আপনি একটি ত্রুটি কোড ফিরে আসতে পারেন। কেবলমাত্র এটি সিদ্ধান্ত নিই যে এটি 'a'বা '0'বা কোনও বড় হাতের অক্ষর নয়, এবং t/0পুরোটা অনেকটা কাস্ট করার পরিবর্তে তা ফিরিয়ে দিন char। আমার ধারণা, আপনি এইভাবে 7 বাইট সংরক্ষণ করতে পারেন। এইভাবে গল্ফ করুন , আপনি 145 বাইট পাবেন।
অলিভিয়ার গ্রাগোয়ার

1
@ অলিভিয়ারগ্রোওয়ের ধন্যবাদ! আমার এই অনুভূতি আছে যে এখনও .matchesএই রেজেক্স, বিটিডব্লিউর পরিবর্তে বৈধতার ভিন্ন উপায় ব্যবহার করা সম্ভব । তবে সম্ভবত আমি ভুল করছি।
কেভিন ক্রুইজসেন

1
না, তুমি পুরোপুরি ঠিক! এটি এর মতোই করণীয়: s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}কেবলমাত্র 94 বাইটের জন্য (এক sহওয়ার সাথে char[]): পি
অলিভিয়ের গ্রাগোয়ার

1
বা আপনি যদি বৈধতা সম্পর্কে সম্পূর্ণ হতে চান: s[0]<88&s[0]>90আরও 8 বাইটের জন্য।
অলিভিয়ের গ্রাগোয়ার



1

q / kdb +, 68 বাইট

সমাধান:

{"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}

উদাহরণ:

q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"00000010"
"X"
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"01234567"
"L"
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"98765432"
"M"
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"69696969"
"T"
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"42424242"
"Y"
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"Z5555555"
"W"
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"Y0000369"
"S"
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"A1234567"
" "
q){"TRWAGMYFPDXBNJZSQVHLCKE"mod["J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x;23]}"1231XX12"
" "

ব্যাখ্যা:

যদি প্রথম অক্ষর,, x 0স্ট্রিংটিতে থাকে "XYZ"তবে aতা হবে 0, 1বা 2। প্রথম অক্ষরটি যদি স্ট্রিংটিতে না থাকে তবে aতা হবে 3। যদি a3 এর কম হয় তবে আমরা একটি ( 0, 1বা 2) স্ট্রিংয়ের জন্য প্রথম অক্ষরটি স্যুইচ আউট করি, অন্যথায় আমরা প্রথম অক্ষরটির জন্য স্যুইচআউট করি (এভাবে কার্যকরভাবে কিছুই করা হয় না)। এই স্ট্রিংটি দীর্ঘ ( "J"$) এ কাস্ট করা হয় , যা এরপরে mod23 টি দিয়ে বাকী অংশটি দেবে। এই বাকীটি অনুসন্ধান সারণিতে সূচক হিসাবে ব্যবহৃত হয়।

{ "TRWAGMYFPDXBNJZSQVHLCKE" mod["J"$$[3>a:"XYZ"?x 0;string a;x 0],1_x;23] } / ungolfed solution
{                                                                         } / lambda function
                            mod[                                     ;23]   / performds mod 23 of the stuff in the gap
                                                                  1_x       / 1 drop input, drops the first character
                                                                 ,          / concatenation
                                    $[             ;        ;   ]           / if COND then TRUE else FALSE - $[COND;TRUE;FALSE]
                                        a:"XYZ"?x 0                         / "XYZ" find x[0], save result in a
                                      3>                                    / is this result smaller than 3
                                                    string a                / if so, then string a, e.g. 0 -> "0"
                                                             x 0            / if not, just return first character x[0]
                                "J"$                                        / cast to long
  "TRWAGMYFPDXBNJZSQVHLCKE"                                                 / the lookup table

মন্তব্য:

" "ত্রুটি পরিস্থিতিগুলিতে ফিরে আসে, এটি কারণ castালাই একটি শূন্য ফেরত দেয়, এবং সূচক নাল এ একটি স্ট্রিংয়ের মধ্যে সূচি একটি ফাঁকা চর। "!"^এটিকে আরও সুস্পষ্ট করতে যে কোনও ত্রুটি ঘটেছে আমি এটি শুরুতে (4) বাইট যুক্ত করতে পারলাম :

q){"!"^"TRWAGMYFPDXBNJZSQVHLCKE"("J"$$[3>a:"XYZ"?x 0;($)a;x 0],1_x)mod 23}"1231XX12"
"!"

1

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

f=i=>{c=+i[0];a=3;while(a--){i[0]=="XYZ"[a]&&(c=a)}b=7;while(b--){c= +i[7-b]+c*10}return "TRWAGMYFPDXBNJZSQVHLCKE"[c%23]}

console.log([f("00000010"),f("01234567"),f("98765432"),f("69696969"),f("42424242"),f("Z5555555"),f("Y0000369"),f("A1234567"),f("1231XX12")])


1

Japt , 50 বাইট

অন্যান্য পদ্ধতির বেশিরভাগের মতো।

ইনপুট এবং আউটপুট ছোট হাতের অক্ষর, undefinedঅবৈধ ইনপুট জন্য আউটপুট ।

`tr°gmyfpdxbnjzsqvhlcke`g("xyz"øUg)?Uc %4+UÅ:U %23

এটি
পরীক্ষা করুন সমস্ত বৈধ পরীক্ষার কেস পরীক্ষা করুন


1

মরিচা, 206 বাইট

আমি মনে করি না গল্ফ কোড গল্ফিংয়ের জন্য উপযুক্ত - -_-

let b=|s:&str|{s.chars().enumerate().map(|(i,c)|match i{0=>match c{'X'=>'0','Y'=>'1','Z'=>'2',_=>c},_=>c}).collect::<String>().parse::<usize>().ok().and_then(|x|"TRWAGMYFPDXBNJZSQVHLCKE".chars().nth(x%23))};

1

05 এ বি 1 ই , 41 40 39 বাইট

ć…xyz2ÝJ‡ìDd_i.ǝ}23%.•Xk¦fΣT(:ˆ.Îðv5•sè

ছোট হাতের ইনপুট নেয় (1 বাইট ইয়ে বাঁচাতে )

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

এসটিডিআরআর যদি ইনপুটটি ত্রুটিযুক্ত থাকে তবে মুদ্রণ করে

ব্যাখ্যা

ć…xyz2ÝJ‡ìDd_i.ǝ}23%.•Xk¦fΣT(:ˆ.Îðv5•sè
ć                                       # Get head of input and put the rest of the input under it on the stack
 …xyz                                   # Push xyz
     2ÝJ                                # Push 012
        ‡                               # Transliterate
         ì                              # Prepend to the rest of the input
          Dd_                           # Does the result contain something other than numbers?
             i.ǝ}                       # If so print input to STDERR
                 23%                    # Modulo 23
                    .•Xk¦fΣT(:ˆ.Îðv5•   # Pushes the character list
                                     sè # Get the char at the index of the modulo

0

ডায়ালগ এপিএল, 95 বাইট

{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}

এটি একটি মোনাডিক অপারেটর যা একটি চরিত্রের স্ট্রিংটিকে তার অপরেন্ড হিসাবে স্বীকার করে এবং এর ফলাফল প্রদান করে।

FIXME এটি এর ইনপুট চেক করে না। এটি সঠিকভাবে গল্ফ হয় না।

ব্যবহার:

    OP ← {'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}

      OP '01234567'
L

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