ダッチバーガーサービスnummer(BSN)11テスト


29

前書き:

オランダのBSN(BurgerServiceNummer)は、次の規則に準拠している場合に有効です。

  • 数字のみが含まれます。
  • 長さは8または9でなければなりません。
  • 数字がAthrough としてインデックス付けされている場合、I次の合計の結果:9xA + 8xB + 7xC + 6xD + 5xE + 4xF + 3xG + 2xH + -1xI(1ではなく-1に注意してください!)11で割り切れるはずであり、0であってはなりません。

チャレンジ:

入力: BSNを表す文字列または文字配列。

出力:truthyまたはfalsey入力が有効BSNであるかどうかの結果。

チャレンジルール:

  • 入力形式は文字列または文字配列でなければなりません。整数のint配列、または(おそらく8進数の)数値を使用することはできません。(ただし、直接引数としてではなく、自分で数字の整数配列に変換できます。)
  • 上記の入力には制限がありますが、すべてのテストケースに1つ以上の数字([0-9]+)が含まれると想定できます。
  • 長さ8の代わりに9とBSNについて、オランダのウィキペディアは、以下の状態:「11・テストのため及び他の実用的な用途のために、長さ9の数を作るために添加される先行ゼロ」(ソース

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターを持つ関数/メソッド、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

// Truthy test cases:
111222333
123456782
232262536
010464554
10464554
44016773

// Falsey test cases:
000000000
192837465
247594057
88888888
73
3112223342
000000012

4
8桁ある場合、A与えられた式から1つが省略されるのは本当ですか?
isaacg 16

@isaacg(オランダ語)ウィキペディアページへのリンクを使用して、これに関するルールを追加しました。あなたは本当に正しいです、それはA式から省略します(または基本的に0それを長さ9にするために先頭を追加して、省略したのと同じ結果になりますA)。
ケビンCruijssen 16

「合計[...]は0であってはなりません。」:000000012
betseg

@betsegリストに追加しました
ケビンCruijssen

回答:


8

05AB1E23 21バイト

`()DgLR*OD11Ö89¹gåP0Ê

オンラインでお試しください!またはテストスイートとして

説明

`                        # push input as individual chars onto stack
 (                       # negate top value
  )                      # wrap in list
   DgLR                  # range [len(input) ... 1]
       *O                # multiply with list of digits and sum
         D11Ö            # is evenly divisible by 11
             89¹gå       # len(input) is 8 or 9
                  P      # product of sum/divisible by 11/len in (8,9)
                   0Ê    # not equal to 0

05AB1Eの古いバージョンが原因である可能性がありますがDgLāに変更することで3バイトを節約できますĀオンラインでお試しください。
ケビンCruijssen

12

JavaScript(ES6)57

文字の配列として入力します。reduceRight日を節約します!

s=>!(i=1,t=s.reduceRight((t,v)=>t-v*++i),!t|t%11|(i|1)-9)

テスト

F=
s=>!(i=1,t=s.reduceRight((t,v)=>t-v*++i),!t|t%11|(i|1)-9)


;['111222333','123456782','232262536','010464554','10464554','44016773']
.forEach(t=>{
  var r=F([...t]);console.log(t,r)
})

;['000000000','192837465','247594057','88888888','73','3112223342','3112223342']
.forEach(t=>{
  var r=F([...t]);console.log(t,r)
})


1
reduceRight答えを見るといつも嬉しいです!
ニール

最後に58に到達する方法を見つけたmap()だけで、あなたの答えは実際にあることを認識することが、57バイトの長:-)
アルノー

私は私が間違ってカウント信じることができないうん@Arnauld もう一度、感謝を
edc65

8

R、86 67バイト

編集:ドット積を提案してくれたJarko Dubbeldamに感謝します!

l=length(x<-scan(,""));s=as.double(x)%*%c(l:2,-1);!s%%11&s&l>7&l<10

stdinから入力を読み取り、文字の配列/ベクトルとして保存します。その後、数値に変換し、ベクトルで乗算し、9...2,-1すべての条件を確認します。


