Dapatkan individualitas kata!

8

Saya suka /usr/share/dict/words; ini sangat berguna! Saya menggunakannya untuk semua program saya, kapan pun saya bisa! Anda akan memanfaatkan file yang sangat berguna ini untuk digunakan, dengan menguji individualitas kata.


Memasukkan

  • Kata; didefinisikan dalam tantangan ini sebagai string karakter apa pun
  • /usr/share/dict/wordsdalam beberapa format; Anda dapat membuat kode, membaca dari disk, menganggapnya sebagai argumen kedua, apa pun yang paling masuk akal dalam tantangan Anda

Keluaran

  • Sebuah kata individualitas (lihat di bawah)

Individualitas kata berasal dari persamaan berikut:

<the number of words for which it is a substring> / <length of the word>

Mari kita lihat sebuah contoh: hello. Ada 12 kata yang memiliki substring hellodi dalamnya, dibagi dengan 5(panjang halo), dan individualitas halo adalah 12/5atau2.4


PS Ini , jadi semakin rendah skor individualitas, semakin individu

Karena individualitas adalah kata yang panjang, program Anda harus sesingkat mungkin

Semoga berhasil!


Uji Kasus

Anda dapat menggunakan skrip Node.js yang nyaman ini, yang sesuai dengan persyaratan tantangan agar sesuai dengan kode Anda. Ini juga bagaimana saya membuat test case:

var fs = require("fs");
var word = process.argv[2];

process.stdout.write("Reading file...")
fs.readFile("/usr/share/dict/words", function(err, contents) {
  console.log("Done")
  if (err) throw err;

  words = contents.toString().split("\n");

  var substrings = words.filter(w => w.indexOf(word) > -1).length;
  var length     = word.length;

  console.log(`${word} => ${substrings} / ${length} = ${substrings / length}`)
})

Kasus uji:

hello => 12 / 5 = 2.4
individuality => 1 / 13 = 0.07692307692307693
redic => 52 / 5 = 10.4
ulous => 200 / 5 = 40
challen => 15 / 7 = 2.142857142857143
ges => 293 / 3 = 97.66666666666667
hidden => 9 / 6 = 1.5
words => 12 / 5 = 2.4
aside => 8 / 5 = 1.6
MayorMonty
sumber
Bukankah seharusnya sebaliknya? Untuk membuatnya lebih individual, punya skor individualitas yang lebih tinggi?
Gabriel Benamy
2
Mungkin, tetapi membuat perubahan pada tantangan ketika orang mungkin sudah mulai bermain golf adalah tidak bijaksana
MayorMonty
Bisakah kita menggunakan daftar kata lain saja? Saya pikir ini lebih mudah digunakan (menjadi pengguna Windows). Daftar ini tampaknya tidak panjang, sehingga individualitasnya akan lebih tinggi, tetapi ini tidak mengubah tantangan seperti yang saya lihat.
Stewie Griffin
1
Apakah sebuah kata merupakan substring dari dirinya sendiri?
FlipTack
1
Saya menganggap pertandingan case-insensitive?
zeppelin

Jawaban:

1

05AB1E , 9 byte

#vy²å}ON/

Cobalah online!

#         Separate by newlines or spaces.
 vy       For each entry in the dictionary.
   ²å     1 if the second argument is a substring of the current word, 0 o.w.
     }    End loop.
      O   Sum ones and zeros.
       N  Get list size. 
        / Divide.
Guci Gurita Ajaib
sumber
Sepertinya milik Anda akan menjadi yang terpendek, tetapi saya akan memberikannya satu atau dua minggu
MayorMonty
3

Pesta, 41, 39, 34, 33, 26 byte

EDIT:

  • Dikonversi dari fungsi ke skrip
  • Satu byte mati dengan menghapus flag abaikan kasus
  • Diganti wc -l dengan grep -c , menghemat 5 byte. Terima kasih @Riley!

