การแปลง ISBN-13 เป็น ISBN-10


21

บทนำ

ในการท้าทายนี้งานของคุณคือการสร้างรหัส ISBN-10 สำหรับหนังสือที่ระบุรหัส ISBN-13 โดยสมมติว่ามีรหัสดังกล่าวอยู่ รหัส ISBN-13 ดังกล่าวประกอบด้วยหลายส่วนโดยคั่นด้วย-:

978-GG-PPPP-TTT-C

ตัวอักษรG(กลุ่ม), P(ผู้เผยแพร่), T(ชื่อเรื่อง) และC(เช็คซัม) ทั้งหมดล้วนเป็นเลขตัวเดียว สำหรับจุดประสงค์ของการท้าทายนี้การจัดกลุ่มและการคำนวณC(ดูความท้าทายนี้ ) ไม่น่าสนใจและเราจะใส่เครื่องหมายยัติภังค์ทั้งหมดเพื่อให้งานนี้ง่ายขึ้น

หมายเลข ISBN-10 มีเค้าโครงคล้ายกันมาก:

GG-PPPP-TTT-c

ตัวอักษรG, PและTเป็นเช่นเดียวสำหรับ 13 หลักเลข ISBN แต่cจะแตกต่างกัน (และคำนวณโดยใช้ขั้นตอนวิธีการที่แตกต่างกัน) หลักcที่ถูกเลือกในลักษณะดังกล่าวที่เท่าเทียมกันต่อไปนี้ถือ (ตัวเลขในการสั่งซื้อ) A:

10*G + 9*G + 8*P + … + 3*T + 2*T + 1*c = 0 (mod 11)

ตัวอย่าง

ขอให้เราพิจารณาจำนวนไอ9780345391803: เพื่อให้ได้สอดคล้อง ISBN-10 รหัสของเราก็วางชั้นนำ978และการตรวจสอบผลผลิต3034539180

ต่อไปเราต้องคำนวณการตรวจสอบใหม่:

10*0 + 9*3 + 8*4 + 7*5 + 6*3 + 5*9 + 4*1 + 3*8 + 2*0 = 185

จำนวนถัดไปหารด้วย11คือ187ดังนั้นการตรวจสอบใหม่2จึงทำให้รหัส ISBN-10 ที่เกิด0345391802ขึ้น

กฎระเบียบ

  • ข้อมูลที่คุณป้อนจะมีหมายเลข ISBN-10 ที่ตรงกันเสมอ (เช่นมีความยาว 13 หลักและเริ่มต้นด้วย978)
  • ข้อมูลที่ป้อนไม่จำเป็นต้องเป็น ISBN-13 ที่ถูกต้อง (เช่น9780000000002)
  • คุณรับรองได้ว่า ISBN ที่ได้จะไม่จบลง X
  • คุณอาจรับข้อมูลเป็นจำนวนเต็มหรือสตริง (ไม่ว่าจะมีเครื่องหมายยัติภังค์) แต่ไม่อนุญาตให้ใช้รายการตัวเลขที่คำนวณล่วงหน้า
  • ผลลัพธ์ของคุณจะต้องเป็นหมายเลข ISBN-10 ที่ถูกต้อง (มีหรือไม่มีเครื่องหมายขีดคั่น)
  • ผลลัพธ์ของคุณอาจเป็นจำนวนเต็มหรือสตริง (ไม่มีรายการของตัวเลข)

Testcases

9780000000002 -> 0000000000
9780201882957 -> 0201882957
9781420951301 -> 1420951300
9780452284234 -> 0452284236
9781292101767 -> 1292101768
9780345391803 -> 0345391802

หมายเหตุเลขศูนย์นำหน้า!


