Encontrando o valor das palavras!


13

Introdução

Na terra de [Insira um nome legal aqui], as pessoas não compram coisas com dinheiro, porque todo mundo tem uma alergia grave ao papel. Eles pagam um ao outro com palavras! Mas como é isso? Bem, eles fornecem valores de número de cada letra:

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

(Com algumas outras regras especiais que serão descritas mais adiante)

Neste desafio, sua tarefa será calcular o valor das sentenças.

Desafio

Você receberá uma entrada que será uma sentença. Você pode assumir que a entrada não possui novas linhas ou espaços à direita. O desafio será calcular o valor da sentença, usando estas regras:

a=1,b=2,c=3,etc.  
  • Uma letra maiúscula vale 1,5 vezes a letra minúscula correspondente

H=h*1.5

Então a palavra

cab

Valeria a pena c+a+b = 3+1+2 = 6

Mas a palavra Cabcom letra maiúscula c valeria a pena. (c*1.5)+a+b = 4.5+1+2 = 7.5 Portanto, se a entrada do programa for "Cab", o programa produzirá 7,5

  • Todos os caracteres não alfabéticos valem 1.

Isso é código de golfe, então a resposta mais curta em bytes vence. Boa sorte!


4
Espere, dinheiro é papel? Eu sempre pensei que eram discos de metal brilhante ou algum tipo de magia invocada ao passar o cartão sagrado.
Geobits

2
Até as notas dos EUA são realmente feitas de algodão e linho ... mas acho que as pessoas de [Inserir nome legal aqui] ainda não haviam pensado nisso.
jcai

Os zeros à direita são permitidos? Por exemplo, imprimir em 7.0vez de 7?
precisa saber é o seguinte

@ kirbyfan64sos 0s finais são permitidos.
Nico A

Respostas:


13

Python 3, 71 65 61 bytes

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

Por uma coincidência extraordinária, (ord(s)-64)*1.5é igual a ord(s)*1.5-96, então precisamos escrever apenas -96uma vez. O resto é bem direto.

Edit: Raspou alguns bytes usando travessuras de exponenciação.


5

Python 2, 120 102 bytes

Editar:

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

Primeira submissão, não tão divertida, mas é preciso começar em algum lugar.

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

Bem-vindo à Programação de Puzzles e Code Golf! Esta postagem contém algumas dicas para o código de golfe em Python que podem ajudá-lo a melhorar sua pontuação. Você pode começar diminuindo a quantidade de espaço em branco.
Alex A.

Em sua segunda lista de compreensão, por que não substituir (ord (l.lower ()) - 96) * 1,5 por 1,5 * ord (l) -96. Você sabe que l é superior, então trabalhe com isso e multiplique para remover os parênteses (64 * 1,5 = 96).
precisa saber é o seguinte

Você também pode remover o espaço entre um ponto final e foras compreensões.
Alex A.

Se não me engano, você pode torná-lo ainda mais curto, simplesmente tornando-o um lambda com eum parâmetro que retorna o resultado.
Alex A.

Na "compreensão"?
Baart

5

Pitão, 23 20 bytes

sm|*hxGrdZ|}dG1.5 1z

Demonstração ao vivo e casos de teste.

Explicação

 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

Alguns usos criativos de valores booleanos como números inteiros aqui.

Versão de 23 bytes:

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

Demonstração ao vivo e casos de teste.


Isso gera a coisa errada para .(todos os caracteres não alfabéticos devem valer 1).
Lynn

1
@Mauris Fixed !!
precisa saber é o seguinte

4

Julia, 63 bytes

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

Isso simplesmente soma uma matriz construída por meio de uma compreensão que faz um loop sobre os caracteres na sequência de entrada e executa aritmética em seus pontos de código.

Ungolfed:

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

Agradecimentos a Glen O por corrigir a abordagem.


2

Preso , 85 43 Bytes

Sim, sim, eu sei, Python é mais curto ..: P Estou usando a mesma lógica que Tryth agora, na maior parte.

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

Explicação:

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 bytes

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 bytes

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

Como isso funciona (uau, eu nunca fiz um destes!):

   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 bytes

Ainda não jogou golfe, mas é um começo:

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

Aqui está uma versão mais legível:

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

Como funciona:

.Q`a`A gera duas listas de letras minúsculas e maiúsculas

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

!:1+til 26mapeia cada letra de cada lista de 1 a 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

Multiplique a primeira lista por 1 e a última por 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

Entre em um único dicionário usando ,/

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

Mapeie os caracteres na sequência de entrada para as pontuações relevantes

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

Preencha quaisquer valores nulos com 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

Soma

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

1

JavaScript, 121 bytes

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

chame o arquivo js com o nó (nó index.js "Cab")


1

MATLAB, 68 bytes

Isso tira vantagem do fato de que os caracteres são convertidos automaticamente para números inteiros e que os valores booleanos podem ser somados como números inteiros.

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 bytes

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

Testado em v5.20.2.


1

Javascript (ES6), 85 82 80 67 bytes

Eu amo desafios rápidos e fáceis como esse. :)

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

Isso funciona interpretando cada caractere como um número base-36, multiplicando-o por 1 ou 1,5 se for maior que 9 ( a-zou A-Z) e fornecendo 1 em vez disso. Como sempre, sugestões são bem-vindas!


1
O 0 em charCodeAt é bot necessário
Downgoat

@vihan Não sabia disso; Obrigado pela dica!
ETHproductions

por que não usartoString(36)
l4m2

@ l4m2 Não sei como .toString(36)se aplica aqui. Você quer dizer algo assim parseInt(c,36)? Na verdade, isso pode ser mais curto ...
ETHproductions

Você pode salvar alguns bytes por ir recursiva e usando 2/3 quando parseInt retorna 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)

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

Ligue para (LinqPad):

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

0

PHP, 102 bytes

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;

Exemplo de uso:

$ 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

Nada de especial no algoritmo. Cada personagem do argumento do primeiro programa ( $argv[1]) é verificado em relação Ae Z, em seguida, ae ze contou em conformidade.


0

PowerShell, 108 bytes

Decentemente competitivo, estou meio surpreso. Não é tão ruim por não ter um operador ternário compacto.

Código:

$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

Explicado:

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

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

O !!antes islowere o isuppersão necessários, porque não é garantido que os valores booleanos retornados por essas funções sejam 0e 1, 1024realmente , o valor verdadeiro estava no meu sistema!


0

Doces , 26 22 bytes

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

Obrigado a @Tryth pelo truque de fatoração!

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

A chamada está com o sinalizador -I, como em candy -I "Cab" -e $prg

O código em sua forma longa é:

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 bytes

Código:

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

Explicado:

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

Exemplo:

p(`Cab`).
7.5

0

PHP, 75 bytes

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

Execute como pipe -nrou experimente online .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.