Обчисліть контрольну цифру за допомогою алгоритму Дамма


17

Існують популярні алгоритми контрольних цифр, такі як Лун, а потім є хороші , наприклад алгоритм Damm. Єдиною можливою причиною популярності таких алгоритмів, як Лун, є те, що існують кодові реалізовані їх реалізації. Це означає, що ми, як громада, маємо змогу змінювати світ, надаючи гольф-реалізація кращих алгоритмів.

Отже, ця задача полягає в тому, щоб змінити світ, написавши функцію або повну програму на обраній вами мові, яка обчислює контрольну цифру за допомогою алгоритму Damm . Відповідь з найменшою кількістю символів (не байтів) буде обрано переможцем через кілька тижнів. Зауважте, що всі допоміжні функції та декларація операційної таблиці повинні бути включені до числа символів. У разі вирівнювання буде обрана найпопулярніша відповідь.

Цей алгоритм обертається навколо операційної таблиці, яка повинна бути слабко цілком антисиметричною квазігрупою порядку 10. Операційна таблиця, яку можна знайти у статті Вікіпедії про алгоритм 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

Якщо коротко (детальніше див. Статтю у Вікіпедії ) алгоритм працює наступним чином:

  1. Ви починаєте зі списку цифр, які підлягають обробці, і проміжної цифри, яка встановлюється на 0.
  2. Для кожної цифри у списку ви обчислюєте нову проміжну цифру, використовуючи цифру як індекс стовпця, а попередню проміжну цифру - як індекс рядка.
  3. Кінцева проміжна цифра - контрольна цифра. Якщо ви перевіряєте число, на якому вже є додана контрольна цифра, остаточна проміжна цифра дорівнює 0, якщо число дійсне.

Ваша програма або функція повинна приймати рядок, який може містити будь-які символи, крім нуля, але він повинен стосуватися лише цифр у рядку. Він повинен або надрукувати (якщо програма), або повернути (якщо функція) початковий рядок із доданим розрахунковим контрольним розрядом. Якщо ви вирішили написати програму, програма може прийняти введення як аргумент або як стандартне введення. Якщо рядок введення порожній або не містить цифр, ви повинні повернути або додати нуль.

Деякі приклади:

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

Я з нетерпінням чекаю побачень на пієтах, які претендують на виграш.
Алхімік

Відповіді:


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

Пітон 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 символів.
монополь

1
Для того, щоб слідувати за одним твердженням, не потрібен новий рядок між ними. (-3)
seequ

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 та 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
Треба сказати, що я захоплююсь питанням використання сумнівної дірки в правилах, але я дійсно повинен роз'яснити правила для забезпечення включення декларації квазігрупи та декларації про будь-яку функцію допомоги в підрахунку символів .
Форс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.