Znalezienie wartości słów!

13

Wprowadzenie

W krainie [Wstaw fajne imię tutaj] ludzie nie kupują rzeczy za pieniądze, ponieważ każdy ma poważną alergię na papier. Płacą sobie nawzajem słowami! Ale jak to jest? Podają wartości liczbowe każdej litery:

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

(Z innymi specjalnymi zasadami, które zostaną opisane później)

W tym wyzwaniu Twoim zadaniem będzie obliczenie wartości zdań.

Wyzwanie

Weźmiesz wejście, które będzie zdanie. Możesz założyć, że na wejściu nie ma znaku nowej linii ani spacji końcowych. Wyzwaniem będzie obliczyć wartość zdania, stosując następujące reguły:

a=1,b=2,c=3,etc.  
  • Wielka litera jest warta 1,5 razy tyle, co odpowiadająca jej mała litera

H=h*1.5

Więc słowo

cab

Byłoby warte c+a+b = 3+1+2 = 6

Ale słowo Cabz wielką literą c byłoby warte (c*1.5)+a+b = 4.5+1+2 = 7.5 Więc jeśli twój program wejściowy to „Cab”, twój program wyświetli 7,5

  • Wszystkie znaki alfabetyczne są warte 1.

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach. Powodzenia!

Nico A.
źródło
4
Zaraz, pieniądze to papier? Zawsze myślałem, że to albo błyszczące metalowe dyski, albo jakaś magia przywołana przez przesunięcie świętej karty.
Geobits
2
Nawet amerykańskie banknoty są w rzeczywistości wykonane z bawełny i lnu ... ale sądzę, że ludzie z [Wpisz fajne imię tutaj] jeszcze o tym nie pomyśleli.
jcai
Czy dozwolone są końcowe zera? Np. Drukowanie 7.0zamiast 7?
kirbyfan64sos
@ kirbyfan64sos Końcowe 0 są dozwolone.
Nico A,
Co ze spacjami?
juniorRubyist

Odpowiedzi:

13

Python 3, 71 65 61 bajtów

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

Przez niezwykły zbieg okoliczności (ord(s)-64)*1.5jest równy ord(s)*1.5-96, więc musimy napisać -96tylko raz. Reszta jest całkiem prosta.

Edycja: Ogolono niektóre bajty za pomocą shenanigans potęgowania.

Tryth
źródło
5

Python 2, 120 102 bajtów

Edytować:

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

Pierwsze zgłoszenie, niezbyt golfowe, ale trzeba gdzieś zacząć.

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
źródło
Witamy w Programowaniu zagadek i Code Golf! Ten post zawiera wskazówki dotyczące gry w golfa w kodzie Python, które mogą pomóc Ci poprawić swój wynik. Możesz zacząć od zmniejszenia ilości białych znaków.
Alex A.,
W drugiej liście zrozumiesz, dlaczego nie zastąpić (ord (l.lower ()) - 96) * 1.5 na 1.5 * ord (l) -96. Wiesz, że l jest górne, więc po prostu pracuj z tym i pomnóż, aby usunąć pareny (64 * 1,5 = 96).
ruler501
Możesz także usunąć odstęp między zamykającym się miąższem i forw opisach .
Alex A.,
Jeśli się nie mylę, możesz uczynić to jeszcze krótszym, po prostu czyniąc go lambda z eparametrem, który zwraca wynik.
Alex A.,
W „zrozumieniu”?
Baart,
5

Pyth, 23 20 bajtów

sm|*hxGrdZ|}dG1.5 1z

Prezentacje na żywo i przypadki testowe.

Wyjaśnienie

 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

Sporo kreatywnych zastosowań wartości logicznych jako liczb całkowitych.

Wersja 23-bajtowa:

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

Prezentacje na żywo i przypadki testowe.

kirbyfan64sos
źródło
Powoduje to, że źle jest .(wszystkie znaki niealfabetyczne powinny być warte 1)
Lynn
1
@ Mauris Naprawiono !!
kirbyfan64sos
4

Julia, 63 bajty

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

To po prostu sumuje tablicę zbudowaną za pomocą zrozumienia, które zapętla znaki w ciągu wejściowym i wykonuje arytmetykę na ich punktach kodowych.

