Dutch Burgerservicenummer (BSN) สิบเอ็ดทดสอบ


29

บทนำ:

Dutch BSN (BurgerServiceNummer) ใช้ได้เมื่อปฏิบัติตามกฎต่อไปนี้:

  • มันมีตัวเลขเท่านั้น
  • ความยาวควรมีความยาว 8 หรือ 9
  • เมื่อตัวเลขถูกทำดัชนีว่าAผ่านIผลลัพธ์ของการรวมดังต่อไปนี้: 9xA + 8xB + 7xC + 6xD + 5xE + 4xF + 3xG + 2xH + -1xI(หมายเหตุ -1 แทนที่จะเป็น 1!) ควรหารด้วย 11 และไม่ควรเป็น 0

ท้าทาย:

อินพุต:สตริงหรืออักขระที่แทน BSN

ผลลัพธ์: ผลลัพธ์ที่เป็นจริงหรือเท็จไม่ว่าอินพุตจะเป็น BSN ที่ถูกต้อง

กฏท้าทาย:

  • รูปแบบอินพุตควรเป็นสตริงหรือ char-array คุณไม่ได้รับอนุญาตให้ใช้จำนวนเต็มหรือตัวเลข (อาจแปด) (คุณได้รับอนุญาตให้แปลงเป็นตัวเลขภายในด้วยตัวคุณเอง แต่ไม่ใช่อาร์กิวเมนต์โดยตรง)
  • แม้จะมีข้อ จำกัด ในการป้อนข้อมูลข้างต้นคุณสามารถสมมติว่ากรณีทดสอบทั้งหมดจะมีหนึ่งหรือมากกว่าหนึ่งหลัก ( [0-9]+)
  • เกี่ยวกับ BSN ที่มีความยาว 8 แทนที่จะเป็น 9 วิกิพีเดียภาษาดัตช์จะกล่าวต่อไปนี้: " สำหรับการทดสอบสิบเอ็ดครั้งและสำหรับการใช้งานในทางปฏิบัติอื่น ๆ จะมีการเพิ่มศูนย์นำหน้าเพื่อทำให้จำนวนความยาว 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จากสูตรที่ให้ไว้?
isaacg

@isaacg ฉันได้เพิ่มกฎเกี่ยวกับสิ่งนี้พร้อมลิงก์ไปยังหน้าวิกิพีเดีย (ดัตช์) คุณไม่ถูกต้องมันไม่ได้Aมาจากสูตร (หรือโดยทั่วไปจะเพิ่มส่วนนำ0เพื่อทำให้ความยาว 9 เป็นผลลัพธ์เช่นเดียวกับการข้ามA)
Kevin Cruijssen

กรณีทดสอบสำหรับ "ผลรวม [... ] ไม่ควรเป็น 0": 000000012
เดิมพัน

@betseg ฉันได้เพิ่มไปยังรายการ
Kevin Cruijssen

คำตอบ:


8

05AB1E , 23 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 แต่คุณสามารถบันทึก 3 ไบต์ในขณะนี้โดยการเปลี่ยนDgLไปāและจะ ลองออนไลน์ Ā
Kevin 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คำตอบเสมอ!
Neil

ในที่สุดก็พบวิธีที่จะเข้าถึง 58 ด้วยmap()เพียงตระหนักว่าคำตอบของคุณคือ57ไบต์ยาว :-) จริง ๆ
Arnauld

@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 ระหว่าง
Billywob

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))สามารถจะกลายเป็น %*%นอกจากนี้ผลรวมของสินค้าคู่ของทั้งสองเวกเตอร์เป็นเช่นเดียวกับจุดคูณของพวกเขา
JAD

@JarkoDubbeldam เยี่ยม! ผลิตภัณฑ์ dot นั้นฉลาดจริงๆ
Billywob

7

JavaScript (ES6), 61 60 59 58 ไบต์

ใช้อาร์เรย์ของตัวอักษรเป็นอินพุต ผลตอบแทน/falsetrue

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 ไบต์

ขอบคุณ @MartinEnder สำหรับการบันทึก5 3 ไบต์ในขณะที่แก้ไขรหัสของฉัน !

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แม้ว่าจะไม่ได้มีความยาวที่ถูกต้อง
Christian Sievers

