スクラブルスコアラー


42

チャレンジ:

大文字または小文字の文字列を入力として(オプション)、英語のスクラブルのゲームで文字列が取得するスコアを計算します。

ルール:

各文字のスコアは次のとおりです(他のバージョンのゲームがある場合でもこれを使用します)。

1 point: E, A, I, O, N, R, T, L, S, U
2 points: D, G
3 points: B, C, M, P
4 points: F, H, V, W, Y
5 points: K
8 points: J, X
10 points: Q, Z

文字列のスコアは、使用される各文字のスコアの合計です。利用可能なタイルがたくさんあると仮定することができるので、長い単語、および同じ文字の多くを含む単語は有効な入力です。

テストケース:

ABC       ->    7
PPCG      ->   11
STEWIE    ->    9
UGPYKXQ   ->   33
FIZZBUZZ  ->   49
ABCDEFGHIJKLMNOPQRSTUVWXYZ  -> 87

各言語の最短回答が勝ちます!入力および出力形式は柔軟であるため、必要に応じて入力を文字の配列(大文字または小文字)として使用できます。


6
私は、MATLAB / Octaveソリューションを見たいと思っています。私の試みはすべてひどく長かった... = /
Stewie Griffin

4
Beatnikのソリューションを期待しています。Cuz、あなたは知っている、それは仕事に適切なツールだろう。
ジュゼッペ

@StewieGriffin 85バイトは恐ろしく長いとカウントされますか?
ルイスメンドー

3
Mathematicaは組み込みではありませんか?
sergiol

1
@manassehkatz絶対にやってみてください!メインサイトに投稿する前に、Sandboxにチャレンジを投稿してフィードバックを得て支援することを強くお勧めします。複雑な課題は、フィードバックなしで正しく処理することが難しいことで有名です。
スチューウィーグリフィン

回答:



10

Haskell86 84バイト

f s=length s+sum[n|x<-s,(n,y)<-zip(9:7:[1..])$words"QZ JX DG BCMP FHVWY K",x`elem`y]

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

説明

ほとんどの文字は1のスコアを与えるため、これらを追跡する必要はなく、代わりに各スコアをデクリメントするだけです(1バイトを保存します 10もします)、結果のスコアに文字列の長さを追加します。

-2バイトの@nimiに感謝します(単語の並べ[1..]替えとの代わりに使用[4,3..])!


1
zip[1..]$words"DG BCMP FHVWY K . . JX . QZ"同じ長さの別の選択肢を与える
-Angs

10

オクターブ、50バイト

@(t)'				'/3*sum(65:90==t')'

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

勝負を受けて立つ。説明:

@(t)             % Define anonymous function taking a single argument t.
    ' ... '/3    % Row vector with letter scores. Corresponds to char([1 3 3 2 ...]*3). 
                 % The factor 3 was necessary to avoid a newline.

*                % Dot product (yes, * is dot product, .* is not. Go figure). Equivalent to sum of element-wise products.
     65:90       % Alphabet
          ==t'   % Broadcast equality with input string.
 sum(         )  % Sum this matrix. Gives the count of each letter in the alphabet
               ' % Transpose into column vector for dot product

非常に賢い!印刷できないものを使用するのはいい感じでした!:)
スチューイーグリフィン

@StewieGriffinそれは比較して1バイトだけです-47が、それはあなたのためのコードゴルフです!
-Sanchises

1
はぁ。まあ、本当にゴルフアウト。==Octaveでそのように使用できるとは思いませんでした。MATLABでは機能しません。知っておくといい。
トムカーペンター

2
@TomCarpenter傷の中の塩をこするつもりはありませんが、これを行う「古い」方法は(でbsxfun)61バイトで短くなります:オンラインで試してみてください!
-Sanchises

3
WAT 50バイトさえも
ルイスメンドー

9

ビートニック、733バイト

本当にやらなければならなかったので、ここにあります。デバッグするのは非常に面倒で、いくつかの課題がありました。

