ソローは投げたが、トロールはタフなトラフを投げる


19

これら9つの紛らわしいほど類似した単語のそれぞれに、任意の方法で1〜9の番号を割り当てます。

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

文字列を取り込むプログラムを作成します。入力がこれらの9つの単語のいずれかである場合、割り当てた番号を出力します。入力が上記の単語のいずれでもない場合、プログラムは何でもできます(エラーや永久ループを含む)。

単語は大文字と小文字を区別します。たとえばThoreau、1〜9の数字を生成するthoreau必要がありますが、必ずしも同じとは限りません。

次のように番号を割り当てるとします。

though   9
through  2
thorough 7
Thoreau  6
throw    3
threw    5
trough   4
tough    1
troll    8

ときにtough入力され、1出力する必要があります。
ときにthrough入力され、2出力する必要があります。
ときにthrow入力され、3出力する必要があります。
。。。
ときにthough入力され、9出力する必要があります。

他のすべての入力は何でもできます。

詳細

  • stdinまたはコマンドラインを介して入力文字列を取得し、stdoutに出力します。
  • 出力には、単一の末尾の改行が含まれる場合があります。
  • プログラムの代わりに、文字列を取り込んで通常どおり結果を出力する関数を作成するか、結果を返すことができます。
  • バイト単位の最短の提出が勝ちます。

1
くそ!Python文字列findメソッドを使用して見つからない場合にゼロを出力する賢い解決策がありました。その後、ルールが変更されました。賢いアイデアは今ではそれほど賢くない。
ロジックナイト

@CarpetPython本当に悪い。変更に満足できない場合は、ためらわずに投票してください。(私はすべての人にこれ以上の変更はないことを約束しますが。)
カルバンの趣味

それで大丈夫です。私の答えはまだ有効だと思います(私は少し冗長ですが)。
ロジックナイト

大文字と小文字に関係なく機能させることはできますか?
ASCIIThenANSI

2
@ASCIIThenANSIが9つのケースで機能する限り
Calvin's Hobbies

回答:


19

CJam、11 9 7バイト

q1b2+B%

使い方

ASCIIコード+ 11でモード化された2の合計が、関係する9つの単語に対して1から9、そして10の非常に良い順序を与えるという事実を利用しています。順序は次のとおりです。

through -> 1
thorough -> 2 
tough -> 3 
Thoreau -> 4 
throw -> 5 
threw -> 6 
trough -> 7 
though -> 8 
troll -> 9

コードの説明

q               e# Read the input
 1b             e# Sum the ASCII code values of all characters in this word
   2+           e# Increment the sum by 2
     B%         e# Mod by 11 and automatically print the mod result at the end

user23013のおかげで4バイト節約

こちらからオンラインでお試しください


どうやってやってみるの?(誰もがCJamを話すわけではありません、私たちの一部はlolcodeを話します)
-Behrooz

@Behroozリンクがあります。それをクリックして、入力セクションの実行に入力を入れます。どのように簡単になるかわからない:)
オプティマイザー

ホリーたわごと、私はそれを単語のリストを与える方法を考えていた。いいもの
-Behrooz

1
@ user23013くそー!毎回!
オプティマイザー

2
またはq1b2+B%
jimmy23013

18

Pyth、8文字

e%Cz8109

オンラインで試す:デモまたはテストスイート

私は割り当てを使用しています:

though   5
through  9
thorough 4
Thoreau  7
throw    3
threw    2
trough   8
tough    6
troll    1

説明:

   z       input()
  C        convert to int (convert each char to their ASCII value
           and interprete the result as number in base 256)
 %  8109   modulo 8109
e          modulo 10

ところで、このスクリプトを使用して、マジックナンバー8109を見つけましたfqr1 10Sme%CdT.z1


これには偽陽性はありませんか?
アレクサンダー・ブレット

5
@ alexander-brett正確にはどういう意味ですか?他のすべての入力の出力は、OPで指定されていません。必要なものを出力できます。
ジャクベ

申し訳ありませんが、私はOPの編集を見逃しました。P:それは残念だ
アレクサンダー・ブレット

11

Python 2、92 54バイト

print'K{7j)yE<}'.find(chr(hash(raw_input())%95+32))+1