私にはうまくいきません。xベクトルとして分割する必要があります。
djhurio

@djhurioスペースで区切られた値を入力すると、文字のベクトルに暗黙的に格納されます。または、間にEnterキーを押して、1つずつ入力します。
ビリーウォブ16

1
if(l<9)x=c(0,x);s=sum(as.double(x)*c(9:2,-1))に変えることができますs=sum(as.double(x)*c(l:2,-1))。また、2つのベクトルのペアワイズ積の合計は、それらのドット乗算と同じ%*%です。
JAD

@JarkoDubbeldamいいね!ドット積は本当に賢いです。
ビリーウォブ16

7

JavaScript(ES6)、61 60 59 58バイト

入力として文字の配列を受け取ります。false/を返しますtrue

a=>!(a.map(c=>s-=--k?-c*k-c:c,k=a.length&9,s=0)|!s|k|s%11)

テストケース


6

C、112の 101 96 98 104バイト

コードを修正しながら5 3バイト節約してくれた@MartinEnderに感謝します

j,i,k,l;f(char*s){l=strlen(s);for(i=l,j=k=0;j<l;)k+=(s[j++]-48)*(i>1?i--:-1);return!(k%11)&&k&&(l^8)<2;}

無効な場合は0、有効な場合は1を返します。オンラインでお試しください!


これは61、長さが正しくない場合でも受け入れます。
クリスチャンシーバーズ

1
これは個人のBSNでは機能しません。
roberrrt-s

うまくいけば修正されました。
betseg 16

未修理。私のどちらでも動作しません。
DavidPostill