入力は大文字のみにする必要があります。出力は単項です(大丈夫ですか?)

J K ZZZZZZK Z ZD ZB ZZZZZZZZZZZZZZZZZA K A Z ZD ZB ZZZZZZZZZZZZZZZKF K A Z ZD ZB ZZZZZZZZZZZZZZZB K A Z ZD ZB ZZZZZZZZZZZZZZZ K A Z ZD ZB ZZZZZZZZZZZZZZKD K A Z ZD ZB ZZZZZZZZZZZZZD K A Z ZD ZB ZZZZZZZZZZZZZD K A Z ZD ZB ZZZZZZZZZZZZ K A Z ZD ZB ZZZZZZZZZZZZB K A Z ZD ZB ZZZZZZZZZKA K A Z ZD ZB ZZZZZZZZZKF K A Z ZD ZB ZZZZZZZZZZK K A Z ZD ZB ZZZZZZZZZB K A Z ZD ZB ZZZZZZZZZB K A Z ZD ZB ZZZZZZZZKD K A Z ZD ZB ZZZZZZZK K A Z ZD ZB ZZZZKB K A Z ZD ZB ZZZZZZKF K A Z ZD ZB ZZZZZZB K A Z ZD ZB ZZZZZFB K A Z ZD ZB ZZZZZA K A Z ZD ZB ZZZAK K A Z ZD ZB ZZZ K A Z ZD ZB ZD K A Z ZD ZB ZKB K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K ZZZZKF KF K A ZKA ZZZZZZZZZZZZZZZZZZY

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

一般的なプロセスは次のとおりです。

  • 入力から文字を取得する
  • 65を引く
  • 結果が0かどうかを確認します
    • 0の場合、指定された量の単語をジャンプします。
    • それ以外の場合は、1を減算してチェックを繰り返します。
  • ジャンプターゲットはプッシュプリント操作であり、プログラムの先頭にループバックします。

エラーで終了します。

より完全な説明:

J K ZZZZZZK Z ZD               # Get input and subtract 65
ZB ZZZZZZZZZZZZZZZZZA K A Z ZD # Character A - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZZZZKF K A Z ZD  # Character B - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZZZZB K A Z ZD   # Character C - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZZZZ K A Z ZD    # Character D - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZZZKD K A Z ZD   # Character E - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZZD K A Z ZD     # Character F - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZZD K A Z ZD     # Character G - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZ K A Z ZD       # Character H - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZZZB K A Z ZD      # Character I - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZKA K A Z ZD        # Character J - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZKF K A Z ZD        # Character K - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZZK K A Z ZD        # Character L - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZB K A Z ZD         # Character M - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZZB K A Z ZD         # Character N - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZZKD K A Z ZD         # Character O - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZZK K A Z ZD           # Character P - if 0 jump to print, otherwise subtract 1
ZB ZZZZKB K A Z ZD             # Character Q - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZKF K A Z ZD           # Character R - if 0 jump to print, otherwise subtract 1
ZB ZZZZZZB K A Z ZD            # Character S - if 0 jump to print, otherwise subtract 1
ZB ZZZZZFB K A Z ZD            # Character T - if 0 jump to print, otherwise subtract 1
ZB ZZZZZA K A Z ZD             # Character U - if 0 jump to print, otherwise subtract 1
ZB ZZZAK K A Z ZD              # Character V - if 0 jump to print, otherwise subtract 1
ZB ZZZ K A Z ZD                # Character W - if 0 jump to print, otherwise subtract 1
ZB ZD K A Z ZD                 # Character X - if 0 jump to print, otherwise subtract 1
ZB ZKB                         # Character Y - if 0 jump to print, otherwise subtract 1
K ZZZZKF KF                    # Jump Point for print 1111111111
K ZZZZKF KF                    #
K ZZZZKF KF                    # Jump Point for print 11111111
K ZZZZKF KF                    #
K ZZZZKF KF                    #
K ZZZZKF KF                    # Jump Point for print 11111
K ZZZZKF KF                    # Jump Point for print 1111
K ZZZZKF KF                    # Jump Point for print 111
K ZZZZKF KF                    # Jump Point for print 11
K ZZZZKF KF                    # Jump Point for print 1
K A ZKA ZZZZZZZZZZZZZZZZZZAAAA # Jump back to start


