Ini adalah algoritma yang sangat sangat sederhana, yang saya yakin dapat diselesaikan dalam banyak bahasa yang berbeda. Di Spanyol kartu ID (dikenal sebagai DNI ) terdiri dari 8 angka dan karakter kontrol. Karakter kontrol dihitung dengan algoritma berikut: bagi angka dengan 23, ambil sisa operasi dan ganti dengan karakter sesuai tabel ini:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T R W A G M Y F P D X B N J Z S Q V H L C K E
Jika DNI milik orang asing yang tinggal di Spanyol, digit pertama diubah menjadi X
, Y
atau Z
dan itu disebut NIE . Dalam hal ini, penggantian berikut dilakukan sebelum menghitung karakter kontrol:
X Y Z
0 1 2
Ada banyak kalkulator online yang membantu Anda mendapatkan karakter kontrol, tetapi, seberapa pendek Anda bisa menulis kode itu? Tulis algoritme (program atau fungsi) yang menerima a string
dengan nomor DNI (yang akan selalu terdiri dari 8 karakter alfanumerik) dan mengembalikan hanya karakter kontrol tunggal yang dihitung dan tidak lebih dari itu (baris baru yang tertinggal diterima).
Catatan:
- DNI selalu ditulis dalam huruf besar, tetapi dalam algoritma Anda, Anda dapat memilih input dan output menjadi huruf besar atau kecil, konsisten saja.
- Dalam kehidupan nyata, beberapa NIE yang dikeluarkan sebelum 2008 memiliki 8 digit setelah
X
,Y
atauZ
, tetapi untuk tujuan permainan ini, Anda dapat menganggap mereka memiliki 7 digit seperti saat ini. - Anda dapat mempertimbangkan bahwa string input akan selalu memiliki 8 karakter, tetapi jika mereka tidak dalam format "8 digit" atau format "[XYZ] plus 7 digit", Anda harus mengembalikan kesalahan (pilihan Anda) atau hanya melempar pengecualian.
Kasus uji:
00000010 -> X (HRM Juan Carlos I's DNI number)
01234567 -> L
98765432 -> M
69696969 -> T
42424242 -> Y
Z5555555 -> W (Z=2)
Y0000369 -> S (Y=1)
A1234567 -> <Error code or exception>
1231XX12 -> <Error code or exception>
Ini adalah kode-golf , jadi semoga kode terpendek untuk setiap bahasa menang!
sumber
Jawaban:
Python 3 , 83 byte
Cobalah online!
Terima kasih kepada AlixEinsenhardt (dari 99 hingga 94). -1 terima kasih kepada JonathanAllan .
sumber
str('XYZ'.index(n[0]))
denganstr(ord(n[0])-88)
dan menyimpan 5 byte-88
dengan%4
.Haskell ,
1079392 byteCobalah online!
sumber
Pyth,
3534 byteKode berisi beberapa karakter yang tidak patut
xxd
dicetak , jadi di sini adalah hexdump yang dapat dibalik.Menggunakan karakter huruf kecil .
Cobalah online. Suite uji.
Versi cetak
Penjelasan
cz]1
membagi input pada posisi 1, misalnya"y0000369"
ke["y", "0000369"]
.>3G
mendapat 3 karakter terakhir dari alfabet"xyz"
,.U3
mendapat kisaran [0, 3 [ ,[0, 1, 2]
.X
petaxyz
ke[0, 1, 2]
dalam array pisah, misalnya["y", "0000369"]
ke[1, "0000369"]
. Ini menggantikan karakter pertama jika salah satunyaxyz
, sambil membiarkan ekor 7 karakter tidak tersentuh karena setiap string 7 karakter tidak dapat sama dengan satu karakter.s
bergabung dengan array dengan string kosong, misalnya[1, "0000369"]
ke"10000369"
.s
melemparkan string ini ke integer, misalnya"10000369"
ke10000369
. Ini menimbulkan kesalahan jika karakter non-digit tambahan dibiarkan dalam string.%
…23
Mendapatkan nilai modulo 23, misalnya10000369
ke15
.C"
…"
Mengonversi string biner dari basis 256 ke integer (sekitar 3.06 × 10 26 )..P
...G
mendapatkan permutasi alfabet dengan indeks itu.@
mendapatkan karakter yang benar dari permutasi.sumber
MATL ,
6259 byteKesalahan untuk input yang tidak valid adalah
A(I): index out of bounds
(kompiler berjalan di Oktaf) atauIndex exceeds matrix dimensions
(kompiler berjalan di Matlab).Cobalah online!
Penjelasan
sumber
ES6,
83 8281 byteBeraksi!
Hanya huruf besar, kode kesalahan untuk nomor yang tidak valid adalah
undefined
.Satu byte disimpan berkat Jonathan Allan.
Satu byte lagi tersimpan berkat Shaggy.
sumber
%4
daripada-88
.0
daricharCodeAt()
juga.Java 8,
154145104 byte-9 byte terima kasih kepada @ OliverGrégoire .
-41 byte terima kasih kepada @ OliverGrégoire lagi, dengan mengambil input sebagai char-array (
char[]
).Jika input tidak valid, itu akan gagal dengan a
java.lang.NumberFormatException
ataujava.lang.StringIndexOutOfBoundsException
.Penjelasan:
Coba di sini. (Kasus uji tidak valid dikelilingi oleh try-catch sehingga tidak berhenti pada kesalahan pertama.)
sumber
|
di regex. Jugaint t=s.charAt(0)-88
& memberikant<0?t+40:t
Anda satu byte.'a'
atau'0'
huruf apa pun bukan huruf besar, dan kembalikan itu alih-aliht/0
dan masukkan seluruh lot kechar
. Anda akan menghemat 7 byte dengan cara ini, saya kira. Golf dengan cara ini , Anda mendapatkan 145 byte..matches
dengan regex ini, btw. Tapi mungkin saya salah.s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}
hanya untuk 94 byte (dengans
menjadi achar[]
): ps[0]<88&s[0]>90
untuk 8 byte lebih.PHP , 88 byte
mencetak 1 untuk suatu kesalahan
Cobalah online!
sumber
Jelly , 42 byte
Cobalah online!
Terlalu lama, Jelly! Dennis kecewa padamu! [rujukan?]
sumber
q / kdb +, 68 byte
Larutan:
Contoh:
Penjelasan:
Jika karakter pertama
x 0
,, ada di string"XYZ"
makaa
akan menjadi0
,1
atau2
. Jika karakter pertama tidak ada dalam string, makaa
akan menjadi3
. Jikaa
kurang dari 3, kita mengganti karakter pertama untuk string a (0
,1
atau2
), kalau tidak kita beralih untuk karakter pertama (sehingga secara efektif tidak melakukan apa-apa). String ini dilemparkan ke panjang ("J"$
), yang kemudianmod
dengan 23 untuk memberikan sisanya. Sisa ini digunakan untuk mengindeks ke dalam tabel pencarian.Catatan:
" "
dikembalikan dalam skenario kesalahan, ini karena para pemain mengembalikan nol, dan pengindeksan ke string di indeks nol adalah char kosong. Saya bisa menambahkan 4 byte di awal ("!"^
) untuk membuatnya lebih jelas bahwa telah terjadi kesalahan:sumber
JavaScript (ES6), 121 byte
sumber
Japt , 50 byte
Mirip dengan sebagian besar pendekatan lain.
Input dan output adalah huruf kecil, output
undefined
untuk input yang tidak valid.Uji itu
Uji semua kasus uji yang valid
sumber
Rust, 206 byte
Saya tidak berpikir karat cocok untuk kode golf -_-
sumber
05AB1E ,
414039 byteMengambil input dalam huruf kecil (untuk menghemat 1 byte yay )
Cobalah online!
Mencetak input ke STDERR jika salah format
Penjelasan
sumber
Dyalog APL, 95 byte
{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}
Ini adalah operator monadik yang menerima string karakter sebagai operan dan mengembalikan hasilnya.
FIXME tidak memeriksa inputnya. Ini tidak golf dengan benar.
Pemakaian:
sumber