คำนวณตัวเลขเช็คโดยใช้อัลกอริทึม Damm


17

มีอัลกอริทึมตรวจสอบตัวเลขที่เป็นที่นิยมเช่น Luhn และจากนั้นก็มีคนดีเช่นอัลกอริทึม Damm เหตุผลที่เป็นไปได้เพียงอย่างเดียวที่อยู่เบื้องหลังความนิยมของอัลกอริทึมเช่น Luhn ก็คือมีการใช้โค้ดที่มีอยู่ของพวกเขา ซึ่งหมายความว่าเราในฐานะชุมชนมีพลังที่จะเปลี่ยนแปลงโลกด้วยการนำเสนออัลกอริทึมที่ดีกว่า

ดังนั้นความท้าทายนี้คือการเปลี่ยนแปลงของโลกโดยการเขียนฟังก์ชั่นหรือโปรแกรมที่สมบูรณ์ในภาษาของคุณเลือกที่คำนวณตรวจสอบหลักโดยใช้อัลกอริทึม Damm คำตอบที่มีจำนวนอักขระน้อยที่สุด(ไม่ใช่ไบต์) จะถูกเลือกให้เป็นผู้ชนะในอีกไม่กี่สัปดาห์ โปรดทราบว่าฟังก์ชั่นช่วยเหลือทั้งหมดและการประกาศของตารางการดำเนินการจะต้องรวมอยู่ในการนับจำนวนตัวอักษร ในกรณีที่เสมอคำตอบที่ได้รับความนิยมจะถูกเลือก

อัลกอริทึมนี้หมุนรอบโต๊ะการดำเนินการซึ่งจะต้องเป็นกลุ่มการต่อต้านแบบสมมาตรที่อ่อนแออย่างสิ้นเชิงทั้งหมดของลำดับที่ 10 ตารางการทำงานที่สามารถพบได้ในบทความ Wikipediaเกี่ยวกับอัลกอริทึม Damm คือสิ่งที่จะใช้ในการท้าทายนี้ เพื่อความสมบูรณ์ฉันจะทำซ้ำด้านล่าง:

    |   0   1   2   3   4   5   6   7   8   9
----+----------------------------------------
0   |   0   3   1   7   5   9   8   6   4   2
1   |   7   0   9   2   1   5   4   8   6   3
2   |   4   2   0   6   8   7   1   3   5   9
3   |   1   7   5   0   9   8   3   4   2   6
4   |   6   1   2   3   0   4   5   9   7   8
5   |   3   6   7   4   2   0   9   5   8   1
6   |   5   8   6   9   7   2   0   1   3   4
7   |   8   9   4   5   3   6   2   0   1   7
8   |   9   4   3   8   6   1   7   2   0   5
9   |   2   5   8   1   4   3   6   7   9   0

ในระยะสั้น (สำหรับรายละเอียดดูบทความ Wikipedia ) อัลกอริทึมทำงานดังต่อไปนี้:

  1. คุณเริ่มต้นด้วยรายการของตัวเลขที่จะประมวลผลและหลักระหว่างนั้นซึ่งถูกตั้งค่าเป็น 0
  2. สำหรับทุกหลักในรายการคุณคำนวณตัวเลขระหว่างกาลใหม่โดยใช้ตัวเลขเป็นดัชนีคอลัมน์และตัวเลขระหว่างกาลก่อนหน้าเป็นดัชนีแถว
  3. ตัวเลขระหว่างกาลสุดท้ายคือเลขที่เช็ค หากคุณกำลังตรวจสอบความถูกต้องของตัวเลขที่มีตัวเลขการตรวจสอบที่เพิ่มแล้วหลักระหว่างกาลสุดท้ายคือ 0 ถ้าหมายเลขนั้นถูกต้อง