@ jimmy23013非常に素晴らしい、あなたはそれを投稿すべきです。
MickyT

8

脳フラック210、204、198、184、170のバイト

({<([{}]<>(({}{}))(([][][][][])<((([]())<([][])>))((((()))))>)[](((()()())<((()))>)((())()()()()))((())()()())((()())()())[]((((())())()))(())){({}<{}>())}>{}{}<{{}}><>})

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

14バイトを節約してくれた@JoKingに感謝します!

読み取り可能なバージョン:

({              # For each character

                # Push array of letter scores
                # Also adjust character to 1-indexing
        <([{}]<>
        (({}{}))    # Push 2 0s
        (([][][][][])   # 10
        <((([]())   # 4
        <([][])>    # 8
        ))      # 4,4
        ((((()))))> # 1,1,1,1
        )       # 10
        []      # Add 12 to difference
        (((()()())  # 3
        <((()))>    # 1,1
        )       # 3
        ((())()()()())) # 1, 5
        ((())()()())    # 1, 4
        ((()())()())    # 2, 4
        []      # Add 22 to difference
        ((((())())()))  # 1,2,3
        (())        # 1
        )   # Push 65-char

        {({}<{}>())} # Index character into score array
        >
        {}{}         # Add score to running total
        <{{}}><>     # Clear the stack

})               # Implicit print of total score


2
「読み取り可能」の定義について:)
マットレーシー

説明を明確にするために編集を行いました。問題が見つかった場合は、気軽にロールバックしてください。
カミルドラカリ

7

Pyth、40バイト

sm+2x.e}dbc." zØÍ jÙ¹>;%OG5§"\ 1

ここで試してみてください

説明

sm+2x.e}dbc." zØÍ jÙ¹>;%OG5§"\ 1
 m                              Q  For each character in the (implicit) input...
    x.e  b                     1   ... find the first index in...
          c." zØÍ jÙ¹>;%OG5§"\     ['dg','bcmp','fhvwy','k','','','jx','','qz']
       }d                          ... containing the character...
  +2                               ... 2-indexed.
s                                  Take the sum.



6

Java 8、75 71 70バイト

s->s.chars().map(c->"\n\n".charAt(c-65)).sum()

-1バイト"02210313074020029000033739".charAt(c-65)-47(印刷できないもの(および2つ\n)に変更して、-47削除できるようにします)。@SanchisesのOctave answerに触発されました

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

s->          // Method with String parameter and integer return-type
  s.chars()  //  Loop over the characters as IntStream
   .map(c->"\n\n".charAt(c-65))
             //   Convert the character to its value
   .sum()    //   And sum it all together


5

ゼリー、19 バイト

Oị“ÆẠḃbṂƬɠF#ṁ²’ḃ⁵¤S

整数を返す大文字のリストを受け入れる単項リンク

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

Oị“ÆẠḃbṂƬɠF#ṁ²’ḃ⁵¤S - Link: list of characters
O                   - ordinals ('A'->65, B->66...)
                 ¤  - nilad followed by link(s) as a nilad:
  “ÆẠḃbṂƬɠF#ṁ²’     -   literal 14011114485013321424185131
                ⁵   -   literal 10
               ḃ    -   bijective-base = [1,3,10,1,1,1,1,4,4,8,4,10,1,3,3,2,1,4,2,4,1,8,5,1,3,1]
 ị                  - index into (1-based & modular) (vectorises)
                    -  i.e. mapping from: O P  Q R S T U V W X Y  Z A B C D E F G H I J K L M N)
                  S - sum

5

R90 63バイト