5
มันไม่ได้ส่งผลกระทบต่อการแก้ปัญหาเลย แต่เพียงเพื่อให้เป็น Guy นั้นคำอธิบายของคุณว่าส่วนของ ISBN (-10 หรือ -13) นั้นแยกกันไม่ถูกต้องหรือไม่ องค์ประกอบกลุ่มการลงทะเบียนคือความยาวผันแปรและจำนวนหลักสำหรับชิ้นส่วนที่ตามมาอาจแตกต่างกันระหว่างและภายในกลุ่มการลงทะเบียน ตัวอย่างเช่นทั้งใน0-684-84328-5และ99921-58-10-7ส่วนแรก ( 0และ99921ตามลำดับ) คือกลุ่มการลงทะเบียนส่วนที่สองเป็นผู้จัดทำและอื่น ๆ
Jordan

5
10/10 ตัวเลือก ISBN ตัวอย่าง
จาคอบ

คำตอบ:


10

Retina ,  44  39 28 ไบต์

>,L3,-2`.+
.
$.>`**
_{11}

_

ลองออนไลน์!

คำอธิบาย

ถึงเวลาที่จะอวดคุณสมบัติใหม่ ๆ ของ Retina :)

>,L3,-2`.+

เราจับคู่อินพุตทั้งหมดด้วย.+คืนการจับคู่Lนั้น แต่เลือกเฉพาะอักขระ 3 (อิงศูนย์) ถึง -2 (สุดท้าย) รวม นอกจากนี้เรายังพิมพ์ผลลัพธ์โดยไม่มีการป้อนบรรทัดต่อท้าย ( >)

ทีนี้การลบสิ่งต่าง ๆ ใน Retina ก็น่ารำคาญนิดหน่อย แต่โชคดีที่เราทำงานแบบโมดูโล 11 ดังนั้นเราสามารถกลับค่าสัมประสิทธิ์ของการรวมเชิงเส้น (mod 11) และเพิ่มทุกอย่าง กล่าวอีกนัยหนึ่งถ้าข้อ จำกัด คือ:

10*G + 9*G + 8*P + … + 3*T + 2*T + 1*c = 0 (mod 11)

จากนั้นเราจะได้รับ:

c = 1*G + 2*G + 3*P + … + 8*T + 9*T (mod 11)

ที่ทำให้สิ่งต่าง ๆ มากมายที่นี่:

.
$.>`**

เราแทนที่ตัวละครแต่ละตัวด้วยสิ่งที่อยู่ด้านล่าง *เป็นตัวดำเนินการซ้ำซ้อนของ Retina มันขวาเชื่อมโยงและมีตัวถูกดำเนินการโดยนัย$&ทางด้านซ้ายและด้านขวาเพื่อทดแทนที่เป็นจริงสั้น_ สร้างสตริงของขีดเส้นใต้dโดยที่dคือตัวเลขที่เรากำลังแทนที่ จากนั้นคือความยาวของสตริงจนถึงและรวมถึงการแข่งขัน 1ดังนั้นการแสดงออกทั้งผลในการเป็นตัวแทนของคำที่nของการรวมเชิงเส้นของเรา$.>`*$&*_$&*_$.>`

_{11}

การทำแบบโมดูโลที่เกิดขึ้นจริงนั้นเป็นเรื่องที่ไม่น่าสนใจ: เราเพิ่งทำเครื่องหมายขีดล่างทั้งหมด 11 อัน

_

ในที่สุดเราจะนับจำนวนขีดล่างที่เหลืออยู่และพิมพ์ผลลัพธ์ซึ่งทำให้ ISBN-10 เสร็จสมบูรณ์


1จะ$.>`ให้ความยาวของสตริงจนถึงและรวมถึงการแข่งขันได้อย่างไร คุณอาจคุ้นเคยกับการ$`แทนที่ regex ซึ่งให้สตริงถึง (แต่ไม่รวม) การจับคู่ โดยการแทรก a >เราสามารถเปลี่ยนบริบทของ$`ไปที่ตัวคั่นระหว่างการแข่งขันปัจจุบันและถัดไป (ซึ่งเป็นสตริงว่างระหว่างตัวเลขปัจจุบันและถัดไป) ตัวคั่นนั้น$`จะรวมการแข่งขันปัจจุบัน ดังนั้นเป็นวิธีที่สั้นลงในการเขียน$>` $`$&ในที่สุดสำหรับ$xองค์ประกอบการทดแทนประเภททั้งหมดRetina ช่วยให้คุณแทรก a .หลัง$เพื่อให้ได้ความยาว


