Pengantar:
BSN Belanda (BurgerServiceNummer) valid ketika mematuhi aturan berikut:
- Hanya berisi digit.
- Panjangnya harus 8 atau 9 panjangnya.
- Ketika digit diindeks
A
melaluiI
, hasil dari jumlah berikut:9xA + 8xB + 7xC + 6xD + 5xE + 4xF + 3xG + 2xH + -1xI
(Perhatikan -1 bukannya 1!) Harus habis dibagi 11, dan tidak boleh 0.
Tantangan:
Input: String atau char-array yang mewakili BSN.
Keluaran: Hasil yang benar atau salah apakah input tersebut merupakan BSN yang valid.
Aturan Tantangan:
- Format input harus berupa string atau char-array. Anda tidak diizinkan untuk menggunakan int-array angka, atau nomor (mungkin oktal). (Namun Anda diizinkan untuk mengonversinya menjadi int-array angka, tetapi tidak secara langsung sebagai argumen.)
- Meskipun ada pembatasan pada input di atas, Anda dapat mengasumsikan semua test case akan berisi satu atau lebih digit (
[0-9]+
) - Mengenai BSN dengan panjang 8 dan bukan 9, Wikipedia Belanda menyatakan sebagai berikut: " Untuk uji sebelas dan untuk penggunaan praktis lainnya, nol terkemuka ditambahkan untuk membuat jumlah panjang 9. " ( sumber )
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'. - Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, silakan tambahkan penjelasan jika perlu.
Kasus uji:
// Truthy test cases:
111222333
123456782
232262536
010464554
10464554
44016773
// Falsey test cases:
000000000
192837465
247594057
88888888
73
3112223342
000000012
code-golf
string
arithmetic
decision-problem
Kevin Cruijssen
sumber
sumber
A
dari rumus yang diberikan?A
dari rumus (atau pada dasarnya menambahkan sebuah penuntun0
untuk membuatnya panjang 9, menghasilkan hasil yang sama dengan menghilangkanA
)Jawaban:
05AB1E ,
2321 byteCobalah online! atau sebagai Test suite
Penjelasan
sumber
DgL
keā
dan0Ê
keĀ
. Cobalah online.JavaScript (ES6) 57
Input sebagai array karakter.
reduceRight
hemat hari ini!Uji
sumber
reduceRight
jawaban!map()
, hanya untuk menyadari bahwa jawaban Anda sebenarnya 57 byte panjang :-)R,
8667 byteSunting: Terima kasih kepada Jarko Dubbeldam karena menyarankan produk titik!
Membaca input dari stdin dan menyimpan sebagai array / vektor karakter. Selanjutnya dikonversi ke numerik, gandakan dengan vektor
9...2,-1
dan periksa semua kondisi.sumber
x
sebagai vektor.if(l<9)x=c(0,x);s=sum(as.double(x)*c(9:2,-1))
bisa diubah menjadis=sum(as.double(x)*c(l:2,-1))
. Juga, jumlah dari produk berpasangan dari dua vektor adalah sama dengan perkalian titik mereka%*%
.JavaScript (ES6),
61605958 byteMengambil array karakter sebagai input. Pengembalian
false
/true
.Uji kasus
Tampilkan cuplikan kode
sumber
C,
1121019698104 byteTerima kasih kepada @MartinEnder karena telah menghemat
53 bytesambil memperbaiki kode saya!Mengembalikan 0 jika tidak valid, 1 jika valid. Cobalah online!
sumber
61
meskipun panjangnya tidak tepat.R,
957993 byteFungsi tanpa nama yang menggunakan string sebagai argumen. Pada awalnya saya mengedepankan persyaratan memiliki string sebagai input, bukan angka, tapi itu bagus, karena menghemat beberapa byte pada konversi.
Saya tidak yakin bagaimana menafsirkan array karakter, tetapi jika itu berarti bahwa Anda dapat menggunakan vektor dari angka
"1" "2" "3" "4" etc
- angka bersenar sebagai input, itu bahkan menjadi sedikit lebih pendek:Pisahkan x menjadi vektor numerik, kemudian tambahkan 0 jika panjangnya 8, kemudian hitung produk titik dari vektor y dan
c(9,8,7,6,5,4,3,2,-1)
. Menguji apakah hasilnya bukan nol dan dapat dibagi dengan 11.Disimpan 16 byte berkat logika oleh @ Enigma, secara implisit menambahkan 0 dalam pembuatan vektor
c(length(x):2,-1)
.Lupa menambahkan cek untuk panjang 8/9, jadi +14 byte :(
sumber
Perl, 58 byte (52 + 6)
Jalankan dengan
Input melewati
STDIN
:Pemakaian
Outputs
1
sebagai nilai kebenaran,0
atau tidak ada nilai falsey.sumber
$r+=$_*(-1,2..9)[$i++]for reverse@F
. Juga,-F -pe
(dan input yang diberikan tanpa baris akhir final,echo -n
misalnya) sudah cukup (kecuali Perl Anda terlalu tua, dalam hal ini Anda akan membutuhkan-a
(tetapi pada Perls baru-baru ini, tersirat oleh-F
). Akhirnya, kode Anda panjangnya 70 byte , bukan 52;)C ++ 14,
107106 byte-1 byte sebagai
int
gantiauto
in untuk loop.Sebagai lambda tanpa nama kembali melalui parameter referensi. Membutuhkan input untuk menjadi
std::string
atau wadah char, sukavector<char>
.Tidak digabungkan dan digunakan:
sumber
Befunge, 72 byte
Cobalah online!
Penjelasan
sumber
MATL, 36 byte
Bukan program MATL terpanjang yang pernah saya tulis , tapi saya suka bagaimana
if
/else
pernyataan menjadi sangat panjang dengan sangat cepat dalam bahasa golf. Saya merasa bahwa solusi ini mungkin tidak optimal di MATL, tetapi sampai sekarang saya tidak dapat mengoptimalkannya lebih jauh. Saya sedang berpikir untuk menggunakan 0 ganda di suatu tempat, dan mungkin mengurangit
di mana-mana.Cobalah online! Penjelasan:
sumber
!U
alih-alih48-
[a2:9]*
menghasilkan perkalian non-elemen-bijaksana, sehingga lain!
akan diperlukan yang akan mengimbangi keuntungan awal.MATL , 26 byte
Hasilnya adalah vektor kolom non-kosong, yang benar jika semua entri adalah nol .
Cobalah online!
Atau verifikasi semua kasus uji dengan setiap hasil pada jalur yang berbeda.
Penjelasan
Ini menguji tiga kondisi dalam urutan berikut:
Pertimbangkan masukan
'8925'
untuk penjelasannya.;
adalah pemisah baris untuk matriks.sumber
?
mungkin akan lebih efisien, tetapi saya tidak tahu cara untuk mempersingkat panjang 8 atau 9. AndaGn8-tg=
sangat pintar.!
?G
mendorong vektor kolom dan saya perlu mengubahnya untuk melakukan pengulangan dengang*
Haskell,
116112102 byteg
menghitung jumlah yang digunakan dalam sebelas-proefh
, sementaraf
juga memeriksa untuk panjang yang benar dan bahwa sebelas-proef tidak 0. Terutama cekf
mengambil banyak byte.EDIT: disimpan 10 byte berkat Lynn dan
div
pembulatan ke bawah.sumber
f x=div(length x)2==4&&g x>0&&h x
?Jelly , 21 byte
TryItOnline! atau jalankan semua test case
Nilai-nilai pengembalian yang sebenarnya adalah nol (dan, pada kenyataannya, merupakan kelipatan dari 11 jumlah).
Bagaimana?
sumber
Python 2, 102 byte
sumber
Python 2, 96 byte
Mengambil string sebagai input. Fungsi menambahkan a
'0'
ke bagian depan string, apakah itu memerlukan atau tidak, dan menggunakan indeks negatif Python untuk menambahkan elemen, mulai dari ujung string dan bekerja kembali ke depan.Ini
-1xI
ditangani secara terpisah, menggunakan panggilan kedua keint()
. Saya tidak tahu cara menghindari ini tanpa biaya lebih banyak byte daripada yang saya simpan.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
akan bekerja dengan baik, karena itu akan menambah1
waktus[-1]
tetapi kemudian kurangi dua kali, dan itu juga akan menambah0
waktu (sesuatu) yang tentu saja tidak akan mempengaruhi jumlah.sumber
Brain-Flak , 345 Bytes
Termasuk +3 untuk
-a
Truthy adalah 1, Falsy memiliki 0 di bagian atas tumpukan.
Cobalah secara Online!
Saya cukup yakin ada cara yang lebih pendek untuk melakukan perkalian dalam satu lingkaran, tetapi saya belum menemukannya.
sumber
PowerShell v2 +, 96 byte
OK, saya akui, ini sepertinya berantakan total. Dan itu agak. Tapi, bersabarlah dan kami akan melewatinya.
Kami mengambil input
$n
(sebagaichar
-array) dan menetapkan$i
sama dengan8
minus nilai Boolean untuk apakah ada 8 item dalam$n
. Artinya, jika ada 8 item, maka$i
akan menjadi7
.Bagian selanjutnya menggabungkan perhitungan dengan output kami. Bekerja dari dalam, kami mengulanginya
$n
dengan$n|%{...}
. Setiap iterasi, kami menggunakan pseudo-ternary untuk menghasilkan satu dari dua hasil - baik-"$_"
atau(($i+1)*+"$_")
. Indeks ini didasarkan pada apakah$i
ini0
atau tidak (yaitu, kami telah memukul-1xI
kasus dari persamaan tantangan), yang mendapat pasca-dikurangi untuk go-babak berikutnya. Itu semua dikumpulkan di parens dan diedit-join
bersama+
. Sebagai contoh, dengan input yang111222333
kami miliki saat ini9+8+7+12+10+8+9+6+-3
. Itu disalurkan keiex
(kependekanInvoke-Expression
dan mirip denganeval
) sebelum disimpan ke$b
. Kami kemudian mengambil itu%11
dan melakukan Boolean-tidak!(...)
pada itu (yaitu, jadi jika habis dibagi 11, bagian ini$true
). Itu digabungkan dengan-and$b
untuk memastikan bahwa$b
itu bukan nol. Hasil Boolean ditinggalkan di jalur pipa dan hasilnya tersirat.Contohnya
sumber
PHP
139128 byteTidak bisa mendapatkan CLI untuk hanya mengulangi kebenaran salah. Harus melakukannya dengan cara ini. Ada ide?
128 byte: Mengubah "true" dan "false" ke 1 dan 0.
sumber
C #,
120115 byteIni loop melalui
char[]
menerima sebagai input dan mengembalikan benar atau salah:Fiddle: https://dotnetfiddle.net/3Kaxrt
Saya yakin saya bisa mengikis beberapa byte, terutama di berantakan
return
. Ada ide selamat datang!Sunting: Disimpan 5 byte berkat Kevin. Aku tidak tahu saya bisa menggunakan
&
bukan&&
!sumber
r>0&&r%11==0&&l<10&&l>7
bisa di mainkan ker>0&r%11<1&l<10&l>7
(&&
ke&
danr%11==0
ker%11<1
). Dan-'0'
bisa bermain golf-48
.PHP,
868584838279 byteCatatan: menggunakan PHP 7.1 untuk indeks string negatif.
Jalankan seperti ini:
Versi untuk PHP <7.1 (+10 byte)
Penjelasan
Tweaks
"0"
, menyimpan satu byte10000000
tidak valid, tidak perlu membandingkan dengangreater than or equals
,greater than
cukup, menghemat satu byte-R
agar$argn
tersediasumber
Java 8,
11598 byteSaya terkejut belum ada yang mengirim jawaban Java, jadi di sini ada satu.
Penjelasan:
Coba di sini.
sumber
Clojure, 114 byte
Nah ini adalah sesuatu,
-
kurangi sisa argumen dari yang pertama sehingga menangani kasus berat khusus-1
. Fungsi ini mengembalikannil
input dengan panjang yang tidak valid, tetapi padaif
klausa mereka beroperasi sama denganfalse
.(#{8 9}(count v))
kembalinil
jika panjangnyav
bukan 8 atau 9.Kasus uji:
sumber
Perl 5 , 63 + 2 (
-F
) = 65 byteCobalah online!
sumber
Stax , 23 byte
Jalankan dan debug online!
Penjelasan
Gunakan versi yang belum dibongkar untuk menjelaskan.
sumber