function(W,u=utf8ToInt)sum(u('

')[u(W)-64])

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

入力を大文字の文字列として受け取ります。Rは問題なく印刷不能文字列と複数行の文字列を処理するので、それは素晴らしいことです。これで外部パッケージのほぼ2倍になりました!

また、CRANには非常に多くのランダムな利点があるためです。

R + ScrabbleScore 31バイト

ScrabbleScore::sws(scan(,""),F)

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

悲しいことに、swsデフォルトで有効性をチェックします。


スコアリストでプレイし、カップル
MickyT

@mickyTいいね!私はutf8ToInt代わりに印刷不可能なものと再利用して遊んでmatch、いくつかのダウンをなんとかすることができました!
ジュゼッペ

4

絵文字コード、358バイト

🐖🔥➡️🔡🍇🍮s 0🔂l🍡🐕🍇🍮s➕s🍺🐽🍯🔤a🔤1🔤e🔤1🔤i🔤1🔤l🔤1🔤n🔤1🔤o🔤1🔤r🔤1🔤s🔤1🔤t🔤1🔤u🔤1🔤d🔤2🔤g🔤2🔤b🔤3🔤c🔤3🔤m🔤3🔤p🔤3🔤f🔤4🔤h🔤4🔤v🔤4🔤w🔤4🔤y🔤4🔤k🔤5🔤j🔤8🔤x🔤8🔤q🔤10🔤z🔤10🍆🔡l🍉🍎🔡s 10🍉

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

説明:

変数名を1文字からより意味のある単語に変更し、言語に不慣れな人でも読みやすいようにコードの一部を拡張しました。ここで拡張プログラムをテストできます

🐋🔡🍇      👴 define a class that takes a string
 🐖🔥➡️🔡🍇    👴 define a method that returns a string
  🍦values🍯    👴 create int dictionary
   🔤a🔤1 🔤e🔤1 🔤i🔤1 🔤l🔤1 🔤n🔤1 🔤o🔤1 🔤r🔤1 🔤s🔤1 🔤t🔤1 🔤u🔤1 🔤d🔤2 🔤g🔤2
   🔤b🔤3 🔤c🔤3 🔤m🔤3 🔤p🔤3 🔤f🔤4 🔤h🔤4 🔤v🔤4 🔤w🔤4 🔤y🔤4 🔤k🔤5 🔤j🔤8 🔤x🔤8
   🔤q🔤10 🔤z🔤10
  🍆        👴 ^ dictionary contains letters(keys) and their numerical values

  🍮score 0                         👴 declare 'score' variable and set to 0
   🍦iterator🍡🐕                     👴 transform input string to iterator
    🔂letter iterator🍇                👴 iterate over each byte in input string
     🍮score➕score 🍺🐽values 🔡letter   👴 add value of each letter to score
   🍉
  🍎🔡score 10    👴 return the score as a string
 🍉
🍉

🏁🍇          👴 begin the program here
 😀🔥🔤abc🔤    👴 call scoring method and print the score
 😀🔥🔤ppcg🔤    👴 repeat with other test cases
 😀🔥🔤stewie🔤
 😀🔥🔤fizzbuzz🔤
 😀🔥🔤abcdefghijklmnopqrstuvwxyz🔤
🍉

7
痛い...私の目...特定の言語を隠すためのオプションがありますか?^^
オリビエデュラック

1
@OlivierDulacおそらく、ブラウザーが絵文字を特別にレンダリングしないようにする方法があります。それらにはそれぞれ、標準のUnicode白黒文字が関連付けられています。
mbomb007


3

オクターブ、73バイト

@(x)sum('09977433333222211'(([~,y]=ismember(x,'QZJXKFHVWYBCMPDG'))+1)-47)

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

ismember入力ストリームの各文字をxルックアップ文字列のインデックスにマッピングするために使用します'QZJXKFHVWYBCMPDG'。見つからない要素は、インデックス0にマッピングされます(これには1ポイント文字が含まれます)。

次に、インデックスに1を追加して、0が有効な1インデックス参照になり、文字列を検索します'09977433333222211'。これは、最初の検索文字列よりも1つの要素です。数字は、元の文字列の各要素のポイント値からマイナス1を表し、余分な要素はで「0」beginningです。

最後に、結果の文字列が47'0'-1)を減算して整数に変換され、各文字のポイント値が得られ、すべてのポイント値が合計されます。


1
非常に賢い!:)
スチューイーグリフィン

