Tulis fungsi yang, mengingat 12 digit pertama dari kode ISBN-13 , akan menghitung seluruh ISBN melalui penghitungan dan menambahkan digit periksa yang sesuai.
Input fungsi Anda adalah string yang berisi 12 digit pertama ISBN. Outputnya adalah string yang berisi semua 13 digit.
Spesifikasi formal
Menulis fungsi yang, ketika diberi string s terdiri sepenuhnya dari tepat 12 angka desimal (dan tidak ada karakter lain), mengembalikan string t dengan sifat sebagai berikut:
- t terdiri dari tepat 13 digit desimal (dan tidak ada karakter lain);
- s adalah awalan t ;
- jumlah semua digit dalam posisi ganjil dalam t (yaitu yang pertama, ketiga, kelima, dll.), ditambah tiga kali jumlah semua digit dalam posisi genap dalam t (yaitu yang kedua, keempat, keenam, dll), adalah kelipatan 10.
Contoh / test case
Memasukkan
978030640615
Keluaran
9780306406157
Kondisi kemenangan
Sebagai tantangan kode-golf , jawaban terpendek menang.
Jawaban:
Golfscript - 25 karakter
Versi program keseluruhan hanya 19 karakter
Periksa kembali di sini untuk analisis nanti. Sementara itu periksa jawaban lama saya yang tidak terinspirasi
Golfscript - 32 karakter
Mirip dengan perhitungan angka luhn
Analisis untuk 978030640615
sumber
{
dan tiga terakhir;}:f
. Saya ingin tahu apakah hal yang sama dapat dilakukan untuk solusi pertama ...:f
(ya, saya tahu fungsi umumnya dinamai saat itu).Python - 44 karakter
Python - 53 karakter
sumber
Haskell - 54 karakter
Ini membutuhkan dukungan untuk pemahaman daftar paralel , yang didukung oleh GHC (dengan
-XParallelListComp
bendera) dan Pelukan (dengan-98
bendera).sumber
[1,3]
dengan[9,7]
dan menghapus-
byte yang menghemat :)APL (27 karakter)
Saya menggunakan Dyalog APL sebagai penerjemah saya. Berikut penjelasan singkat, sebagian besar dari kanan ke kiri (dalam definisi fungsi,
F←{ ... }
):⍎¨⍵
: Jalankan / evaluasi (⍎
) setiap¨
karakter ( ) yang diberikan dalam argumen yang benar (⍵
).(12⍴1 3)
: Membentuk kembali (⍴
) vektor1 3
menjadi vektor -12
elemen (berulang untuk mengisi celah).+.×
: Ambil titik produk (+.×
) dari argumen kiri ((12⍴1 3)
) dan argumen kanannya (⍎¨⍵
).10-
: Kurangi dari 10.10|
: Temukan sisanya setelah pembagian oleh10
.⍕
: Format angka (mis., Berikan representasi karakter).⍵,
: Tambahkan (,
) digit terhitung kami ke argumen yang benar.sumber
PHP -
868582 karakterFormat ulang dan penjelasan:
sumber
Windows PowerShell, 57
sumber
Haskell,
787166 karaktersumber
Ruby -
7365 karaktersumber
"\\1"
->'\1'
?f=->s{...}
. Hemat 6 karakter. Juga tuliss<<(...).to_s
alih-alih menambahkan 48 dan gunakanFixnum#chr
.C # (94 karakter)
Dengan linebreak / spasi putih untuk keterbacaan:
Diuji pada beberapa ISBN dari buku di rak saya, jadi saya tahu itu berfungsi!
sumber
Python -
91, 89sumber
for
(danin
dan ketiga) dalam pemahaman daftar selama itu dapat dibagi oleh parser (tidak menggunakan nama variabel). -2 karakter di sana.Perl, 53 karakter
sumber
C # -
8977 karakterDiformat agar mudah dibaca:
Kami tidak mengalikan satu atau tiga, kami hanya menambahkan semuanya, ditambah kami menambahkan semua karakter genap sekali lagi, dikalikan dua.
9992 cukup besar sehingga jumlah semua karakter ASCII lebih kecil dari itu (sehingga kita dapat mod sebesar 10 dan pastikan hasilnya positif, tidak perlu mod sebanyak 10 kali), dan tidak dapat dibagi dengan nol karena kita menambahkan semua ekstra 2 * 12 * 48 (dua belas angka ASCII, ditimbang dengan 1 dan 3) == 1152, yang memungkinkan kita untuk menyimpan satu karakter tambahan (alih-alih dua kali mengurangi 48, kita kurangi 0 hanya untuk mengonversi dari char ke int, tetapi bukannya 990, kita perlu menulis 9992).
Tapi sekali lagi, meskipun jauh lebih tidak indah ;-), solusi old-school ini menghasilkan 80 karakter (tapi ini hampir kompatibel dengan C):
sumber
J -
554538misalnya
cara lama:
sumber
(i.12)(".@{)y
dapat diganti dengan"."0 y
Ruby - 80 karakter
sumber
dc, 44 karakter
Diminta sebagai
lIx
, misalnya:sumber
Q, 36 karakter
sumber
D - 97 karakter
Diformat lebih jelas:
Verbositas dari operator pemeran D pasti membuat lebih sulit untuk menulis kode pendek yang obsesif.
sumber
Java - 161 Karakter :(
sumber
Q (44 karakter)
sumber
Scala 84
Pengujian:
Hasil:
sumber
C,
8079 karakterFungsi memodifikasi string di tempat, tetapi mengembalikan pointer string asli untuk memenuhi persyaratan masalah.
Beberapa penjelasan: Alih-alih mengurangi 48 (nilai ASCII digit
0
) dari setiap karakter input, akumulators
diinisialisasi sehingga modulo 10 sama dengan 48 + 3 * 48 + 48 + 3 * 48 ... + 48 + 3 * 48 = 24 * 48 = 1152. Langkah10-sum
ini dapat dihindari dengan mengakumulasikans
dengan mengurangi bukannya menambah. Namun, operator modul%
dalam C tidak akan memberikan hasil yang dapat digunakan jikas
negatif, jadi alih-alih menggunakans-=
pengganda 3 dan 1 diganti dengan -3 = 7 modulo 10 dan -1 = 9 modulo 10, masing-masing.Uji harness:
sumber
Groovy
75, 66 karaktermenggunakan:
sumber
APL (25)
sumber
Perl 6 , 29 byte
Cobalah online!
sumber
Python 2 ,
7876 byteCobalah online!
Mengambil string sebagai argumen.
Penjelasan:
Menggunakan notasi irisan python, mengubah string menjadi daftar pasangan karakter. ("978030640615" -> [("9", "7"), ("8", "0"), ("3", "0"), ("6", "4"), ("0 "," 6 "), (" 1 "," 5 ")])
Untuk daftar pasangan itu, konversi setiap item menjadi bilangan bulat dan mengembalikan +3b.
Jumlahkan semua hasil.
Mendapat jumlah modulo 10, OR 10 jika sisanya adalah 0. (Ini mencegah digit terakhir menjadi 10 bukannya 0.)
Hapus sisanya dari 10 untuk mendapatkan digit periksa.
Mengonversi digit periksa yang dihitung ke string melalui ekspresi backtick yang sudah usang.
Mengembalikan nomor asli ditambah digit periksa yang dihitung.
Edit:
Disimpan 2 byes dengan menghapus spasi (terima kasih Jo King !).
sumber
for
danor
APL (Dyalog Unicode) , 18 byte SBCS
Fungsi awalan diam-diam anonim mengambil string sebagai argumen. Menggunakan pendekatan Bubbler .
Cobalah online!
≢
panjang argumen (12)9 7⍴⍨
membentuk ulang secara siklis[9,7]
sampai sejauh itu+.×
dot produk berikut ini dengan itu:⍎¨
`mengevaluasi setiap karakter10|
mod-10 itu,∘⍕
tambahkan berikut ini pengetatan itu:⊢
argumen yang tidak dimodifikasisumber
dc , 25 byte
Cobalah online!
Saya tahu sudah ada jawaban dc di sini, tapi 25 <44 jadi saya kira saya merasa 19 byte oke tentang hal itu. Ini menggunakan fakta yang
8+9^z
setara dengan mod-3
atau-1
10 tergantung pada apakah z genap atau ganjil. Jadi saya gunakanA~
untuk memecah angka menjadi angka-angka di tumpukan, tetapi ketika saya membangun tumpukan saya mengalikan setiap digit dengan di8+9^z
mana z adalah ukuran tumpukan saat ini. Kemudian saya menambahkan semuanya sebagai fungsi tumpukan membuka gulungan, dan mencetak digit terakhir.sumber
MATLAB - 82 karakter
sumber
R, 147 karakter
Pemakaian:
sumber
J, 25
sumber