言葉の価値を見つける!


13

前書き

[ここにクールな名前を挿入]の土地では、誰もが紙に対して深刻なアレルギーを持っているため、お金で物を買うことはありません。彼らは言葉でお互いに支払います!しかし、それはどうですか?まあ、彼らはそれぞれの文字の数値を与えます:

a=1,b=2,c=3,etc. 

(後で説明する他の特別なルールを使用)

この課題では、あなたの仕事は文章の価値を計算することです。

チャレンジ

あなたは文になる入力を取ります。入力に改行や末尾のスペースがないと仮定できます。課題は、次のルールを使用して、文の価値を計算することです。

a=1,b=2,c=3,etc.  
  • 大文字は、対応する小文字の1.5倍の価値があります

H=h*1.5

だから、言葉

cab

価値があるだろう c+a+b = 3+1+2 = 6

しかし、Cab大文字のcを持つ単語は価値があり(c*1.5)+a+b = 4.5+1+2 = 7.5 ます。したがって、プログラム入力が「Cab」の場合、プログラムは7.5を出力します。

  • アルファベット以外の文字はすべて1の価値があります。

これはコードゴルフであるため、バイト単位の最短回答が優先されます。幸運を!


4
お金は紙ですか?? 私はいつも、それが光沢のある金属製のディスクか、聖なるカードをスワイプすることによって引き起こされるある種の魔法だと思っていました。
ジオビット

2
米国の紙幣でさえ実際には綿とリネンでできています。
jcai

末尾のゼロは許可されますか?例えば、7.0代わりに印刷し7ますか?
kirbyfan64sos

@ kirbyfan64sos末尾の0は許可されます。
ニコA

スペースはどうですか?
juniorRubyist

回答:


13

Python 3、71 65 61バイト

lambda z:sum((ord(s)*1.5**(s<'_')-96)**s.isalpha()for s in z)

異常な偶然により、(ord(s)-64)*1.5はに等しいord(s)*1.5-96ので、-96一度書くだけです。残りは非常に簡単です。

編集:べき乗シェナンガンを使用していくつかのバイトを削った。


5

パイソン2、120の 102バイト

編集:

e=raw_input()
print sum([ord(l)-96for l in e if not l.isupper()]+[1.5*ord(l)-96for l in e if l.isupper()])

最初の提出は、それほどゴルフではありませんが、どこかから始めなければなりません。

def s2(p):
 c=0
 for l in p:
  if l.isupper():
   c+=(ord(l.lower())-96)*1.5
  else:
   c+=ord(l)-96
 return c
print s(raw_input())

プログラミングパズルとコードゴルフへようこそ!この投稿には、スコアを改善するのに役立つPythonでのコードゴルフのヒントが含まれています。空白の量を減らすことから始めることができます。
アレックスA.

2番目のリスト内包表記では、(ord(l.lower())-96)* 1.5を1.5 * ord(l)-96に置き換えてはどうでしょうか。lは上限であることがわかっているので、それを使用して乗算し、parens(64 * 1.5 = 96)を削除します。
-ruler501

また、閉じ括弧とfor理解内のスペースを削除することもできます。
アレックスA.

間違っていなければe、結果を返すパラメーターとしてlambdaを使用するだけで、これをさらに短くすることができます。
アレックスA.

「理解」の1つでは?
バート

5

Pyth、23 20バイト

sm|*hxGrdZ|}dG1.5 1z

ライブデモとテストケース。

説明

 m                 z    For each input character
    hxGrdZ              Get the value of it's lowercase form, or 0 for non-alphabetic characters
   *      |}dG1.5       Multiply it by 1 if it's lowercase, 1.5 if uppercase
  |               1     If it's still zero, it's a non-alphabetic character, so use 1 as its value
s                       Sum of all the values

ここでは、ブール値を整数として創造的に使用します。

23バイトバージョン:

sm+*hxGJrdZ|}dG1.5!}JGz

ライブデモとテストケース。


この出力は、のために間違ったこと.(すべての非アルファベット文字は価値が1でなければなりません)
リン

1
@モーリス修正!!
kirbyfan64sos

4

ジュリア、63バイト

s->sum(c->isalpha(c)?(64<c<91?1.5:1)*(c-(64<c<91?'@':'`')):1,s)

