Menemukan Nilai Kata-Kata!

13

pengantar

Di tanah [Masukkan nama keren di sini], orang tidak membeli barang dengan uang, karena semua orang memiliki alergi parah terhadap kertas. Mereka saling membayar dengan kata-kata! Tapi bagaimana itu? Ya, mereka memberikan nilai angka setiap huruf:

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

(Dengan beberapa aturan khusus lainnya yang akan dijelaskan nanti)

Dalam tantangan ini, tugas Anda adalah menghitung nilai kalimat.

Tantangan

Anda akan mengambil input yang akan menjadi kalimat. Anda dapat menganggap input tidak memiliki baris baru atau spasi tambahan. Tantangannya adalah untuk menghitung nilai kalimat, menggunakan aturan-aturan ini:

a=1,b=2,c=3,etc.  
  • Huruf kapital bernilai 1,5 kali sesuai dengan huruf kecil

H=h*1.5

Jadi, kata itu

cab

Akan bernilai c+a+b = 3+1+2 = 6

Tetapi kata Cabdengan huruf c akan bernilai. (c*1.5)+a+b = 4.5+1+2 = 7.5 Jadi jika input program Anda adalah "Cab", program Anda akan menghasilkan 7.5

  • Semua karakter bukan alfabet bernilai 1.

Ini kode golf, jadi jawaban tersingkat dalam byte menang. Semoga berhasil!

Nico A
sumber
4
Tunggu, uang itu kertas ?? Saya selalu berpikir itu adalah cakram logam mengkilap atau semacam sihir yang dipanggil dengan menggesekkan kartu suci.
Geobits
2
Bahkan uang kertas AS sebenarnya terbuat dari katun dan linen..tapi saya kira orang-orang dari [Masukkan nama keren di sini] belum memikirkan itu.
jcai
Apakah membuntuti nol diperbolehkan? Misalnya, mencetak 7.0bukan 7?
kirbyfan64sos
@ kirbyfan64sos Trailing 0s diizinkan.
Nico A
Bagaimana dengan ruang?
juniorRubyist

Jawaban:

13

Python 3, 71 65 61 byte

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

Dengan kebetulan yang luar biasa, (ord(s)-64)*1.5sama dengan ord(s)*1.5-96, jadi kita hanya perlu menulis -96sekali. Sisanya cukup lurus ke depan.

Sunting: Memotong beberapa byte menggunakan shenanigans eksponensial.

Tryth
sumber
5

Python 2, 120 102 byte

Edit:

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

Pengajuan pertama, tidak begitu golf tetapi kita harus mulai di suatu tempat.

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())
Baart
sumber
Selamat Datang di Programming Puzzles dan Code Golf! Posting ini berisi beberapa tips untuk kode golf di Python yang dapat membantu Anda meningkatkan skor Anda. Anda bisa mulai dengan mengurangi jumlah spasi.
Alex A.
Dalam pemahaman daftar kedua Anda, mengapa tidak mengganti (ord (l.lower ()) - 96) * 1.5 dengan 1.5 * ord (l) -96. Anda tahu bahwa saya di atas jadi hanya bekerja dengan itu dan gandakan untuk menghapus parens (64 * 1.5 = 96).
ruler501
Anda juga dapat menghapus ruang antara paren penutup dan for dalam pemahaman.
Alex A.
Jika saya tidak salah, Anda bisa membuatnya lebih pendek hanya dengan menjadikannya lambda esebagai parameter yang mengembalikan hasilnya.
Alex A.
Dalam "pemahaman" satu?
Baart
5

Pyth, 23 20 byte

sm|*hxGrdZ|}dG1.5 1z

Demo langsung dan uji kasus.

Penjelasan

 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

Cukup banyak penggunaan kreatif nilai boolean sebagai bilangan bulat di sini.

Versi 23 byte:

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

Demo langsung dan uji kasus.

kirbyfan64sos
sumber
Ini menghasilkan hal yang salah untuk .(semua karakter non-alfabet harus bernilai 1.)
Lynn
1
@Mauris Diperbaiki !!
kirbyfan64sos
4

Julia, 63 byte

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

Ini hanya menjumlahkan array yang dibangun melalui pemahaman yang melompati karakter dalam string input dan melakukan aritmatika pada codepoint mereka.

Tidak Disatukan:

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