Nie golfowany:

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

Dzięki Glen O za naprawę podejścia.

Alex A.
źródło
2

Utknął , 85 43 bajtów

Tak, tak, wiem, Python jest krótszy ..: P Używam teraz tej samej logiki co Tryth.

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

Wyjaśnienie:

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
źródło
2

Python 2, 101 bajtów

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
źródło
1

CJam, 30 bajtów

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

Jak to działa (wow, nigdy nie stworzyłem żadnego z nich!):

   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
źródło
1

F #, 168 bajtów

Jeszcze nie grałem w golfa, ale początek:

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

Oto bardziej czytelna wersja:

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
źródło
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

Jak to działa:

.Q`a`A generuje dwie listy małych i wielkich liter

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

!:1+til 26mapuje każdą literę na każdej liście od 1 do 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

Pomnóż pierwszą listę przez 1, ostatnią przez 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 w jednym słowniku za pomocą ,/

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

Odwzoruj znaki w ciągu wejściowym na odpowiednie wyniki

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

Wypełnij wszystkie wartości null wartością 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

Suma

k)+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
349f
tartin
źródło
1

JavaScript, 121 bajtów

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

wywołaj plik js z węzłem (node ​​index.js „Cab”)

Marcel
źródło
1

MATLAB, 68 bajtów

Wykorzystuje to fakt, że znaki są automatycznie rzutowane na liczby całkowite, a wartości boolowskie można sumować jako liczby całkowite.

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
źródło
1

Perl 5, 77 bajtów

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

Testowane na v5.20.2.

msh210
źródło
1

JavaScript (ES6), 85 82 80 67 bajtów

Uwielbiam takie szybkie i łatwe wyzwania. :)

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

Działa to poprzez interpretację każdego znaku jako liczby podstawowej 36, pomnożenie go przez 1 lub 1,5, jeśli jest większy niż 9 ( a-zlub A-Z), i podanie 1 zamiast tego, jeśli nie. Jak zawsze sugestie mile widziane!

ETHprodukcje
źródło
1
0 w charCodeAt jest konieczne bot
Downgoat
@vihan Nie wiedziałem o tym; dzięki za wskazówkę!
ETHprodukcje
dlaczego nie skorzystaćtoString(36)
l4m2
@ l4m2 Nie jestem pewien, jak się .toString(36)tutaj stosuje. Masz na myśli coś takiego parseInt(c,36)? To może być krótsze ...
ETHprodukcje
Możesz zaoszczędzić kilka bajtów, przechodząc rekurencyjnie i używając 2/3, gdy parsowanie zwraca NaN: ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
Rick Hitchcock
0

Python 3: 86 85 bajtów

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
źródło
0

C # 81 bajtów

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

Zadzwoń za pomocą (LinqPad):

a("Hello World").Dump();
Stephan Schinkel
źródło
0

PHP, 102 bajty

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;

Przykład użycia:

$ 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

Nic specjalnego w algorytmie. Każdy znak z argumentu pierwszego programu ( $argv[1]) jest sprawdzany względem, Aa Znastępnie ai zodpowiednio liczony.

aksjomat
źródło
0

PowerShell, 108 bajtów

Jestem przyzwoicie konkurencyjny, jestem trochę zaskoczony. Niezbyt obskurny, bo nie ma kompaktowego operatora trójskładnikowego.

Kod:

$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

Wyjaśniono:

$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
źródło
0

C, 85 bajtów

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

!!Przed isloweri isuppersą konieczne, ponieważ wartości logiczne zwracane przez te funkcje nie są gwarancją 0i 1prawdziwa wartość była 1024w moim systemie rzeczywiście!

pawel.boczarski
źródło
0

Cukierki , 26 22 bajtów

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

Dzięki @Tryth za sztuczkę faktoryzacji!

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

Wywołanie ma flagę -I, jak w candy -I "Cab" -e $prg

Kod w swojej długiej formie to:

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
źródło
0

Prolog (SWI), 101 bajtów

Kod:

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

Wyjaśniono:

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

Przykład:

p(`Cab`).
7.5
Emigna
źródło
0

PHP, 75 bajtów

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

Uruchom jako potok z -nrlub spróbuj online .

Tytus
źródło