用于验证信用卡号等的Luhn算法


49

挑战

编写最短的程序或函数以计算用于验证(信用卡)号码的Luhn算法

Luhn算法解释

在RosettaCode中,为此挑战指定了该算法,其示例输入为49927398716

Reverse the digits, make an array:
    6, 1, 7, 8, 9, 3, 7, 2, 9, 9, 4
Double the numbers in odd indexes:
    6, 2, 7, 16, 9, 6, 7, 4, 9, 18, 4
Sum the digits in each number:
    6, 2, 7, 7, 9, 6, 7, 4, 9, 9, 4
Sum all of the numbers:
    6 + 2 + 7 + 7 + 9 + 6 + 7 + 4 + 9 + 9 + 4 = 70
If the sum modulo 10 is 0, then the number is valid:
    70 % 10 = 0 => valid

IO规则

输入:您选择的语言输入/输出格式的字符串或数字(您的选择)

输出真实或错误的值,分别表示根据上述测试输入是否有效。

注释/提示

  • 如果使用它们来测试,请尽量不要意外发布您自己的信用卡或帐号:)

  • 如果输入无效并且无法使用指定的算法进行处理(即太短而无法使用),则可以执行所需的任何操作,包括炸毁我的计算机。

  • 但是,前面的符号并不意味着您的语言可以使用太大而无法处理的Numbers来完成您想要的任何事情。如果您的语言无法处理测试用例,请考虑采用字符串作为输入。

例子

以下示例已使用此Python脚本进行了验证;如果您认为错误或有疑问,请ping @cat。

49927398716      True
49927398717      False
1234567812345670 True    
1234567812345678 False
79927398710      False
79927398711      False
79927398712      False
79927398713      True
79927398714      False
79927398715      False
79927398716      False
79927398717      False
79927398718      False
79927398719      False
374652346956782346957823694857692364857368475368 True
374652346956782346957823694857692364857387456834 False
8 False **
0 True  **

**根据Python实现,但是您可以执行任何操作,因为这些时间太短,无法严格遵守规范。


如果上述任何方法使现有答案无效(尽管我认为这不可能),则这些答案仍然有效。但是,新的答案为了有效,应遵循上面的说明。

排行榜

Answers:


21

Golfscript-24个字符

-1%{2+0!:0)*109%+}*10%8=

说明:

  1. -1% 反转字符串
  2. {开始一个块(我们将其用作循环)。字符串中的每个字符都按其ascii值进行推送。
    1. 2+ 加2。(一个数字的ascii值为48 + n,所以我们现在有50 + n,最后一个数字为n)
    2. 0!:0 反转0的值并将其存储(所有都是变量),因此在第一次迭代中有1,在第二次迭代中有0,依此类推。
    3. )* 向此值加1并将其相乘,因此我们先乘以2,然后乘以1,然后乘以2,依此类推。
    4. 109% 余数取模109。这仅影响值5-9(已加倍)并将其减小为正确值。
    5. + 将此值添加到运行总和
  3. }*结束该块并执行“折叠”操作。首先,第一个字符被按下(由于我们已经反转了,所以这是校验位)。然后,交替推动并执行该块。因此,我们将第一个字符的ascii值用作运行总和的起始值。
  4. 10% 将余数取模10
  5. 8= 如果值为8,将返回1。我们使用此方法是因为我们没有规范化第一个被压入的字符(校验位)。

可能有人以为我们可以通过更改为8-而不是使用2+保存字符,除非我们需要添加一个空格以使减号(而不是)。109%89%--0


11

GolfScript,44个字符