インデックス文字列は for word in words: print chr(hash(word)%95+32),ます。Jakubeの答えで指摘したように、ハッシュ関数はPythonのバージョンに応じて異なる結果をもたらします。このインデックス文字列は、64ビットPython 2.7.6で計算されます。

長い(92バイト)が、わかりにくい答え:

print'though through thorough Thoreau throw threw trough tough troll'.find(raw_input())/7+1

プログラムは1から9を返しますが、徹底的なThoreauスローにより、タフトロールをこの順序でスローします。入力が見つからない場合、findは-1を返しますが、これはの後に便利にゼロになり+1ます。


0ものはもはや必要ないことに注意してください。変更して申し訳ありません。
カルバンの趣味

努力に気づいてくれてありがとう。それは少しの間...のための良い解決策だった
ロジック騎士

3
@CarpetPythonフロア分割の素晴らしい使用-それは驚くほどきれいに動作します。
xnor

7

Python 2.7.9 32ビットバージョン、22バイト

lambda x:hash(x)%78%10

ここで、バージョンは本当に重要です。Pythonの64ビットバージョンを使用している場合は、異なる結果が得られます。以来hashこの方法は、代わりに32ビットの64ビットのハッシュ値を計算します。

割り当ては次のとおりです。

though  => 5   through => 6   thorough => 8
Thoreau => 7   throw   => 3   threw    => 1
trough  => 9   tough   => 4   troll    => 2

オンラインで試す:http : //ideone.com/Rqp9J8


2
わあ、これまでずっと、言語バージョンとオペレーティングシステムビットを繰り返していたのですか?:P
オプティマイザー

1
とてもいい答えです。数学、自動反復、またはいくつかの推測を通じて定数78を見つけましたか?
ロジックナイト

3
@CarpetPythonすべての可能なモジュールを通過する単純な総当たりループ。一度sorted(...)==range(1,10)、私は停止しました。
寂部

5

Pyth、7バイト

et%Cz31

私は次の割り当てを使用しています:

though   8
through  3
thorough 1
Thoreau  5
throw    4
threw    7
trough   6
tough    2
troll    9

Cz入力を基数256の数値として解釈します。次に、このmod 31を取得し、1を減算し、結果mod 10を取得します。同等の擬似コード:

((base_256(input()) % 31) - 1) % 10

デモンストレーションテストハーネス


1

Python 2、27バイト

f=lambda w:int(w,34)%444/46

この割り当てでは:

>>> for w in "though through thorough Thoreau throw threw trough tough troll".split(): print f(w),w
...
9 though
7 through
3 thorough
8 Thoreau
2 throw
5 threw
6 trough
1 tough
4 troll

いくつかのバリエーションが可能です、例えば

f=lambda w:int(w,35)/159%10

1

Japt、6バイト

nH %BÉ

それを試してください | すべての単語をチェック


説明

base- nstringを整数に解析するとき、JavaScriptは、より大きい数字を検出すると解析を停止nし、その時点まで結果を返すという事実を利用します。ここでbase-32(数字0-v)を使用することによりw、「throw」と「throw」のsは本質的に無視されます。

nH      :Convert from base-32
   %B   :Modulo 11
     É  :Subtract 1

JavaScript、22バイト

直接翻訳-個別に投稿する価値はないようです。

f=
U=>parseInt(U,32)%11-1
o.innerText=["through","tough","troll","trough","though","throw","threw","thorough","Thoreau"].map(s=>f(s)+": "+s).join`\n`
<pre id=o><pre>



0

Java 8、53 25バイト

s->(s.chars().sum()+2)%11

または

s->-~-~s.chars().sum()%11

@OptimizerのCJam回答のポート。Javaでこれを(ほとんどの場合)短くすることはできないためです。

オンラインでお試しください。


Javaは持ってparseIntいますよね?私のソリューションのポートは短くなりませんか?
シャギー

@Shaggy Javaは確かにparseInt与えられたベースを持っていますが、残念ながら静的クラスの要件のために非常にバイト過剰です:Long.parseLong(...,32)最短バリアントとして。さらに、何らかの理由でJavaでも同様に)失敗するよう"throw""threw"です。wbase-32の範囲外であるようです(33を使用すると誤った結果が得られます)。
ケビンCruijssen

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.