Jarak Hamming antara dua string dengan panjang yang sama adalah jumlah posisi di mana karakter yang sesuai berbeda. Jika string tidak memiliki panjang yang sama, jarak Hamming tidak ditentukan.
Tantangan
Tulis program atau fungsi yang menemukan jarak Hamming terbesar dari semua pasangan string dari daftar string, diisi seperti yang dipersyaratkan sesuai dengan aturan yang dijelaskan di bawah ini.
Karakter akan berasal dari dalam a-zA-Z0-9
.
Panjang string mungkin tidak sama, jadi untuk setiap perbandingan, string yang lebih pendek harus diisi sebagai berikut:
- bungkus tali dari awal sebanyak yang diperlukan untuk mencocokkan panjang yang dibutuhkan
- mengubah huruf-huruf setiap pembungkus waktu ganjil (1, 3, 5, dll.)
- biarkan barang-barang di luar
a-zA-Z
tidak berubah saat dibungkus
Misalnya, Anda perlu membuat string 5 karakter ab9Cd
agar berakhir dengan 18 karakter. Anda akan berakhir dengan:
ab9CdAB9cDab9CdAB9
^^^^^ ^^^
dengan ^
menambahkan di bawah wraps 1 dan 3 untuk menyoroti perubahan huruf.
Input output
Format input / output fleksibel. Anda dapat mengasumsikan input memiliki setidaknya dua string, dan bahwa semua string memiliki setidaknya satu karakter.
Outputnya adalah integer.
Aturan
Ini adalah kode-golf . Aturan standar berlaku.
Uji kasus
[ "a", "b" ] => 1
[ "a", "b", "c" ] => 1
[ "a", "a", "c" ] => 1
[ "abc", "abcd" ] => 1
[ "abc12D5", "abC34d3", "ABC14dabc23DAbC89d"] => 17
[ "a", "Aaa", "AaaA", "aAaAa", "aaaaaaaaaaaaaa", "AAaAA", "aAa" ] => 8
["AacaAc", "Aab"] => 2
Implementasi referensi
Saya menguji contoh-contoh dengan kode R (yang sama sekali tidak dikenali) yang dapat Anda coba di sini untuk membandingkan contoh lain yang mungkin Anda coba dengan kode Anda.
["AacaAc", "Aab"] => 2
. Sebuah golf bertujuan untuk jawaban Jelly saya akan gagal dalam kasus itu, tetapi akan melewati semua yang lain.Jawaban:
Jelly , 20 byte
Tidak begitu senang dengannya. Harus bisa golf, bahkan hingga ~ 15 byte.
Cobalah online!
atau Lihatlah test suite!
Penjelasan
sumber
LÞ
dan masih mendapatkan hasil maksimal yang sama di akhir.ṁ/
sebaliknya akan memotong terpanjang ke panjang yang terpendek dalam beberapa kasus, yang bukan apa yang kita inginkan .... Saya kira kasus uji terlalu baik dipilih (dan ini kebetulan yang agak disayangkan) ...["AacaAc", "Aab"]
.Python 2 , 86 byte
Cobalah online!
Mengingat dua string,
s,t
,zip((s+s.swapcase())*len(t),t))
akan menjadi daftar tupel panjanglen(t)
sejakzip
memotong ke terpendek iterable. Jikalen(s)<len(t)
, maka ini "pad out"s
dengan swap kasus yang diinginkan dan kami menghitungsum
karakter yang berbeda.Jika
len(t)<=len(s)
, maka hasilnyasum
akan kurang dari atau sama dengansum
jika kita mengevaluasit,s
; sehingga tidak berpengaruh pada hasilmax
dalam kasus itu.sumber
y!=
alih-alih!=y
menyimpan 1 byteJavaScript (Node.js) , 111 byte
Cobalah online!
sumber
Jelly , 19 byte
Cobalah online!
sumber
Ruby ,
8982 byteMenciptakan produk silang dari daftar input terhadap dirinya sendiri sebelum menghitung jarak Hamming masing-masing pasangan, menggunakan metode duplikasi yang mirip dengan jawaban Chas Brown . Namun, Ruby tidak dapat mengaitkan string atau menambahkan boolean tanpa overhead tambahan, sehingga menjadi perlu untuk mengulangi melalui string secara manual sebagai gantinya.
-7 byte dari GB.
Cobalah online!
sumber
Java 10 ,
748740667666616 byteIni harus menjadi yang paling padat dan tidak dapat dibaca, namun golf terpanjang yang pernah saya miliki.
Metode panggilan
h(String[])
dengan array eksplisit (tanpa argumen): misalnya,kembali
1
.Anda dapat mencobanya secara online !
Tidak dikumpulkan dan berkomentar:
Saya tahu solusi yang lebih baik dapat dicapai, terutama untuk bagian pemasangan string.
EDIT : mencukur 8 byte dengan mengubah ukuran array int
hammingDistance()
ke kuadrat dari jumlah string yang diberikan. Ini juga memperbaiki yangArrayIndexOutOfBounds
dilemparkan ke dalam salah satu kasus uji.EDIT 2 : Disimpan 33 byte berkat komentar Kevin Cruijssen : deklarasi kelas dihapus, nama disingkat menjadi 1 char, operator berubah, dll.
EDIT 3 : Simpan 1 byte dan raih skor Setan yang disetujui dengan mengubah metode dengan var-arg ke array.
EDIT 4 : Simpan 50 byte lagi berkat Kevin Cruijssen , lagi: perbarui versi Java dari 8 hingga 10 untuk menggunakan
var
kata kunci,StringBuilder
contoh yang dihapus , dll.sumber
hammingDistance
gunakand
atau variabel lain yang tidak digunakan. Sebagian besar dari Anda&&
bisa&
dan||
bisa|
.c^' '
bisac^32
.boolean w = false;
bisaboolean w=0>1;
.i=0
inisialisasi loop dapat dihapus dan mengubah,i,j
ke,i=0,j
.++j
dapat dihapus dan++
dapat ditambahkan ke.charAt(j++)
..toString()
bisa+""
.for(j=i+1;j<l;++j)
bisafor(j=0;++j<l;)
. Dll.StringBuilder
bisaStringBuffer
(jika Anda beralih ke Jawa 10 bisavar b=new StringBuffer(l);
The.boolean
danchar
kemudian juga menjadivar
Jika Anda tidak memiliki Java 10 lokal,. itu tersedia di TIO ). Selain itu,for(;i<n;++i){for(char c:s.toCharArray())b.append(e(w,c));w=!w;}
bisa jadifor(;i++<n;w=!w)for(char c:s.toCharArray())b.append(e(w,c));
. Dan saya cukup yakin Anda dapat menghapusStringBuffer
sepenuhnya dan hanya menggunakanString
dan+=
bukanappend
.05AB1E ,
3329 byteCobalah secara online atau verifikasi semua kasus uji .
Kemungkinan besar dapat dibelah dua dalam byte-count, tetapi berfungsi ..
Penjelasan:
sumber
Java 11, 387 byte
Cobalah online. (CATATAN: Karena Java 11 belum menggunakan TIO,
String.repeat(int)
telah ditirurepeat(String,int)
untuk byte-count yang sama.)Penjelasan:
sumber
R , 173 byte
Cobalah online!
@ ngm: Saya mencoba yang terbaik untuk golf kode Anda (dengan kustomisasi berat saya tentu saja) tetapi, seperti yang Anda ketahui, R tidak terlalu golf dalam memanipulasi string: P
sumber
outer
untuk mendapatkan semua kombinasi, dan melakukan aritmatika modular pada poin kode sebagai penggantichartr
.