เวทมนตร์แบบโมดูโล 11 คืออะไร! นั่นจะช่วยฉัน 4 ไบต์ ... แต่ฉันไม่เข้าใจ!
ท้องถนน

1
@streetster โดยทั่วไป-2 ≡ 9 (mod 11)(เพราะการเพิ่มหรือลบ 11 จากตัวเลขจะไม่เปลี่ยน "value" ใน Congruence class mod 11) และนอกจากนี้และการคูณการเคารพคลาสความสอดคล้องดังนั้นคุณสามารถแทนที่ค่าใด ๆ ในการรวมกันเชิงเส้นด้วยค่าที่เทียบเท่าภายใต้โมดูโลปัจจุบัน เหตุผลที่ฉันพูดถึงจำนวนลบเป็นจริงเพียงว่าฉันได้จัดสมการใหม่ให้มีcด้านหนึ่งและอีกแง่หนึ่ง (เป็นค่าลบ) ที่อีกด้านหนึ่ง
Martin Ender

ฉันคิดว่าฉันได้รับแล้ว ดังนั้นคุณย้ายcไปกลายเป็น-c = ...และมากกว่าคูณด้วย10 9 8...คุณลบ11จากแต่ละที่จะได้รับ-1 -2 -3...และแล้วทุกอย่างคูณด้วย -1 cที่จะได้รับ
ท้องถนน

คุณจะอธิบายได้ไหมว่าเหตุใดขั้นตอนสุดท้ายจึงเป็นการแทนที่การขีดล่าง? ฉันใช้เวลาซักพักเพื่อค้นหาว่าอะไรเป็นสาเหตุของสิ่งนั้น แต่ดูเหมือนจะทำซ้ำไม่ได้ การอัปเดตนี้ดูน่าทึ่งมาก แต่ทำได้ดีมาก!
FryAmTheEggman

1
@FryAmTheEggman ขอบคุณ :) ณ จุดนี้สตริงมีขีดล่างเท่านั้น เราได้พิมพ์ตัวเลขเก้าหลักแรกในระยะแรกแล้ว
Martin Ender


5

PowerShell , 96 84 ไบต์

$y=-(([char[]]($x="$args"-replace'^978|.$')|%{--$a*[int]"$_"})-join'+'|iex)%11;$x+$y

ลองออนไลน์!

ใช้อินพุต"$args"ทำ regex -replaceเพื่อให้ได้เฉพาะส่วนที่เกี่ยวข้องเก็บที่$xเป็นสตริง จากนั้นเราก็โยนมันเป็นแบบcharอาเรย์และวนผ่านตัวอักษรแต่ละตัว ภายในลูปเราจะลดค่าลงล่วงหน้า$a(ซึ่งเป็นค่าเริ่มต้น0) และคูณออกตามการคำนวณค่าเช็คซัม สังเกตการส่งไปที่intอื่นจะใช้ค่า ASCII

จากนั้นเราก็-joinตัวเลขเหล่านั้นพร้อมกับ+ไพพ์ไปที่iex( Invoke-Expressionและคล้ายกับeval) เราใช้เวลาที่และร้านค้าที่เข้ามาตรวจสอบ%11 $yในที่สุดเราก็เรียงต่อกัน$x + $yและปล่อยให้มันอยู่ในท่อ เอาท์พุทเป็นนัย

บันทึก 12 ไบต์ด้วย Emigna


ฉันไม่รู้จัก powershell จริง ๆ แต่ฉันคิดว่าสิ่งนี้สามารถใช้งานได้สำหรับ 84
Emigna