โปรแกรมหรือฟังก์ชั่นของคุณต้องยอมรับสตริงที่สามารถมีอักขระใด ๆ ยกเว้น null แต่ควรเกี่ยวข้องกับตัวเลขในสตริงเท่านั้น มันจะต้องพิมพ์ (ถ้าโปรแกรม) หรือคืน (ถ้าฟังก์ชั่น) สตริงเดิมที่มีการตรวจสอบตัวเลขที่คำนวณได้ผนวก หากคุณเลือกที่จะเขียนโปรแกรมโปรแกรมอาจยอมรับอินพุตเป็นอาร์กิวเมนต์หรืออินพุตมาตรฐาน หากสตริงอินพุตว่างเปล่าหรือไม่มีตัวเลขใด ๆ คุณต้องส่งคืนหรือผนวกศูนย์

ตัวอย่างบางส่วน:

Input       |   Output
------------+-------------
42          |   427
427         |   4270
2 to 2      |   2 to 29
23 42 76-   |   23 42 76-5
-           |   -0

ฉันหวังว่าจะได้เห็นรายการ Piet อ้างว่าชนะ
เล่นแร่แปรธาตุ

คำตอบ:


3

Pyth, 49 ตัวอักษร

+z`u@sm>+0jCdT_6"Ľ򒉲򭉟񶯆𐱩򐞆󰆂򕟐򑽌򵋏󇋽򯴆󚙈𱑂񞑼쵥񪨶"+*TGvH:z"\D"k0

มี god รู้ว่าตัวละครคืออะไรดังนั้นนี่คือโปรแกรม Python3 เพื่อสร้างโปรแกรมดังกล่าวบนเครื่องของคุณอย่างถูกต้อง:

N = 317598642709215486342068713591750983426612304597836742095815869720134894536201794386172052581436790
M = 1000000
l = []
while N:
    l.insert(0, N % M)
    N //= M

n = "".join(chr(c) for c in l)

s = '+z`u@sm>+0jCdT_6"' + n + '"+*TGvH:z"\D"k0'

with open("golf.pyth", "wb") as f:
    f.write(s.encode("utf-8"))

print("Program length is {} characters.".format(len(s)))

คำอธิบาย:

