Monday Mini-Golf: Serangkaian tantangan kode-golf pendek , diposting (mudah-mudahan!) Setiap hari Senin.
(Maaf ini agak terlambat.)
Saya yakin sebagian besar dari Anda pernah mendengar tentang jarak Levenshtein , sebuah algoritma untuk menghitung jarak antara dua string. Nah, tantangan ini adalah tentang mengimplementasikan algoritma serupa dari penemuan saya *, yang disebut jarak anagram . Perbedaan utama adalah bahwa urutan karakter tidak masalah; alih-alih, hanya karakter yang unik untuk satu string atau yang lain yang diukur.
Tantangan
Tujuan dari tantangan ini adalah untuk menulis program atau fungsi yang mengambil dua string dan mengembalikan jarak anagram di antara mereka. Cara utama untuk melakukan ini adalah dengan menggunakan logika berikut:
- Konversikan kedua string menjadi huruf kecil dan (secara opsional) mengurutkan masing-masing karakter secara alfabet.
- Sementara string mengandung setidaknya satu karakter yang sama, hapus instance pertama dari karakter ini dari setiap string.
- Tambahkan panjang string yang tersisa dan kembalikan / hasilkan hasilnya.
Contoh
Jika inputnya adalah:
Hello, world!
Code golf!
Kemudian, huruf kecil dan disortir, ini menjadi: (berdasarkan jenis JS default; perhatikan spasi terkemuka)
!,dehllloorw
!cdefgloo
Menghapus semua karakter yang ada di kedua string, kita berakhir dengan:
,hllrw
cfg
Dengan demikian, jarak anagram antara dua string asli = 6 + 3 = 9.
Detail
- String dapat diambil dalam format apa pun yang masuk akal.
- String hanya akan terdiri dari ASCII yang dapat dicetak.
- String itu sendiri tidak akan mengandung spasi apa pun selain ruang biasa. (Tidak ada tab, baris baru, dll.)
- Anda tidak perlu menggunakan algoritme yang tepat ini, asalkan hasilnya sama.
Kasus uji
Input 1:
Hello, world!
Code golf!
Output 1:
9
Input 2:
12345 This is some text.
.txet emos si sihT 54321
Output 2:
0
Input 3:
All unique characters here!
Bdfgjkmopvwxyz?
Output 3:
42
Input 4:
This is not exactly like Levenshtein distance,
but you'll notice it is quite similar.
Keluaran 4:
30
Input 5:
all lowercase.
ALL UPPERCASE!
Output 5:
8
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek yang valid dalam byte menang. Tiebreaker pergi ke pengiriman yang mencapai jumlah byte terakhirnya terlebih dahulu. Pemenang akan dipilih Senin depan, 12 Oktober. Semoga beruntung!
Sunting: Selamat kepada pemenang, @isaacg, menggunakan Pyth (lagi) untuk 12 byte yang luar biasa !
* Jika algoritma ini telah digunakan di tempat lain dan / atau diberi nama lain, beri tahu saya! Saya tidak dapat menemukannya dengan pencarian 20 menit.
Jawaban:
Pyth, 12 byte
Suite uji
Operasi yang dimaksud setara dengan operator pengurangan searah Pyth
.-
, yang diterapkan di kedua arah. Anda bisa menyebutnya bagor xor, saya kira.Solusinya adalah:
.z
: dapatkan input sebagai daftar 2 string.rR0
: konversi keduanya menjadi huruf kecil..p
: Bentuk semua permutasi, yaitu normal dan terbalik..-M
: Petakan.-
operasi pada setiap pemesanan.s
: Menggabungkan hasilnya.l
: Cetak panjangnya.sumber
JavaScript (ES7), 92 byte
Menentukan fungsi anonim.
Untuk menguji, jalankan snippet di bawah ini. Anda dapat mengedit kode dan mengklik 'Tes' untuk membandingkan hasilnya dengan yang asli. (Berikan komentar jika Anda menemukan peningkatan!) Inputnya seperti
"Hello, world!", "Code golf!"
di kotak input.Terima kasih kepada @ETHproductions untuk menghemat 6 byte!
Lebih lanjut tentang test suite
Bagaimana itu bekerja
sumber
.join("")+b
dengan.join``+b
tanpa efek.CJam,
2319 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Ruby, 62
Harus ada cara yang lebih baik.
Sunting: 57 karakter berkat iamnotmaynard yang menyelidiki jalan yang terlalu malas untuk saya.
sumber
sub
dapat mengambil string. Tidak bisakah Anda menggunakanc.downcase
bukan/#{Regexp.escape c}/i
?Python,
9087818079 bytePython <versi 3.5, 80 byte
Penjelasan
Untuk setiap karakter dalam a atau b, hitung jumlah kemunculan di setiap string, dan tambahkan perbedaan (positif).
Sunting: Baca kembali aturan, fungsi anonim yang direalisasikan dapat diterima, peningkatan jawaban dengan menyingkirkan raw_input. Golf pertama, harap lembut!
Terima kasih kepada sp3000 untuk peningkatan mendefinisikan ulang str.lower dan membuat saya menyadari bahwa cetak tidak perlu. Juga spasi. Masih belajar.
Menggunakan python> = 3.5, ada cara yang lebih pendek untuk mendefinisikan set, sehingga byte dapat disimpan lebih dari versi sebelumnya.
sumber
Retina,
4020 byte20 byte disimpan berkat Martin Büttner.
Tempatkan setiap baris dalam file sendiri dan ganti
\n
dengan baris baru literal.sumber
pb , 648 byte
Mengambil input dengan karakter tab yang memisahkan kedua string.
Yang ini doozy. Sebenarnya menerapkan algoritma itu bukan bagian yang sulit, yang datang dengan relatif mudah. Tetapi saya harus melakukan dua hal yang sulit dilakukan di pb: Kasus tidak sensitif dan itoa. Saya kebetulan memiliki program untuk mengkonversi ke huruf kecil hanya berbaring (sepanjang 211 byte) dan segala sesuatu yang lain ditempel di ujung untuk melakukan pekerjaan untuk tantangan ini secara khusus.
Anda dapat menonton program ini berjalan di YouTube! Ada beberapa hal yang harus diingat jika Anda melakukannya:
chr(-1)
crash interpreter ketika berjalan dalam mode tontonan.Hello, world!
danCode golf.
. Ini sedikit berbeda dari salah satu contoh input dalam tantangan; Saya menggunakannya karena pendek tetapi dimodifikasi sehingga output yang benar adalah 10 bukan 9. Ini hanya untuk menunjukkan bahwa angka dicetak dengan benar bahkan jika itu beberapa digit, yang sulit di pb.chr(10)
tidak ditangani dengan benar membuat mereka sebagian besar tidak berguna di sini. Semua yang dikatakan, saya pikir itu hampir jenis yang indah untuk ditonton. Ini adalah kekacauan besar dari kode mengerikan yang menafsirkan kode mengerikan lainnya, potongan-potongan itu mogok di depan mata Anda, namun semuanya bekerja cukup hanya untuk mendapatkan jawaban yang benar. Sepertinya sampah sedang dicetak tetapi jika Anda cukup memperhatikan dengan sumbernya, Anda dapat mengetahui apa yang dilakukannya dan mengapa pada titik mana pun. Saya merasa seperti Cypher ketika menonton video ini:I... I don’t even see the code. All I see is blonde, brunette, red-head.
Tanpa basa-basi lagi, inilah kodenya ungolfed.
sumber
C ++ 199 byte
Menggunakan array untuk menyimpan hitungan masing-masing karakter dalam string pertama, meminimalkan hitungan dalam string kedua. Selanjutnya ia menemukan jumlah nilai absolut dari elemen-elemen array: ini adalah jarak.
Golf:
Tidak Disatukan:
sumber
PowerShell, 79 byte
Hampir kode yang persis sama dengan jawaban saya di Anagram Code Golf ... tapi ... Saya mendapatkan perilaku aneh jika saya hanya memotong
-eq0
dari jawaban itu, jadi saya akhirnya perlu secara eksplisit.ToLower()
dan menyusun kembali di luarparam
deklarasi. +Penjelasan juga (sebagian besar) disalin dari jawaban itu - Mengambil dua input string, membuatnya lebih kecil, dan melemparkannya kembali sebagai char-array. The
diff
function (alias untukCompare-Object
) mengambil dua array dan kembali item yang berbeda antara keduanya. Kami memanfaatkannya dengan kembali casting sebagai array dengan()
, dan kemudian memeriksa panjangnya.+ Misalnya, saya mendapatkan hasil palsu dengan
param([char[]]$a,[char[]]$b)(diff $a $b).length
diall lowercase.
/ALL UPPERCASE!
tes. Jika saya secara manual memisahkan array (mis. Ran(diff ('a','l','l'...
), itu berfungsi dengan baik, tetapi akan gagal setiap kali ada modal / huruf kecil tumpang tindih dengan casting. Semua yang saya dapat baca pada dokumentasi menyatakandiff
secara case-insensitive secara default, jadi ... shrug ???sumber
Bash,
6867 byteSaya pikir ini berhasil. Perhatikan ruang trailing di baris kedua.
Uji kasus
sumber
Perl,
5246 byte + 3 sakelar (a, F, n) =5549 byteMengambil input dari STDIN dengan string input di jalur mereka sendiri, diakhiri oleh EOF.
Switch:
Kode:
sumber
Utilitas Bash + GNU, 53
sed
berubah menjadi huruf kecil dan membagi string menjadi garis untuksort
. Karena kita perlu melakukan ini dua kali saya memasukkannya ke dalam fungsi.comm3 -3
menyaring garis yang relevan danwc -l
menghasilkan nomor.Masukan melalui
STDIN
; karena dua perintah membaca berurutan, Anda harus mengirimEOF
(Ctrl-D) dua kali, di antara string dan di akhir. Timpa file1
, jika ada.sumber
Matlab, 91 byte
Cobalah online .
Ini berfungsi sebagai berikut:
sumber
Jelly , 6 byte
Cobalah online!
sumber
F #,
134126 bytePenjelasan :
a
danb
secara terpisah.Kurangi setiap grup dengan
-
operator, yang memiliki efek sebagai berikut:Jumlahkan nilai absolut dari nilai-nilai dari langkah sebelumnya.
sumber
Scala ,
13481 byteTerima kasih @ ASCII-hanya untuk pekerjaan mereka.
Cobalah online!
sumber