@Emigna ใช่แน่นอน เลขคณิตโมดูลัสและสมองของฉันไม่ได้เล่นอย่างสวยงาม
AdmBorkBork

5

Octave , 46 41 39 37 bytes

@(a)[c=a(4:12) 48+mod(7+c*(1:9)',11)]

ลองออนไลน์!

โค้ดรับอินพุตเป็นสตริงและส่งคืนสตริง

รหัสแบ่งออกเป็นดังนี้:

@(a) สร้างฟังก์ชั่นที่ไม่ระบุชื่อ

เมื่อ[c=a(4:12) ... ]เราแยกอักขระที่เป็นรหัสหลักให้บันทึกสำเนาไว้cเพื่อใช้ในภายหลังและเพิ่มอีกหนึ่งสำเนาลงในสตริงเอาต์พุตสุดท้าย

จากวิธีที่ฉลาดในการ10:-1:2แปลงเป็น@ MartinEnter 1:10เราสามารถสร้างช่วงนั้นและแปลงให้เป็นเวกเตอร์คอลัมน์ได้อย่างง่ายดาย c*(1:10)'การคูณอาร์เรย์ของเวกเตอร์แถวcและเวกเตอร์คอลัมน์ช่วงใด นี่เทียบเท่ากับการคูณองค์ประกอบที่ฉลาดแล้วรวม

ปกติการตรวจสอบจะmod(11-sum,11)คำนวณจำนวนที่ต้องการสำหรับผลรวมเป็น 11 เท่าอย่างไรก็ตามเนื่องจากcเป็นสตริงอักขระผลรวมจะมีขนาดใหญ่กว่าที่ควรเป็น 2592 (48 * 54) เพราะเราคูณด้วยตัวเลข ที่มีขนาดใหญ่กว่า 48 ค่าที่แท้จริง

เมื่อเราดำเนินการแบบโมดูโลก็จะได้รับการกำจัดโดยอัตโนมัติทั้งหมด แต่ 7 ที่ 2592. 48+mod(7+sum,11)เช่นนี้และการบัญชีสำหรับการปฏิเสธของช่วงการคำนวณที่เกิดขึ้นจริงจะกลายเป็น เราเพิ่ม 48 เป็นผลลัพธ์เพื่อแปลงกลับเป็นอักขระ ASCII

อักขระเช็กซัมจะถูกต่อท้ายผลลัพธ์และค่าที่ส่งคืน


5

เยลลี่ 12 ไบต์

ṫ4ṖȮV€xJS%11

นี่เป็นโปรแกรมเต็มรูปแบบที่ใช้สตริงสำหรับ I / O

ลองออนไลน์!

มันทำงานอย่างไร

ṫ4ṖȮV€xJS%11  Main link. Argument: s (string of length 13)

ṫ4            Tail 4; discard the first three characters.
  Ṗ           Pop; discard the last characters.
   Ȯ          Output; print the result to STDOUT and return it.
    V€        Eval each; turn digit characters into digits.
       J      Indices; yield [1, ..., 13].
      x       Repeat the first digit once, the second digit twice, etc.
        S%11  Take the sum, modulo 11.
              (implicit) Print the checksum to STDOUT.

4

JavaScript (ES6), 59 56 ไบต์

s=>(s=s.slice(3,-1))+[...s].reduce(n=>n+s[i++]*i,i=0)%11

-3 ไบต์ขอบคุณที่@ ข้อเสนอแนะปุย



1
หรือแม้กระทั่ง56 ไบต์
Shaggy

เหตุใดจึงไม่ป้อนข้อมูลเป็นอาร์เรย์ของตัวเลข 54 ไบต์
tsh


3

Pyth , 16 ไบต์

%s.e*ksbpP>Q3hT

ลองที่นี่!

Pyth , 17 ไบต์

%s*VsMKpP>Q3SlK11

ลองที่นี่!

คำอธิบาย

%s.e*hksbpP>Q3hT || Full program. Uses string for input and output.

            Q    || The input.
           > 3   || With elements at indexes smaller than 3 trimmed.
          P      || Pop (remove the last item).
         p       || Print the result without a linefeed, but also return it.
  .e             || Enumerated map. For each (index, value), assign two variables (k, b).
       sb        || b converted to an integer.
    *hk          || And multiplied by k + 1.
 s               || Summation.
%                || Modulo by:
               T || The literal 10.
              h  || Incremented by 1.

3

Japt , 16 15 ไบต์

มาที่ผับนี้เมื่อคืนก่อนและลืมไปหมด

s3J
U+¬x_*°TÃuB

ลองมัน


คิดว่าคุณสามารถบันทึกไบต์ด้วยs3JและU+¬x_*°TÃuB
ETHproductions

แปลก; ฉันสาบานได้เลยว่า ขอบคุณ @ETHproductions
Shaggy

เดี๋ยวก่อนฉันลืมไปแล้วU- D'oh!
Shaggy

3

Hexagony , 77 61 ไบต์

,,,,'~'11=\.A&.=\./';"-'"{4.8}}\'.A.>.,<\'+'%!@}/=+'+{./&{{&/

ลองออนไลน์!


สี:


นี่คือรุ่นที่ใหญ่กว่า มีการข้ามเส้นทางบางส่วน แต่เนื่องจากเซลล์เหล่านั้นทั้งหมด.(ไม่มี op ใน Hexagony) คุณไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งเหล่านี้:

(ฉันพยายามเก็บกระจกเก่าไว้ด้วย แต่บางครั้งฉันต้องเปลี่ยนบางอย่าง)

คำสั่งเชิงเส้นที่ดำเนินการคือ:

,,,,'48}}
,
while memory > 0:
    ';"-'"{+'+{=A&=''A
    if memory < 0:
        undefined behavior
    &{{&}
    ,
'"''+~'11='%!@

คำอธิบาย: แทนที่จะรักษาตัวนับและทำการคูณที่แต่ละหลักโปรแกรมนี้:

  • เก็บตัวแปร "ผลรวมบางส่วน" และตัวแปร "ผลรวม" ( pและt)
  • สำหรับการอ่านแต่ละหลัก: เพิ่มลงในผลรวมบางส่วนและเพิ่มผลรวมบางส่วนไปยังผลรวม
  • พิมพ์(-p-t)%11ซึ่ง%จะส่งคืนผลลัพธ์ที่เป็นบวกเสมอ

3

K (oK) , 29 25 24 23 ไบต์

วิธีการแก้:

x,$11!7+/(1+!9)*x:-1_3_

ลองออนไลน์!

ตัวอย่าง:

x,$11!7+/(1+!9)*x:-1_3_"9780000000002"
"0000000000"
x,$11!7+/(1+!9)*x:-1_3_"9780345391803"
"0345391802"
x,$11!7+/(1+!9)*x:-1_3_"9781292101767"
"1292101768"
x,$11!7+/(1+!9)*x:-1_3_"9780452284234"
"0452284236"

คำอธิบาย:

ทำการประเมินผลจากขวาไปซ้าย

เคล็ดลับสองข้อที่นำมาจากโซลูชันอื่น ๆ :

  • คูณด้วย 1 2 3 ... แทน 10 9 8 ...
  • คูณค่า ASCII แล้วบวก 7 เข้ากับผลรวมเพื่อทำยอดคงเหลือ

ทำให้พังถล่ม:

x,$11!7+/(1+!9)*x:-1_3_ / the solution
                     3_ / drop three items from the start
                  -1_   / drop one item from the end
                x:      / save this as variable x
               *        / multiply by
         (    )         / all this together
            !9          / til, !9 => 0 1 2 3 4 5 6 7 8
          1+            / add 1 => 1 2 3 4 5 6 7 8 9
      7+/               / sum (+) over (/), start from 7
   11!                  / mod by 11
  $                     / convert back to a string
x,                      / join with x

หมายเหตุ:

  • -4 ไบต์ขอบคุณที่มาร์ตินเอ็นเดอร์ของ " เพียงแค่สลับสัมประสิทธิ์วิเศษ"
  • -1 ไบต์ขอบคุณTom Carpenterสำหรับการลบความจำเป็นในการแปลงเป็นจำนวนเต็ม (โดยการเพิ่ม7ไปยังผลรวม)
  • -1 ไบต์เริ่มต้นการสะสมที่ 7

3

C (gcc) 96 95 87 86 85 ไบต์

(-1 ขอบคุณที่แมวเพดาน)

*f(s,r,c,d)char*s,*r;{for(d=13;--d;s+=*++s<48)r=d>8?c=3,s:r,c-=~d**s;*s=58-c%11;s=r;}

ลองออนไลน์!

จะเรียกว่าเป็นf(s)โดยที่sตัวชี้ไปยังองค์ประกอบแรกของอาร์เรย์ตัวละครที่ปรับเปลี่ยนได้ ปรับเปลี่ยนอาร์เรย์อินพุตส่งคืนตัวชี้ไปยังอาร์เรย์อินพุต




2

ECMAScript 6 , 86 67 ไบต์

a=>(c=a.substr(3,9))+([...c].map(v=>g+=--i*v,e=i=g=11)?(e-g%e)%e:0)

ลองออนไลน์!


ขอบคุณสำหรับความคิดเห็นของ Arnauldเปลี่ยนจากreduceเป็นmapและกำจัดreturnคำหลัก


3
ยินดีต้อนรับสู่ PPCG! คำตอบจะต้องเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่เรียกได้ ฉันเชื่อว่าตัวเลือกที่สั้นที่สุดใน JavaScript มักเป็นแลมบ์ดาที่ไม่มีชื่อ
Martin Ender

@MartinEnder ขอบคุณฉันได้แก้ไขคำตอบของฉัน
Kos

3
ยินดีต้อนรับ! เคล็ดลับ: การเริ่มต้นตัวแปรสามารถจะใส่เป็นพารามิเตอร์พิเศษmap(), reduce()ฯลฯ ด้วยบางเขียนใหม่เพิ่มเติมก็มักจะเป็นไปได้ในการกำจัดและ{} returnนอกจากนี้ในกรณีนี้โดยเฉพาะอาจจะสั้นกว่าmap() reduce()( นี่คือรุ่น 65 ไบต์)
Arnauld

ฉันค่อนข้างแน่ใจว่าf=ไม่จำเป็น นอกจากนี้คุณสามารถเริ่มต้นcด้วยการแพร่กระจายสำหรับสิ่งนี้: a=>{i=10;s=[...c=a.substr(3,9)].reduce((g,v)=>+g+(i--)*v,0)%11;return c+=s?11-s:0}(-4 bytes)
Asone Tuhid

2

เรติน่า 0.8.2 , 72 51 ไบต์

...(.*).
$1¶$1
r`.\G
$&$'
r`.\G
$*
1{11}

¶(1*)
$.1

ลองออนไลน์! เพราะฉันยังไม่ได้เรียนรู้ Retina 1.0 คำอธิบาย:

...(.*).
$1¶$1

ลบอักขระที่ไม่ต้องการแล้วทำสำเนาที่สองของตัวเลขที่เหมาะสม

r`.\G
$&$'

เติมคำต่อท้ายแต่ละหลักในสำเนาที่สองด้วยคำต่อท้าย สิ่งนี้จะทำซ้ำแต่ละหลักอย่างมีประสิทธิภาพในคำต่อท้ายตามตำแหน่ง

r`.\G
$*

แปลงตัวเลขในสำเนาที่สองเป็น unary จึงเพิ่มเข้าด้วยกัน

1{11}

ลดโมดูล่า 11. (มีเพียง 9 หลักในสำเนาแรกดังนั้นสิ่งนี้จะไม่มีผลกับมัน)

¶(1*)
$.1

แปลงผลลัพธ์กลับเป็นทศนิยมและลบบรรทัดใหม่อีกครั้ง


2

APL (Dyalog Unicode) , 26 24 ไบต์

∊⍕¨(⊢,11|⊢+.×⍳∘≢)3↓¯1↓⍎¨

ลองออนไลน์!

ฟังก์ชั่นนำหน้า Tacit รับอินพุตเป็นสตริง

บันทึก 2 ไบต์ด้วย @ngn

อย่างไร?

∊⍕¨(⊢,11|⊢+.×⍳∘≢)3↓¯1↓⍎¨     Main function.
                       ⍎¨     Execute each; turns the string into a vector of digits.
                 3↓¯1        Drop (↓) the last 1) and the first 3 digits.
   (           ≢)             Tally; returns the number of digits in the vector.
             ⍳∘                Then (∘) index (⍳) from 1
            ×                 Multiply the resulting vector [1..9]
         ⊢+.                  Dot product with sum with the original vector;
                              This will multiply both vectors, and sum the resulting vector.
      11|                     Mod 11
     ,                        Concatenate
                             With the original vector
 ⍕¨                           Format each; returns a vector of digits as strings.
                             Flatten to get rid of the spaces.


1

Kotlin , 83 ไบต์

i.drop(3).dropLast(1).let{it+(11-(it.mapIndexed{i,c->(10-i)*(c-'0')}.sum()%11))%11}

เชิดชู

i.drop(3).dropLast(1).let {
    it + (11 - (it.mapIndexed { i, c -> (10 - i) * (c - '0') }.sum() % 11)) % 11
}

ทดสอบ

data class Test(val input: String, val output: String)

fun f(i: String) =

i.drop(3).dropLast(1).let{it+(11-(it.mapIndexed{i,c->(10-i)*(c-'0')}.sum()%11))%11}

val tests = listOf(
        Test("9780000000002", "0000000000"),
        Test("9780201882957", "0201882957"),
        Test("9781420951301", "1420951300"),
        Test("9780452284234", "0452284236"),
        Test("9781292101767", "1292101768"),
        Test("9780345391803", "0345391802")
)

fun main(args: Array<String>) {
    for (c in tests) {
        val answer = f(c.input)
        val good = answer == c.output
        println("$good ${c.input} -> ${c.output} | $answer")
    }
}

TIO

TryItOnline



1

PHP, 64 ไบต์

น่าเสียดายที่ใน PHP (-$c)%11เหมือนกับ-($c%11); ดังนั้นฉันจะต้องได้รับความแตกต่างไปอย่างน้อยผลรวมที่ใหญ่ที่สุดที่เป็นไปได้ (55 * 9 = 495 = 45 * 11) -$c%11แทนการใช้เพียง

for($f=11;--$f>1;print$d)$c+=$f*$d=$argn[13-$f];echo(495-$c)%11;

หรือ

for($c=45*$f=11;--$f>1;print$d)$c-=$f*$d=$argn[13-$f];echo$c%11;

ทำงานเป็นท่อที่มี-nRหรือลองพวกเขาออนไลน์


0

Java 10, 110 ไบต์

l->{var s=l+"";int c=0,i=3;for(;i<12;)c+=(13-i)*(s.charAt(i++)-48);return(l-(long)978e10)/10*10+(11-c%11)%11;}

รับอินพุตและเอาต์พุตเป็นlongจำนวนเต็ม ลองออนไลน์ที่นี่

เวอร์ชันที่ไม่ถูกปรับแต่ง:

l -> { // lambda taking a long as argument
    var s = l + ""; // convert the input to a String
    int c = 0, // the check digit
    i = 3; // variable for iterating over the digits
    for(; i < 12 ;) // go from the first digit past 978 to the one before the check digit
        c += (13 - i) * (s.charAt(i++) - 48); // calculate the check sum
    return (l - (long) 978e10) // remove the leading 978
           /10 *10 // remove the original check digit
           + (11 - c % 11) % 11; // add the new check digit
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.