1
สิ่งนี้ไม่ทำงานกับ BSN ส่วนตัวของฉัน
roberrrt-s

หวังว่าจะได้รับการแก้ไข
betseg

ไม่ได้แก้ไข ไม่ทำงานกับฉันเหมือนกัน
DavidPostill

1
@Roberrrt, @DavidPostill; ตกลงหรือไม่ฉันควรจะยอมแพ้? = (
betseg

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 เป็นเวกเตอร์ที่เป็นตัวเลขแล้วผนวก 0 ถ้าความยาว 8 แล้วคำนวณ dotproduct ของเวกเตอร์ Y c(9,8,7,6,5,4,3,2,-1)และ ทดสอบว่าผลลัพธ์เป็นทั้งศูนย์และหารด้วย 11

ที่บันทึกไว้ 16 ไบต์ขอบคุณกับตรรกะโดย @Enigma ที่ปริยายท้าย 0 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 -pe(และอินพุตที่ให้โดยไม่มีบรรทัดใหม่สุดท้ายพร้อมด้วยecho -n) ก็เพียงพอแล้ว (ยกเว้นกรณีที่ Perl ของคุณเก่าเกินไปซึ่งในกรณีนี้คุณจะต้องใช้-a(แต่สำหรับ Perls ล่าสุดมันบอกเป็นนัย-F) ในที่สุดรหัสของคุณมีความยาว 70 ไบต์ ไม่ใช่ 52;)
Dada

3

C ++ 14, 107 106 ไบต์

-1 ไบต์intแทนautoการวนซ้ำ

เป็นแลมบ์ดาที่ไม่มีชื่อที่ส่งคืนผ่านพารามิเตอร์อ้างอิง ต้องมีการป้อนข้อมูลที่จะเป็นหรือภาชนะของถ่านเช่นstd::stringvector<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;}

Ungolfed และการใช้งาน:

#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-
Luis Mendo


@LuisMendo แย่มาก [a2:9]*ผลลัพธ์ในการคูณที่ไม่ใช่องค์ประกอบดังนั้นจึง!จำเป็นต้องใช้อีกอันหนึ่งซึ่งจะชดเชยผลกำไรเริ่มต้น
Sanchises

3

MATL , 26 ไบต์

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

ผลที่ได้คือเวกเตอร์คอลัมน์ที่ไม่ว่างเปล่าซึ่งเป็นtruthy IFF ทุกรายการที่มีค่าที่ไม่ใช่ศูนย์

ลองออนไลน์!

หรือตรวจสอบกรณีทดสอบทั้งหมดที่มีแต่ละผลลัพธ์ในบรรทัดที่แตกต่างกัน

คำอธิบาย

สิ่งนี้ทดสอบสามเงื่อนไขตามลำดับต่อไปนี้:

  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
ยังไงก็ตามอินพุตแบบเวกเตอร์คอลัมน์จะไม่ถือว่าเป็นchar-array ที่เป็นตัวแทนของ BSNและช่วยคุณประหยัดเป็นคนแรก!ใช่หรือไม่
Sanchises

@Sanchises ปัญหาคือว่าแล้วGผลักเวกเตอร์คอลัมน์และฉันต้องแปลงให้ทำซ้ำด้วยg*
Luis Mendo

แน่นอนใช่ ไม่เป็นไร!
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

gนับผลรวมที่ใช้ในสิบเอ็ด - โพรเซของhในขณะที่fยังตรวจสอบความยาวที่ถูกต้องและที่สิบเอ็ด - โพรฟไม่ใช่ 0 โดยเฉพาะอย่างยิ่งการตรวจสอบของfใช้จำนวนมากไบต์

แก้ไข: บันทึก 10 ไบต์ด้วย Lynn และdivการปัดเศษลง


1
แล้วไงf x=div(length x)2==4&&g x>0&&h xล่ะ
ลินน์

@ ลินน์: นั่นเป็นสิ่งที่ดีขอบคุณ
Renzeee

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)