1
@ Roberrrt、@ DavidPostill; 今は大丈夫ですか、それともIめるべきですか?=(
betseg 16

5

R、95 79 93バイト

function(x){y=as.double(el(strsplit(x,"")));z=y%*%c((q<-length(y)):2,-1);(z&!z%%11&q>7&q<10)}

引数として文字列を取る名前のない関数。最初は、数値ではなく文字列を入力として使用するという要件を読み直しましたが、変換でバイトを節約できるため、それは良いことです。

文字の配列を解釈する方法がわかりませんが"1" "2" "3" "4" etc、それが入力として文字列の数字のベクトルを使用できることを意味する場合、それは少し短くなります:

function(x){y=as.double(x);z=y%*%c((q<-length(y)):2,-1);(z&!z%%11&q>7&q<10)}

xを数値ベクトルに分割し、長さが8の場合は0を追加し、ベクトルyとの内積を計算しc(9,8,7,6,5,4,3,2,-1)ます。結果がゼロ以外であり、11で割り切れるかどうかをテストします。

@Enigmaによるロジックのおかげで、ベクトルの作成時に暗黙的に0を追加して16バイトを節約しましたc(length(x):2,-1)

長さ8/9のチェックを追加するのを忘れたため、+ 14バイト:(


4

Perl、58バイト(52 + 6)

@N=(-1,2..9);$r+=$_*shift@N for reverse@F;$_=$r&&/^\d{8,9}$/&&!($r%11)

で実行

perl -F// -lapE

渡される入力STDIN

使用法

echo 232262536 | perl -F// -lapE '@N=(-1,2..9);$r+=$_*shift@N for reverse@F;$_=$r&&/^\d{8,9}$/&&!($r%11)'

1真実の値として出力する0か、偽の値に対しては何も出力しません。


最初にいくつかのバイトを保存できます$r+=$_*(-1,2..9)[$i++]for reverse@F。また、-F -peecho -nたとえば、最後の改行なしで提供される入力)で十分です(Perlが古すぎる場合を除き、この場合は必要になります-a(ただし、最近のPerl ではで暗示されています-F)。最後に、コードは70バイト長でした。 52ではなく;)
ダダ

3

C ++ 14、107 106バイト

forループintautoはなく-1バイト。

参照パラメーターを介して戻る名前のないラムダとして。のstd::stringような入力またはcharのコンテナが必要vector<char>です。

[](auto c,int&r){int i=c.size();r=7<i&&i<10?-2*c.back()+96:~1<<9;for(int x:c)r+=(x-48)*i--;r=r%11<1&&r>0;}

ゴルフをしないと使用法:

#include<iostream>
#include<string>

auto f=
[](auto c, int& r){
 int i = c.size();
 //if the size is correct, init r to -2*I so we can add I safely later
 //otherwise such a big negative number, that the final test fails
 r = 7<i && i<10 ? -2*c.back()+96 : ~1<<9;
 for (auto x:c)
  r += (x-48)*i--;
 r = r%11<1 && r>0;
}
;

using namespace std;
using namespace std::literals;

int main(){
 int r;
 f("111222333"s,r); std::cout << r << std::endl;
 f("123456782"s,r); std::cout << r << std::endl;
 f("010464554"s,r); std::cout << r << std::endl;
 f("10464554"s,r); std::cout << r << std::endl;
 f("44016773"s,r); std::cout << r << std::endl;
 std::cout << std::endl;
 f("000000000"s,r); std::cout << r << std::endl;
 f("192837465"s,r); std::cout << r << std::endl;
 f("73"s,r); std::cout << r << std::endl;
 f("88888888"s,r); std::cout << r << std::endl;
 f("3112222342"s,r); std::cout << r << std::endl;
 std::cout << std::endl;
 f("99999999"s,r); std::cout << r << std::endl;
 f("999999999"s,r); std::cout << r << std::endl;
}

3

Befunge、72バイト

>+~>:0`v
^1\-*68_\2/4-!00p*8>1-10p\910gv
@.!+!\%+56:*g00$  _^#!:g01+*-<<

オンラインでお試しください!

説明

>+~>:0`v            Read characters from stdin until EOF, converting each digit into
^1\-*68_              a number on the stack, and keeping a count of the characters read.

      \2/4-!00p     Save !(count/2-4), which is only true for valid lengths (8 and 9).
               *    Multiply the EOF (-1) with the final digit; this is the initial total.

8>1-10p\910gv       Loop over the remaining 8 digits, multiplying each of them by 9-i and
 ^#!:g01+*-<<         add to the total; i goes from 7 down to 0, so 9-i goes from 2 to 9.

               $    Drop the loop counter.
           *g00     Multiply total by the length calculation (invalid lengths become 0).
      %+65:         Make a copy of the total, and calculate modulo 11.
    !\              Boolean not the other copy to check for zero. 
  !+                !(total%11 + !(total)) is only true for non-zero multiples of 11.
@.                  Output the result and exit.

3

MATL、36バイト

私がこれまでに書い最長のMATLプログラムではありませんが、ゴルフの言語でif/ elseステートメントが非常に長く非常に長くなるのが好きです。このソリューションはMATLでは最適ではないかもしれませんが、現時点ではそれ以上最適化することはできません。どこかでdouble 0を使用することを考えtています。

48-tn8=?0wh]tn9=?P[a2:9]*st11\~Y&}x0

オンラインでお試しください!説明:

48-                                  % Subtract 48 (ASCII '0')
   tn                                % Duplicate. Get length.
     8=?                             % If length equals 8
        0wh                          %     Prepend 0 to the duplicate
           ]                         % End if.
            t                        % Duplicate again.
             n9=?                    % If length equals 9.
                 P                   %     Reverse the duplicate
                  [a2:9]*            %     Element-wise product with [-1 2 ... 9]
                         s           %     Sum
                          t11\       %     Duplicate sum, modulus 11
                              ~Y&    %     Result on stack: modulus==0 AND sum!=0
                                 }   % Else
                                  x0 %     Remove the duplicate. Put 0 on stack.
                                     % Display implicitly.

列ベクトルで対応できる場合:!U代わりに48-
ルイスメンドー


@LuisMendo残念 [a2:9]*結果は非要素単位の乗算になるため!、初期ゲインを相殺する別の乗算が必要になります。
Sanchises

3

MATL、26バイト

!UGg*R!s0&)s-t11\~Gn8-tg=v