-1%{16%}%2/1,\+{(\.{0=2*.9>9*-+}{;}if+}*10%!

精选评论

有趣的是,下面的前两项展示了该%运算符的三种完全不同的用法:数组选择,映射和mod。大多数GolfScript运算符是“上下文敏感的”,根据参数的类型,它们的行为迥然不同。

  1. -1%反转字符串。这很重要,因为数字对是从右边开始计数的。
  2. {16%}% 通过将16修改为所有ASCII数字,将其转换为数字。
  3. 2/ 将数组分成2组。
  4. 1,是一种便宜的做法[0]
  5. \+有效地将0附加到digits数组。它通过交换然后进行连接来实现。

0之前是为下一步折叠而准备的。GolfScript的折叠不使用显式的初始值,而是使用数组中的第一项作为初始值。

现在,让我们看一下实际的折叠功能。此函数有两个参数:折叠值和数组中的当前项(在此情况下,数组为2或(通常为1),因为数组2/较早)。假设参数为1 [2 3]

  1. (\.拆分最左边的数组元素,将剩余的数组移到最前面,然后复制它。堆栈现在看起来像:1 2 [3] [3]
  2. if检查该数组为空(这是用于与奇数大小帐号处理时在最后一组的情况下)。如果是这样,则不会进行任何特殊处理(只需弹出空数组)。
  3. 对于一个均匀的组:
    1. 0= 获取数组的第一个(在这种情况下,只有这种情况)元素。 1 2 3
    2. 2* 将数字加倍。 1 2 6
    3. .9>9*- 如果数字大于9,则从数字中减去9。实现为:复制数字,与9进行比较,将结果(0或1)乘以9,然后相减。 1 2 6
    4. + 最后将其添加到第一个数字中。 1 8
  4. +(在之后if),将的结果if与原始值相加,得到新的折叠值。

折叠完成后,我们简单地对10(10%)进行mod 运算,然后对结果(!)求反,以便在总和为10的倍数时返回1。


这似乎为维基百科(49927398716)上的示例编号返回0
gnibbler'2

纳米 我忘了使用echo -n
gnibbler

1
@gnibbler:哈哈,失败。:-P(严重的是,在我的初次测试中,我也被它吓了一跳。)
Chris Jester-Young

1
这里有一些地方可以保存一些简单的字符。-1% 2/可以合并为-2/1,可以替换为0(将0强制转换为数组,然后+将其连接)。9>9*-可以替换为9>+(因为我们只关注最后一位)。同样,奇数长度的检查有点长,使用.,2%,\+时间更短。完成此操作后,我们还可以更改{16%}%(\0=进入{16}/(在循环内部)。完成所有这些操作后,它看起来将如下所示:.,2%,\+-2/0\+{{16%}/2*.9>+++}*10%!
Nabb 2011年

@Nabb:谢谢!我会将这些内容合并到我的解决方案中,尽管看起来您已经遇到了麻烦。:-)
Chris Jester-Young


10

Python 3,77个字节

c=lambda a:sum(sum(divmod(int(a[-e-1])<<e%2,10))for e in range(len(a)))%10==0

9

C#119个字符:

bool l(string n){return(String.Join("",n.Reverse().Select((x,i)=>(x-48)*(i%2<1?1:2)+"").ToArray()).Sum(x=>x-48))%10<1;}

不是糟糕的是静态类型语言代码高尔夫的n00b,我希望。

可以减少到100

bool l(string n){return String.Join("",n.Reverse().Select((x,i)=>(x-48)*(i%2+1))).Sum(x=>x+2)%10<1;}

这是一个好主意,也是一种有趣的方法,但似乎没有用。至少我的一些测试没有。看起来您的第一个lambda中的“ i”应该是字符串中字符的索引。这样行得通吗?如果是这样,为什么只反转字符串然后根据索引位置对其进行修改?似乎有点多余,不是吗?
Nellius

我只测试了我的一张信用卡,还有几张因TBH而出错。(使用VS 2008调试器)该算法应该从LAST位数开始每隔第二个位数加倍。如果我不反转字符串,那么对于奇数长度的字符串将是不正确的。
mootinator

原来我确实有i%2<1?1:2倒退的结果。谢谢。
mootinator

8

Golfscript-34个字符

{15&}%.-2%\);-2%{.+(9%)}%+{+}*10%!

维基百科第4992739871页的示例编号

{15&}%  does a bitwise and of each ascii digit with 00001111
        now I have a list of digits 
        [4 9 9 2 7 3 9 8 7 1 6]
.       makes a copy of the list, now I have two identical lists
        [4 9 9 2 7 3 9 8 7 1 6] [4 9 9 2 7 3 9 8 7 1 6]
-2%     like [::-2] in python takes every second element in reverse
        [4 9 9 2 7 3 9 8 7 1 6] [6 7 9 7 9 4]
\       swap the two lists around
        [6 7 9 7 9 4] [4 9 9 2 7 3 9 8 7 1 6]
);      drop the last digit off the list
        [6 7 9 7 9 4] [4 9 9 2 7 3 9 8 7 1]