+z`                                     Output the input followed by a
                                        stringified...
   u                         :z"\D"k0   Reduction starting with 0 of digits
                                        in input...
    @                  +*TGvH           Indexing ... by 10*prev + int(next).
     sm         "ZALGO"                 Sum all digits created by ... over the
                                        unicode garbage.
       >+0     6                        Prepend 0 if needed to...
          jCdT_                         Codepoint converted to sequence of
                                        digits.

3

CJam, 54 ตัวอักษร

q_o{A,s&},{~0"끼´慜䪝膞䝮芜㮜ꡞ靓渏縰蒆㣉倔쵶"2G#bAb+A/T==:T;}/T

มีอักขระที่ไม่สามารถพิมพ์ได้หนึ่งตัวในนั้นดังนั้นคุณอาจต้องการใช้ลิงก์ด้านล่าง

ทดสอบที่นี่

คำอธิบาย

กำลังติดตามตัวเลขหลักชั่วคราว Tซึ่ง CJam เริ่มต้นที่ 0

q_o                                  "Read STDIN, duplicate it and print it.";
   {A,s&},                           "Filter out all non-digit characters.";
          {                     }/   "For each digit character.";
           ~                         "Eval to get the digit itself.";
            0                        "Push a zero.";
             "..."2G#b               "Push that long string and interpret the character
                                      codes as the digits of a base-2^16 number.";
                      Ab+            "Get base-10 digits and prepend the 0.";
                         A/          "Split into rows of 10.";
                           T=        "Select row based on interim digit.";
                             =       "Select column based on current digit.";
                              :T;    "Store in T and discard.";
                                   T "Push the interim digit to be printed.";

3

Python 3, 149 141 138 ตัวอักษร

import re
l=""
for c in"ĽᝢႮ⏿ዿၮ∉᜝Ꮺൢ៫Njẜ᳼╭᛭ᰡඡᆸߡⓞ᠜ȍ῏᪆":l+="%04d"%ord(c)
def D(b):
 a="0"
 for i in re.sub("\D","",b):a=l[int(a+i)]
 return b+a

ตัวอย่าง:

 Input | Output
-------+--------
    42 | 427
   427 | 4270
2 to 2 | 2 to 29
   123 | 1234
  1234 | 12340
     - | -0

ขอขอบคุณ @MegaTom และ @Sieg ที่ช่วยในการลบอักขระทั้งหมด 11 ตัว


2
10 * int (a) + int (i) คือ int (a + i) ใช่ไหม?
MegaTom

จุดดี! ขอบคุณที่ช่วยประหยัด 5 ตัวอักษร
monopole

1
ตามด้วยคำสั่งเดียวไม่จำเป็นต้องขึ้นบรรทัดใหม่ในระหว่าง (-3)
seequ

2

Ruby, 149 ตัวอักษร

i="0";t="0#{'2uleblnnz0nbpv3kqkaufbjqebm57jdj6ubaba1mc2fyucqff69tbllrcvw393li'.to_i 36}";puts(gets.chomp.each_char{|c|i=(c=~/\d/?t[(i+c).to_i]:i)}+i)

ทดสอบบนrepl.it


2

J, 117 ไบต์

มี ascii ที่พิมพ์ได้เท่านั้น (ฉันมีช่วงเวลาที่ยากลำบากกับ J และ unicode) สร้างตารางการเปลี่ยนแปลงจากดัชนีเรียงลำดับของแถว

3 :'y,":(((_4(87)&#:inv\40-~a.i.''(3/3+wGf*Dl:(zaW+Hhw*(1p+;~.,y>m-<MZ)JCs'')A.i.10){~<@,~)/|.0,(#~10>])(1":i.10)i.y'

การใช้งาน:

   damm=.3 :'y,":(((_4(87)&#:inv\40-~a.i.''(3/3+wGf*Dl:(zaW+Hhw*(1p+;~.,y>m-<MZ)JCs'')A.i.10){~<@,~)/|.0,(#~10>])(1":i.10)i.y'

   damm '23 42 76-'
23 42 76-5

   damm ''
0

ลองออนไลน์ได้ที่นี่


2

Haskell, 131 ตัวอักษร

import Data.Char
f n=n++(show$foldl(\x y->read[('0':(show.ord=<<"౧⚈ક×ዿၮ∉ɏᵕₖ᧔İɕSʢ凞㷽ᰡ衎텴䘗↩倭῏᪆"))!!(x*10+y)])0[read[i]|i<-n,isDigit i])

ทดสอบการทำงาน:

> mapM_ (putStrLn.f) ["42", "427", "2 to 2", "23 42 76-", "-"]
427
4270
2 to 29
23 42 76-5
-0

0

k, 36 ตัวอักษร

/ declare quasi-group  
M:"H"$'"0317598642709215486342068713591750983426612304597836742095815869720134894536201794386172052581436790"

/ declare function
  f:{x,$0{M y+10*x}/"H"$'x@&x in .Q.n}

/ get length of function
  #$f
36

/ execute function against test input
  .q.show f@'{x!x}("42";"427";"2 to 2";"23 42 76-";,"-")
"42"       | "427"
"427"      | "4270"
"2 to 2"   | "2 to 29"
"23 42 76-"| "23 42 76-5"
,"-"       | "-0"

q, 40 ตัวอักษร (เทียบเท่ากับ k)

 f:{x,string 0{M y+10*x}/"H"$'x inter .Q.n}

1
ฉันต้องบอกว่าฉันชื่นชมการใช้วนลูปที่น่าสงสัยในกฎ แต่ฉันต้องชี้แจงกฎให้ชัดเจนเพื่อรวมการประกาศของ quasi-group และการประกาศฟังก์ชันช่วยเหลือใด ๆ ในการนับจำนวนอักขระ .
Fors
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.