これは、入力文字列の文字をループ処理し、そのコードポイントで算術演算を実行する内包表記で構築された配列を単純に合計します。

ゴルフをしていない:

function char_score(c::Char)
    (64 < c < 91 ? 1.5 : 1) * (c - (64 < c < 91 ? '@' : '`')) : 1
end

function sentence_value(s::String)
    sum(char_score, s)
end

アプローチを修正してくれたGlen Oに感謝します。


2

スタック85 43バイト

ええ、ええ、私はPythonのほうが短いことを知っています

s_"str.isalpha"fgl;l-|0Gc"_91<1.5;^*96-":++

説明:

s_                                            # Take input & duplicate
  "str.isalpha"fg                             # Filter for only alpha chars, save
                 l;l-|                        # Determine number of symbols in start string
                      0Gc                     # Get saved string, convert to char array
                         "_91<1.5;^*96-":     # Logic to find score for each letter
                                         ++   # Sum the list of nums, add to # of symbols


1

CJam、30バイト

q:i91,64fm1.5f*32,5f-+1fe>f=:+

これがどのように機能するか(ワオ、私はこれらのどれも作ったことがありません!):

   91,64fm1.5f*32,5f-+1fe>      Construct an array so that a[i] == score for chr(i)
q:i                             Read STDIN and convert to ASCII codes
                          f=    Index each from the array
                            :+  Sum the result

1

F#、168バイト

まだゴルフはまだしていませんが、スタート:

fun(w:string)->w|>Seq.map(fun c->if Char.IsLetter c then (if Char.IsUpper(c) then (float)(Math.Abs(64-(int)c))*1.5 else (float)(Math.Abs(96-(int)c))) else 1.0)|>Seq.sum

ここでより読みやすいバージョン:

let calc (w : string) =
    w
    |> Seq.map (fun c -> if Char.IsLetter c then (if Char.IsUpper(c) then (float)(Math.Abs(64 - (int)c)) * 1.5 else (float)(Math.Abs (96 - (int)c))) else 1.0)
    |> Seq.sum

1

K、30

+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)

k)+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
349f

使い方:

.Q`a`A 小文字と大文字の2つのリストを生成します

k).Q`a`A
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

!:1+til 26各リストの各文字を1〜26にマップします

k)(.Q`a`A)!\:1+!26
"abcdefghijklmnopqrstuvwxyz"!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

最初のリストに1を掛け、最後に1.5を掛ける

k)1 1.5*(.Q`a`A)!\:1+!26
"abcdefghijklmnopqrstuvwxyz"!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26f
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"!1.5 3 4.5 6 7.5 9 10.5 12 13.5 15 16.5 18 19.5 21 22.5 24 25.5 27 28.5 30 31.5 33 34.5 36 37.5 39

を使用して単一の辞書にレイズする ,/

k)(,/1 1.5*(.Q`a`A)!\:1+!26)
a| 1
b| 2
c| 3
d| 4
..

入力文字列の文字を関連するスコアにマップします

k)(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
24 18 15 7 18 1 13 13 9 14 7 0n 24 21 26 26 12 5 19 0n 0n 0n 4.5 15 4 5 0n 10.5 15 12 6

null値を1で埋めます

k)1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
24 18 15 7 18 1 13 13 9 14 7 1 24 21 26 26 12 5 19 1 1 1 4.5 15 4 5 1 10.5 15 12 6

k)+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
349f

1

JavaScript、121バイト

l=process.argv[2].split(""),r=0;for(k in l)c=l[k],o=c.toLowerCase(),r+=(o.charCodeAt(0)-96)*(o===c?1:1.5);console.log(r);

ノード(ノードindex.js "Cab")でjsファイルを呼び出す


1

MATLAB、68バイト

これは、文字が自動的に整数にキャストされ、ブール値を整数として合計できるという事実を利用しています。

sum([t(t>96&t<132)-96,(t(t>64&t<91)-64)*1.5,t<65|(t>90&t<97)|t>122])

1

Perl 5、77バイト

@_=split//,$ARGV[0];$i+=(ord)*(/[a-z]/||/[A-Z]/*1.5||96/ord)-96for@_;print$i

テスト済みv5.20.2


1

Javascript(ES6)、85 82 80 67バイト

このような迅速で簡単なチャレンジが大好きです。:)

t=>[...t].map(c=>u+=(v=parseInt(c,36)-9)>0?v*(c>'Z'||1.5):1,u=0)&&u