-2%     same as before
        [6 7 9 7 9 4] [1 8 3 2 9]
{       for each item in the list ...
.+      ... double it ...
(       ... subtract 1 ...
9%      ... mod 9 ...
)}%     ... add 1 ...
        [6 7 9 7 9 4] [2 7 6 4 9]
+       join the two lists
        [6 7 9 7 9 4 2 7 6 4 9]
{+}*    add the elements up
        70
10%     mod 10
        0
!       invert the result
        1

.+(9%)是非常有创意的(对我来说,反正)。我喜欢!+1
克里斯·杰斯特·杨

不过,很遗憾,GolfScript需要分区运算符,因此您无需执行此“删除最终项目并重复”的废话。:-)
克里斯·杰斯特·杨

1
@Chris,我在多年前就知道了“铸造九”。这是仔细检查
长期

3
这对于将值0加倍(0(9%)是9而不是0)不起作用。
Nabb 2011年

8

PHP,108字节

<?function v($s,$t=0){for($i=strlen($s);$i>=0;$i--,$c=$s[$i])$t+=$c+$i%2*(($c>4)*-4+$c%5);return!($t % 10);}

7

Ruby-85个字符

def f s
l=s.size
s.chars.map{|k|(i=k.to_i*((l-=1)%2+1))%10+i/10}.inject(:+)%10==0
end

你可能知道这一点,但你可以做的.sum代替.inject的(:+)来保存7个字节
哈佛尼加德

7

Haskell,96个字节

必须有一个更好/更短的方法,但这是我用96个字符表示的Haskell解决方案:

l=(==0).(`mod`10).sum.zipWith($)(cycle[id,\x->x`mod`5*2+x`div`5]).reverse.map((+(-48)).fromEnum)

可悲的是,该digitToInt功能只能在您import Data.Char首先使用时使用。否则,我可以通过更换下来到88个字符((+(-48)).fromEnum)使用digitToInt


6

Windows PowerShell,82

filter f{!((''+($_[($_.length)..0]|%{+"$_"*($i++%2+1)})-replace'.','+$&'|iex)%10)}

历史:

  • 2011-02-13 03:08(84)第一次尝试。
  • 2011-02-13 12:13(82)我不需要参加,因为空格不会伤害您。+1 + +3仍然可以评估。

5

问63

{0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}

用法

