Tìm giá trị của từ ngữ!


13

Giới thiệu

Ở vùng đất [Chèn tên mát mẻ ở đây], mọi người không mua đồ bằng tiền, vì mọi người đều bị dị ứng nặng với giấy. Họ trả tiền cho nhau bằng lời nói! Nhưng làm thế nào được? Vâng, họ cung cấp cho mỗi giá trị số chữ cái:

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

(Với một số quy tắc đặc biệt khác sẽ được mô tả sau)

Trong thử thách này, nhiệm vụ của bạn sẽ là tính toán giá trị của câu.

Thử thách

Bạn sẽ có một đầu vào sẽ là một câu. Bạn có thể cho rằng đầu vào không có dòng mới hoặc dấu cách. Thử thách sẽ là tính giá trị của câu, sử dụng các quy tắc sau:

a=1,b=2,c=3,etc.  
  • Một chữ cái viết hoa có giá trị gấp 1,5 lần chữ cái viết thường

H=h*1.5

Vì vậy, từ

cab

Sẽ có giá trị c+a+b = 3+1+2 = 6

Nhưng từ Cabcó vốn c sẽ có giá trị (c*1.5)+a+b = 4.5+1+2 = 7.5 Vì vậy, nếu đầu vào chương trình của bạn là "Cab", chương trình của bạn sẽ xuất 7.5

  • Tất cả các ký tự không chữ cái đều có giá trị 1.

Đây là mã golf, vì vậy câu trả lời ngắn nhất trong byte thắng. Chúc may mắn!


4
Đợi đã, tiền là giấy ?? Tôi luôn nghĩ rằng đó là đĩa kim loại sáng bóng hoặc một loại phép thuật nào đó được viện dẫn bằng cách quẹt thẻ thiêng liêng.
Geobits

2
Ngay cả tiền giấy của Hoa Kỳ cũng thực sự được làm từ cotton và vải lanh..nhưng tôi đoán người dân của [Chèn tên mát mẻ ở đây] chưa nghĩ đến điều đó.
jcai

Các số 0 có được phép không? Ví dụ, in 7.0thay vì 7?
kirbyfan64sos

@ kirbyfan64sos Trailing 0s được cho phép.
Nico A

Còn không gian thì sao?
juniorRubyist

Câu trả lời:


13

Python 3, 71 65 61 byte

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

Bởi một sự trùng hợp phi thường, (ord(s)-64)*1.5bằng ord(s)*1.5-96, vì vậy chúng tôi chỉ phải viết -96một lần. Phần còn lại là khá thẳng về phía trước.

Chỉnh sửa: Cạo sạch một số byte bằng cách sử dụng shenanigans lũy thừa.


5

Python 2, 120 102 byte

Biên tập:

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()])

Trình đầu tiên, không quá golf nhưng người ta phải bắt đầu từ đâu đó.

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())

Chào mừng bạn đến với Câu đố lập trình và Code Golf! Bài đăng này chứa một số mẹo để chơi golf mã trong Python có thể giúp bạn đạt điểm cao hơn. Bạn có thể bắt đầu bằng cách giảm số lượng khoảng trắng.
Alex A.

Trong danh sách thứ hai của bạn hiểu tại sao không thay thế (ord (l.lower ()) - 96) * 1.5 bằng 1.5 * ord (l) -96. Bạn biết rằng l là trên nên chỉ cần làm việc với nó và nhân ra để loại bỏ các parens (64 * 1.5 = 96).
ruler501

Bạn cũng có thể loại bỏ khoảng trắng giữa một paren đóng và fortrong phần hiểu.
Alex A.

Nếu tôi không nhầm, bạn có thể làm điều này thậm chí ngắn hơn bằng cách đơn giản biến nó thành lambda với etham số trả về kết quả.
Alex A.

Trong "hiểu" một?
Baart

5

Bình thường, 23 20 byte

sm|*hxGrdZ|}dG1.5 1z

Bản demo và trường hợp thử nghiệm trực tiếp.

Giải trình

 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

Khá nhiều sử dụng sáng tạo các giá trị booleans như số nguyên ở đây.

Phiên bản 23 byte:

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

Bản demo và trường hợp thử nghiệm trực tiếp.


Điều này tạo ra điều sai cho .(tất cả các ký tự không phải là chữ cái nên có giá trị 1.)
Lynn

1
@Mauris Đã sửa !!
kirbyfan64sos

4

Julia, 63 byte

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

