내 바코드가 유효합니까?


33

EAN-8 바코드 정보와 8 체크섬 자리의 7 자리 숫자가 포함되어 있습니다.

체크섬은 숫자에 3과 1을 번갈아 곱하고 결과를 더한 다음 10의 다음 배수에서 빼서 계산합니다.

예를 들어, 숫자가 주어지면 2103498:

Digit:        2   1   0   3   4   9   8
Multiplier:   3   1   3   1   3   1   3
Result:       6   1   0   3  12   9  24

이 결과 숫자의 합은 55 이므로 체크섬 숫자는 60-55 = 5입니다.


도전

당신의 임무는, 8 자리 바코드가 주어진다면 그것이 유효한지 확인하는 것입니다-체크섬이 유효하면 참 값을 반환하고 그렇지 않으면 거짓입니다.

  • 다음 형식 중 하나로 입력 할 수 있습니다.
    • 바코드 숫자를 나타내는 8 자 길이의 문자열
    • 8 자리 정수 목록, 바코드 숫자
    • 음수가 아닌 정수 (아무것도 주어지지 않은 경우 앞에 0을 가정 할 수 있습니다 (예 : 1= 00000001)
  • EAN-8 체크섬을 계산하는 내장 (즉, 처음 7 자리를 취하고 마지막을 계산)은 금지됩니다.
  • 이것은 이므로 가장 짧은 프로그램 (바이트)이 이깁니다!

테스트 사례

20378240 -> True
33765129 -> True
77234575 -> True
00000000 -> True

21034984 -> False
69165430 -> False
11965421 -> False
12345678 -> False


1
이 질문은 실제로 바코드 (흑백 줄무늬)가 아니라 바코드로 인코딩 된 숫자에 관한 것입니다. 숫자는 바코드없이 존재할 수 있으며, 바코드는 EAN 이외의 것을 인코딩 할 수 있습니다. " EAN-8이 유효 합니까?"가 더 좋은 제목일까요?
Paŭlo Ebermann

2
@ PaŭloEbermann은 그것과 똑같은 고리를 가지고 있지 않습니다 ...
FlipTack

7
바코드에 대해 읽을 때 체크섬을 확인하지 않고 이미지를 읽거나 비트 문자열을 확인해야합니다.
Paŭlo Ebermann

ISBN-13은 EAN이므로 강력하게 관련되어 있습니다.
Olivier Grégoire

답변:


5

젤리 , 7 바이트

s2Sḅ3⁵ḍ

온라인으로 사용해보십시오!

작동 원리

s2Sḅ3⁵ḍ  Main link. Argument: [a,b,c,d,e,f,g,h] (digit array)

s2       Split into chunks of length 2, yielding [[a,b], [c,d], [e,f], [g,h]].
  S      Take the sum of the pairs, yielding [a+c+e+g, b+d+f+h].
   ḅ3    Convert from ternary to integer, yielding 3(a+c+e+g) + (b+d+f+h).
     ⁵ḍ  Test if the result is divisible by 10.

13

자바 스크립트 (ES6), 41 40 38 바이트

@ETHProductions 덕분에 2 바이트를 절약하고 @Craig Ayre 덕분에 1 바이트를 절약했습니다.

s=>s.map(e=>t+=e*(i^=2),t=i=1)|t%10==1

숫자 목록으로 입력을받습니다.

체크섬을 포함한 모든 자릿수의 합계를 결정합니다.

합계가 10의 배수이면 유효한 바코드입니다.

테스트 사례


나는 당신이 pre-recursion에서 post-recursion 으로 전환 함으로써 3 바이트를 절약 할 수 있다고 말하려고 g=([n,...s],i=3,t=0)=>n?g(s,4-i,t+n*i):t%10<1했지만 더 나은 방법을 찾았을 것입니다.
ETHproductions

감사 map합니다.
Rick Hitchcock

아마도 다른 바이트를 s=>s.map(e=>t+=e*(i=4-i),t=i=1)&&t%10==1?
ETHproductions

예, 훌륭합니다, 감사합니다
Rick Hitchcock

훌륭한 솔루션! 당신이 대체 할 수 &&|truthy 때문에 출력 1/0에 / falsy 허용?
Craig Ayre


8

젤리 , 8 바이트

m2Ḥ+µS⁵ḍ

테스트 스위트를 사용해보십시오.

젤리 , 9 바이트

JḂḤ‘×µS⁵ḍ

온라인으로 시도 하거나 테스트 스위트를 사용해보십시오.

작동 원리

m2Ḥ + µS⁵ḍ ~ 전체 프로그램.

m2 ~ Modular 2. 입력의 모든 초 요소를 반환합니다.
  Ḥ ~ 각각 두 배.
   + µ ~ 입력을 추가하고 새로운 모나 딕 체인을 시작합니다.
     S ~ 합계
      ⁵ḍ ~ 10으로 나눌 수 있습니까?
JḂḤ '× µS⁵ḍ ~ 전체 프로그램 (모노 딕).

J ~ 1 인덱스 길이 범위.
 Ḃ ~ 비트; 위의 범위에있는 각 수는 2 씩 모듈로됩니다.
  Ḥ ~ 각각 두 배.
   '~ 각각 증가합니다.
    × ~ 입력과 쌍으로 곱합니다.
     µ ~ 새로운 모나 딕 체인을 시작합니다.
      S ~ 합계
       sum ~ 합계를 10으로 나눌 수 있습니까?

바코드 및 체크섬 숫자의 처음 7 자리 숫자의 결과가 있어야 의 배수에 추가 (10) 가 유효하려면. 따라서 전체 목록에 적용된 알고리즘 을 10 으로 나눌 수 있는 경우 체크섬이 유효합니다 .


일관성있는 값하지만 여전히 9 바이트 :JḂḤ‘×µS⁵ḍ
HyperNeutrino

@HyperNeutrino 고마워, 나는 이것에 대한 원자가 있다는 것을 알고 있었다!
Mr. Xcoder

또한 9 바이트 : JḂaḤ+µS⁵ḍ: P
HyperNeutrino

@HyperNeutrino 글쎄, 많은 대안이 있습니다 : P
Mr. Xcoder

1
8 바이트 또는 8 문자? m2Ḥ+µS⁵ḍ내가 잘못 계산하지 않으면 UTF-8에서 15 바이트입니다.
ta.speot.은 (는)

7

MATL , 10 바이트

실수를 지적한 @Zgarb 에게 감사의 말을 전했다 .

IlhY"s10\~

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

Ilh     % Push [1 3]
Y"      % Implicit input. Run-length decoding. For each entry in the
        % first input, this produces as many copies as indicated by
        % the corresponding entry of the second input. Entries of
        % the second input are reused cyclically
s       % Sum of array
10\     % Modulo 10
~       % Logical negate. Implicit display

7

Befunge-98 (PyFunge) , 16 14 바이트

s j대신 두 번째 부분을 건너 뛰고 두 번째 부분 에서 a 를 제거하기 위해 ;a ~+첫 번째 부분을 교환 하여 2 바이트를 절약했습니다 +.

~3*+~+6jq!%a+2

입력은 8 자리 (해당되는 경우 앞에 0이 있음)이며 다른 것은 없습니다.

종료 코드를 통해 출력합니다 (TIO에서 디버그 드롭 다운 열기). 여기서 1은 true이고 0은 false입니다.

온라인으로 사용해보십시오!

설명

이 프로그램은 다양한 트릭을 사용합니다.

우선, ASCII 값을 통해 숫자를 하나씩 가져옵니다. 일반적으로 입력에서 읽을 때 각 값에서 48을 빼야합니다. 그러나 수정하지 않으면 합계에 16 개 (3 + 1 + 3 + 1 + 3 + 1 + 3 + 1)가 48 개 남게되어 총계가 768보다 큽니다. "무엇을"해야하는지 우리는 합계 mod 10에만 관심이 있기 때문에 나중에 합계에 2를 더할 수 있습니다. 따라서 원시 ASCII 값을 가져와 6 바이트 정도를 절약 할 수 있습니다.

두 번째로이 코드는 입력이 8 자만 보장되므로 다른 모든 문자가 EOF인지 확인합니다.

셋째, #줄 끝의 첫 번째 문자는 건너 뛰지 않지만 ;다른 방향에서 오는 경우 는 건너 뜁니다 . #;대신 앞에를 두는 것보다 낫습니다 .

프로그램의 두 번째 부분은 한 번만 실행되므로 뒤로 실행할 때 전반부를 건너 뛰도록 설정할 필요가 없습니다. 이를 통해 점프 명령을 사용하여 후반으로 건너 뛸 수 있습니다.

단계별

참고 : "홀수"및 "짝수"문자는 0 색인 시스템을 기반으로합니다. 첫 번째 문자는 인덱스 0 인 짝수 문자입니다.

~3*+~+      Main loop - sum the digits (with multiplication)
~           If we've reached EOF, reverse; otherwise take char input. This will always
                be evenly indexed values, as we take in 2 characters every loop.
 3*+        Multiply the even character by 3 and add it to the sum.
    ~       Then, take an odd digit - we don't have to worry about EOF because
                the input is always 8 characters.
     +      And add it to the sum.
      6j    Jump over the second part - We only want to run it going backwards.

        q!%a+2    The aftermath (get it? after-MATH?)
            +2    Add 2 to the sum to make up for the offset due to reading ASCII
          %a      Mods the result by 10 - only 0 if the bar code is valid
         !        Logical not the result, turning 0s into 1s and anything else into 0s
        q         Prints the top via exit code and exits


6

Wolfram Language (Mathematica) , 26 21 바이트

10∣(2-9^Range@8).#&

온라인으로 사용해보십시오!

8 자리 목록으로 입력합니다.

작동 원리

2-9^Range@8는 합동 모듈로 10에서 2-(-1)^Range@8입니다 {3,1,3,1,3,1,3,1}. 이리스트의 내적을 입력 값으로 취하고 결과가 10으로 나눌 수 있는지 확인합니다.

Wolfram Language (Mathematica) , 33 바이트 및 비경쟁

Check[#~BarcodeImage~"EAN8";1,0]&

온라인으로 사용해보십시오!

입력을 문자열로받습니다. 1유효한 바코드와 0유효하지 않은 바코드를 반환 합니다.

작동 원리

내장 방식으로 찾을 수있는 가장 좋은 것은 (Mathematica가 모든 것이므로).

내부 비트 () #~BarcodeImage~"EAN8";1는 EAN8 바코드의 이미지를 생성 한 다음이를 완전히 무시하고 1로 평가합니다. 그러나 바코드가 유효하지 않은 경우 BarcodeImage경고가 발생 Check하고이 경우 0을 반환합니다.


3
계산 시간이 짧거나 Wolfram의 표준 라이브러리 어딘가에 ValidateEAN8BarCode () 함수가 없기 때문에 직접 계산을 수행하고 있습니까?
Mark

1
@Mark Mathematica는 바코드를 직접 확인할 수 없지만 방금 BarcodeImage바코드 이미지를 생성하고 프로세스에서 바코드를 검증하는을 찾았습니다 . 그래서 Check[#~BarcodeImage~"EAN8";0,1]<1&작동합니다 (그러나 더 깁니다).
Misha Lavrov 2018

5

자바 8, 58 56 55 바이트

a->{int r=0,m=1;for(int i:a)r+=(m^=2)*i;return r%10<1;}

@RickHitchcock 덕분 에 그의 자바 스크립트 답변 에서을 보지 (m=4-m)*i않고 대신 사용하여 -2 바이트를 간접적으로 사용할 수 있습니다. @ETHProductions (및 @RickHitchcock ) 대신 -1 바이트를 간접적으로 사용하여 대신에 .m++%2*2*i+i
(m^=2)*i(m=4-m)*i

설명:

여기에서 시도하십시오.

a->{              // Method with integer-array parameter and boolean return-type
  int r=0,        //  Result-sum
      m=1;        //  Multiplier
  for(int i:a)    //  Loop over the input-array
    r+=           //   Add to the result-sum:
       (m^=2)     //    Either 3 or 1,
       *i;        //    multiplied by the digit
                  //  End of loop (implicit / single-line body)
  return r%10<1;  //  Return if the trailing digit is a 0
}                 // End of method

1
트릭 @ETHProductions 나를 보여하면 다른 바이트를 저장할 수 있습니다 변화 m=4-m에를 m^=2.
Rick Hitchcock

@RickHitchcock 아, 물론 .. 내가 사용하는 ^=1내가 사이에 변경하고자 할 때 답변에 꽤 자주 01. ^=2이 경우 1및 사이를 변경 3합니다. 좋은 속임수와 의견을 주셔서 감사합니다. :)
Kevin Cruijssen

4

05AB1E , 14 바이트

θ¹¨3X‚7∍*O(T%Q

온라인으로 사용해보십시오!

선행 0s가 필요 하고 자릿수 목록을 사용합니다.


실패하는 것 같습니다 3100004(진실해야 함).
Zgarb

@Zgarb 0거기에 빠졌 습니다.
Outgolfer Erik

아, 문자열이 필요해? 좋아, 내 나쁜.
Zgarb

@ Zgarb 글쎄, 당신은 따옴표를 생략 할 수 있지만, 그래, 당신은 선행이 필요합니다 0. 이 답변은 실제로 05AB1E의 기능 중 하나 인 문자열에 숫자 함수를 사용합니다.
Outgolfer Erik

@ Mr.Xcoder 그 질문에 대해서는 명확하지 않습니다. 아래에서 처리하는 다른 코드를 추가하겠습니다.
Outgolfer Erik

4

Pyth , 8 바이트

!es+*2%2

모든 테스트 사례를 확인하십시오!

Pyth , 13 바이트

입력이 항상 정확히 8 자리라고 가정 할 수 있다면 :

!es.e*bhy%hk2

모든 테스트 사례를 확인하십시오!


어떻게 작동합니까?

! es + * 2 % 2 ~ 전체 프로그램.

      % 2 ~ 입력 [:: 2]. 입력의 두 번째 요소
    * 2 ~ Double (반복 목록 두 번).
   + ~ 입력을 추가합니다.
  s ~ 합계
 e ~ 마지막 자리.
! ~ 논리 NOT.
! es.e * sbhy % hk2 ~ 전체 프로그램.

               ~ 입력을 문자열로 변환합니다.
   .e ~ 열거 된 맵으로, 현재 값을 b에, 색인을 k에 저장합니다.
          % hk2 ~ 색인의 반전 된 패리티. (k + 1) % 2.
        hy ~ Double, 증분 홀수 정수는 1에 짝수 정수는 3에 매핑됩니다.
      b ~ 현재 숫자.
     * ~ 곱하기.
  s ~ 합계
 e ~ 마지막 자리.
! ~ 논리적 부정.

적용 후 처음 7 자리의 합을 10 에서 빼고 마지막 자리와 비교하는 경우, 알고리즘이 적용된 후 모든 숫자의 합이 10 의 배수인지 확인하는 것과 같습니다 .


실패하는 것 같습니다 3100004(진실해야 함).
Zgarb

대기 @Zgarb 우리는 어떻게해야 3*3+1*1+0*3+...0*3+3*1+1*0..? 나는 우리가 전자를해야한다고 생각했습니다
Mr. Xcoder

새로운 사양에서는 선행 숫자가 추가되어 정확히 8 (정확하게 이해하는 경우)이되도록합니다.
Zgarb

@ Zgarb Ok, 고정.
Mr. Xcoder


4

망막 , 23 22 바이트

Martin Ender 덕분에 -1 바이트 !

(.).
$1$1$&
.
$*
M`
1$

온라인으로 사용해보십시오!

설명

입력 예 : 20378240

(.).
$1$1$&

각 두 자리 숫자를 두 번 반복 한 다음 두 자리 숫자로 바꿉니다. 우리는 얻는다2220333788824440

.
$*

각 숫자를 단항으로 변환하십시오. 명확성을 위해 괄호를 추가하면(11)(11)(11)()(111)(111)...

M`

빈 문자열의 일치 횟수를 세십시오. 이는 문자열의 일치 횟수보다 하나 더 많습니다. (마지막 두 단계로 기본적으로 각 숫자의 합 +1을 취했습니다) 결과 :60

1$

1문자열의 끝에 a 를 일치 시킵니다. 우리는 숫자에 3과 1을 번갈아 곱하고 합산했습니다. 유효한 바코드의 경우 10으로 나눌 수 있어야합니다 (마지막 숫자 0). 마지막 단계에서 1을 추가 했으므로 마지막 숫자는 1이 되길 원합니다. 최종 결과 : 1.


2
.경기 무대에서 경기 1$를 중단하고 마지막 경기 를 할 수 있다고 생각합니다 .
Martin Ender

@MartinEnder 아주 좋은, 감사합니다!
Leo

3

PowerShell , 85 바이트

param($a)(10-(("$a"[0..6]|%{+"$_"*(3,1)[$i++%2]})-join'+'|iex)%10)%10-eq+"$("$a"[7])"

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인

정의 된대로 알고리즘을 구현합니다. 입력 $a"$a"[0..6]받고, 각 숫자를 빼고을 통해 반복합니다 |%{...}. 각 반복마다 숫자를 가져 와서 문자열 "$_"로 캐스트 한 다음 int 또는을 +곱하기 전에 int로 캐스트합니다 ( modulo 을 증가시켜 선택 ).31$i2

이러한 결과는 모두 함께 모여 요약 -join'+'|iex됩니다. 우리는 그 결과 mod를 취하고에서를 10빼고 10다시 결과 mod를 취합니다 10(이 두 번째 mod는 00000000테스트 사례 를 설명하는 데 필요합니다 ). 그런 다음 -eq마지막 숫자와 일치하는지 확인합니다 . 해당 부울 결과는 파이프 라인에 남아 있으며 출력은 암시 적입니다.


실패하는 것 같습니다 3100004(진실해야 함).
Zgarb

@Zgarb 저에게 효과적입니까? 온라인으로 사용해보십시오!
AdmBorkBork

아, 따옴표없이 테스트했습니다.
Zgarb

@Zgarb 아 그래. 따옴표가 없으면 PowerShell은 암시 적으로 정수로 캐스팅하여 선행 0을 제거합니다.
AdmBorkBork

3

젤리 , 16 바이트

ż3,1ṁ$P€SN%⁵
Ṫ=Ç

온라인으로 사용해보십시오!

숫자 목록으로 입력을받습니다.


Nitpick : TIO 타임 아웃 또한 16 바이트 입니다.
Outgolfer Erik

@EriktheOutgolfer 어떻게 기다리세요. D바닥 글에 넣을 때 작동합니다 . 그리고 고마워! : D
HyperNeutrino

@EriktheOutgolfer 내가 뭔가 잘못하고 있습니까? 16 바이트가 유효하지 않은 것 같습니까?
HyperNeutrino

어쩌면, 그것은 약간 다르게 작동하지만, 당신도 약간 유효하지 않은 것 같습니다 ... 특히 마지막 줄은이어야한다고 생각합니다 DµṪ=Ç.
Outgolfer Erik

1
실패하는 것 같습니다 3100004(진실해야 함).
Zgarb

3

APL (Dyalog) , 14 바이트

streetster의 솔루션 과 동일 합니다 .

전체 프로그램 본문. STDIN에서 숫자 목록을 프롬프트합니다.

0=10|+/⎕×83 1

온라인으로 사용해보십시오!

...

0= 0과 같음

10| 의 모드 -10

+/ 의 합

⎕× 입력 시간

8⍴3 1 주기적으로 가져온 8 가지 요소 [3,1]

?


1
당신은 APL이 고대 수메르어 또는 선형 B와 같은 문자에서 한 문자로 그것을 할 수 없다는 것을 의미합니까?
Mark

열차 : 0 = 10 |-/ + 2 × + /
ngn

3

05AB1E , 9 바이트

3X‚7∍*OTÖ

온라인으로 사용해보십시오!

3X‚7∍*OTÖ    # Argument a
3X‚          # Push [3, 1]
   7∍        # Extend to length 7
     *       # Multiply elements with elements at same index in a
      O      # Total sum
       TÖ    # Divisible by 10

좋은! 내가 생각했을 때 가장 먼저 생각했던 것은 "길이 연장"인데 아직 사용하지 않았습니다.
매직 문어 Urn

31×S*OTÖ8 바이트 ×31 번만 누르면 n됩니다. 곱하면 여분의 31이 자동으로 떨어집니다.
매직 문어 Urn

@MagicOctopusUrn 6 번째 테스트 케이스에서 실패한 것 같습니다69165430 -> 1
kalsowerus

3

J, 17 바이트

Cole 덕분에 -10 바이트

0=10|1#.(8$3 1)*]

온라인으로 사용해보십시오!

동일한 크기의 목록을 곱하여 원래 솔루션의 압축 / 곱하기 조합과 1#.제품을 함께 추가하는 "기본 1 트릭" 을 피합니다. 높은 수준의 접근 방식은 원래 설명과 비슷합니다.

원본, 27 바이트

0=10|{:+[:+/[:*/(7$3 1),:}:

온라인으로 사용해보십시오!

설명

0 =                                        is 0 equal to... 
    10 |                                   the remainder when 10 divides...
         {: +                              the last input item plus...
              [: +/                        the sum of...
                    [: */                  the pairwise product of...
                          7$(3 1) ,:       3 1 3 1 3 1 3 zipped with...
                                     }:    all but the last item of the input

0=10|1#.(8$3 1)*]17 바이트에서 작동해야합니다 (같은 알고리즘도 사용). 난 있으므로, 반드시 베타는 명사와 함께 오른쪽에 종료 후크를 가질 수 0=10|1#.]*8$3 115 작동 할 수 있습니다 (I 티오 확인 거라고하지만 아래 것 같다?)

@cole, 나는이 개선을 좋아합니다. 나는 1#.2 ~ 3 번과 같은 트릭 에 대해 배우고 잊어 버렸 습니다 ... 알림을 주셔서 감사합니다. 아, 15 바이트 버전은 TIO에서 작동하지 않았습니다.
요나

3

C (gcc), 84 82 72 61 54 바이트

c;i;f(x){for(i=c=0;x;x/=10)c+=(1+2*i++%4)*x;c=c%10<1;}

Neil 에서 -21 바이트

Nahuel Fouilleul 에서 -7 바이트

온라인으로 사용해보십시오!

Steadybox의 답변 과 독립적으로 개발

'f'는 바코드를로 사용하고 True와 False를 int반환 하는 함수입니다 .10

  • f의 마지막 자리에 저장 x하여 s( s=x%10)

  • 그런 다음 c( for(i=c=0;x;x/=10)c+=(1+2*i++%4)*x;) 의 합계를 계산합니다.

    • c합계 i입니다, 카운터입니다

    • 첫 번째 숫자를 포함하여 각 숫자에 대해 체크섬에 1+2*i%4숫자 ( x%10)를 곱하고 증분 i( i++in 3-2*i++%4)

      • 1+2*i%4짝수 i이면 1 , i홀수이면 0
  • 그런 다음 합계가 10의 배수인지 여부를 반환하고 마지막 숫자 (1을 곱한 값)를 추가 했으므로 바코드가 유효하면 합계는 10의 배수가됩니다. GCC 종속 정의되지 않은 동작을 사용하여 생략 return합니다.


어쨌든 나중에 복용하는 (x%10)것처럼 될 수 있다고 생각 합니다. 또한 사용 하고 마지막에 0 인지 테스트 할 수 있다고 생각합니다 . xc%10i<8c%10

@ 닐 감사합니다! 그것은 -10 바이트를 얻었다.
pizzapants184

실제로 나는 s불필요 하다고 생각한다 :c;i;f(x){for(i=c=0;i<8;x/=10)c+=(1+2*i++%4)*x;return c%10<1;}
Neil

티오 링크는 61 바이트이지만 대답은 72입니다. 또한 왜 x=c%10<1또는 c=c%10<1대신 return c%10<1여전히 작동하는지
모릅니다

또한 i<8교체 할 수 있습니다x
나우 Fouilleul

3

C, 63 바이트

i;s=0;c(int*v){for(i=0;i<8;i++){s+=v[i]*3+v[++i];}return s%10;}

그 가정 0입니다 true및 다른 값이다 false.

더 나은 리턴 값을위한 +3 바이트

i;s=0;c(int*v){for(i=0;i<8;i++){s+=v[i]*3+v[++i];}return s%10==0;}

추가 ==0받는 return문.

언 골프

int check(int* values)
{
    int result = 0;
    for (int index = 0; index < 8; index++)
    {
        result += v[i] * 3 + v[++i]; // adds this digit times 3 plus the next digit times 1 to the result
    }
    return result % 10 == 0; // returns true if the result is a multiple of 10
}

이것은 체크 디지트를 포함한 전체 바코드의 체크섬이 10의 배수가되도록 체크 디지트가 선택되는 EAN 체크섬의 대체 정의를 사용합니다.

Steadybox가 제안한 루프 내부 변수 초기화, 63 바이트

i;s;c(int*v){for(i=s=0;i<8;i++){s+=v[i]*3+v[++i];}return s%10;}

Steadybox에서 제안한대로 중괄호 제거, 61 바이트

i;s;c(int*v){for(i=s=0;i<8;i++)s+=v[i]*3+v[++i];return s%10;}

Kevin Cruijssen이 제안한대로 더 나은 반환 가치 <1보다는 사용==0

i;s=0;c(int*v){for(i=0;i<8;i++){s+=v[i]*3+v[++i];}return s%10<1;}

명령문에 추가 <1하면 3 바이트를 return추가 ==0하는 것보다 2 바이트 만 추가됩니다 .


당신은 할 수 2 바이트를 저장 을 제거하여 {}애프터 for. 또한, 기능 제출은 재사용 될 필요 는 초기화 할 필요가 있으므로, s(바로 변경 기능 내부 i;s=0;i,s;i=0;i=s=0;).
Steadybox

@Steadybox 중괄호는 어떻게 제거합니까?
Micheal Johnson

그들 안에 단 하나의 진술이 있습니다. 뒤에 중괄호가 없으면 for루프 본문이 다음 명령문이됩니다. for(i=0;i<8;i++){s+=v[i]*3+v[++i];}와 동일합니다 for(i=0;i<8;i++)s+=v[i]*3+v[++i];.
Steadybox

@Steadybox 아 물론입니다. 일반적인 코드를 작성할 때 코드가 더 읽기 쉽기 때문에 필요하지 않더라도 항상 중괄호를 포함하기 때문에 일반적으로 잊어 버리는 C 구문의 단점 중 하나입니다.
Micheal Johnson

당신의 참 / 거짓 대답에서 +3을 추가 ==0하는 대신 그것을 사용하여 +2 일 수 있습니다 <1. :)
Kevin Cruijssen '11

2

자바 스크립트 (Node.js) , 47 바이트

e=>eval(e.map((a,i)=>(3-i%2*2)*a).join`+`)%10<1

훨씬 짧은 답변이 이미 있지만 이것은 JavaScript로 골프를 치는 첫 번째 시도이므로 골프 권장 사항을 듣고 싶습니다 :-)

테스팅

또는 온라인으로 사용해보십시오!


2

Perl 5, 37 32 + 1 (-p) 바이트

s/./$-+=$&*(--$|*2+1)/ge;$_=/0$/

Dom Hastings 덕분에 -5 바이트 37 +1 바이트는

$s+=$_*(++$i%2*2+1)for/./g;$_=!!$s%10

온라인으로 사용해보십시오


1
이와 약간의 놀이를했다 내가 유용한 트릭을 공유하고자합니다 : --$|토글 사이 10대신의 사용할 수 있도록 ++$i%2교류 부울을! 또한 중요한 것은 total ( $s)이 일치 /0$/한다는 것입니다 s///. 이러한 변경 사항을 다음 과 결합하여 33 바이트를 얻을 수 있습니다. 온라인으로 사용해보십시오! ( -l다만 시정을위한)
돔 헤이스팅스

그래, 난에 불구 s/./(something with $&)/ge하고 /0$/일치하지만 두 결합.
Nahuel Fouilleul

2

Brainfuck, 228 바이트

>>>>++++[<++>-]<[[>],>>++++++[<++++++++>-]<--[<->-]+[<]>-]>[->]<<<<[[<+>->+<]<[>+>+<<-]>>[<+>-]<<<<<]>>>>[>>[<<[>>+<<-]]>>]<<<++++[<---->-]+++++[<++<+++>>-]<<[<[>>[<<->>-]]>[>>]++[<+++++>-]<<-]<[[+]-<]<++++++[>++[>++++<-]<-]>>+.

아마 약간 개선 될 수 있습니다. 입력은 한 번에 1 자리이며, 1은 true, 0은 false입니다.

작동 방식 :

>>>>++++[<++>-]<

위치 3에 8을 놓습니다.

[[>],>>++++++[<++++++++>-]<--[<->-]+[<]>-]

입력을 8 회 가져와 매번 ASCII 값에서 실제 값 +2로 변경합니다. 입력은 1 씩 간격을두고 나중에 쉽게 곱할 수 있도록 제거됩니다.

>[->]

각 항목에서 하나씩 빼십시오. 우리 테이프는 이제

0 0 0 0 4 0 4 0 8 0 7 0 6 0 2 0 3 0 10 0 0
                                         ^

각 값이 1보다 커야합니다. 0은 곱셈 과정을 망칠 것이기 때문입니다.

이제 곱셈을 시작할 준비가되었습니다.

<<<<

마지막에서 두 번째 항목으로 이동하십시오.

[[<+>->+<]<[>+>+<<-]>>[<+>-]<<<<<]

0 인 동안 항목에 3을 곱한 다음 두 항목을 왼쪽으로 이동하십시오. 이제 필요한 모든 것을 3으로 곱했으며 테이프의 첫 번째 위치에 있습니다.

>>>>[>>[<<[>>+<<-]]>>]

전체 목록을 요약하십시오.

<<<++++[<---->-]

우리가 가진 가치는 실제 가치보다 16 더 큽니다. 16을 빼서이 문제를 해결하십시오.

+++++[<++<+++>>-]

합계가 10의 배수인지 테스트해야합니다. 최대 합계는 9 초 (144)입니다. 합계가 10 * 15보다 크지 않으므로 테이프에 15와 10을 순서대로 붙여 넣습니다. 합계의 권리.

<<[<[>>[<<->>-]]>[>>]++[<+++++>-]<<-]

15가있는 곳으로 이동하십시오. 0이 아닌 합계가 0이 아닌지 테스트하십시오. 그렇다면 10을 빼십시오. 이제 우리는 (빈) 합계 위치에 있거나 (또한 비어있는) 10 위치에 있습니다. 오른쪽으로 움직입니다. 우리가 합계 위치에 있다면, 우리는 이제 0이 아닌 15 위치에 있습니다. 그렇다면 오른쪽으로 두 번 이동하십시오. 이제 우리는 두 경우 모두 같은 위치에 있습니다. 10의 위치에 10을 더하고 15의 위치에서 1을 뺍니다.

나머지는 출력용입니다.

<[[+]-<]<++++++[>++[>++++<-]<-]>>+.

합계 위치로 이동하십시오. 0이 아닌 경우 (음수) 바코드가 유효하지 않습니다. 위치를 -1로 설정하십시오. 이제 올바른 아스키 값을 얻으려면 49를 추가하십시오. 1이면 유효하고 0이면 유효하지 않습니다.


2

자바 8, 53 바이트

골프 :

b->(3*(b[0]+b[2]+b[4]+b[6])+b[1]+b[3]+b[5]+b[7])%10<1

람다에서의 직접 계산이 가장 짧은 솔루션으로 나타납니다. 단일 표현식에 적합하여 람다 오버 헤드를 최소화하고 외부 변수 선언 및 세미콜론을 제거합니다.

public class IsMyBarcodeValid {

  public static void main(String[] args) {
    int[][] barcodes = new int[][] { //
        { 2, 0, 3, 7, 8, 2, 4, 0 }, //
        { 3, 3, 7, 6, 5, 1, 2, 9 }, //
        { 7, 7, 2, 3, 4, 5, 7, 5 }, //
        { 0, 0, 0, 0, 0, 0, 0, 0 }, //
        { 2, 1, 0, 3, 4, 9, 8, 4 }, //
        { 6, 9, 1, 6, 5, 4, 3, 0 }, //
        { 1, 1, 9, 6, 5, 4, 2, 1 }, //
        { 1, 2, 3, 4, 5, 6, 7, 8 } };
    for (int[] barcode : barcodes) {
      boolean result = f(b -> (3 * (b[0] + b[2] + b[4] + b[6]) + b[1] + b[3] + b[5] + b[7]) % 10 < 1, barcode);
      System.out.println(java.util.Arrays.toString(barcode) + " = " + result);
    }
  }

  private static boolean f(java.util.function.Function<int[], Boolean> f, int[] n) {
    return f.apply(n);
  }
}

산출:

[2, 0, 3, 7, 8, 2, 4, 0] = true
[3, 3, 7, 6, 5, 1, 2, 9] = true
[7, 7, 2, 3, 4, 5, 7, 5] = true
[0, 0, 0, 0, 0, 0, 0, 0] = true
[2, 1, 0, 3, 4, 9, 8, 4] = false
[6, 9, 1, 6, 5, 4, 3, 0] = false
[1, 1, 9, 6, 5, 4, 2, 1] = false
[1, 2, 3, 4, 5, 6, 7, 8] = false

2

Q 기본, 54 52 바이트

지루한 답변이 가장 짧았습니다.

INPUT a,b,c,d,e,f,g,h
?(3*a+b+3*c+d+3*e+f+3*g+h)MOD 10=0

쉼표로 구분 된 숫자를 입력합니다. 한 번에 한 자릿수를 입력하는 원래의 54 바이트 솔루션은 "더 나은"접근 방식을 사용합니다.

m=3
FOR i=1TO 8
INPUT d
s=s+d*m
m=4-m
NEXT
?s MOD 10=0

2

C # (. NET 코어) , 65 62 바이트

b=>{int s=0,i=0,t=1;while(i<8)s+=b[i++]*(t^=2);return s%10<1;}

온라인으로 사용해보십시오!

감사의 말

@KevinCruijssen 및 배타적 연산자를 사용하는 깔끔한 트릭 덕분에 -3 바이트.

골프

b=>{
    int s=0,i=0,t=1;

    while(i<8)
        s+=b[i++]*(t^=2); // exclusive-or operator alternates t between 3 and 1.

    return s%10<1;
}

C # (. NET 코어) , 53 바이트

b=>(3*(b[0]+b[2]+b[4]+b[6])+b[1]+b[3]+b[5]+b[7])%10<1

온라인으로 사용해보십시오!

@ Snowman 's answer 의 직접 포트 .


첫 번째 답변 : b=>{int s=0,i=0,t=1;while(i<8)s+=b[i++]*(t^=2);return s%10<1;}( 62 bytes ) 또는 foreach와 함께 62 바이트 : b=>{int s=0,t=1;foreach(int i in b)s+=i*(t^=2);return s%10<1;}(이것은 Java 8 answer 의 포트입니다 ).
케빈 크루이 ssen

1

MATLAB / 옥타브 , 32 바이트

@(x)~mod(sum([2*x(1:2:7),x]),10)

온라인으로 사용해보십시오!

이 코드를 개발하고 다른 답변을 보지 않고 접근하면서 다른 Octave 답변에도 불구하고 이것을 게시 할 것입니다.

여기에 입력을 8 값의 배열로 가져오고 유효한 바코드이면 true를 반환하고 그렇지 않으면 false를 반환하는 익명 함수가 있습니다.

결과는 다음과 같이 계산됩니다.

              2*x(1:2:7)
             [          ,x]
         sum(              )
     mod(                   ,10)
@(x)~
  1. 홀수 자릿수 (한 인덱스)에 2를 곱합니다.
  2. 결과는 입력 배열 앞에 추가되어 합계에 홀수 자릿수가 세 번, 짝수 자릿수가 한 번 포함되는 배열을 제공합니다.
  3. 우리는 합계에 제공된 체크섬을 포함하는 합계를 수행합니다.
  4. 다음으로 모듈로 (10)가 수행된다. 제공된 체크섬이 유효하면 체크섬 값을 포함하여 곱한 모든 숫자의 합이 10의 배수가됩니다. 따라서 유효한 바코드 만 0을 반환합니다.
  5. 유효한 경우 논리 출력 true를 얻기 위해 결과가 반전됩니다.

1

엑셀, 37 바이트

Excel에서 8 개의 개별 셀을 허용하는 "8 개의 정수 목록"해석 :

=MOD(SUM(A1:H1)+2*(A1+C1+E1+G1),10)=0

= MOD (SUM ((A1 : H1) + 2 * (A1 + C1 + E1 + G1)), 10) = 0이 수식이 Excel에 있습니까?
RosLuP

@RosLuP (사전 정의되지 않음) 그러나 Modulo, Sum, + 등은 ;-)
Wernisch

나는 APL에서 처음 y = (A1 : H1) + 2 * (A1 + C1 + E1 + G1), 그리고 합과 모드 후에 잘 수행되는 것 같습니다. APL에서는 (1,2,3) + 4 = (5,6,7) 및 sum (5,6,7) = 18과 같은 첫 번째 sum (A1 : H1) 등이 잘되지 않습니다. sum (1,2,3) = 6 및 6 + 4 = 10은 18과 다릅니다. 그러나 가능한 오류가 있습니다
RosLuP

@RosLuP, 사과, ()댓글에서 변경된 부분을 놓쳤습니다 .
베르니 슈

문제는 Excel이 해석하는 방식입니다 =(A1:H1). 이것은 배열로 처리되지 않습니다. A-H범위 내에 있지 않은 열에 배치 된 경우 유효하지 않습니다 . AH의 열에 배치 된 경우 해당 열의 값만 반환합니다. (% 공식은 % : C2-> C1 H999-> H1 K1-> #VALUE!)
Wernisch

1

루비, 41 바이트

정수 배열을받습니다. Jordan 덕분에 -6 바이트

->n{n.zip([3,1]*4){|x,y|$.+=x*y};$.%10<1}

좋은! FWIW 당신은 ​​전혀 필요하지 않습니다 map: zip차단합니다. $.초기화 하는 대신 다음을 사용하여 몇 바이트를 더 절약 할 수 있습니다 s.->n{n.zip([3,1]*4){|x,y|$.+=x*y};$.%10<1}
Jordan

1

TI 기본 (83 시리즈), 18 바이트

not(fPart(.1sum(2Ans-Ans9^cumSum(binomcdf(7,0

의 목록으로 입력을 Ans받습니다. 1유효한 바코드와 0유효하지 않은 바코드를 반환 합니다.

Mathematica 답변 의 포트 . 온라인 테스트 환경 대신 스크린 샷 포함 :

바코드 스크린 샷

주목할만한 기능 : binomcdf(7,0리스트를 생성하는 데 사용됩니다 {1,1,1,1,1,1,1,1}(성공 확률이 0 인 7 회 시도에서 N = 0,1, ..., 7의 경우 최대 N 개의 성공 확률이 있음). 그런 다음 cumSum(이것을로 바꿉니다 {1,2,3,4,5,6,7,8}.

이것은 seq(명령을 사용하는 것보다 1 바이트 짧습니다. 역사적으로 요점은 상당히 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.