結果は、空でない列ベクトルになります。これは、すべてのエントリがゼロ以外である場合に真です。

オンラインでお試しください!

または、それぞれの結果が異なる行にあるすべてのテストケース検証します

説明

これにより、次の順序で3つの条件がテストされます。

  1. 加重合計はゼロではありません。
  2. 加重合計は11で割り切れます。
  3. 長さは8または9です。

'8925'説明のために入力を検討してください。;行列の行区切り文字です。

!     % Implicit input. Transpose into a column vecvtor
      % STACK: ['8'; '9'; '2'; '5']
U     % Convert each digit to number
      % STACK: [8; 9; 2; 5]
Gg    % Push a row array of ones as long as the input
      % STACK: [8; 9; 2; 5], [1 1 1 1]
*     % Multiply, element-wise with broadcast
      % STACK: [8 8 8 8; 9 9 9 9; 2 2 2 2; 5 5 5 5]
R     % Upper triangular part
      % STACK: [8 8 8 8; 0 9 9 9; 0 0 2 2; 0 0 0 5]
!     % Transpose
      % STACK: [8 0 0 0;8 9 0 0;8 9 2 0;8 9 2 5]
s     % Sum of each column. This multiplies last element by 1, second-last by 2 etc
      % STACK: [32 27 4 5]
0&)   % Split into last element and remaining elements
      % STACK: 5, [32 27 4]
s     % Sum of array
      % STACK: 5, 63
-     % Subtract
      % STACK: -58. This is the result of condition 1
t11\  % Duplicate. Modulo 11
      % STACK: -58, 8
~     % Logical negation
      % STACK: -58, 0. This gives condition 2
Gn    % Push numnber of entries in the input
      % STACK: -58, 0, 4
8-    % Subtract 8. For valid lengths (8 or 9) this gives 0 or 1
      % STACK: -58, 0, -4
tg    % Duplicate. Convert to logical: set nonzero values to 1
      % STACK: -58, 0, -4, 1
=     % 1 if equal, 0 otherwise. Lenghts 8 or 9 will give 1. This is condition 3
      % STACK: -58, 0, 0
v     % Vertically concatenate the entire stack. This is truthy iff all values 
      % are non-zero. Implicitly display
      % STACK: [-58; 0; 0]

よくやった。せずにアプローチ?がおそらくより効率的であると考えましたが、長さ8または9を短くする方法を見つけることができませんでした。あなたGn8-tg=は非常に賢いです。
Sanchises

1
ちなみに、列ベクトル入力はBSNを表すchar-arrayとして適格ではないので、最初は節約できます!か?
Sanchises

@Sanchises問題はG、列ベクトルをプッシュし、それを転置して繰り返しを行う必要があることですg*
ルイスメンドー

もちろんそうです。気にしないで!
Sanchises

3

Haskell、116 112 102バイト

f x=div(length x)2==4&&g x>0&&h x
h=((==0).(`mod`11)).g
g=sum.zipWith(*)(-1:[2..]).map(read.(:[])).reverse

g11-proefで使用される合計をカウントhしながら、f11-proefがのない0特にチェック正しい長さとすることもチェックしているfバイトがかかります。

編集:リンとdiv切り捨てのおかげで10バイトを節約しました。


1
どうf x=div(length x)2==4&&g x>0&&h x
リン

@リン:それは素晴らしいものです、ありがとう。
レンジー16

2

ゼリー、21 バイト

V€U×JN1¦µL:2=4×Sµ11ḍa

TryItOnline!またはすべてのテストケースを実行する

真の戻り値はゼロ以外です(実際、11の倍数です)。

どうやって?