Điều này chỉ đơn giản là tổng hợp một mảng được xây dựng thông qua sự hiểu biết lặp lại các ký tự trong chuỗi đầu vào và thực hiện số học trên các điểm mã của chúng.

Ung dung:

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

Cảm ơn Glen O đã sửa chữa phương pháp này.


2

Bị kẹt , 85 43 byte

Vâng vâng, tôi biết, Python ngắn hơn ..: P Tôi đang sử dụng logic tương tự như Tryth bây giờ, đối với hầu hết các phần.

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

Giải trình:

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

2

Python 2, 101 byte

v=0
for x in raw_input():v+=(ord(x.lower())-96)*(1.5 if ord(x)<96 else 1)if x.isalpha()else 1
print v

1

CJam, 30 byte

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

Cách thức hoạt động (wow, tôi chưa bao giờ thực hiện một trong số này!):

   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 byte

Chưa thực sự chơi golf, nhưng một sự khởi đầu:

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

Đây là một phiên bản dễ đọc hơn:

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

Làm thế nào nó hoạt động:

.Q`a`A tạo hai danh sách chữ thường và chữ hoa

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

!:1+til 26ánh xạ từng chữ cái trong mỗi danh sách từ 1 đến 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

Nhân danh sách đầu tiên với 1, cuối cùng với 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

Raze vào một từ điển duy nhất bằng cách sử dụng ,/

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

Ánh xạ các ký tự trong chuỗi đầu vào tới các điểm có liên quan

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

Điền vào bất kỳ giá trị null nào bằng 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

Tổng

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

1

JavaScript, 121 byte

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);

gọi tệp js bằng nút (nút index.js "Cab")


1

MATLAB, 68 byte

Điều này lợi dụng thực tế là các ký tự được tự động chuyển thành số nguyên và các giá trị boolean có thể được tổng hợp dưới dạng số nguyên.

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 byte

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

Đã thử nghiệm trên v5.20.2.


1

Javascript (ES6), 85 82 80 67 byte

Tôi thích những thử thách nhanh chóng và dễ dàng như thế này. :)

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

Điều này hoạt động bằng cách giải thích mỗi char là một số cơ sở 36, nhân nó với 1 hoặc 1,5 nếu nó lớn hơn 9 ( a-zhoặc A-Z) và thay vào đó là 1 nếu không. Như mọi khi, đề nghị chào đón!


1
Số 0 trong charCodeAt là bot cần thiết
Downgoat

@vihan Không biết điều đó; cảm ơn vì tiền hỗ trợ!
Sản xuất ETH

tại sao không sử dụngtoString(36)
l4m2

@ l4m2 Tôi không chắc làm thế nào để .toString(36)áp dụng ở đây. Bạn có ý nghĩa gì đó như thế parseInt(c,36)nào? Trên thực tế, điều đó có thể ngắn hơn ...
Sản phẩm điện tử

Bạn có thể lưu một số byte bằng cách đệ quy và sử dụng 2/3 khi parseInt trả về NaN: ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
Rick Hitchcock

0

Python 3: 86 85 byte

t=0
for c in input():k=ord(c)-64;t+=k*1.5if 0<k<27else k-32if 32<k<59else 1
print(t)

0

C # 81 byte

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

Gọi với (LinqPad):

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

0

PHP, 102 byte

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;

Ví dụ sử dụng:

$ 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

Không có gì đặc biệt trong thuật toán. Mỗi nhân vật từ lập luận chương trình đầu tiên của ( $argv[1]) sẽ được kiểm tra chống lại AZsau đó azvà tính phù hợp.


0

PowerShell, 108 byte

Cạnh tranh khốc liệt, tôi hơi ngạc nhiên. Không quá tồi tàn vì không có một toán tử Ternary nhỏ gọn.

Mã số:

$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

Giải thích:

$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 byte

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

Các !!trước islowerisupperlà cần thiết, vì các giá trị boolean được trả về bởi các chức năng này không đảm bảo được 01, giá trị thực là 1024trên hệ thống của tôi thực sự!


0

Kẹo , 26 22 byte

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

Cảm ơn @Tryth về thủ thuật nhân tố!

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

Gọi là với cờ -I, như trong candy -I "Cab" -e $prg

Mã ở dạng dài là:

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

Prolog (SWI), 101 byte

Mã số:

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).

Giải thích:

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

Thí dụ:

p(`Cab`).
7.5

0

PHP, 75 byte

while(~$c=$argn[$i++])$r+=ctype_alpha($c)?ord($c)%32*(1+($c<a)/2):1;echo$r;

Chạy như ống với -nrhoặc thử trực tuyến .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.