Pertimbangkan string dengan panjang N, seperti Peanut Butter
dengan N = 13. Perhatikan bahwa ada N-1 pasangan karakter yang berdekatan dalam string. Sebab Peanut Butter
, yang pertama dari 12 pasangan adalah Pe
, yang kedua adalah ea
, yang terakhir adalah er
.
Ketika pasangan sebagian besar karakter yang berbeda, string memiliki kualitas yang tebal, misalnya chUnky
.
Ketika pasangan ini sebagian besar karakter yang sama, string memiliki kualitas yang halus, misalnya sssmmsss
.
Tentukan chunkiness string menjadi rasio jumlah pasangan dengan dua karakter berbeda dengan jumlah total pasangan (N-1).
Tentukan kelancaran string menjadi rasio jumlah pasangan dengan dua karakter identik dengan jumlah total pasangan (N-1).
Misalnya, Peanut Butter
hanya memiliki satu pasangan dengan karakter yang identik ( tt
), sehingga kehalusannya adalah 1/12 atau 0,0833 dan chunkiness-nya adalah 11/12 atau 0,9167.
String kosong dan string dengan hanya satu karakter didefinisikan sebagai 100% halus dan chunky 0%.
Tantangan
Tulis program yang menggunakan string dengan panjang sewenang-wenang dan output baik rasio chunkiness atau smoothness sebagai nilai floating point.
- Ambil input melalui stdin atau baris perintah, atau Anda dapat menulis fungsi yang mengambil string.
- Anda dapat mengasumsikan string input hanya berisi karakter ASCII yang dapat dicetak (dan karenanya adalah satu-baris).
- Cetak pelampung ke stdout ke 4 atau lebih tempat desimal, atau Anda dapat memilih untuk mengembalikannya jika Anda menulis suatu fungsi. Tempat desimal yang tidak menyampaikan informasi tidak diperlukan, misalnya boleh
0
saja0.0000
. - Pilih chunkiness atau smoothness sesuai keinginan. Pastikan untuk mengatakan yang mana output program Anda.
Kode terpendek dalam byte menang.
Contohnya
Peanut Butter
→ chunkiness: 0.91666666666
, Smoothness: 0.08333333333
chUnky
→ chunkiness: 1.0
, Smoothness: 0.0
sssmmsss
→ chunkiness: 0.28571428571
, Smoothness: 0.71428571428
999
→ chunkiness: 0.0
, Smoothness: 1.0
AA
→ chunkiness: 0.0
, Smoothness: 1.0
Aa
→ chunkiness: 1.0
, Smoothness: 0.0
!
→ chunkiness: 0.0
, Smoothness: 1.0
[kosong string] → chunkiness: 0.0
, Kelancaran:1.0
Pertanyaan bonus: Manakah yang Anda sukai , string chunky atau smooth ?
sumber
Jawaban:
APL, 10 byte
Ini membaca input dari stdin dan mencetak chunkiness ke stdout. Algoritma ini sama dengan yang digunakan untuk solusi J.
sumber
CJam, 19 byte
100% kode sumber chunky yang menghitung chunkiness .
Coba kebaikan besar online ini.
Bagaimana itu bekerja
Jelas, NaN dibulatkan ke 4 tempat desimal adalah 0.
sumber
2ew
pendekatan yang saya coba. Kasus khusus 0/1 surat membunuh saya._
bergerak. Tidak yakin apakah itu penting.Pyth,
1312 byteKode chunky sepenuhnya menghitung chunkiness.
Demonstrasi. Uji harness.
sumber
z
penyebab kesalahan pada input kosong online. Saya akan pergi dan memperbaiki bug itu. Namun, kode ini baik-baik saja.TI-BASIC, 46 byte
sub(x1,x2,x3
memberikan substring stringx1
mulai (berbasis satu) pada angkax2
dan berakhir pada angkax3
, kemudianseq(
membangun urutan.Memberikan nilai kelancaran. The
Ans
variabel0
secara default, jadi kita tidak perluElse
keIf
pernyataan, atau ke toko apa pun untukAns
terlebih dahulu.sumber
Matlab (
3736 bytes)Ini dapat dilakukan dengan fungsi anonim berikut, yang mengembalikan chunkiness:
Komentar:
Dalam versi Matlab lama (seperti R2010b), Anda perlu
+
melemparkan array charx
ke array ganda:Tapi itu tidak terjadi di versi terbaru (diuji dalam R2014b), yang menghemat satu byte. Terima kasih kepada Jonas untuk komentarnya.
max
menangani kasus satu karakter dan nol karakter (untuk chunkiness)Contoh:
sumber
diff('abc')
tidak akan menghasilkan peringatan.> <> ,
4036 byteProgram ini mengembalikan chunkiness string.
Penjelasan
Pengiriman sebelumnya (37 + 3 = 40 byte)
Program ini mengembalikan kelancaran sebuah string. Input melalui
-s
flag, missumber
C #,
9489 byteSub 100 byte, jadi saya kira itu beberapa bentuk kemenangan itu sendiri?
Ini adalah definisi fungsi (diizinkan sesuai spesifikasi) yang mengembalikan kelancaran string input:
Cukup mudah, jika panjangnya adalah 0 atau 1 maka akan mengembalikan 1, jika tidak maka string akan dibandingkan dengan karakter pertama, kemudian mengembalikan jumlah pasangan identik dibagi dengan jumlah pasangan.
Edit - diganti Substring dengan Lewati. Kesalahan pemula!
sumber
J,
1413 byteMenghitung tingkat chunkiness. Kudos to J untuk mendefinisikan
0 % 0
sama dengan 0.Cobalah online
Berikut ini penjelasannya:
sumber
(]+/%#)2~:/\]
menghemat 1 byte.CJam, 23 byte
Penjelasan:
Ini menghasilkan rasio kelancaran.
sumber
CJam, 16 byte
Kode sumber Cheaty yang menghitung kehalusan .
Untuk input dengan panjang 0 atau 1, ini mencetak hasil yang benar sebelum keluar dengan kesalahan. Dengan Java interpreter, output kesalahan menuju ke STDERR ( sebagaimana mestinya ).
Jika Anda mencoba kode online , abaikan saja semuanya kecuali baris terakhir dari output.
Bagaimana itu bekerja
sumber
Julia, 52 byte
Kelancaran!
Ini menciptakan fungsi tanpa nama yang menerima string dan mengembalikan nilai numerik.
Jika panjang input kurang dari 2, kelancarannya adalah 1, jika tidak kita menghitung proporsi karakter yang berdekatan yang identik dengan mengambil rata-rata dari array logis.
sumber
Nim,
1059691 byteMencoba mempelajari Nim. Ini menghitung chunkiness string.
(
Jika saya mencoba membaca ini sebagai Python indentasi terlihat kacau ...Sekarang lebih mirip Ruby ...)sumber
Python 3, 63 Bytes
Ini adalah fungsi lambda anonim yang mengambil string sebagai argumen, dan mengembalikan chunkiness-nya.
Untuk menggunakannya, berikan nama dan panggil saja.
sumber
def f(n):
yang memiliki jumlah karakter persis sama denganlambda n:
. Ini menghilangkan kebutuhan untuk memberi nama fungsi Anda.def f(n):
juga membutuhkanreturn
Python 3, 52 byte
Ini menghitung chunkiness, dan output
-0.0
untuk string kosong. Jika tidak suka nol negatif, Anda selalu dapat memperbaikinya dengan byte tambahan:sumber
Haskell, 64 byte
Keluaran kelancaran. misalnya
f "Peanut Butter"
->8.333333333333333e-2
.Bagaimana itu bekerja:
sum(x>>[1])
adalah panjang x, tetapi karena sistem tipe Haskell yang kuat mengharuskan untuk memberi makan fraksional/
, saya tidak dapat menggunakanlength
yang mengembalikan bilangan bulat. Mengubah bilangan bulat menjadi pecahan melaluifromInteger$length x
terlalu lama.sumber
import Data.Ratio
terlalu mahal.JavaScript (ES6), 55 byte
Kelancaran, 56 byte
Chunkiness, 55 byte
Demo
Menghitung kehalusan, karena itulah yang saya sukai. Hanya berfungsi di Firefox untuk saat ini, seperti ES6.
sumber
KDB (Q), 30
Mengembalikan kelancaran.
Penjelasan
Uji
sumber
Ruby ,
6966 byteCobalah online!
Dicukur beberapa byte dengan komentar dari IMP. Juga, dengan mendatang versi 2.7.0 dari Ruby itu mungkin untuk menghemat byte dengan mengganti
|x,y|x!=y
dengan@1!=@2
sumber
.to_f/~-s.size
ke penugasan c, maka Anda dapat mencukur byte dengan operasi ternary:f=->s{(c=s.chars.each_cons(2).count{|x,y|x!=y}.to_f/~-s.size)>0?c:0}
f=
? Saya tidak 100% pada aturan tentang itu. Tantangannya mengatakan Anda dapat mengembalikan fungsi yang mengambil string, yaitu lambda yang stabby.Python 3, 69 byte
Belum ada yang memposting solusi Python, jadi inilah implementasi fungsi "chunkiness" yang cukup mudah. Ini hubungan pendek pada string panjang
1
, dan cetakan0
(yang merupakan bilangan bulat daripada pelampung tetapi tampaknya diizinkan sesuai dengan aturan).Pada string kosong, ini menghasilkan
-0.0
bukan0.0
. Bisa dibilang ini bisa dianggap dapat diterima, sebagai-0.0 == 0 == 0.0
pengembalianTrue
.Contoh:
(Python 3 digunakan untuk divisi float default-nya.)
sumber
C, 83 byte
Fungsi mengembalikan chunkiness .
Penjelasan
Terima string C, dan kembalikan float (dobel akan bekerja tetapi lebih banyak karakter)
Penghitung -
a
untuk pasangan total,b
untuk pasangan yang tidak cocok. Menggunakanint
batas "panjang sewenang-wenang" dari string, tapi itu hanya pelanggaran kecil terhadap persyaratan dan saya tidak akan memperbaikinya.Kasus khusus string kosong - biarkan kedua counter nol.
Non-empty string - iterate through it dengan pre-increment (jadi pertama kali melalui loop,
s[a]
akan menjadi karakter kedua. Jika string hanya memiliki satu karakter, badan loop tidak akan dimasukkan, dana
akan menjadi 1.Jika karakter saat ini berbeda dari sebelumnya, kenaikan
b
.Setelah perulangan, ada tiga kemungkinan: 'a == 0, b == 0' untuk input kosong, 'a == 1, b == 0' untuk input karakter tunggal atau 'a> 1, b> = 0 'untuk input multi-karakter. Kami mengurangi 1 dari
a
(?
operator adalah titik urutan, jadi kami aman), dan jika nol, kami memiliki huruf kedua, jadi harus mengembalikan nol. Kalau tidak,b/a
itulah yang kita inginkan, tetapi kita harus mempromosikanb
ke tipe floating-point terlebih dahulu atau kita akan mendapatkan divisi integer. Untuk string kosong, kita akan berakhir dengan nol negatif, tetapi aturan tidak melarangnya.Tes:
Pemberian yang mana:
seperti yang dipersyaratkan.
sumber
a,b;float f(char*s){if(*s)for(a=b=0;s[++a];)b+=s[a]!=s[a-1];return--a?1.*b/a:b;}
Perl, 69
Fungsi mengembalikan kelancaran :
Penjelasan
Tes
sumber
Mathematica,
7372 byteIni tidak memenangkan apa pun untuk ukuran, tetapi langsung:
Kelancaran
sumber
Length[#]
->Length@#
menyimpan stroke. Begitu juga dengan menghilangkanN@
dan mengubah1
ke1.
GeL:
7673 karakterKelancaran.
Contoh dijalankan:
(GeL = Gema + Lua binding. Jauh lebih baik, tapi masih jauh dari kemenangan.)
Gema:
123120 karakterKelancaran.
Contoh dijalankan:
(Apakah lebih merupakan latihan bagi diri saya untuk melihat apa peluang untuk menyelesaikannya dalam bahasa tanpa dukungan angka floating point dan dukungan aritmatika yang umumnya menyakitkan. Baris ke-2, terutama
\P
urutannya, adalah sihir murni, baris terakhir adalah siksaan nyata.)sumber
Java 8,
8482 byteKeluaran Kelancaran.
Cobalah online.
Penjelasan:
sumber
Kelapa , 38 byte
Cobalah online!
Port Python 3 akan menjadi 50 byte .
sumber
PowerShell, 55 byte
Kelancaran
Tampaknya sedikit konyol untuk mendapatkan variabel di stdin dan kemudian memberikannya pengenal, tetapi lebih cepat daripada memiliki fungsi.
sumber
Python 3, 61 Bytes
hitung chunkiness:
sumber
K (22)
solusi Q tweak WooiKent:
sumber
Ruby, 63 Bytes
Keluaran chunkiness.
f=->s{s.chars.each_cons(2).count{|x,y|x!=y}/[s.size-1.0,1].max}
Mirip dengan solusi @ daniero, tetapi sedikit dipersingkat dengan langsung membagi dengan panjang string - 1 dan kemudian mengandalkan .count menjadi nol dengan panjang 0 & 1 string (.max memastikan saya tidak akan membagi dengan 0 atau -1).
sumber
Mathematica, 107 byte
Menghitung kekonyolan dengan mengambil setengah dari jarak Levenshtein antara setiap digraf dan kebalikannya.
Jika Anda lebih suka jawaban rasional yang tepat, hapus
.5
dan tempatkan/2
sebelum yang terakhir&
tanpa penalti. Program itu sendiri memiliki chunkiness 103/106, atau sekitar 0,972.sumber