クレジットカード番号などを検証するための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ルール

入力:選択した言語の入力/出力形式の文字列または数値(選択)

出力:上記のテストに従って入力が有効であるかどうかを示す、それぞれ真実または偽の値

メモ/ヒント

  • テストに使用する場合は、誤って自分のクレジットカードまたはアカウント番号を投稿しないようにしてください:)

  • 入力が無効で、指定されたアルゴリズムで処理できない(つまり、作業するには短すぎる)場合は、コンピューターを爆破するなど、何でもできます。

  • ただし、前の箇条書きでは、言語が大きすぎて処理できない場合は、言語で必要な処理を実行できるという意味ではありません。言語がテストケースを処理できない場合は、入力として文字列を使用することを検討してください。

次の例は、このPythonスクリプトで検証されました。間違っていると思う場合や質問がある場合は、@ catにpingしてください。

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実装によれば、しかし、これらは仕様を厳密に順守するのに適さないには短すぎるので、あなたは何でもするかもしれません。


上記のいずれかが既存の回答を無効にする場合(それは可能ではないはずです)、それらの回答はまだ有効です。ただし、有効な新しい回答は、上記の仕様に従う必要があります。

リーダーボード

回答:


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回目の反復で1、2回目の反復で0などとなります。
    3. )* この値に1を加算して乗算するため、2、1、2のように乗算します。
    4. 109% 109を法とする剰余です。これは、2倍にされた値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%!

選択された解説

興味深いことに、以下の最初の2つの項目は、%演算子の3つのまったく異なる使用法を示しています。配列選択、マップ、およびmodです。ほとんどのGolfScript演算子は「コンテキスト依存」であり、引数のタイプに応じて非常に多様な動作を提供します。

  1. -1%文字列を反転します。数字のペアは右からカウントされるため、これは重要です。
  2. {16%}% すべてのASCII数字を16で修飾することにより、数字に変換します。
  3. 2/ 配列を2つのグループに分割します。
  4. 1,安価な方法です[0]
  5. \+0を数字配列に効果的に追加します。これは、スワッピングと連結によって行われます。

0は、次に来るフォールドに備えて追加されます。GolfScriptのfoldは、明示的な初期値をとるのではなく、配列の最初のアイテムを初期値として使用します。

それでは、実際のfold関数を見てみましょう。この関数は2つの引数を取ります:折り畳まれた値と、配列上の現在のアイテム(この場合、2または(まれに)1の配列になります2/)引数がであると仮定しましょう1 [2 3]

  1. (\.左端の配列要素を分割し、残りの配列を前に移動してからコピーします。スタックは次のようになります1 2 [3] [3]
  2. ifチェックアレイは、(奇数サイズの口座番号を扱う最後のグループのためのケースである)空の場合。その場合、特別な処理は行われません(空の配列からポップするだけです)。
  3. 偶数グループの場合:
    1. 0= 配列の最初の(この場合のみ)要素を取得します。 1 2 3
    2. 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を返します。


これは、Wikipediaのサンプル番号(49927398716)に対して0を返すようです
ニブラー

nm。使用するのを忘れたecho -n
ニブラー

1
@gnibbler:ハハ、失敗。:-P(真剣に、私も最初のテストでその1つに刺されました。)
クリスジェスターヤング

1
ここにいくつかの簡単なキャラクターを保存するためのいくつかの場所。-1% 2/に結合できます-2/1,に置き換えることができます0(0は配列に強制され、その後+連結されます)。9>9*-に置き換えることができます9>+(最後の数字のみに関係しているため)。また、奇数の長さのチェックは少し長く、使用.,2%,\+は短くなります。これを行った後、変更{16%}%(\0={16}/(ループ内)にすることもできます。すべての作業を完了すると、次のようになります.,2%,\+-2/0\+{{16%}/2*.9>+++}*10%!
ナブ

@ナブ:ありがとう!これらを私のソリューションに組み込みますが、すでに深刻な問題を引き起こしているものがあるようです。:-)
クリスジェスターヤング

11

Python、73 69文字

def P(x):D=map(int,x);return sum(D+[d-d/5*9for d in D[-2::-2]])%10==0

4
あなたは逆方向にループしないことによって、さらに2つの文字を保存することができます:D[-2::-2]- > D[1::2]和の順序は重要ではありません:)として
ThinkChaos

==0短くすることができます<1
Black Owl Kai


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;}

それは良いアイデアであり、興味深いアプローチですが、うまくいかないようです。少なくとも私の少数のテストではそうではありません。最初のラムダの「i」は、文字列の文字のインデックスであると思われます。それは正常に機能しますか?もしそうなら、なぜインデックス位置に基づいてそれを変更するためだけに文字列を逆にするのですか?少し冗長に思えますか?
ネリウス