3

C ++、95バイト

char*m="02210313074020029000033739";
int f(char*p){int n=0;while(*p)n+=m[*p++-65]-47;return n;}

オンラインで試す(TIOリンクではありません)

説明:

  • 宣言 m、各文字の値の配列、マイナス1。マイナス1はQとZのためです。2桁の数字を入れることができませんでした。
  • pnull 文字に達するまで文字列を反復処理し、数値のスコアを追加します(*p文字が得られる-65ため、配列に適切にインデックスを付けることができます)。以来mであるchar*ことはに変換しchar、我々のでマイナス480に戻し、それを持って来るので、しかし、追加1以来m1が少なく、各文字のスコアとして宣言されています。

私はここでは熱心なポスターではないので、これが正しくできたことを願っています。私は彼らnが値を出力するものとしてカウントを返すと信じており、関数を宣言することは問題ありません。


非常に素晴らしい!保存できる唯一のバイトは改行です:オンラインで試してみてください!
movatica



2

Japt、36バイト

£2+`dg
bcmp
fhvwy
k


jx

qzbøX
x

入力を小文字の文字列として受け取り、数値を返します。
簡単な説明:

£2+`dg
¬       // Split the input into chars,
 £      // then map over each char, returning
  2+`dg // 2 plus

qzbøX
    bøX // the char's index in
qz    // the hardcoded string split by newlines.
x       // And finally sum the whole thing.

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




2

Gforth、109バイト

: V s" 1332142418513113:11114484:" ; : C 0 NAME 0 DO DUP C@ 65 - V DROP + C@ 48 - ROT + SWAP 1+ LOOP DROP . ;

入力は大文字でなければなりません:
C PPCG 11 OK

読みやすい

\ String used as table with values for each letter in the alphabet
\ : follows 9 in the ASCII-table
: V
   s" 1332142418513113:11114484:"
;

: C
   0                   \ Initialize sum        ( sum               )
   NAME                \ Get the string        ( sum  c-addr count )
   0 DO                \ Start of loop         ( sum  c-addr       )
      DUP C@           \ Get letter            ( sum  c-addr char  )
      65 -             \ Calculate table index ( sum  c-addr index )
      V DROP + C@      \ Get table entry       ( sum  c-addr entry )
      48 -             \ Calculate entry value ( sum  c-addr value )
      ROT + SWAP       \ Update sum            ( sum' c-addr       )
      1+               \ Next character        ( sum' c-addr'      )
   LOOP
   DROP .              \ Drop c-addr and print result
;

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



2

Retina 0.8.2、41バイト

T`BCDGJKMPQXZF\HVWY`221174229793
.
$*..
.

オンラインでお試しください!リンクにはテストケースが含まれます。説明:Haskellの回答と同様に、重要な文字はスコアより1少ない値に変換され、後で文字が単項に変換されるときに1が追加されます。FHVWY最後に置くと、全員が3 + 1のスコアにマッピングされます。


2

C(gcc)、78 72バイト

i;f(char*s){for(i=0;*s;)i+="\n\n"[*s++-65];s=i;}

その文字列には実際には26文字があります。適切にレンダリングされたコードを確認し、ここで実行します

ガストロプナーのおかげで6バイトのゴルフをしてにます。

ゴルフされていないバージョン:

i; // declare a variable to store the score; it is implicitly of type int
f(char* s) { // function taking a string as argument and implicitly returning an int
    for(i = 0; // initialize the score to 0
        *s; ) // iterate over the string until we hit terminating NUL byte
        i += "\n\n"[*s++ - 65]; // this is a 26-char string containing the ASCII equivalent of each numeric scrabble value; 65 is ASCII code for 'A', mapping the alphabet onto the string
    s = i; // implicitly return the score
}

2

Excel、91バイト

{=LEN(A1)+SUM(0+("0"&MID("02210313074020029000033739",CODE(MID(A1,ROW(A:A),1)&"z")-64,1)))}

説明:

  • 入力はセル内にあります A1
  • 式は、Ctrl+ Shift+ を含む配列式として入力する必要がありますEnter。これにより、{ }両端に中括弧が追加されます。
  • MID(A1,ROW(A:A),1) 各文字を順番に引き出します(また、シート内の行と同じ数の値を返すため、多くの空の値も)
  • CODE(MID(~)&"z")各文字のASCII値を引き出します。&"z"追加zの最後にMID()あるため、結果CODE()は空の入力好きではありません。のASCII値zただし、はすべての大文字よりも大きいため、後で事実上無視されます。
  • MID("02210313074020029000033739",CODE(~)-64,1) 64文字ずつ調整されたASCII値に基づいてスコア文字列から文字を引き出して、文字が65-90ではなく1-26で実行されるようにします。
  • "0"&MID(~)MID()Excelでは空の文字列を使用した計算ができないため、結果の先頭にゼロが追加されます。
  • 0+("0"&MID(~)) これらすべての文字列を数値に変換します。
  • SUM(0+("0"&MID(~))) 現在は数字になっているすべての文字列を合計します。
  • LEN(A1)+SUM(~)入力の長さを合計に追加します。これは、スコア文字列(02210313074020029000033739)のすべての値が1つずつ調整され、すべて1桁の長さになるためです。

Googleスプレッドシートにも非常によく似たソリューションがありますが、97バイトであるためArrayFromula()、それよりも長いです{}(ただし、少なくとも処理できます0 + "" = 0)。

=Len(A1)+ArrayFormula(Sum(0+Mid("02210313074020029000033739",Code(Mid(A1,Row(A:A),1)&"z")-64,1)))

1
よくやった。私は26を使用したExcelソリューションを持っていSUBSTITUTE()ます。
ヴェルニッシュ

2

Wolfram言語(Mathematica)、74バイト

もちろん、Wolfram | Alphaはスクラブルスコアリングをサポートしています!これは匿名関数です。

Plus@@(First[WolframAlpha["Scrabble "<>##,"NumberData"]]&/@Characters[#])&

これはTIOでは機能しません。

実行するには、ここに移動、下にスクロールして[新しいノートブックの作成»]をクリックします。ノートブックで使用するコードはこのTIOプログラムに含まれているため、コピーできます。各関数呼び出しを独自のコードブロックに貼り付けます。1つのブロックで実行する回数が多すぎる場合、実行は完了しません。

ご了承ください WolframAlphaインターネットを使用してリクエストを送信する。PPCGにはそれを使用する他の回答がありますが、知っておくべきだと思いました。

このプログラムは以下の短い関数を使用しますが、それを呼び出します が、入力の個々の文字ごとにます(Wolfram | Alphaへの呼び出しを毎回送信します!)


これは、長さ15(スクラブルボードの幅)までの入力に対してのみ機能します。(49バイト)

First[WolframAlpha["Scrabble "<>#,"NumberData"]]&

上記と同じですが、入力が有効なスクラブル語であるかどうかとともに、結果をボックスに表示します。(45バイト)

First[WolframAlpha["Scrabble "<>#,"Result"]]&


2

K(oK)60 38バイト

解決:

+/1+.:'"02210313074020029000033739"65!

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

説明:

スコアにインデックスを付け、結果を合計します。

+/1+.:'"02210313074020029000033739"65! / the solution
                                   65! / input modulo 65 to get position in A-Z
       "02210313074020029000033739"    / index into the scores (1 point lower)
    .:'                                / value (.:) each (') to convert to ints
  1+                                   / increase by 1
+/                                     / sum up

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