約5秒を超えると何のタスクにも集中できなくなるため、単語をサブストリングに分割することがよくあります。サブストリングはそれぞれ長さが異なり、繰り返し文字が含まれていません。たとえば、「パスタ」という単語を「過去」と「a」、「パス」と「タ」、または「パス」と「スター」に分割すると、画像が表示されます。
ただし、すべての組み合わせを覚えるのは難しいため、通常は1つだけを選択し、最も優れた組み合わせを選択します。最も良い方法は、「スコア」が最も低い方法であると考えています。あなたの仕事は、単語を与えられて、以下の複雑なルールを与えられて、そのスコアを印刷することです。
得点
単語の採点方法の説明:
単語はラテン文字の文字列であり、大文字は同じ小文字の2で置き換える必要があります(したがって、「ボックス」は「bbox」になります)。
セグメントは単語の連続した(厳密な)サブストリングであり、文字を2回含めることはできません( "her"、 "re"、 "h"はすべて "Here"( "hhere")の有効なセグメントですが、 "hh"そして「エレ」はそうではありません)
セグメンテーションは、長さが異なる一連のセグメントであり、結合すると元の単語を形成し(「tre」と「e」は「tree」を作成)、セグメンテーション内でそれ以上セグメント化できません(つまり、「ba」には単一のセグメンテーション、「ba」、および「alp」と「habet」は、「alphabet」の有効なセグメンテーションではありません。これは、これらのいずれかをさらにセグメント化できるためです(たとえば、現在「a」と「lp」と「habet」)。有効なセグメンテーション(「habet」は、長さ2または1)のセグメントを形成しないとセグメント化できません)))。
セグメンテーションのスコアは、元の単語に出現する個別の各文字のスコアの合計です(大文字が置き換えられた後)。
キャラクターのスコアリングは以下で説明されています
単語のスコアは、最も良い可能なセグメンテーションのスコアです(スコアが最も低い)。
単語に有効なセグメンテーションが存在しない場合(たとえば、 "Brass"( "bbrass")。最初の "b"と最後の "s"は独自のセグメントになければならないため、セグメント化できません。同じ長さの2つのセグメント)の場合、テキスト「evil」を出力する必要があります。それ以外の場合は、単語のスコアを出力する必要があります。
キャラクター採点
文字のスコアリングは、文字が出現する回数、および出現するセグメントの重み付けに基づいています。セグメントの重み付けは、セグメントの長さと、すべてのセグメントの長さの最小公倍数によって異なります。セグメンテーション。
segment weighting = lowest common multiple of lengths segments / length of segment
「ol」と「ive」に分割され、同じ領域の2つのボックスとして視覚化された「olive」という単語を考えます。1つは重み3の「ol」、もう1つは重み2の「ive」(LCMの6)。
ol
ol ive
ol ive
これは、3つの「ol」から作られた2つのボックスと2つの「ive」から作られた1つのボックスを表すことを意図しています。あるいは、 "o"と "live"(LCM of 4)の場合もあります。
o
o
o
o live
次に、各文字のスコアは、それが表示されるセグメントの重みの合計に、大文字を置き換えた後に表示される回数を掛けたものです(したがって、2回表示される場合は、発声するたびに2倍の料金がかかります)。
character score = character count * sum(segment weights in which character appears)
採点例
「フォール」という言葉を取り上げますが、「ファル」と「l」にしか分割できません。3と1の最小公倍数は3なので、「fal」の重みは1で、「l」の重みは3です。
l
l
fal l
各キャラクターを通過する...
「f」は1回出現し、重み「1」のセグメント「fal」にあるため、スコアは1 * 1 = 1です。
「a」も1回だけ出現し、重みの合計が1であるため、スコアは1 * 1 = 1です。
「l」は2回出現し、「fal」(重み1)と「l」(重み3)に出現するため、スコアは2 *(1 + 3)= 8です。
これらの合計は10です(セグメンテーションのスコアと、これが最も優れたセグメンテーションであるため、単語のスコア)。これは、以下の例と同じ形式です。
fall = fal l
2*1 [fa] + 2*(1+3) [ll] = 10
スコアリングの例
これらのスコアリングの例は、役立つ場合とそうでない場合があります。
class -> clas s
3*1 [cla] + 2*(4+1) [ss] = 13
fish -> fis h
3*1 [fis] + 1*3 [h] = 6
eye -> e ye
1*1 [y] + 2*(1+2) [ee] = 7
treasure -> treas u re
3*2 [tas] + 2*2*(2+5) [rree] + 1*10 [u] = 44
Wolf -> w wolf
3*1 [olf] + 2*(1+4) = 13
book
evil
「本」は邪悪な言葉なのでスコアがありません。
「宝物」はいくつかの方法でセグメント化できますが、示されているセグメント化では、長いセグメントで文字(「r」と「e」)が頻繁に使用されることでメリットが得られるため、重みはそれほど大きくありません。セグメンテーション "t"& "re"& "asure"は同じ結果になりますが、 "treas"& "ur"& "e"は影響を受け、 "e"は2 *(1 + 10 + 2 )=単独で24。この観察は、実際には全体の練習の精神です。「宝」の誤ったスコアの例(最も良いセグメンテーションのスコア(最も低いスコアのスコア)から派生していないため、正しくありません):
treasure = treas ur e
3*2 [tas] + 2*(2+5) [rr] + 1*5 [u] + 2*[2+10] = 49
入力
どちらの場合もラテン文字のみを含む単一の文字列(「horse」、「Horse」、および「hOrSe」はすべて有効な入力です)。STDIN、コマンドライン引数、関数引数、または言語が選択は前述のいずれもサポートしません。
出力
0より大きい単一の正の整数である単語のスコア、またはセグメンテーションが存在しない場合は「悪」のいずれかを出力する必要があります。選択した言語がこれらのどちらもサポートしていない場合を除き、出力はSTDOUTまたは関数の戻り引数にする必要があります。その場合、スポーツマン的に動作します。
例
私はあなたがこのすべてのものを印刷することを期待していません、私が欲しいのは単語のスコア、または出力「悪」、たとえば(入力の後に出力)だけです
eye
7
Eel
evil
a
1
Establishments
595
antidisestablishmentarianism
8557
私はパフォーマンスに関心はありません。賢明な(意図的に曖昧に残された)マシンで1分以内に(大文字を置き換えた後)約15文字の単語をスコア付けできれば、それで十分です。
これはコードゴルフです、最短のコードが勝つかもしれません。
この課題を解決してくれたPeterTaylor、MartinBüttner、SP3000に感謝