แต่น่าเสียดายที่ผมสามารถยอมรับได้เฉพาะหนึ่งคำตอบแทนของทั้งสองตั้งแต่คุณมีเดียวกัน 21 ไบต์นับเป็น@Emignaคำตอบ 05AB1E 's แต่เนื่องจากEnigmaตอบเร็ว (และแก้ไขของเขาสำหรับ 21 ไบต์ก็ยังเร็ว) ฉันได้รับการยอมรับของเขา
Kevin Cruijssen

นั่นฟังดูยุติธรรมสำหรับฉัน!
Jonathan Allan


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

รับสตริงเป็นอินพุต ฟังก์ชันเพิ่ม a '0'ที่ด้านหน้าของสตริงไม่ว่าจะต้องการหรือไม่และใช้ดัชนีลบของ Python เพื่อเพิ่มองค์ประกอบเริ่มต้นจากจุดสิ้นสุดของสตริงและทำงานกลับไปด้านหน้า

จะถูกจัดการแยกกันโดยใช้สายที่สองไป-1xI 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)*uจะทำงานได้ดีเช่นกันเพราะมันจะเพิ่ม1เวลาs[-1]แต่แล้วก็ลบมันสองครั้งและมันก็จะเพิ่ม0เวลา (บางสิ่ง) ซึ่งแน่นอนว่าจะไม่ส่งผลกระทบต่อผลรวม


2

Brain-Flak , 345 ไบต์

รวมถึง +3 สำหรับ -a

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

ความจริงคือ 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

ตกลงฉันจะยอมรับว่านี่เป็นระเบียบเรียบร้อย และมันก็เป็นอย่างนั้น แต่ทนกับฉันและเราจะผ่านมันไป

เรารับอินพุต$n(เป็นchar-array) และตั้งค่า$iเท่ากับ8ลบค่าบูลีนว่ามี 8 รายการใน$nหรือไม่ ความหมายถ้ามี 8 รายการแล้วจะเป็น$i7

ส่วนถัดไปรวมการคำนวณกับผลลัพธ์ของเรา การทำงานจากภายในที่เราห่วงผ่านด้วย$n $n|%{...}แต่ละซ้ำเราจะใช้หลอก ternary จะเกิดขึ้นกับหนึ่งในสองผล - ทั้งหรือ-"$_" (($i+1)*+"$_")ดัชนีจะขึ้นอยู่กับว่า$iเป็น0หรือไม่ (เช่นเราได้ตี-1xIกรณีจากสมการท้าทาย) ซึ่งได้รับการโพสต์ลดลงสำหรับรอบต่อไป เหล่านี้จะรวมตัวกันทั้งหมดใน parens และเอ็ดร่วมกับ-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 เพื่อสะท้อนความจริงของเท็จ ต้องทำแบบนี้ ความคิดใด ๆ

128 ไบต์: เปลี่ยนเป็น "true" และ "false" เป็น 1 และ 0


2

C #, 120 115 ไบต์

สิ่งนี้จะวนchar[]ซ้ำตามที่ได้รับเป็นอินพุตและส่งคืนจริงหรือเท็จ:

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! r>0&&r%11==0&&l<10&&l>7สามารถเล่นกอล์ฟถึงr>0&r%11<1&l<10&l>7( &&ไปยัง&และr%11==0ไปr%11<1) และสามารถที่จะแข็งแรงเล่นกอล์ฟ-'0' -48
Kevin Cruijssen

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 equals, greater thanพอเพียงประหยัดไบต์
  • วิธีที่สั้นกว่าเพื่อลบตัวเลขที่สำคัญน้อยที่สุด
  • ลบถ่านแทน XOR โดยบันทึกเป็นไบต์
  • บันทึก 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 ไบต์

อย่างนี้เป็นสิ่งที่-substracts -1ส่วนที่เหลือของการขัดแย้งจากคนแรกเพื่อให้จับว่ากรณีพิเศษของน้ำหนัก ฟังก์ชั่นนี้จะส่งกลับnilสำหรับปัจจัยการผลิตที่มีความยาวไม่ถูกต้อง แต่ในคำสั่งพวกเขาทำงานเช่นเดียวกับif ส่งคืนถ้าความยาวของไม่ใช่ 8 หรือ 9false(#{8 9}(count v))nilv

(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

Stax , 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.