これは、各charを36進数として解釈し、9(a-zまたはA-Z)より大きい場合は1または1.5を乗算し、そうでない場合は代わりに1を与えることで機能します。いつものように、提案は大歓迎です!


1
charCodeAtの0はボットが必要です
-Downgoat

@vihanそれを知らなかった。先端をありがとう!
ETHproductions

使用しない理由toString(36)
l4m2

@ l4m2 .toString(36)ここでどのように適用されるかわかりません。次のようなものparseInt(c,36)ですか?実際、それはもっと短いかもしれません
...-ETHproductions

:あなたは、いくつかは、再帰的に行くとのparseIntは、NaNを返したときに2/3を使用してバイト保存することができます ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
リック・ヒッチコック


0

C#81バイト

decimal a(string i){return i.Sum(c=>c>64&&c<91?(c-64)*1.5m:c>96&&c<123?c-96:1m);}

(LinqPad)で呼び出します:

a("Hello World").Dump();

0

PHP、102バイト

foreach(str_split($argv[1])as$c){$v=ord($c)-64;$s+=A<=$c&&$c<=Z?1.5*$v:(a<=$c&&$c<=z?$v-32:1);}echo$s;

使用例:

$ php -d error_reporting=0 value.php cab
6
$ php -d error_reporting=0 value.php Cab
7.5
$ php -d error_reporting=0 value.php 'Programming Puzzles & Code Golf'
349

アルゴリズムに特別なものはありません。最初のプログラムの引数($argv[1])の各文字がチェックされAZそれaからzandがカウントされます。


0

PowerShell、108バイト

かなり競争が激しいので、ちょっと驚きました。コンパクトなTernary演算子を持たないことで、それほど粗末ではありません。

コード:

$a=[char[]]$args[0];$a|%{$b=$_-64;If($b-in(1..26)){$c+=$b*1.5}ElseIf($b-in(33..58)){$c+=$b-32}Else{$c++}};$c

説明:

$a=[char[]]$args[0]                # Take command-line input, cast as char array
$a|%{                              # For each letter in the array
  $b=$_-64                         # Set $b as the int value of the letter (implicit casting), minus offset
  If($b-in(1..26)){$c+=$b*1.5}     # If it's a capital, multiply by 1.5.
                         # Note that $c implicitly starts at 0 the first time through
  ElseIf($b-in(33..58)){$c+=$b-32} # Not a capital
  Else{$c++}                       # Not a letter
  }
$c                                 # Print out the sum

0

C、85バイト

float f(char*s){return(*s-96)*!!islower(*s)+1.5*(*s-64)*!!isupper(*s)+(*++s?f(s):0);}

!!islowerとは、isupperこれらの関数によって返されたブール値があることが保証されていないため、必要な01真の値だった、1024確かに私のシステムで!


0

キャンディ26 22バイト

(〜 "a" <{A#64-2 / 3 * | A#96-} h)Z

因数分解のトリックをありがとう@Tryth!

(~"a"<{A2/3*|A}#96-h)Z

呼び出しは、次のように-Iフラグを使用します。 candy -I "Cab" -e $prg

長い形式のコードは次のとおりです。

while     # loop while able to consume characters from stack
  peekA   # A gets stack to
  "a"
  less    # is pop() < "a"
  if
    pushA   # capitalized
    digit2
    div
    digit3
    mult
  else
    pushA   # lower case
  endif
  number
  digit9
  digit6
  sub
  popAddZ   # add pop() to counter register Z
endwhile
pushZ       # push Z onto stack as answer

0

プロローグ(SWI)、101バイト

コード:

X*Y:-X>64,X<91,Y is X*1.5-96;X>96,X<123,Y is X-96.
_*1.
p(L):-maplist(*,L,A),sumlist(A,B),write(B).

説明:

X*Y:-X>64,X<91,       % When X is upper case
     Y is X*1.5-96    %      Y is 1.5 times charvalue starting at 1
     ;X>96,X<123,     % OR when X is lower case
     Y is X-96.       %      Y is charvalue starting at 1
_*1.                  % ELSE Y is 1
p(L):-maplist(*,L,A), % Get list of charvalues for all chars in string
      sumlist(A,B),   % Take sum of list
      write(B).       % Print

例:

p(`Cab`).
7.5

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