Có được tính cá nhân của một từ!


8

Tôi yêu /usr/share/dict/words; thật tiện dụng Tôi sử dụng nó cho tất cả các chương trình của tôi, bất cứ khi nào tôi có thể! Bạn sẽ tận dụng lợi thế của tệp này rất hữu ích để sử dụng, bằng cách kiểm tra tính cá nhân của một từ.


Đầu vào

  • Một từ; được định nghĩa trong thử thách này là bất kỳ chuỗi ký tự nào
  • /usr/share/dict/wordstrong một số định dạng; bạn có thể viết mã cứng, đọc từ đĩa, coi đó là đối số thứ hai, bất cứ điều gì có ý nghĩa nhất trong thử thách của bạn

Đầu ra

  • Một từ riêng lẻ (xem bên dưới)

Tính cá nhân của một từ có nguồn gốc từ phương trình sau:

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

Hãy xem một ví dụ : hello. Có 12 từ có chuỗi con hellotrong đó, chia cho 5(độ dài của hello) và tính cá nhân của hello là 12/5hoặc2.4


PS Đây là , vì vậy điểm cá nhân càng thấp, cá nhân càng nhiều

Vì tính cá nhân là một từ dài, chương trình của bạn phải càng ngắn càng tốt

Chúc may mắn!


Các trường hợp thử nghiệm

Bạn có thể sử dụng tập lệnh Node.js tiện lợi này, phù hợp với các yêu cầu thách thức để phù hợp với mã của bạn. Đó cũng là cách tôi tạo ra các trường hợp thử nghiệm:

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}`)
})

Các trường hợp thử nghiệm:

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

Không phải là cách khác? Để làm cho nó cá nhân hơn, có điểm cá nhân cao hơn?
Gabriel Benamy

2
Có thể, nhưng thực hiện các thay đổi đột phá đối với thử thách khi mọi người có thể đã bắt đầu chơi golf sẽ không khôn ngoan
MayorMonty

Chúng ta có thể sử dụng danh sách từ khác thay thế? Tôi nghĩ cái này dễ sử dụng hơn (là người dùng Windows). Danh sách rõ ràng không dài, vì vậy tính cá nhân sẽ cao hơn, nhưng điều này không làm thay đổi thách thức theo cách tôi nhìn thấy.
Stewie Griffin

1
Là một từ một chuỗi con của chính nó?
FlipTack

1
Tôi giả sử một trường hợp không nhạy cảm trường hợp?
zeppelin

Câu trả lời:


1

05AB1E , 9 byte

#vy²å}ON/

Hãy thử trực tuyến!

#         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.

Có vẻ như bạn sẽ là người ngắn nhất, nhưng tôi sẽ cho nó một hoặc hai tuần
MayorMonty

3

Bash, 41, 39, 34, 33, 26 byte

BIÊN TẬP:

  • Chuyển đổi từ chức năng sang tập lệnh
  • Tắt một byte bằng cách xóa cờ trường hợp bỏ qua
  • Đã thay thế wc -l bằng grep -c , tiết kiệm 5 byte. Cảm ơn @Riley!

Một giải pháp khá nhỏ trong bash + coreutils

Chơi gôn

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

Kiểm tra

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

>grep -i ulous /usr/share/dict/words | wc -l
38

1
Sẽ grep -ic $1làm việc thay vì grep -i $1|wc -l?
Riley

Thật ! (luôn nghĩ đây là một phần mở rộng GNU, nhưng thực ra nó là một tùy chọn POSIX). Cảm ơn bạn !
zeppelin

2

Python 3, 52 49 byte

-3 byte nhờ Kade, vì đã giả sử wlà danh sách từ dưới dạng danh sách:

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

Giải pháp trước đây:

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

Giả sử wlà danh sách từ. Tôi chọn Python 3 vì trong danh sách từ của tôi có một số ký tự Non-ASCII và Python 2 không thích chúng.


1
Vì bạn được phép lấy danh sách từ ở bất kỳ định dạng hợp lý nào, không thể làm việc này với 50 byte:f=lambda s,w:w>[]and (s in w[0])/len(s)+f(s,w[1:])
Kade

1
Tôi nên lưu ý rằng bạn có thể loại bỏ khoảng trắng giữa and(để làm cho nó 49 byte.
Kade

@Kade tuyệt vời! Lạm dụng tốt đẹp của các yêu cầu lỏng lẻo.
Karl Napf

@Dopapp Không, bởi vì điều này sẽ không substring
Karl Napf

2

Perl 6 ,  45 36 33  32 byte

danh sách từ dưới dạng tên tệp f, 45 byte

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

danh sách từ như một danh sách l, 36 byte

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

sử dụng biến giữ chỗ và Rtoán tử meta ( ), 33 byte

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

sử dụng .combđể có được danh sách các ký tự, thay vì .charsđể đếm, 32 byte

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

Mở rộng:

{             # 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 )
}

1

awk: 31 byte

Truyền từ dưới dạng wbiến cho awklệnh và tệp trong <stdin>:

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

Đầu ra mẫu:

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

1

PHP, 54 byte

Giả sử danh sách từ trong $w.

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

0

Clojure, 53 byte

Không thú vị lắm: /

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

Đó 1.là ở đó để chuyển đổi một hợp lý thành một float. Tôi tải sẵn các từ Wnhư vậy:

(def W (map clojure.string/lower-case (clojure.string/split (slurp "/usr/share/dict/words") #"\n")))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.