Solusi yang agak sepele di bash + coreutils

Golf

bc -l<<<`grep -c $1`/${#1}

Uji

>cat /usr/share/dict/words| ./test ulous
7.60000000000000000000

>grep -i ulous /usr/share/dict/words | wc -l
38
zeppelin
sumber
1
Apakah akan grep -ic $1berhasil grep -i $1|wc -l?
Riley
Benar! (selalu menganggap ini sebagai ekstensi GNU, tetapi ternyata memang menjadi opsi POSIX). Terima kasih !
zeppelin
2

Python 3, 52 49 byte

-3 byte terima kasih kepada Kade, untuk mengasumsikan wmenjadi daftar kata sebagai daftar:

f=lambda s,w:w>[]and(s in w[0])/len(s)+f(s,w[1:])

Solusi sebelumnya:

lambda s,w:sum(s in x for x in w.split('\n'))/len(s)

Diasumsikan wsebagai daftar kata. Saya memilih Python 3 karena dalam daftar kata saya ada beberapa karakter Non-ASCII dan Python 2 tidak menyukainya.

Karl Napf
sumber
1
Karena Anda diizinkan untuk mengambil daftar kata dalam format apa pun yang masuk akal, tidak bisakah ini berfungsi untuk 50 byte:f=lambda s,w:w>[]and (s in w[0])/len(s)+f(s,w[1:])
Kade
1
Saya harus mencatat Anda dapat menghapus ruang antara anddan (membuatnya 49 byte.
Kade
@Kade mengagumkan! Penyalahgunaan persyaratan longgar yang bagus.
Karl Napf
@Dappapp Tidak, karena ini tidak akan substring
Karl Napf
2

Perl 6 ,  45 36 33  32 byte

daftar kata sebagai nama file f, 45 byte

->$w,\f{grep({/:i"$w"/},f.IO.words)/$w.chars}

daftar kata sebagai daftar l, 36 byte

->$w,\l{grep({/:i"$w"/},l)/$w.chars}

menggunakan variabel placeholder, dan membalikkan ( R) meta-operator, 33 byte

{$^w.chars R/grep {/:i"$w"/},$^z}

gunakan .combuntuk mendapatkan daftar karakter, daripada .charsuntuk mendapatkan hitungan, 32 byte

{$^w.comb R/grep {/:i"$w"/},$^z}

Diperluas:

{             # block lambda with placeholder parameters 「$w」 「$z」

  $^w         # declare first parameter ( word to search for )
  .comb       # list of characters ( turns into count in numeric context )

  R[/]        # division operator with parameters reversed

  grep        # list the values that match ( turns into count in numeric context )

    {         # lambda with implicit parameter 「$_」
      /       # match against 「$_」
        :i    # ignorecase
        "$w"  # the word as a simple string
      /
    },

    $^z       # declare the wordlist to search through
              #( using a later letter in the alphabet
              #  so it is the second argument )
}
Brad Gilbert b2gills
sumber
1

awk: 31 byte

Melewati kata sebagai wvariabel ke awkperintah, dan file di <stdin>:

$0~w{N++}END{print N/length(w)}

Output sampel:

 $ awk -vw=hello '$0~w{N++}END{print N/length(w)}' /usr/share/dict/words
 2.4
Adam
sumber
1

PHP, 54 byte

Mengasumsikan daftar kata dalam $w.

<?=count(preg_grep("/$argv[1]/",$w))/strlen($argv[1]);
Alex Howansky
sumber
0

Clojure, 53 byte

Tidak terlalu menarik: /

#(/(count(filter(fn[w](.contains w %))W))(count %)1.)

Itu 1.ada untuk mengubah rasional menjadi pelampung. Saya memasukkan kata-kata menjadi Wseperti itu:

(def W (map clojure.string/lower-case (clojure.string/split (slurp "/usr/share/dict/words") #"\n")))
NikoNyrh
sumber