Damm 알고리즘을 사용하여 확인 숫자 계산


17

있습니다 인기 등 Luhn과 같은 검사 숫자 알고리즘은 다음 거기에 좋은 당국이 알고리즘은 예를 들어, 사람. Luhn과 같은 알고리즘이 인기를 얻은 유일한 이유는 코드 골프 구현이 존재하기 때문입니다. 이는 커뮤니티로서 우리가 더 나은 알고리즘의 골프 구현을 제공함으로써 세상을 바꿀 힘을 가지고 있음을 의미합니다.

따라서이 과제는 Damm 알고리즘을 사용하여 검사 숫자를 계산하는 선택한 언어로 함수 또는 완전한 프로그램을 작성하여 세상을 바꾸는 것입니다 . 몇 주 안에 가장 적은 수의 문자 (바이트가 아님)를 가진 답이 승자로 선정됩니다. 모든 보조 기능 및 작업 테이블 선언은 문자 수에 포함되어야합니다. 동점 인 경우 가장 인기있는 답변이 선택됩니다.

이 알고리즘은 순서가 10 인 약칭 적으로 반대 칭적인 유사 그룹이어야하는 작업 테이블을 중심으로 진행됩니다. Damm 알고리즘에 대한 Wikipedia 기사 에서 찾을 수있는 작업 테이블 은이 문제에 사용됩니다. 완전성을 기하기 위해 아래에서 재현합니다.

    |   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)을 제외한 모든 문자를 포함 할 수있는 문자열을 허용해야하지만 문자열의 숫자에만 관련되어야합니다. 계산 된 확인 숫자가 추가 된 원래 문자열을 인쇄 (프로그램의 경우)하거나 반환 (기능의 경우)해야합니다. 프로그램 작성을 선택한 경우 프로그램은 입력을 인수 또는 표준 입력으로 승인 할 수 있습니다. 입력 문자열이 비어 있거나 숫자가없는 경우 0을 반환하거나 추가해야합니다.

몇 가지 예 :

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

승리를 주장하는 Piet 작품을 볼 수 있기를 기대합니다.
Alchymist

답변:


3

Pyth, 49 자

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

신이 어떤 문자를 알고 있는지 알고 있으므로 다음은 컴퓨터에서 위의 프로그램을 정확하게 생성하는 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, 149141138 문자

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

총 11자를 제거하는 데 도움을 준 @MegaTom과 @Sieg에게 감사합니다


2
10 * int (a) + int (i)는 int (a + i)입니까?
MegaTom

좋은 지적! 감사합니다. 5자를 절약 할 수 있습니다.
monopole

1
for 다음에 하나의 문장은 사이에 줄 바꿈이 필요하지 않습니다. (-3)
참조 :

2

루비, 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와 유니 코드로 어려움을 겪었습니다.) 행의 순열 표시에서 전이 테이블을 생성합니다.

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

하스켈, 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
나는 규칙에 의심스러운 허점을 사용하는 것에 감탄한다고 말해야하지만, 준 그룹의 선언과 문자 수에 도움이되는 모든 종류의 선언을 포함시키기 위해 규칙을 명확히해야합니다. .
Fors
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.