一言で個性を出そう!


8

大好き/usr/share/dict/wordsです。とても便利です!できる限り、すべてのプログラムで使用します。単語の個性をテストすることで、この非常に便利なファイルを利用することができます。


入力

  • 単語; このチャレンジで任意の文字列として定義されています
  • /usr/share/dict/wordsあるフォーマットで; ハードコーディングし、ディスクから読み取り、2番目の引数として想定することができます。

出力

  • 言葉の個性(下記参照)

単語の個性は次の方程式から導出されます。

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

例を見てみましょう: hello。(helloの長さ)でhello割った部分文字列を含む12の単語があり5、helloの個性は12/5または2.4


PSこれはであるため、個性スコアが低いほど、より個性的です

個性は長い言葉なので、プログラムはできるだけ短くする必要があります

幸運を!


テストケース

この便利なNode.jsスクリプトを使用できます。これは、コードに適合するためのチャレンジ要件に適合します。また、テストケースの生成方法も示します。

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

テストケース:

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

それは逆にしてはいけませんか?より個性的にするために、より高い個性スコアを持っていますか?
ガブリエルベナミー2016年

2
おそらく、しかし人々がゴルフを始めたかもしれないときに挑戦に
重大

代わりに他の単語リストを使用できますか?これはWindowsユーザーの方が使いやすいと思います。リストは明らかに長くないので、個性は高くなりますが、これは私がそれを見る方法の挑戦を変えません。
Stewie Griffin

1
単語はそれ自体の部分文字列ですか?
FlipTack 2016年

1
大文字と小文字を区別しない一致を想定していますか?
zeppelin 2016年

回答:



3

バッシュ、 41393433、26バイト

編集:

  • 関数からスクリプトに変換
  • 大文字と小文字を区別しないフラグを削除して1バイトオフ
  • wc -lgrep -cに置き換え、5バイトを節約。ありがとう@Riley!

bash + coreutilsのかなり自明なソリューション

ゴルフ

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

テスト

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

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

1
grep -ic $1の代わりに働きますかgrep -i $1|wc -l
Riley

ほんとだ!(これは常にGNU拡張機能であると考えられていましたが、実際にはPOSIXオプションであることが判明しています)。ありがとうございました !
zeppelin

2

Pythonの3、52の 49バイト

wリストとしての単語リストであると想定していたKadeのおかげで-3バイト:

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

以前の解決策:

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

w単語リストであると想定します。私の単語リストにはいくつかの非ASCII文字があり、Python 2はそれらが気に入らないため、Python 3を選択します。


1
:あなたは、任意の合理的な形式で単語リストを取ることが許可されている50バイトのための可能性がないこの作品以来f=lambda s,w:w>[]and (s in w[0])/len(s)+f(s,w[1:])
カーデ

1
私はあなたが間にスペースを削除することができます注意しなければならないandし、(それ49バイトにします。
Kade

@Kadeすごい!緩い要件の素敵な乱用。
Karl Napf 2016年

@Dopappいいえ、このため、サブストリングではないでしょう
カールNAPF

2

Perl 6の 45の36 33  32バイト

ファイル名としてのワードリストf45バイト

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

リストとしてのワードリストl36バイト

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

プレースホルダー変数とリバース(R)メタ演算子の使用、33バイト

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

カウントを取得するの.combではなく、文字のリストを取得するために使用する.chars32バイト

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

拡張:

{             # 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バイト

単語をw変数としてawkコマンドに渡し、ファイルを<stdin>次のように渡します。

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

出力例:

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


0

Clojure、53バイト

それほどエキサイティングではありません:/

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

これ1.は有理数を浮動小数点数に変換するためのものです。私Wはそのように単語を事前にロードしました:

(def W (map clojure.string/lower-case (clojure.string/split (slurp "/usr/share/dict/words") #"\n")))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.