В поисках ценности слов!


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
Подожди, деньги бумажные ?? Я всегда думал, что это были либо блестящие металлические диски, либо какая-то магия, вызванная смахиванием священной карты.
Geobits

2
Даже американские банкноты на самом деле сделаны из хлопка и льна ... но я думаю, что люди [Вставьте классное имя здесь] еще не думали об этом.
JCai

Разрешены ли конечные нули? Например, печать 7.0вместо 7?
kirbyfan64sos

@ kirbyfan64sos Трейлинг 0 допускается.
Нико А

А как насчет пространства?
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

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

Добро пожаловать в Программирование головоломок и Code Golf! Этот пост содержит несколько советов по игре в гольф на Python, которые могут помочь вам улучшить свой результат. Вы можете начать с уменьшения количества пробелов.
Алекс А.

Во втором понимании списка почему бы не заменить (ord (l.lower ()) - 96) * 1,5 на 1,5 * ord (l) -96. Вы знаете, что l выше, поэтому просто поработайте с этим и умножьте значение, чтобы убрать символы (64 * 1.5 = 96).
ruler501

Вы также можете удалить пространство между закрывающей пареной и forв понимании.
Алекс А.

Если я не ошибаюсь, вы можете сделать это еще короче, просто сделав лямбду eв качестве параметра, возвращающего результат.
Алекс А.

В «понимании» одного?
Баарт

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)

Это просто суммирует массив, построенный через понимание, которое перебирает символы во входной строке и выполняет арифметику для их кодовых точек.

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

Спасибо Glen O за исправление подхода.


2

Stuck , 85 43 байта

Да, да, я знаю, Python короче ..: P Я использую ту же логику, что и Триф сейчас, по большей части.

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

К, 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 генерирует два списка строчных и прописных букв

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

Raze в один словарь, используя ,/

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

Заполните все нулевые значения 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

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

Это работает путем интерпретации каждого символа как числа base-36, умножения его на 1 или 1,5, если он больше 9 ( a-zили A-Z), и вместо этого дает 1, если нет. Как всегда, предложения приветствуются!


1
0 в charCodeAt необходим бот
Downgoat

@vihan Не знал этого; Спасибо за чаевые!
ETHпродукция

почему бы не использоватьtoString(36)
l4m2

@ l4m2 Я не уверен, как это .toString(36)применимо здесь. Вы имеете в виду что-то подобное parseInt(c,36)? На самом деле, это может быть короче ...
ETHproductions

Вы можете сохранить несколько байтов, используя рекурсивный подход и используя 2/3, когда parseInt возвращает NaN: ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
Рик Хичкок,



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]) проверяется, Aа Zзатем aи zи подсчитывается соответственно.


0

PowerShell, 108 байт

Прилично конкурентоспособный, я немного удивлен. Не слишком потрепанный из-за отсутствия компактного тернарного оператора.

Код:

$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нужны, так как логические значения , возвращаемые этими функциями, не гарантируется 0и 1, истинное значение было 1024на моей системе на самом деле!


0

Candy , 26 22 байта

(~ "А" <{A # 64-2 / ​​3 * | A # 96-} ч) 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.