Damm algoritmasını kullanarak bir kontrol basamağını hesaplama


17

Orada popüler tür Luhn olarak kontrol basamağı algoritmaları ve sonra orada iyi Damm algoritma örneğin, olanları. Luhn gibi algoritmaların popülaritesinin arkasındaki tek olası neden, bunların kodlu golf uygulamalarının mevcut olmasıdır. Bu, bir topluluk olarak, daha iyi algoritmaların golf uygulamalarını sunarak dünyayı değiştirme gücüne sahip olduğumuz anlamına gelir.

Dolayısıyla bu zorluk, Damm algoritmasını kullanarak bir kontrol basamağını hesaplayan, kendi dilinizde bir işlev veya tam bir program yazarak dünyayı değiştirmektir . En az sayıda karakter içeren (bayt değil) cevap birkaç hafta içinde kazanan olarak seçilecektir. Tüm yardım işlevlerinin ve işlem tablosunun bildiriminin karakter sayısına dahil edilmesi gerektiğini unutmayın. Beraberlik durumunda en popüler cevap seçilecektir.

Bu algoritma, zayıf bir şekilde tamamen anti-simetrik sıralı 10. sıraya sahip olması gereken bir operasyon tablosu etrafında döner . Damm algoritması hakkındaki Wikipedia makalesinde bulunabilen operasyon tablosu, bu meydan okumada kullanılacak olan çalışma tablosudur . Tamlık uğruna aşağıda çoğaltacağım:

    |   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

Kısacası (ayrıntılar için Wikipedia makalesine bakın ) algoritma aşağıdaki gibi çalışır:

  1. İşlenecek basamakların bir listesi ve 0 olarak ayarlanmış bir ara basamak ile başlarsınız.
  2. Listedeki her basamak için, rakamı sütun dizini olarak ve önceki ara basamağı satır dizini olarak kullanarak yeni bir ara basamak hesaplarsınız.
  3. Son ara hane kontrol basamağıdır. Zaten eklenmiş bir kontrol basamağı olan bir sayıyı doğrulıyorsanız, sayı geçerliyse son ara basamağı 0 olur.

Programınız veya işleviniz null dışında herhangi bir karakter içerebilen bir dize kabul etmelidir, ancak yalnızca dizedeki rakamlarla ilgilenmelidir. Hesaplanan kontrol basamağı eklenmiş olarak orijinal dizgiyi yazdırmalı (bir program varsa) veya döndürmeli (bir işlevse). Bir program yazmayı seçtiyseniz, program girişi bağımsız değişken veya standart girdi olarak kabul edebilir. Giriş dizesi boşsa veya herhangi bir rakam içermiyorsa, döndürmeniz veya sıfır eklemeniz gerekir.

Bazı örnekler:

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

Kazanmayı iddia eden Piet girişlerini görmek için sabırsızlanıyorum.
Simyacı

Yanıtlar:


3

Pyth, 49 karakter

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

Tanrı hangi karakterleri biliyor, bu yüzden yukarıdaki programı makinenizde doğru bir şekilde oluşturmak için bir Python3 programı:

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)))

Açıklama:

+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 karakter

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

Burada yazdırılamayan bir karakter var, bu nedenle aşağıdaki kalıcı bağlantıyı kullanmak isteyebilirsiniz.

Burada test edin.

açıklama

Ara basamak izlenir ve TCJam 0 olarak başlatır.

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, 149141134 karakter

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

Örnekler:

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

@MegaTom ve @Sieg'e toplam 11 karakteri kaldırmaya yardımcı oldukları için teşekkürler


2
10 * int (a) + int (i) int (a + i) 'dir, değil mi?
MegaTom

İyi bir nokta! Teşekkür ederim, bu 5 karakter kazandırır.
tekel

1
Çünkü tek bir ifadenin aralarında yeni bir satıra ihtiyacı yoktur. (-3)
seequ

2

Ruby, 149 karakter

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 üzerinde test edildi


2

J, 117 bayt

Yalnızca yazdırılabilir ascii içerir. (J ve unicode ile zorlandım.) Satırların permütasyon indekslerinden geçiş tablosunu oluşturur.

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'

Kullanımı:

   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

Burada çevrimiçi deneyin.


2

Haskell, 131 karakter

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])

Test sürüşü:

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

0

k, 36 karakter

/ 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 karakter (k'ye eşdeğer uygulama)

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

1
Kurallarda şüpheli bir döngü deliğinin kullanılmasına hayran olduğumu söylemeliyim, ancak yarı grubun deklarasyonunun ve karakter sayımına her türlü yardım fonksiyonunun deklare edilmesini zorunlu kılmak için kuralları açıklığa kavuşturmak zorundayım. .
Fors
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.