Terima kasih kepada Glen O untuk memperbaiki pendekatannya.

Alex A.
sumber
2

Terjebak , 85 43 Bytes

Yeah yeah, saya tahu, Python lebih pendek ..: P Saya menggunakan logika yang sama dengan Tryth sekarang, untuk sebagian besar.

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

Penjelasan:

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
Kade
sumber
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
Alex Blundell
sumber
1

CJam, 30 byte

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

Cara kerjanya (wow, saya tidak pernah membuat ini!):

   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
Lynn
sumber
1

F #, 168 byte

Belum benar-benar bermain golf, tapi awal:

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

Di sini versi yang lebih mudah dibaca:

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
oopbase
sumber
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

Bagaimana itu bekerja:

.Q`a`A menghasilkan dua daftar huruf kecil dan besar

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

!:1+til 26memetakan setiap huruf dalam setiap daftar dari 1 hingga 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

Lipat gandakan daftar pertama dengan 1, terakhir dengan 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 menjadi satu kamus menggunakan ,/

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

Petakan karakter dalam string input ke skor yang relevan

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

Isi semua nilai nol dengan 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

Jumlah

k)+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
349f
tmartin
sumber
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);

panggil file js dengan simpul (node ​​index.js "Cab")

Marcel
sumber
1

MATLAB, 68 byte

Ini mengambil keuntungan dari fakta bahwa karakter secara otomatis dilemparkan ke bilangan bulat, dan bahwa nilai boolean dapat dijumlahkan sebagai bilangan bulat.

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

Perl 5, 77 byte

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

Diuji pada v5.20.2.

msh210
sumber
1

Javascript (ES6), 85 82 80 67 byte

Saya suka tantangan cepat & mudah seperti ini. :)

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

Ini bekerja dengan menafsirkan masing-masing karakter sebagai nomor basis-36, mengalikannya dengan 1 atau 1,5 jika lebih besar dari 9 ( a-zatau A-Z), dan memberikan 1 sebagai gantinya jika tidak. Seperti biasa, saran diterima!

Produksi ETH
sumber
1
0 di charCodeAt diperlukan
Downgoat
@ Vihan Tidak tahu itu; terima kasih atas tipnya!
ETHproduksi
mengapa tidak menggunakantoString(36)
l4m2
@ l4m2 Saya tidak yakin bagaimana .toString(36)berlaku di sini. Apakah maksud Anda sesuatu seperti itu parseInt(c,36)? Sebenarnya, itu mungkin lebih pendek ...
ETHproduk
Anda dapat menyimpan beberapa byte dengan menjadi rekursif dan menggunakan 2/3 ketika parseInt mengembalikan NaN: ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
Rick Hitchcock
0

Python 3: 86 85 Bytes

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)
Daniel Wakefield
sumber
0

C # 81 Bytes

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

Panggilan dengan (LinqPad):

a("Hello World").Dump();
Stephan Schinkel
sumber
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;

Contoh penggunaan:

$ 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

Tidak ada yang istimewa dalam algoritma. Setiap karakter dari argumen program pertama ( $argv[1]) diperiksa terhadap Adan Zkemudian adan zdan dihitung sesuai.

aksioma
sumber
0

PowerShell, 108 Bytes

Kompetitif, saya agak terkejut. Tidak terlalu kumuh karena tidak memiliki operator Ternary yang kompak.

Kode:

$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

Dijelaskan:

$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
AdmBorkBork
sumber
0

C, 85 byte

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

The !!sebelum islowerdan isupperdiperlukan, karena nilai-nilai boolean dikembalikan oleh fungsi-fungsi ini tidak dijamin akan 0dan 1, nilai sebenarnya adalah 1024pada sistem saya memang!

pawel.boczarski
sumber
0

Candy , 26 22 byte

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

Terima kasih kepada @Tryth untuk trik faktorisasi!

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

Invokation dengan bendera -I, seperti pada candy -I "Cab" -e $prg

Kode dalam bentuk panjangnya adalah:

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
Dale Johnson
sumber
0

Prolog (SWI), 101 byte

Kode:

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

Dijelaskan:

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

Contoh:

p(`Cab`).
7.5
Emigna
sumber
0

PHP, 75 byte

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

Jalankan sebagai pipa dengan -nratau coba online .

Titus
sumber