Tulis sebuah program (isi fungsinya cukup) yang menerima serangkaian karakter alfanumerik dan memvalidasinya sesuai dengan ISO 13616: 2007. Algoritma untuk validasi adalah (sumber: artikel wikipedia di IBAN http://en.wikipedia.org/wiki/International_Bank_Account_Number ):
Memvalidasi IBAN IBAN divalidasi dengan mengubahnya menjadi integer dan melakukan operasi mod-97 dasar (seperti yang dijelaskan dalam ISO 7064) di atasnya. Jika IBAN valid, sisanya sama dengan 1. Algoritma validasi IBAN adalah sebagai berikut:
- Pastikan total panjang IBAN sudah benar sesuai negara. Jika tidak, IBAN tidak valid. Panjang IBAN yang benar dapat ditemukan di sini: http://pastebin.com/kp4eECVk (juga dapat ditemukan di bawah), dipesan berdasarkan panjang nomor IBAN. 2 karakter pertama dari setiap angka adalah kode negara. Semua karakter lain (huruf kecil pada pastebin, tetapi dapat berupa kasus apa pun dalam IBAN yang sebenarnya) di belakang 2 pertama dapat berupa karakter alfanumerik apa pun.
- Pindahkan keempat karakter awal ke akhir string.
- Ganti setiap huruf dalam string dengan dua digit, dengan demikian memperluas string, di mana A = 10, B = 11, ..., Z = 35.
- Menafsirkan string sebagai bilangan bulat desimal dan menghitung sisa angka itu di divisi dengan 97
Jika sisanya adalah 1, tes digit periksa dilewati dan IBAN mungkin valid.
Contoh (Bank Inggris fiktif, kode sortir 12-34-56, nomor rekening 98765432):
- IBAN: GB82 WEST 1234 5698 7654 32 - Rearrange: W E S T12345698765432 G B82 - Convert to integer: 3214282912345698765432161182 - Compute remainder: 3214282912345698765432161182 mod 97 = 1
Algoritma moest mengembalikan true (atau nilai kebenaran) jika angka tersebut valid, dan false (atau nilai palsu) jika angka tidak valid sesuai dengan algoritma. Anda tidak perlu memeriksa apakah nomor itu benar-benar ada, hanya jika itu valid. Algoritme harus bekerja untuk masing-masing nomor IBAN berbeda yang disetujui yang disebutkan dalam artikel wikipedia di atas. Algoritma harus kompatibel dengan angka baik dengan atau tanpa karakter pemisah antara 2 karakter alfanumerik. Karakter pemisah dapat berupa titik, spasi atau tanda hubung dan satu angka dapat berisi berbagai jenis pemisah.
Lubang biasa berlaku: tidak ada sumber daya eksternal, tidak ada fungsi atau metode bawaan.
Jenis puzzle adalah kode golf. Kode terpendek dalam bytecount menang. Pelat standar yang diperlukan untuk menjalankan program (mis. Namespace, kelas, deklarasi fungsi dalam OOP) tidak termasuk dalam bytecount.
Bonus: jika Anda dapat mengembalikan nomor IBAN yang diformat dengan benar (sesuai dengan format nasional di wikipedia) alih-alih dalam kasus nomor yang valid, Anda mendapatkan pengurangan 25% dalam skor Anda. Jika nomor tidak valid, Anda mengembalikan string literal dengan nilai "Tidak Valid".
Salinan panjang IBAN dalam hal pastebin pernah dihapus:
Country;Chars;IBAN Fields
Norway;15;NOkk bbbb cccc ccx
Belgium;16;BEkk bbbc cccc ccxx
Burundi;16;BIkk nnnn nnnn nnnn
Denmark;18;DKkk bbbb cccc cccc cc
Faroe Islands;18;FOkk bbbb cccc cccc cx
Finland;18;FIkk bbbb bbcc cccc cx
Greenland;18;GLkk bbbb cccc cccc cc
Netherlands;18;NLkk bbbb cccc cccc cc
Macedonia;19;MKkk bbbc cccc cccc cxx
Slovenia;19;SIkk bbss sccc cccc cxx
Austria;20;ATkk bbbb bccc cccc cccc
Bosnia and Herzegovina;20;BAkk bbbs sscc cccc ccxx
Estonia;20;EEkk bbss cccc cccc cccx
Kazakhstan;20;KZkk bbbc cccc cccc cccc
Lithuania;20;LTkk bbbb bccc cccc cccc
Luxembourg;20;LUkk bbbc cccc cccc cccc
Costa Rica;21;CRkk bbbc cccc cccc cccc c
Croatia;21;HRkk bbbb bbbc cccc cccc c
Latvia;21;LVkk bbbb cccc cccc cccc c
Liechtenstein;21;LIkk bbbb bccc cccc cccc c
Switzerland;21;CHkk bbbb bccc cccc cccc c
Bahrain;22;BHkk bbbb cccc cccc cccc cc
Bulgaria;22;BGkk bbbb ssss ddcc cccc cc
Georgia;22;GEkk bbcc cccc cccc cccc cc
Germany;22;DEkk bbbb bbbb cccc cccc cc
Ireland;22;IEkk aaaa bbbb bbcc cccc cc
Montenegro;22;MEkk bbbc cccc cccc cccc xx
Serbia;22;RSkk bbbc cccc cccc cccc xx
United Kingdom;22;GBkk bbbb ssss sscc cccc cc
Gibraltar;23;GIkk bbbb cccc cccc cccc ccc
Israel;23;ILkk bbbn nncc cccc cccc ccc
United Arab Emirates;23;AEkk bbbc cccc cccc cccc ccc
Andorra;24;ADkk bbbb ssss cccc cccc cccc
Czech Republic;24;CZkk bbbb ssss sscc cccc cccc
Moldova;24;MDkk bbcc cccc cccc cccc cccc
Pakistan;24;PKkk bbbb cccc cccc cccc cccc
Romania;24;ROkk bbbb cccc cccc cccc cccc
Saudi Arabia;24;SAkk bbcc cccc cccc cccc cccc
Slovakia;24;SKkk bbbb ssss sscc cccc cccc
Spain;24;ESkk bbbb gggg xxcc cccc cccc
Sweden;24;SEkk bbbc cccc cccc cccc cccx
Tunisia;24;TNkk bbss sccc cccc cccc cccc
Virgin Islands;24;VGkk bbbb cccc cccc cccc cccc
Algeria;24;DZkk nnnn nnnn nnnn nnnn nnnn
Portugal;25;PTkk bbbb ssss cccc cccc cccx x
Angola;25;AOkk nnnn nnnn nnnn nnnn nnnn n
Cape Verde;25;CVkk nnnn nnnn nnnn nnnn nnnn n
Mozambique;25;MZkk nnnn nnnn nnnn nnnn nnnn n
Iceland;26;ISkk bbbb sscc cccc iiii iiii ii
Turkey;26;TRkk bbbb bxcc cccc cccc cccc cc
Iran;26;IRkk nnnn nnnn nnnn nnnn nnnn nn
France;27;FRkk bbbb bggg ggcc cccc cccc cxx
Greece;27;GRkk bbbs sssc cccc cccc cccc ccc
Italy;27;ITkk xaaa aabb bbbc cccc cccc ccc
Mauritania;27;MRkk bbbb bsss sscc cccc cccc cxx
Monaco;27;MCkk bbbb bsss sscc cccc cccc cxx
San Marino;27;SMkk xaaa aabb bbbc cccc cccc ccc
Burkina Faso;27;BFkk nnnn nnnn nnnn nnnn nnnn nnn
Cameroon;27;CMkk nnnn nnnn nnnn nnnn nnnn nnn
Madagascar;27;MGkk nnnn nnnn nnnn nnnn nnnn nnn
Albania;28;ALkk bbbs sssx cccc cccc cccc cccc
Azerbaijan;28;AZkk bbbb cccc cccc cccc cccc cccc
Cyprus;28;CYkk bbbs ssss cccc cccc cccc cccc
Dominican Republic;28;DOkk bbbb cccc cccc cccc cccc cccc
Guatemala;28;GTkk bbbb cccc cccc cccc cccc cccc
Hungary;28;HUkk bbbs sssk cccc cccc cccc cccx
Lebanon;28;LBkk bbbb cccc cccc cccc cccc cccc
Poland;28;PLkk bbbs sssx cccc cccc cccc cccc
Benin;28;BJkk annn nnnn nnnn nnnn nnnn nnnn
Ivory Coast;28;CIkk annn nnnn nnnn nnnn nnnn nnnn
Mali;28;MLkk annn nnnn nnnn nnnn nnnn nnnn
Senegal;28;SNkk annn nnnn nnnn nnnn nnnn nnnn
Brazil;29;BRkk bbbb bbbb ssss sccc cccc ccct n
Palestinian;29;PSkk bbbb xxxx xxxx xccc cccc cccc c
Qatar;29;QAkk bbbb cccc cccc cccc cccc cccc c
Ukraine;29;UAkk bbbb bbcc cccc cccc cccc cccc c
Jordan;30;JOkk bbbb nnnn cccc cccc cccc cccc cc
Kuwait;30;KWkk bbbb cccc cccc cccc cccc cccc cc
Mauritius;30;MUkk bbbb bbss cccc cccc cccc cccc cc
Malta;31;MTkk bbbb ssss sccc cccc cccc cccc ccc
Jawaban:
J (294 - 73.5 = 220.5)
Saya belum menghitung definisi fungsi (
f=:3 :0
...)
) karena dapat dianggap boilerplate, menghitung seluruh blok memberikan skor 304 - 76 = 228 .Tes:
Penjelasan:
b=.y-.' -.'
: hapus pemisah apa pun dari argumen dan simpan hasilnya dib
.1}.;' '&,&.>_4<\b
: pisahkanb
dalam grup empat, tambahkan spasi di depan setiap grup, bergabung dengan grup dan hapus spasi di depan. Jikay
berisi nomor IBAN yang valid, ini adalah representasi kanoniknya (yaitu kelompok empat, dipisahkan oleh spasi, dengan kelompok terakhir mungkin memiliki kurang dari empat elemen).(
...){'Invalid';
: buat array dengan stringInvalid
sebagai elemen 0 dan nomor IBAN yang diformat sebagai elemen 1. Pilih yang benar berdasarkan pada apakah nomor IBAN valid:'NO.BEBI.---.JOKWU.MT.'
: daftar semua kode negara untuk setiap panjang, dipisahkan oleh titik-titik+/"1(2{.b)&E.;.2
: kelompokkan string berdasarkan titik-titik, dan lihat mana yang berisi kode negara yang diberikan (2 elemen pertamab
).15+1 i.~
: cari indeks yang cocok dan tambahkan15
untuk menemukan panjangnya.(#b)=
: periksa dengan panjang aktualb
.4|.b
: putarb
ke kiri sebanyak 4 (atur ulang)k=.3&u:
: cari nilai ASCII untuk setiap nomor48-~k-7*64<k
: kurangi 7 dari setiap huruf, lalu kurangi 48 dari semua, berikan nilainya1".'x',~' '-.~":
: memformat, menghapus spasi, menambahkan 'x' di akhir (untuk mode presisi tinggi, yang diperlukan untuk angka besar), dan mengubahnya kembali menjadi angka1=97|
: periksa apakah angka mod 97 sama dengan 1.>
: unbox string yang dihasilkansumber
CJam,
151,5141,75 poinProgram di atas adalah 189 byte dan memenuhi syarat untuk bonus.
Dengan biaya 26 byte lebih - untuk skor total 161,25 - kita dapat menghindari karakter yang tidak patut:
Anda dapat menguji versi ini dalam juru bahasa CJam .
Contoh dijalankan
Bagaimana itu bekerja
mengubah string
"…"
menjadi bilangan bulat dengan menganggapnya sebagai basis-256 angka, kemudian menjadi array bilangan bulat dengan menganggapnya sebagai basis 27-angka, menambahkan kode karakter@
untuk setiap digit dan melemparkan ke Karakter dalam proses.Akibatnya, kode berikut dijalankan:
sumber
LANG=en_US java -jar cjam-0.6.2.jar iban.cjam<<<GB82WEST12345698765432
output Tidak Valid, apa yang saya lakukan salah (berjalan pada Windows8.1 dan Cygwin)?md5sum iban.cjam
harus dicetak1960c33e31ae5646cd0400826757b3bc
. 2. Apakah lokal diinstal dengan benar? Anda dapat memeriksa dengan mengeksekusilocale -a | grep en_US
.fb620d509887f1a7298c3e5ff312401a
).locale -a|grep en_US
outputen_US
danen_US.utf8
LANG=en_US cjam <(LANG=en_US cjam gen.cjam) <<< GB82WEST12345698765432
. Saya telah memasukkan versi ASCII saja dalam jawaban saya yang seharusnya lebih mudah diverifikasi.Pesta,
738 519 444 434427Ini adalah sesuatu untuk memulai kita, saya menulisnya (dan menyimpan 317 karakter, sebagian besar dalam bit penyimpanan kode negara) sementara pertanyaannya ada di kotak pasir. Beri tahu saya jika ada masalah.
Fungsi membaca dari stdin, yang cukup umum di Bash (pertanyaannya mengatakan "menerima serangkaian karakter alfanumerik", tidak memerlukan ini melalui argumen).
Mengembalikan 0 jika IBAN valid dan nilai bukan nol jika tidak valid.
IBAN yang mengandung karakter apa pun selain pembatas
. -
danA-Z0-9
tidak validPenjelasan
Contohnya
sumber
Python 3 - (483 - 25%) 362
sumber
Perl (356 + 2 * 75% = 268.5)
kode ini sangat membingungkan sehingga penyorotan sintaksis SE pun hilang di dalamnya :)
Penjelasan
-n
berarti membaca stdin baris demi baris;-l
menambahkan baris baru untuk dicetakdiperlukan untuk operasi modulo nanti untuk mengembalikan nilai yang benar.
hapus semua yang bukan dari IBAN.
konversikan nomor iban menjadi huruf besar, juga simpan ke $ T - akan digunakan untuk pencetakan cantik nanti.
atur variabel sementara ke 15, itu akan digunakan untuk membangun tabel hash dengan kode negara untuk pemetaan panjang iban.
pisahkan string besar menjadi array koma atau kode negara dua huruf, iterate di atasnya. jika elemen dimulai dengan huruf, ini adalah kode negara - simpan dalam hash dengan nilai $ q; jika tidak, koma berarti menambah $ q. jadi, TIDAK akan mendapatkan nilai 15, BE dan BI akan menjadi 16, dan seterusnya.
cocokkan dua karakter pertama dari IBAN (kode negara)
periksa apakah IBAN memiliki panjang yang benar untuk kode negara, simpan hasil dalam $ q
pindahkan empat karakter pertama ke akhir IBAN
ganti semua huruf dengan angka yang sesuai, dimulai dengan A = 10
cetak "Tidak Valid" atau IBAN yang tercetak cantik.
1==$_%97*$q
hanya akan sama1
dengan IBAN dengan panjang yang benar dan sisa yang benar.sumber
perl
subkontest "hanya" Anda menang ;-) Meskipun membingungkan, bisakah Anda mencoba menjelaskannya sedikit seperti pada contoh bash? Cukup cantik ?! Jika Anda menjelaskan milik Anda, saya akan menjelaskan milik saya :-) (meskipun saya mungkin mencuri salah satu trik Anda yang sebenarnya, panjang negara IBAN dulu). Bersulang.Perl 6 - 354 karakter - (tidak yakin bonus)
Masukan bacaan dari
IBANS.txt
padaSTDIN
dan menghirup aturan dari fileir
(saya meninggalkan aturan dari total jika mereka boilerplate - file aturan adalah 191 karakter sehingga total akan menjadi 545.IBANS.txt
adalah sebagai berikut:Catatan
wc -m ibanvalidate.p6
Output khas:
Ini bukan kode Perl6 yang khas (terutama the
comb
- lines yang dikembangkan oleh Perl yang ramah dan berpengaruh ini): Saya seorang pemula. Setelah kontes selesai, saya akan menambah / mengubah dan membuat modifikasi yang disarankan oleh Perl6-ers. Terima kasih telah bermain dan bersikap baik :-)sumber
Perl 6 , 311 byte, skor 233.25
Cobalah online!
Saya tidak yakin
Penjelasan
sumber
Python3.x (539 karakter - 25% = 404,25)
(Bisa dikatakan pertama: Saya agak bingung apa yang HARUS dihitung dengan aturan Anda jadi saya hanya menghitung seluruh fungsi saya)
539 karakter - Termasuk
import
dandef IBAN(i):
(tab di awal baris dihitung tetap dengan python sehingga tidak masalah)Bonus diterapkan sebagaimana tercantum dalam aturan.
Kode dengan komentar (belum selesai ... Saya terlalu lelah untuk menulis bagian komentar yang tersisa ... Saya akan melakukannya besok)
sumber
Perl (535)
Belum benar-benar bermain golf - tidak tahu apakah saya memenuhi syarat untuk mendapatkan bonus ;-) Saya akan menambahkan beberapa penjelasan jenis @professorfish.
sumber
JavaScript (Node.js) , 372 byte * .75 = 279
Cobalah online!
Kasus uji dipinjam dari jawaban J @marinus.
sumber