q){0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}"79927398711"
0b
q){0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}"79927398712"
0b
q){0=mod[(+/)"I"$(,/)($)($)@["I"$'x;1+2*'(!)(_)((#)x)%2;*;2];10]}"79927398713"
1b

47个字节,{0=mod[sum"J"$raze($)($)x*#:[x]#1 2]10}"I"$'(|)以另一种方式使奇数索引加倍。
streetster

5

D,144字节

bool f(S)(S s){int t(C)(C c){return to!int(c)-'0';}int n,v;foreach(i,c;array(retro(s))){v=i&1?t(c)*2:t(c);n+=v>=10?v%10+v/10:v;}return n%10==0;}

更清晰:

bool f(S)(S s)
{
    int t(C)(C c)
    {
        return to!int(c) - '0';
    }

    int n, v;

    foreach(i, c; array(retro(s)))
    {
        v = i & 1 ? t(c) * 2 : t(c);

        n += v >= 10 ? v % 10 + v / 10 : v;
    }

    return n % 10 == 0;
}

5

APL,28 个字节

{0=10|+/⍎¨∊⍕¨v×⌽2-2|⍳⍴v←⍎¨⍵}

分解图

{                     v←⍎¨⍵}  ⍝ turn the string into a numeric vector of its digits, v
                2-2|⍳⍴v       ⍝ make a vector of the same length, with 2 in every 2nd place
             v×⌽              ⍝ multiply it with v, starting from the right
          ∊⍕¨                 ⍝ turn each component into a string and collect all the digits
      +/⍎¨                    ⍝ turn each digit again into a number and sum them
 0=10|                        ⍝ check whether the sum is a multiple of 10

例子

      {0=10|+/⍎¨∊⍕¨v×⌽2-2|⍳⍴v←⍎¨⍵} '79927398713'
1
      {0=10|+/⍎¨∊⍕¨v×⌽2-2|⍳⍴v←⍎¨⍵} '123456789'
0

1
-2:{0=10|+/⍎¨∊⍕¨⍵×⌽2-2|⍳⍴⍵}⍎¨
亚当

4

PowerShell 123

filter L($x){$l=$x.Length-1;$l..0|%{$d=$x[$_]-48;if($_%2-eq$l%2){$s+=$d}elseif($d-le4){$s+=$d*2}else{$s+=$d*2-9}};!($s%10)}

4

Perl,46 42 41字节

包括+1的 -p

在STDIN上输入:

luhn.pl <<< 79927398713

luhn.pl

#!/usr/bin/perl -p
s%.%$=-=-$&-$&*1.2*/\G(..)+$/%eg;$_=/0$/

您能解释一下这是如何工作的吗?您似乎在减少比赛次数,然后再减少比赛时间1.2,但只在正确的位置。为什么是1.2?不是$=-=-$&-$&*/\G(..)+$/吗?
msh210 '16

3
@ msh210:它将乘以2的效果编码。0..4* 2给出0, 2, 4, 6, 85..9给出10,12,14,16,18哪个和1 3 5 7 9的最后几位与11 13 15 17 19哪些数字相同,0..9 * 2.2就像您将其截断为整数一样。第一个$&已经贡献了一个因子1,因此1.2仍然需要进行修正。$=只能包含整数,并且以以0结尾的值开头,因此需要进行截断。负值是必需的,因为/\G/正则表达式会更改$&评估堆栈上的任何内容,因此需要对其进行更改
Ton Hospel

哦。辉煌!并感谢您的解释。
msh210 '16

3

JavaScript(ES6),61个字节

不竞争,因为JavaScript在2011年大为不同。

的数字之和2*n2*n如果n in 0..42*n-9如果n in 5..9。也就是说,所有的总和都可以一步计算。

s=>!([...s].reduceRight((t,d)=>t-d-i++%2*(d>4?d-9:d),i=0)%10)

3

果冻12 11字节

ṚḤJḤ$¦DFS⁵ḍ

在线尝试!(包含所有测试用例)

这个怎么运作

ṚḤJḤ$¦DFSḍ⁵  - Main link. Argument: n (integer) e.g. 49927398716
Ṛ            - Reverse. Casts a number to digits     [6, 1, 7, 8, 9, 3, 7, 2, 9, 9, 4]
     ¦       - Sparse application. Apply the next command to the given indicies
 Ḥ           -   Command: Double
    $        -   Indicies:
  J          -     range(length)...                  [1, 2 , 3, 4, 5, 6, 7, 8, 9, 10, 11]
   Ḥ         -     doubled.                          [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
             - Doubles elements at odd indicies      [6, 2, 7, 16, 9, 6, 7, 4, 9, 18, 4]
      D      - Split each into digits                [6, 2, 7, [1, 6], 9, 6, 7, 4, 9, [1, 8], 4]
       F     - Flatten                               [6, 2, 7, 1, 6, 9, 6, 7, 4, 9, 1, 8, 4]
        S    - Sum                                   70
          ḍ  - Divisible by... 
         ⁵   -   10?                                 1

或者,对于12个字节:

ṚḤJḤ$¦DFSḍ@⁵

3

8086组装,IBM PC DOS,29 28 25 23字节

; Perform LUHN check
; Input: SI = card num string, CX = length
; Output: ZF = 1 if valid, ZF = 0 if not valid
    LUHN    MACRO
            LOCAL DIGIT_LOOP, EVEN
03 F1       ADD  SI, CX         ; start at end of input string 
FD          STD                 ; set LODSB direction to decrement 
    DIGIT_LOOP:
AC          LODSB               ; load next digit into AL, decrement SI
2C 30       SUB  AL, '0'        ; convert ASCII char to binary value 
F7 DA       NEG  DX             ; flip DX to alternate odd/even index
78 06       JS   EVEN           ; if even index, do not double and sum digits 
D0 E0       SHL  AL, 1          ; double the value 
D4 0A       AAM                 ; BCD convert to split digits (ex: 18 = 12H --> 0108H) 
02 DC       ADD  BL, AH         ; add tens digit to running sum 
    EVEN:
02 D8       ADD  BL, AL         ; add ones digit to running sum 
E2 ED       LOOP DIGIT_LOOP 
93          XCHG BX, AX         ; sum is in BL, move to AL for conversion
D4 0A       AAM                 ; BCD convert AL, set ZF=1 if low digit is 0
    ENDM

使用(滥用)x86的BCD到二进制指令来处理单个数字的拆分和modulo 10检查。事实证明,AAMAAD指令可以对字节值进行BCD /二进制转换(可能非常方便),尽管它们没有被记录或描述为一般执行该功能。

对于所有的官方IBM / MS DOS版本,AX并且BX被初始化为0000在启动时(REFREF)和DXCS,这是这样保证是非零正和一个12位的值。这就是我们可以保证BX0并且可以翻转/翻转DX以确定奇数/偶数位的方式。

输出示例:

在此处输入图片说明

下载LUHN.COM IBM PC DOS测试程序。


2

斯卡拉:132

def q(x:Int)=x%10+x/10
def c(i:String)={val s=i.reverse
(s(0)-48)==10-(s.tail.sliding(2,2).map(n=>(q((n(0)-48)*2)+n(1)-48)).sum%10)}

调用:

c("79927398713")
  • 反向(“ 79927398713”)= 31789372997
  • s(0),s.tail:(3)(1789372997)
  • 滑动(2,2)=(17 89 37 29 97)
  • 映射(q((n(0)-48 * 2 + n(1)-48))=> q(('1'-'0')* 2)+'7'-'0')= 1 * 2 + 7

2

JavaScript 1.8:106个字符

这是我找到这篇文章之前想出的原始解决方案:

function(n){return!(n.split('').reverse().reduce(function(p,c,i){return(+c&&((c*(1+i%2)%9)||9))+p},0)%10)}

可读形式:

function luhnCheck(ccNum) {
    return !(                                  // True if the result is zero.
             ccNum.split('').
               reverse().                      // Iterate over the string from rtl.
               reduce(function(prev, cur, idx) {
                 return prev +                 // Sum the results of each character.
                        (+cur &&               // If the current digit is 0, move on.
                         ((cur * (1 + idx % 2) // Double cur at even indices.
                           % 9) || 9));        // Sum the digits of the result.
               }, 0)
            % 10);                             // Is the sum evenly divisible by 10?
}


2

视网膜43 42字节

视网膜比这个挑战要新得多。


;
r`(.);.
$1$&
\d
$*
1+
$.&
.
$*
$
$._
0$

前导空行很重要。

打印0虚假和1真实的结果。

在线尝试!(稍作修改即可一次运行所有测试用例。)

说明


;

;在每个位置插入以分隔数字。

r`(.);.
$1$&

r右边开始,我们反复匹配两个数字,然后将左边的数字翻倍。这样,我们避免了昂贵的列表反转。

\d
$*

我们匹配每个数字并将其转换为这么多1s(即,将每个数字转换为一进制)。

1+
$.&

这将匹配每个一元数,并通过将其替换为长度将其转换回十进制。与上一阶段一起,这将增加两位数。

.
$*

同样,我们匹配每个字符并将其变成那么多1。也就是说,我们将每个数字分别转换回一元。这也与;分隔符匹配,分隔符在转换中被视为零,这意味着它们被简单地删除了。由于所有一元数现在都被压缩在一起,因此我们自动将所有数字的一元表示形式加在一起。

$
$._

最后,我们插入整个字符串的长度,即一进制校验和的十进制表示形式。

0$

最后,我们计算此正则表达式的匹配数,即检查小数表示是否以0,打印01相应结尾。


2

Powershell,74个字节

param($s)$s[$s.Length..0]|%{(1+$i++%2)*"$_"}|%{$r+=$_-9*($_-gt9)}
!($r%10)

说明

  1. 对于参数字符串的每个字符,按相反顺序
  2. 得到一个数字的两倍的数字
  3. 一个数字的双精度值不能大于18。因此,如果value> 9,我们将得到一个值减去9。
  4. 如果除以10的余数为0,则返回true

测试脚本

$f = {

param($s)$s[$s.Length..0]|%{(1+$i++%2)*"$_"}|%{$r+=$_-9*($_-gt9)}
!($r%10)

}

@(
    ,("49927398716"      , $True)
    ,("49927398717"      , $False)
    ,("1234567812345670" , $True)
    ,("1234567812345678" , $False)
    ,("79927398710"      , $False)
    ,("79927398711"      , $False)
    ,("79927398712"      , $False)
    ,("79927398713"      , $True)
    ,("79927398714"      , $False)
    ,("79927398715"      , $False)
    ,("79927398716"      , $False)
    ,("79927398717"      , $False)
    ,("79927398718"      , $False)
    ,("79927398719"      , $False)
    ,("374652346956782346957823694857692364857368475368" , $True)
    ,("374652346956782346957823694857692364857387456834" , $False)
    ,("8" , $False)
    ,("0" , $True)
) | % {
    $s, $expected = $_
    $result = &$f $s
    "$($result-eq$expected): $result : $s"
}

输出量

True: True : 49927398716
True: False : 49927398717
True: True : 1234567812345670
True: False : 1234567812345678
True: False : 79927398710
True: False : 79927398711
True: False : 79927398712
True: True : 79927398713
True: False : 79927398714
True: False : 79927398715
True: False : 79927398716
True: False : 79927398717
True: False : 79927398718
True: False : 79927398719
True: True : 374652346956782346957823694857692364857368475368
True: False : 374652346956782346957823694857692364857387456834
True: False : 8
True: True : 0

2

05AB1E12 10字节

RSāÈ>*SOTÖ

在线尝试! 或作为测试套件

说明

R             # reverse input
 S            # split to list of digits
  ā           # push range[1 ... len(input)]
   È          # map isEven on each
    >         # increment
     *        # multiply doubling every other item
      SO      # sum digits
        TÖ    # mod 10 == 0

1

Haskell:97

由于某种原因,这对我不起作用,所以这是我的版本

l=(\x->(==0)$(`mod`10).sum$zipWith($)(cycle[id,sum.map(read.(:"")).show.(*2)])(map(read.(:""))x))

1

GNU sed,140字节

(包括+1 -r

s/^(..)*.$/0&/
s/(.)./\1x&/g
s/x[5-9]/1&/g
s/[0x]//g
s/[789]/&6/g
s/[456]/&3/g
s/[369]/&11/g
s/[258]/&1/g
s/.{10}//g
s/.+/false/
s/^$/true/

Sed几乎从来不是最自然的算术语言,但是我们来:

#!/bin/sed -rf

# zero-pad to even length
s/^(..)*.$/0&/
# double every other digit
s/(.)./\1x&/g
# add carry (converts mod-9 to mod-10)
s/x[5-9]/1&/g
# convert sum to unary
s/[0x]//g
s/[789]/&6/g
s/[456]/&3/g
s/[369]/&11/g
s/[258]/&1/g
# remove whole tens
s/.{10}//g
# output 'true' or false
s/.+/false/
s/^$/true/


1

PHP-136个字符

function t($c){foreach($a=str_split(strrev($c)) as $k=>&$v){$v=array_sum(str_split(($k % 2)!==0?2*$v:$v));}return !(array_sum($a)% 10);}

1

MATL23 20字节(非竞争)

P!Utn:2X\!*t9>+s10\~

在线尝试!

输出1表示有效数字,否则输出0。

感谢Luis Mendo的建议,节省了三个字节。

说明

P       % flip the order of elements
!       % transpose into column vector
U       % convert char matrix to numeric
t       % duplicate the vector
n       % find the length
:       % create a new vector length n (1, 2, 3, ... n)
2       % number literal
X\      % take it mod 2, to make the new vector (1, 2, 1, ..., (n-1) mod 2 +1)
!       % transpose
*       % element-wise product
t       % duplicate
9       % push 9
>       % 1 if it is greater than 9
+       % add the vectors, this makes the last digit of each the same as the sum of the digits
s       % add them
10      % number literal
\       % mod 10
~       % logical 'not' (element-wise)
        % (implicit) convert to string and display

1

果冻,14字节

DUḤJḤ$¦DS$€S⁵ḍ

在线尝试!

说明:

D              get digits
 U             reverse array
   JḤ$         for every other index,
  Ḥ   ¦        double the value
          €    for each value,
       D $     get the digits
        S$     and sum them
           S   sum the list
            ⁵ḍ check if it's divisible by 10

为什么这种不竞争?
mudkip201

@ mudkip201如果我错了,请纠正我,但是在提出问题时不存在此版本的Jelly,因此对于该问题无效。
埃莉

3
相当肯定有一个元的共识是说,面临的挑战后所做的语言不是“非竞争”了
mudkip201
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.