私は自分のクレジットカードの1つだけをテストし、TBHからいくつかのエラーを1つだけテストしました。(VS 2008デバッガーを使用)アルゴリズムは、最後の数字で始まる2桁ごとに2倍になると想定されています。文字列を逆にしなかった場合、長さが奇数の文字列では正しくありません。
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
@クリス、私は何年も前に「ナインをキャストする」と呼ばれることを学びました。これは、ロングハンドの加算と乗算をダブルチェックするためのきちんとした方法です
ニブラー

3
これは、値0が2倍になる0(9%)と機能しません(0ではなく9です)。
ナブ

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

ルビー-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

おそらく、このことを知っていますが、.injectの代わりに.SUM行うことができます:7バイト節約するために(+)
HåvardNygårdの

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最初に使用した場合にのみ使用できます。それ以外の場合は、に置き換える((+(-48)).fromEnum)と88文字になり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

Q、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

{0=mod[sum"J"$raze($)($)x*#:[x]#1 2]10}"I"$'(|)奇数インデックスを2倍にする別の方法で47バイト。
ストリートスター

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

3
@ msh210:乗算の効果を2でエンコードします。0..4* 2は0, 2, 4, 6, 8、整数に切り捨てられた場合と同じ値である最後の桁と同じ合計を与えますが5..910,12,14,16,18どの合計を与えます。最初のものは既にfactor を提供しているため、まだ修正が必要です。整数のみを保持でき、0で終わる値で始まるため、切り捨ての世話をします。以来、負の値が必要とされている正規表現は、任意の変更、彼らは変更する必要があるので、評価スタックに残って1 3 5 7 911 13 15 17 190..9 * 2.2$&11.2$=/\G/$&
トンHospel

ああ。ブリリアント!そして説明をありがとう。
msh210

3

JavaScript(ES6)、61バイト

JavaScriptは2011年と非常に異なっていたため、競合していません。

の桁数の合計2*n2*nif n in 0..42*n-9ifの場合n in 5..9。つまり、すべての合計を1つのステップで計算できます。

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チェックを処理します。これは、ことが判明AAMし、AAD命令がそれらない文書又は総称その機能を実行するものとして説明されているにもかかわらず(非常に便利であることができる)バイト値のBCD /バイナリ変換を行います。

すべての公式IBM / MS DOSバージョンの、AX及びBXに初期化され0000、起動(オンREFREF)とDXするCSので、非ゼロと陽性であることが保証され、12ビットの値です。これは、我々が保証することができますどのようにBXされ0、および/フリップ・フロップできるDX奇数/偶数桁の場所を決定します。

出力例:

ここに画像の説明を入力してください

LUHN.COM IBM PC DOSテストプログラムをダウンロードします。


2

Scala: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$

先頭の空行は重要です。

プリント0falsy用と1 truthy結果を得るために。

オンラインでお試しください!(すべてのテストケースを一度に実行するために少し変更されています。)

説明


;

;すべての位置に挿入して、数字を区切ります。

r`(.);.
$1$&

rライトから、2桁の数字を繰り返し照合し、左の数字を2倍にします。このようにして、リストの高額な逆転を回避します。

\d
$*

各桁を一致させ、その数に変換します1(つまり、各桁を単項に変換します)。

1+
$.&

これは各単項数と一致し、その長さで置き換えることにより10進数に変換し直します。前のステージとともに、これにより2桁の数字が追加されます。

.
$*

繰り返しますが、すべての文字に一致し、それをその数に変換し1ます。つまり、各桁を個別に単項に変換します。これ;は、変換でゼロとして扱われる区切り文字とも一致します。つまり、単純に削除されます。すべての単項数がまとめられたため、すべての数字の単項表現を自動的に追加しました。

$
$._

最後に、文字列全体の長さ、つまり単項チェックサムの10進数表現を挿入します。

0$

最後に、この正規表現の一致数をカウントします。つまり、10進表現がで終わるか0、印刷する0か、1それに応じてチェックするかを調べます。


2

Powershell、74バイト

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

説明

  1. 引数文字列の各文字に対して、逆順
  2. 数字の二重値の数字を取得します
  3. 数字のdouble値は18を超えることはできません。したがって、値> 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



1

GNU sed、140バイト

-rフラグの+1を含む)

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

APL、38 バイト

d←10∘⊥⍣¯1⋄{0=10|+/+/d x×1+~2|⍳⍴x←⌽d ⍵}

文字列ではなく数字として数字を期待しますが、それはtryAPLが(理解できるように)実装していないからです

さらに削減可能、きっと…


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の提案のおかげで3バイト節約されました。

説明

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
チャレンジ後に作成された言語は
もはや
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.