V€U×JN1¦µL:2=4×Sµ11ḍa - Main link: string of digits  e.g. "111222333"
V€                    - eval each - effectively cast each to an integer (keeps leading zeros)
  U                   - upend                        e.g. [ 3, 3, 3, 2, 2, 2, 1, 1, 1]
    J                 - range(length)                e.g. [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
   ×                  - multiply                     e.g. [ 3, 6, 9, 8,10,12, 7, 8, 9]
      1¦              - apply to index 1 (first element)
     N                -     negate                   e.g. [-3, 6, 9, 8,10,12, 7, 8, 9]
        µ             - monadic chain separation   e.g. z=[-3, 6, 9, 8,10,12, 7, 8, 9]
         L            - length(z)                    e.g. 9
          :2          - integer divide by 2          e.g. 4
            =4        - equals 4?                    e.g. 1
               S      - sum(z)                       e.g. 66
              ×       - multiply                     e.g. 66
                µ     - monadic chain separation   e.g. z=66
                 11ḍ  - divides(11, z)               e.g. 1
                    a - and z (for z=0 case)         e.g. 66 (truthy)

残念ながら、あなたの回答は@Emignaの05AB1E回答と同じ21バイトカウントであるため、2つではなく1つの回答しか受け入れられません。しかし、エニグマがより早く答えたので(そして彼の21バイトの編集も早くなったので)私は彼を受け入れました。
ケビンCruijssen

それは私には公平に聞こえます!
ジョナサンアラン

2

Python 2、102バイト

def f(i):S=sum(a*b for a,b in zip([-1]+range(2,10),map(int,i)[::-1]));return(7<len(i)<10)*(S%11<1)*S>0

2

Python 2、96バイト

def g(s):u=7<len(s)<10and sum(x*int(('0'+s)[-x])for x in range(2,10))-int(s[-1]);print(u%11<1)*u

入力として文字列を受け取ります。この関数は、'0'必要かどうかに関係なく、文字列の先頭にa を追加し、Pythonの負のインデックスを使用して、文字列の末尾から先頭に向かって要素を追加します。

-1xI2番目の呼び出しを使用して、別々に処理されますint()。私が節約した以上のバイトを費やさずにこれを回避する方法を見つけることができませんでした。

def g(s):u=7<len(s)<10and sum(x*int(('0'+s)[-x])for x in range(10))-2*int(s[-1]);print(u%11<1)*u1時間s[-1]が加算されますが、2回減算されるため、同様に動作します。また0、もちろん合計に影響しない時間(何か)も加算されます。


2

Brain-Flak、345バイト

+3を含む -a

([]){{}({}[((((()()()){}){}){}){}]<>)<>([])}{}<>([][(()()()()){}]){({}[()]){([]){{}{}([])}}}{}([{}])({}({}){})({}({})({}){})({}(({}){}){})({}(({})({})){}{})({}(({})({}){}){})({}((({}))({}){}){}{})({}((({}){}){}){})(({}(((({})){}){}){}{}{}<(((()()())()){}{})>)){{}({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{}[{}]<(())>){((<{}{}>))}{}(<()>)}{}

Truthyは1、Falsyはスタックのトップに0を持っています。

オンラインでお試しください!

ループ内で乗算を行うより短い方法があると確信していますが、まだ見つかりません。

#reverse and subtract 48 from all numbers (ASCII -> decimal)
([]){{}({}[((((()()()){}){}){}){}]<>)<>([])}{}<> 

([][(()()()()){}])       #height - 8
{({}[()]){               #if not 0 subtract 1
   ([]){{}{}([])}        #if still not 0 pop everything
}}{}                     #this loop pops everything unless there are 8 or 9 digits

([{}])                   # -I
({}({}){})               # H*2
({}({})({}){})           # G*3
({}(({}){}){})           # F*4
({}(({})({})){}{})       # E*5
({}(({})({}){}){})       # D*6
({}((({}))({}){}){}{})   # C*7
({}((({}){}){}){})       # B*8
(({}(((({})){}){}){}{}{} # A*9 pushed twice with:
<(((()()())()){}{})>))   # 11 under it


{{} #if not 0
({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{}   # mod 11
[{}]<(())>){((<{}{}>))}{}                       # logical not
(<()>)                                          # push 0 to exit loop
}{}
                                                # implicit print

2

PowerShell v2 +、96バイト

param($n)$i=8-($n.count-eq8);!(($b=($n|%{(-"$_",(($i+1)*+"$_"))[!!$i--]})-join'+'|iex)%11)-and$b

わかりました、これは完全な混乱のように見えます。そして、それはちょっとです。しかし、私と我慢して、それを乗り越えます。

入力を$nchar-array として)取得し、に8個のアイテムがあるかどうかのブール値$i8マイナスに設定し$nます。つまり、8つのアイテムがある場合$iはになります7

次のセクションでは、計算と出力を組み合わせます。内部から作業し、でループ$n$n|%{...}ます。繰り返しごとに、疑似3項を使用して、2つの結果のいずれか、-"$_"またはを導き出します(($i+1)*+"$_")。インデックスがいるかどうかに基づいて$iいる0かどうか(つまり、私たちがヒットしまし-1xIなり、チャレンジ式からケース)の次ゴーラウンドのポストデクリメント。それらはすべて括弧で-joinまとめられ、一緒に編まれ+ます。例えば、入力と111222333この時点で、私たちは持っていると思います9+8+7+12+10+8+9+6+-3。それはにパイプされiex(の略でInvoke-Expressionに類似eval)、に格納され$bます。次に、それを取り%11、ブール演算を実行します!(...)その上(つまり、11で割り切れる場合、この部分は$true)です。それは、ゼロでない-and$bことを保証するために結合され$bます。そのブール結果はパイプラインに残り、出力は暗黙的です。

PS C:\Tools\Scripts\golfing> 111222333,123456782,232262536,010464554,10464554,44016773|%{"$_ -> "+(.\dutch-burgerservicenummer.ps1 ([char[]]"$_"))}
111222333 -> True
123456782 -> True
232262536 -> True
10464554 -> True
10464554 -> True
44016773 -> True

PS C:\Tools\Scripts\golfing> 000000000,192837465,247594057,88888888,73,3112223342,000000012|%{"$_ -> "+(.\dutch-burgerservicenummer.ps1 ([char[]]"$_"))}
0 -> False
192837465 -> False
247594057 -> False
88888888 -> False
73 -> False
3112223342 -> False
12 -> False

2

PHP 139 128バイト

 $u=-1;$i=$argv[1];while($u<=strlen($i)){$c+=($u*(substr($i,-(abs($u)),1)));$u +=$u<0?3:1;}echo($c>0&&!($c%11)&&$u>8&&$u<11?1:0);

CLIにtrueまたはfalseをエコーさせることができませんでした。このようにする必要がありました。何か案は?

128バイト:「true」と「false」を1と0に変更。


2

C#、120 115バイト

これchar[]は、入力として受け取ったものをループし、trueまたはfalseを返します。

bool b(char[]n){int r=0,k,i=0,l=n.Length;for(;i<l;i++){k=i==l-1?-1:l-i;r+=k*(n[i]-48);}return r>0&r%11<1&l<10&l>7;}

フィドル:https : //dotnetfiddle.net/3Kaxrt

私は、特に乱雑に、数バイトを削ることができると確信していますreturn。どんなアイデアも歓迎します!

編集:ケビンのおかげで5バイトを保存しました。&代わりに使用できるとは思いもしませんでした&&


1
+1!(to およびto )にr>0&&r%11==0&&l<10&&l>7ゴルフできます。とにgolfedすることができます。r>0&r%11<1&l<10&l>7&&&r%11==0r%11<1-'0'-48
ケビンCruijssen 16

2

PHP、86 85 84 83 82 79バイト

注:負の文字列インデックスにはPHP 7.1を使用します。

for($l=log10($a=$argn);~$c=$a[-++$x];)$s+=$x>1?$x*$c:-$c;echo$s%11<1&$l>7&$l<9;

次のように実行します:

echo 010464554 | php -nR 'for($l=log10($a=$argn);~$c=$a[-++$x];)$s+=$x>1?$x*$c:-$c;echo$s%11<1&$l>7&$l<9;';echo
> 1

PHP <7.1(+10バイト)のバージョン

echo 010464554 | php -nR 'for($l=log10($a=$argn);~$c=$a[strlen($a)-++$x];)$s+=$x>1?$x*$c:-$c;echo$s%11<1&$l>7&$l<9;';echo

説明

for(
  $l=log10(         # Take the log of the input number.
    $a=$argn        # Set input to $a
  );
  ~$c=$a[-++$x];    # Iterate over digits of input (reverse). Negate to
                    # change every char to extended ASCII (all truthy),
                    # without changing empty sting (still falsy, ending
                    # the loop).
)
  $s+=$x>1?         # Add current char to the sum...
     ?$x*$c:-$c;    # multiplied by $x, unless $x is 1; subtract it.
echo
  $s%11<1 &         # Check if sum is divisible by 11, and
  $l>7   &          # log of the input is greater than 7, and
  $l<9;             # log of the input is less than 9. Outputs 0 or 1.

微調整

  • 空の文字列とを区別するより短い方法"0"、バイトを保存
  • 以来10000000、無効な、と比較する必要はありませんでgreater than or equalsgreater than十分で、バイトを保存します
  • 最下位桁を減算するより短い方法
  • XORの代わりにcharを否定し、バイトを保存します
  • 使用して3つのバイトを保存-Rするために$argn利用可能

2

Java 8、115 98バイト

b->{int l=b.length,i=0,r=0,x;for(;l>7&l<10&i<l;r+=(b[i++]-48)*(x<2?-1:x))x=l-i;return r>0&r%11<1;}

誰もまだJavaの回答を投稿していないことに驚いています。

説明:

ここで試してみてください。

b->{                  // Method with character-array as parameter and boolean return-type
  int l=b.length,     //  Length of the array
      i=0,            //  Index-integer, starting at 0
      r=0,            //  The result-sum, starting at 0
      x;              //  Temp integer `x`
  for(;l>7&l<10       //  Start looping if the length is either 8 or 9
       &i<l;          //  And continue looping while the index is smaller than the length
      r+=             //    After every iteration, increase the result-sum by:
         (b[i++]-48)  //     The current digit
         *(           //     Multiplied by:
           x<2?       //      If `x` is 1:
            -1        //       Multiply by -1
           :          //      Else:
            x))       //       Simply multiply by `x` 
    x=l-i;            //   Set `x` to the length minus the current index
                      //  End of loop (implicit / single-line body)
  return r>0          //  Return if the result-sum is larger than 0,
    &r%11<1;          //   and if the result-sum is divisible by 11
}                     // End of method

1

Clojure、114バイト

さて、これは何か、-最初の引数から残りの引数を減算することで、weightの特殊なケースを処理し-1ます。この関数はnil、無効な長さの入力に対して戻りますが、if節では、と同じように動作しfalseます。(#{8 9}(count v))nil長さがv8または9でない場合に戻ります。

(fn[v](if(#{8 9}(count v))(#(and(< % 0)(=(mod % 11)0))(apply -(map *(range 1 10)(reverse(map #(-(int %)48)v)))))))

テストケース:

(pprint (group-by f (map str [123456782 232262536 "010464554" 10464554 44016773 "000000000" 192837465 247594057 88888888 73 3112223342 "000000012"])))
{true  ["123456782" "232262536" "010464554" "10464554" "44016773"],
 false ["000000000" "192837465" "247594057" "88888888" "000000012"],
 nil   ["73" "3112223342"]}


1

スタックス、23 バイト

╪╦µΘç}<╔▼◘╞i∟~¿≥←║▐√ 4u

オンラインで実行してデバッグします!

説明

解凍されたバージョンを使用して説明します。

i%8A:byr{]ei^*mBN+|+c11%!L|A
i                               Suppress implicit eval
 %8A:b                          Length is 8 or 9 (Element #1 on the final stack)
      yr                        Reverse input
        {     m                 Map each element with
         ]e                         Its numerical value
           i^*                      Multiplied current 1-based loop index
               BN+              Negate the first element
                  |+            Sum (Element #2 on the final stack)
                    c11%!       Sum is multiple of 11 (Element #3 on the final stack)
                         L|A    Collect all the three elements and `and` them.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.